• Pacemaker 集群中使用 fence_mpath 实现 multipath IO fence


    在集群中,如果一个节点出现故障,存活的节点会接管服务。但在接管服务之前,存活节点需要确定故障节点当前没有访问共享存储,fence 机制可以阻断故障节点访问存储,保证数据不被损坏。

    Normal 2-node cluster

    (更多…)

  • MiniFlow – 自制玩具版 TensorFlow


    神经网络由一个个神经元组成,简单而言,每个神经元会对输入进行一些简单运算,得到输出。而训练一个网络,则是调整网络中的参数,使得输出接近学习样本的期望输出。
    比如,假设有一个网络只计算 y = w * x, 初始值 w=5。把 x=10 放进这个网络,会得到 y=50. 而我们预期 y=20. 通过训练这个网络,w 将会被调整为 w=2, 输出 y=20 则符合(接近)预期。

    在实际应用中,一个网络会有不少参数,我们需要一个方法来调整这些参数。按我的理解,这个“调整参数”的过程就是机器学习的过程。

    一个常见的神经网络,会由 Input layer, Hidden layer 和 output layer 组成。每层 layer 由众多神经元组成,Input/output layer 的神经元通常仅存储一个数值,本身不会进行运算。Hidden layer 的神经元则会对输入进行运算,将输出传给下一层。

    By Glosser.ca – Own work, Derivative of File:Artificial neural network.svg, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=24913461

    Udacity CarND-term1 Lesson 5 让我们自己去实现一个 Miniflow, 相当于一个玩具版的 Tensorflow. 通过实现 Miniflow, 可以体会到 Forward Pass 和 Backpropagation 的过程。
    (更多…)

  • rpm是怎样安装/更新文件的?

    这个问题的更准确表述是,在用rpm命令更新软件包时,这个软件包里的某个文件是逐渐改变的,还是原子的?

    比如说,有一个软件包叫 fake-1.rpm,里面有A/B/C三个文件。这个软件包有一个更新版本 fake-2.rpm, 其中对B文件进行了变更。那么,在进行rpm的升级过程中,文件B会发生怎样的改变?在升级过程中,文件B有没有可能是不完整的?它的MD5值是yyy1234, yyy5678 还是其它值?
    [cc]
    fake-1.rpm (version 1)
    +——-+———+
    | Files | MD5 |
    +——-+———+
    | A | xxx1234 |
    +——-+———+
    | B | yyy1234 |
    +——-+———+
    | C | zzz1234 |
    +——-+———+

    fake-2.rpm (version 2)
    +——-+———+
    | Files | MD5 |
    +——-+———+
    | A | xxx1234 |
    +——-+———+
    | B | yyy5678 |
    +——-+———+
    | C | zzz1234 |
    +——-+———+
    [/cc]
    (更多…)

  • 文件系统的 nodev 挂载选项有什么用?

    nodev挂载选项有什么用?

    一些安全策略会要求,除了根目录(/),其他目录如果挂载了单独的分区,应该添加 nodev 挂载选项。
    所以 nodev 有什么用呢? mount 的 man 手册如此解释:
    [cc lang=”bash”]
    nodev Do not interpret character or block special devices on the file system.
    [/cc]
    好吧,看完我还是没理解这个选项到底是干嘛的。网上搜索到了几个回答[2][3]。如果在挂载时,添加了nodev选项,那么系统不会把该文件系统里面的 block/character 文件当作是 block/character 文件来处理。

    举个例子,一位别有用心的用户,在他有权限的机器上(比如他的笔记本),在U盘上创建了一个 block 文件,指向 sd* 之类的数据盘,这么巧他有权限把U盘插到服务器上,这么巧服务器自动挂载了这个U盘且没有 nodev 挂载选项,那么这位用户就能通过这个 block 文件读取到服务器上相应磁盘的数据。

    (更多…)

  • 在两节点Pacemaker集群中使用Quorum Device来避免fencing race

    使用场景

    两节点集群示例
    – 在一个两节点高可用集群中,心跳和fence设备不在同一个网络;
    – 如果心跳网络出现异常,两个节点则会出现分离;
    – 在 Corosync 2.x 中,两节点默认(必须)开启two_node模式,在这个分离的情况下,两节点均可达到quorate的状态;
    – 由于fence网络可以正常连同,两节点会互相fence对方,造成fencing race,两节点均被重启而无法提供服务;
    两节点心跳丢失示意
    (更多…)

  • 周末游大同:北岳恒山+云冈石窟

    某同事要去三山五岳打卡,在朋友圈诱惑大家去北岳恒山。周五晚上火车出发,周日下午火车返回,不需要请假。

    行程开销

    周末整个行程总共开销738元,吃饱喝好睡得也挺舒服。

    [table caption=”花费细分” colalign=”left|left|right|left”]
    类别,项目,金额,备注
    交通,北京->大同, 99.5, K695次
    交通,大同->北京, 109.5, K696次 包含异地取票5元
    交通, 包车, 87.5, 大同恒山 4人包出租车350元
    交通, 公交,4,从酒店到云冈石窟
    交通, 黑车, 10, 从云冈石窟到市区
    交通, 滴滴, 6, 4人一共24元
    住宿,云冈国际酒店, 84, 双床标间168元
    门票, 悬空寺外, 25,
    门票, 恒山, 47,
    门票, 云冈石窟, 125,
    餐饮, 晚饭, 52, 凯鸽三部 4人一共208元
    餐饮, 水, 3.5
    餐饮, 早餐, 18, 外卖华莱士
    餐饮, 午饭, 61, 凯鸽火锅 4人一共243元
    [/table]

    (更多…)

  • CarND Project 1 – 车道检测


    这是 Udacity 无人驾驶课程的笔记。第一个作业是检测车道,简单地说就是把路面上的行车线找出来。

    Origin

    target

    环境准备

    这个作业需要有 Anaconda 的环境,然后装上 jupyter notebook, OpenCV 等必要的库。
    具体的安装方法可参考(fork 自 Udacity):
    https://github.com/feichashao/CarND-Term1-Starter-Kit/blob/master/doc/configure_via_anaconda.md
    其中,安装 tensorflow 的时候,可能会遇到 Google 被墙的情况,所以安装的时候最好先挂个代理,在安装前设置环境变量, 比如:

    # export http_proxy=http://8.8.8.8:5187/ 
    # export https_proxy=$http_proxy
    

    颜色选择(Color Selection)

    颜色是区分行车线的其中一个因素。对于一种颜色,可以有不同的编码方式,常见的是RGB,YUV等。

    由于行车线的颜色与周围环境有一定区分,我们可以对RGB分别设定阈值,把有用的信息分离出来。
    (更多…)

  • 用 mmap 将某些 struct 存放到文件中 (map virtual memory to a file)

    背景

    在 RHEL7 中, dovecot 在运行的过程中其中一个 imap 进程挂掉,出来这么一个 coredump.

    [cc]
    Program terminated with signal 7, Bus error.

    (gdb) f 0
    #0 0x00007fbb15868c17 in mail_cache_transaction_open_if_needed (ctx=ctx@entry=0x7fbb173c1430)
    at mail-cache-transaction.c:218
    218 if (ext->reset_id == cache->hdr->file_seq || i == 2)

    (gdb) p cache
    $1 = (struct mail_cache *) 0x7fbb173af2d0

    (gdb) p cache->hdr
    $3 = (const struct mail_cache_header *) 0x7fbb15ce5000

    (gdb) p cache->hdr->file_seq
    Cannot access memory at address 0x7fbb15ce5008

    # cat maps | grep 7fbb15ce5000
    7fbb15ce5000-7fbb15ced000 r–s 00000000 00:2c xxxxxxxxx /xxxxxxx/dovecot.index.cache
    [/cc]

    挂掉的原因是 “signal 7, bus error” ((bad memory access)). 从 gdb 中可以看到,进程挂的时候在尝试访问 ext->reset_id 和 cache->hdr->file_seq, 而从 maps 可以看出 cache->hdr 指向的是 file-backend 的地址空间。

    那么问题来了,怎样可以把一个结构体,映射到一个文件,而不是匿名页?另外一个问题是,在 gdb 中看到 “Cannot access memory at address” 是意味着这段地址存在问题吗?

    测试环境

    Debian 8 – jessie
    (更多…)

  • Linux Kernel 的双向链表实现

    在一个太阳毒辣的周五,刚到公司的我还没吃完手里的面包,肯尼斯把我抓到他的屏幕前:“你来说说这段代码什么意思。”

    [cc lang=”C”]
    #define container_of(ptr, type, member) ({ \
    const typeof( ((type *)0)->member ) *__mptr = (ptr); \
    (type *)( (char *)__mptr – offsetof(type,member) );})
    [/cc]

    我凝视屏幕一分钟,问道:“这…有注释吗?”
    见状,肯尼斯渐渐露出笑容。我仿佛从肯尼斯的笑脸中,看到了下一分钟认怂的我。

    一分钟后,肯尼斯从 Kernel 的双向链表给我讲起…

    测试环境

    下面的 Kernel 源码以及测试环境均为 RHEL7.3:
    kernel-3.10.0-514.el7.x86_64
    gcc-4.8.5-11.el7.x86_64
    (更多…)