201706

08配置 Linux 策略路由以允许双网卡双地址访问

现有一台 Linux 网关,拥有两块网卡,一块接入百兆校园网(222.24.24.2/24),一块接入千兆专线(10.0.0.2/24)。因为专线带宽远高于校园网,所以默认路由指向了专线。路由表如下所示:

$ ip route
default via 10.0.0.1 dev eth1  proto static  metric 1024
10.0.0.0/24 dev eth1  proto kernel  scope link  src 10.0.0.2
222.24.24.0/24 dev eth0  proto kernel  scope link  src 222.24.24.2

由于保留了校园网地址,所以理论上可以同时使用校园网地址 222.24.24.2 和专线地址 10.0.0.2 访问到这个网关。然而实际情况却不一样。测试发现,222.24.24.2 地址只能通过同网段电脑正常访问。不同网段的地址并不能通过 222.24.24.2 登录到网关。原因十分简单:通过其它网段地址发往 222.24.24.2 的数据包,会通过网关 222.24.24.1 发到 eth0,然后返回的数据包会根据路由表选路通过 eth1 发往千兆专线网关 10.0.0.1,然而 10.0.0.1 是一个防火墙,防火墙由于没有完整地看到连接建立过程,对数据不予放行,于是无法正常建立 TCP 会话。
拓扑.png

阅读全文

201703
201702

20在 shell 中测试 C 语言表达式用的 bash 脚本

#!/bin/bash
if [ ! "$1" ]; then
    echo "usage: $0 <EXPRESSION>"
    exit
fi
DISPLAY_FILE=display-const-`date +%H%M%S`
gcc -o /tmp/$DISPLAY_FILE -x c - <<EOF
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/socket.h>
#include <sys/signal.h>
int main() {
    int i = 0;
    printf("%s = %d\\n", "$1", (int)($1));
    return 0;
}
EOF
if [ "$?" = "0" ]; then
    /tmp/$DISPLAY_FILE
    rm /tmp/$DISPLAY_FILE
fi

阅读全文

12通过程序控制 Raspberry Pi 的 USB 接口供电

Raspberry Pi (树莓派)的 USB 接口供电是会在系统停止的时候自动断开的,于是我意识到了其 USB 供电电路一定是受 CPU 控制的,可能就是通过某个 GPIO 控制的。 通过在网上的一番查找,发现和我想象的还是有一些出入的:

  • USB 接口的供电并不是通过 GPIO 直接控制的,而是通过 USB 集线器 LAN9514 控制的。CPU 可以通过设置集线器的 PORT_POWER 选项完成 USB 供电电路的开关。
  • 控制 USB 供电的电路出现在 Raspberry Pi Model B+ 之后的版本。原版的 Raspberry Pi Model B 的 USB 供电电路直接与 5V 相连,不受控制。

阅读全文

11dd 命令在全盘拷贝时实时显示进度

启动 dd 进程并将 dd 进程的 PID($!)保存到 shell 变量 PID:

dd if=/dev/sda of=/dev/sdb bs=1M & PID=$!

每隔 1 秒向 dd 进程发送一个 USR1 信号,要求 dd 进程输出拷贝进度:

while kill -USR $PID; do sleep 1; done
zyxwvu
UNDER CONSTRUCTION