搭建自配置可用的IPv6网络

为了能有IPv6链接,在重新配置了系统之后又把以前做过的 Radvd 和 使用 HE 提供的 Tunnel Broker 的服务又配置了一遍:

首先要有一个 Hurrican Electric 的 Tunnel Broker 帐号,注册很方便,过程略。

内核要开启Tunnel支持,可见链接中的Wiki。

自用的配置脚本:

由于我用的ADSL拨号网络IP总是变化,所以不能用固定的文件去配置,需要一枚脚本:

https://github.com/ryncsn/he-ipv6-init-script/raw/master/hev6.sh

放到/usr/local/sbin/

wget https://raw.githubusercontent.com/ryncsn/he-ipv6-init-script/master/hev6.sh -O /usr/local/sbin/hev6-init

vim /usr/local/sbin/hev6-init

按照 Tunnel Broker 帐号和申请的 Tunnel 信息配置开头的各种变量,INTERFACE是 Tunnel 经过的的 Interface,需要能接受服务器发来的 6in4 (Protocal 41) 包,且有独立公网地址。ROUTE_INTERFACE是本地需要提供IPv6网络的接口,对我来说就是内网。

 

配置服务:

要让服务自启动。之后写一个服务资源文件:

Gentoo中:

vim /etc/init.d/hev6-init
#!/sbin/runscript
# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

description="Hurrican Electric Tunnel Broker"

command="/usr/local/sbin/hev6-init"

log_file="/var/log/hev6"
depend() {
        need net
        use logger dns
}

start() {
        ebegin "Starting DDNS on ${IFACE}"
        start-stop-daemon --start --background \
        --stdout $log_file --stderr $log_file \
        --exec $command
}

stop() {
        ebegin "Stopping HE v6 tunnel"
        $command clear
        eend $?
}

启用,启动服务。

rc-update add hev6-init default

service hev6-init start

Systemd版:

vim /etc/systemd/system/hev6.service
[Unit]
Description=Hurrican Electric IPv6 Tunnel Broker
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
TimeoutSec=0
PIDFile=/run/hev6.pid
ExecStart=/usr/local/sbin/hev6-init
ExecStop=/usr/local/sbin/hev6-init clear
Restart=on-failure


[Install]
WantedBy=multi-user.target
systemctl enable hev6

systemctl start hev6

服务启动之后通过ping6 ipv6.google.com测试,无问题。

 

配置Radvd:

配置radvd,在要提供IPv6服务的接口上开启路由通知:

emerge radvd

vim /etc/radvd.conf

参考配置,酌情修改网段信息等:

interface eth0
{       
        AdvSendAdvert on;
        
        MinRtrAdvInterval 3;
        MaxRtrAdvInterval 10;
        
        AdvDefaultPreference low;               
        AdvHomeAgentFlag off;
        
        prefix 2001:470:ffff:ffff::/64
        {       
                AdvOnLink on;
                AdvAutonomous on;                                                                               
                AdvRouterAddr on;                                                                                       
        };
};

之后配置服务开机自起:

service radvd start

rc-update add radvd default

Gentoo中启动radvd 服务会自动开启ipv6 forwarding。

我的另一机器是 Centos 7,配置时需要手动在/etc/sysctl.con中加入:

net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1

 

配置ip6tables:

增加TUNNEL Chain,配置类似如下:

-A FORWARD -j TUNNEL

:TUNNEL - [0:0]
-A TUNNEL -s 2001:470:ffff:ffff::/64 -j ACCEPT
-A TUNNEL -d 2001:470:ffff:ffff::/64 -j ACCEPT
-A TUNNEL -s fe80::/10 -j ACCEPT
-A TUNNEL -d fe80::/10 -j ACCEPT
-A TUNNEL -j RETURN

之后在网络上接入其他设备,ping6 ipv6.google.com,测试无问题即可用。

 

相关链接:

Tunnel broker:

http://tunnelbroker.net/

Gentoo Wiki:

https://wiki.gentoo.org/wiki/IPv6_router_guide#Using_radvd

Gentoo + OpenRC 网络配置 PPPoE 双路网络

自家用的电信网络,允许4台客户机同时拨号,其中ADSL路由进行一次拨号提供家人的上网服务,同时使用花生壳的服务。自己的Pi拨号一次,给自己的网站一个地址,使用Dnspod的DDNS。

但默认网络的路由规则会导致所有出站的包都经由同一个默认路由,有两个线路的话其中一条会不可用,为了实现两个多个域名都能使用,要配置双路网络,加一个路由表:

其中ppp0通过eth0进行拨号,eth0为已配置好的局域网。

1、配置PPPoE:

Gentoo 中开启 ppp flag 后,portage 会自动安装需要的包。

在 /etc/portage/make.conf 中加入 ppp flag

USE="... ppp ..."

emergr 自动安装相关依赖包:

emerge --ask --changed-use --deep @world

2、相对的添加路由表

添加一个路由表,所有经由路由器(经由内网IP)的包会被使用新的路由表进行查询。

vim /etc/iproute2/rt_tables

添加:

...
#
# local
#
1       lan.inet

3、配置网络:

编辑 /etc/conf.d/net,添加对应规则,对应情况修改:

主要的是让eth0启动的时候在路由表中添加对应的规则,让对应的包使用新加的路由表。

config_eth0="<static lan ip here> netmask 255.255.255.0"
routes_eth0="default via 192.168.1.1 dev eth0 src <static lan ip here> table lan.inet"
rules_eth0="from <static lan ip here> lookup lan.inet"

dns_servers_eth0="192.168.1.1"

config_ppp0="ppp"
link_ppp0="eth0"
plugins_ppp0="pppoe"
username_ppp0='<username here>'
password_ppp0='<password here>'
pppd_ppp0="
noauth
defaultroute
usepeerdns
holdoff 3
child-timeout 60
lcp-echo-interval 15
lcp-echo-failure 3
noaccomp noccp nobsdcomp nodeflate nopcomp novj novjccomp"

rc_net_ppp0_need="net.eth0"

4、配置启动脚本:

开机自起:

cp /etc/init.d/net.lo /etc/init.d/net.ppp0

rc-update add net.ppp0 default

重启网络/系统,完成。

Defy 上重新分区并加入Kpanic分区

身边的Defy服役快5年了,3.7寸,1G+512内存小身板撑了这么久煞是不容易(还能再战十年!)

自己修改过内核的不少部分,稳定性现在不错,但如果偶遇内核Panic导致关机的话然后死的太突然并不能看到日志。而KPanic是Android上(曾经)常用的日志转储,在Kernel Panic的瞬间将日志转储到指定的分区上。我用的自定义分区表+内核似乎失去了这个功能。

通过刷上官方的固件之后用adb shell连过去,cat /proc/partitions看到:

179       32    1912832 mmcblk1
179       33        128 mmcblk1p1
179       34        512 mmcblk1p2
179       35        512 mmcblk1p3
179       36          1 mmcblk1p4
179       37        512 mmcblk1p5
179       38        512 mmcblk1p6
179       39       4096 mmcblk1p7      pds
179       40        512 mmcblk1p8
179       41        512 mmcblk1p9
179       42       1024 mmcblk1p10
179       43       2048 mmcblk1p11
179       44        512 mmcblk1p12
179       45        512 mmcblk1p13
179       46       4096 mmcblk1p14
179       47       8192 mmcblk1p15     boot
179       48       8192 mmcblk1p16     recovery
179       49      14336 mmcblk1p17     cdrom
179       50        512 mmcblk1p18     misc
179       51        512 mmcblk1p19     cid
179       52       4096 mmcblk1p20     kpanic
179       53     334848 mmcblk1p21     system
179       54        512 mmcblk1p22     prek
179       55        512 mmcblk1p23     pkbackup
179       56     204800 mmcblk1p24     cache
179       57    1319936 mmcblk1p25     userdata
179        0   61407232 mmcblk0
179        1   61406208 mmcblk0p1

查看原生分区的信息:

for i in /sys/block/mmcblk1/mmcblk1p*/; do
echo $i;
for j in `ls $i`; do
if [ -f $i$j ] ;then
echo "$j" : `cat $i$j`;
fi
done
done

得到了25个分区的start,end,size:

使用dd把整个/dev/mmcblk1 dump下来,使用16进制编辑器简单的看一下,可以在系统不可见分区里找到类似于分区表的东西,整理一下可看到整个Defy的分区结构,其中蓝色的是Android系统使用/可见的分区:

CONTENT DEV NODE START(BLOCK) SIZE(BLOCK) END(BLOCK)
mbmloader mmcblk1 256 256 512
mbm mmcblk2 1024 1024 2048
mbmbackup mmcblk3 2048 1024 3072
ebr mmcblk4 3072 2 3074
bploader mmcblk5 4096 1024 5120
cdt.bin mmcblk6 5120 1024 6144
pds mmcblk7 6144 8192 14336
lbl mmcblk8 14336 1024 15360
lbl_backup mmcblk9 15360 1024 16384
logo.bin mmcblk10 16384 2048 18432
sp mmcblk11 18432 4096 22528
devtree mmcblk12 22528 1024 23552
devtree_bak mmcblk13 23552 1024 24576
bpsw mmcblk14 24576 8192 32768
boot mmcblk15 32768 16384 49152
recovery mmcblk16 49152 16384 65536
cdrom mmcblk17 65536 28672 94208
misc mmcblk18 94208 1024 95232
cid mmcblk19 95232 1024 96256
kpanic mmcblk20 96256 8192 104448
system mmcblk21 104448 669696 774144
prek mmcblk22 774144 1024 775168
pkbackup mmcblk23 775168 1024 776192
cache mmcblk24 776192 409600 1185792
userdata mmcblk25 1185792 2639872 3825664

我之前一直在用的,XDA上大牛Quarx移植ROM所用的分区表,省去目前不考虑的分区:

PART DEV START(Byte) SIZE(Byte) END(Byte)
pds mmcblk1p9 3145728 4193792 7339520
root_system mmcblk1p1 53477376 51593216 105070592
system mmcblk1p5 105070593 657930240 763000833
system_sign mmcblk1p2 396221216 393216 396614432
prek1 mmcblk1p3 396361728 524288 396886016
prek2 mmcblk1p4 396886016 524288 397410304
cache mmcblk1p6 763000834 51200000 814200834
data mmcblk1p7 814200833 1143996416 1958197249

吐槽下这歪七扭八没对齐的分区数字,不过由于自定义分区是利用的Linux 内核一段时间前加的自定义MMC分区功能,并不会写到硬盘分区表,而内核在处理启动参数时候会自动对其,所以并没有性能的影响。

对其(为了方便计算)+重做一下分区,加入kpanic,新的分区表:

LABEL DEV START(Byte) SIZE(Byte) END(Byte)
pds mmcblk1p8 3145728 4194304 7340032
kpanic mmcblk1p9 49414144 4063232 53477376
bootstrap mmcblk1p1 53477376 33554432 87031808
system mmcblk1p5 87031808 671088640 758120448
system_sign mmcblk1p2 395968512 393216 396361728
prek mmcblk1p3 396361728 524288 396886016
pkbackup mmcblk1p4 396886016 524288 397410304
cache mmcblk1p6 758120448 50331648 808452096
userdata mmcblk1p7 808452096 1150287872 1958739968

Rom的BoardConfig中的BOARD_KERNEL_CMDLINE改成如下:

PARTITION_TABLE := blkdevparts=mmcblk1:33554432@53477376(root_system),393216@395968512(system_sign),524288@396361728(prek),524288@396886016(pkbackup),671088640@87031808(system),50331648@758120448(cache),1150287872@808452096(data),4194304@3145728(pds),4063232@49414144(kpanic) mmcparts=mmcblk1:p1(root_system),p2(system_sign),p3(prek),p4(pkbackup),p5(system),p6(cache),p7(data),p8(pds),p9(kpanic)
BOARD_RECOVERY_KERNEL_CMDLINE := console=/dev/null mem=499M init=/init omapfb.vram=0:4M usbcore.old_scheme_first=y cpcap_charger_enabled=y $(PARTITION_TABLE)
BOARD_KERNEL_CMDLINE := console=/dev/null panic=30 mem=499M init=/init ip=off brdrev=P3A omap3_die_id init=/init omapfb.vram=0:4M usbcore.old_scheme_first=y cpcap_charger_enabled=n $(PARTITION_TABLE)

由于要绕开Bootloader的检查使用自定义ROM,system覆盖了system_sign,system_sign是bootloader会去读取的数据,自定义ROM 通过设置badblock防止system分区的写操作破坏system_sign分区的内容。改动分区表之后badblock位置也变了,这次要将75424到75775设置为badblock。

之后修改Quarx的升级bootstrap和格式化用的刷机文件,主要修改Kernel cmdline和badblock,重新刷入,完成。

链接:

XDA上Quarx的ROM发布页:http://forum.xda-developers.com/showthread.php?t=2515036

我修改过的ROM:http://tieba.baidu.com/p/4061404066

Intel Galileo Gen 2 上运行带有 Arduino 兼容的 Debian

最近学校课设,用到了Intel Galileo Gen2,为了使用NodeJS开发安装了Galileo-Debian,之后遇到了两个问题,记录下:

1、安装Debian之后失去了原来的Arduino兼容功能。

2、安装Debian之后不停地pthread lib segfault。

添加Arduino兼容功能:

把Intel给的Yacto镜像解开看看,发现Yacto上开机自起/opt/cln/galileo,”监听”ttyGS0,负责Arduino部分的功能。

直接拿来用即可,不过Yacto用的似乎不是glibc,导致Debian中无法直接使用,为了省事直接把原镜像mount后chroot进去运行sketch即可,注意把 /dev 等涉及硬件操作的挂载点暴露给chroot。

注释掉/etc/inittab中的以下行,ttyGS0要交给shetch:

GS0:23:respawn:/sbin/getty -L ttyGS0 115200 vt100

把Intel提供的SDCard.1.0.4.tar.bz2解压,image-full-galileo-clanton.ext3放到sd卡的/opt/galileo-ketch/,Galileo开机执行以下脚本即可:

#!/bin/bash
dir="/opt/galileo-sketch"
mount $dir/image-full-galileo-clanton.ext3 $dir/mount
mount --rbind /dev $dir/mount/dev
mount --rbind /sys $dir/mount/sys
mount --rbind /proc $dir/mount/proc
mount --rbind /run $dir/mount/run
mount --rbind /tmp $dir/mount/tmp
nohup chroot $dir/mount /usr/bin/env HOME=/home/root PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/bash -c "source /etc/profile; /opt/cln/galileo/launcher.sh" &>/var/log/galileo-sketch.log &

F00F Bug

Google “debian galileo pthread segfault”后,发现有人遇到这问题了,原因是Intel Quark CPU有Bug,在F00F指令时触发。F0对应锁总线,而Galileo为单核设备,可以忽略这个操作,直接用十六进制编辑器吧F0替换成90(NOP),问题解决。

/lib/i386-linux-gnu/libpthread.so.0中所有的:

f0 0f b1 8b 94 21 00 00

替换为:

90 0f b1 8b 94 21 00 00

有其它f00f导致的segfault可以用类似方法解决。

 

相关链接:

Intel Galileo Support:http://www.intel.com/support/galileo/sb/CS-035101.htm

Galileo-Debian:http://sourceforge.net/projects/galileodebian/

Debian Bug:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=738575