200M Linux 可以通过网络启动,批量自动部署或直接无盘运行了 (附配置 iPXE 无盘启动说明)

2017-02-26 00:08:58 +08:00
 jarell
之前介绍的 /t/330321 这个系统现在可以无盘启动了

简单来说就是通过网络加载镜像文件到内存后启动,现在实验的这几十台机器是通过 http 和 https 进行加载的,
由于主要是加载一个一百多兆镜像文件,感觉用 tcp 协议比 udp 协议效果好很多。尤其是很多台机器同时启动的时候,
使用 udp 的 tftp 时总会有一些失败的,换过不同的 tftp 服务器都是这样,而且单台启动的时候不能跑满带宽。
换成 nginx 当 http 服务器的时候就没碰到过这种问题,单台启动能跑满带宽,很多台同时启动也都能慢慢加载完。
可能用组播方式会更好吧,但没细研究组播,感觉现在的 http(s)的方案对我来说够用了。

在就是得益于系统镜像体积还算小,可以就这么直接无盘运行, 150MB 内存开销完全可以接受,这样还有个好处是
更新的时候只动服务器上的镜像就可以了,要更新的机器直接重启就行了。
加载到本机内存相比通过网络挂载根文件系统的方式在延迟的和稳定性上好太多了,尤其是机器很多的时候。毕竟不受断网影响。

无盘方式有个问题就是数据怎么回写,方案非常多,为了简单起见用了个非常粗暴的方式解决了我的问题。
对于我这的情况,就是怎么让不同机器加载不同配置,根本不需要什么回写,那解决起来就简单多了:
每台机器除了加载共用的镜像再根据各自的标识加载一个 tar 包解压叠加到根文件系统上就行了。
同时为了能自动初始化或者自动安装,如果文件服务器上没有那个标识符的文件,还会尝试加载一个默认的 tar 包,满足不同环境的制定。

前面废话一大堆,现在说下怎么用吧。
在已经运行支持 https 的 iPXE 情况下,在 iPXE 命令行输入下面两条命令之一就能启动这个系统了。
chain https://sourceforge.net/projects/lfsp200/files/netboot/boot.ipxe
chain https://l-lfsp200.rhcloud.com/netboot/boot.ipxe
注意你的网络环境要良好,这可是从大陆以外加载 150MB 左右的文件,自己计算下时间吧。
有的地区可能会遇到 iPXE 网络加载证书时被打断的情况,这时就不能加载 https 文件了。这个问题研究了很久,分明那个 boot.ipxe 能下载嘛。
下载过程有个百分比进度,不出意外加载完很快就能启动了。同事说很神奇,有透明计算的感觉。其实这都是 iPXE 的功劳。

通过公网加载确实是比较慢的,实际用的话还是要自己部署的。下面说下具体怎么操作。
由于是网络启动,至少要两台机器或者用虚拟机。(在 openwrt/lede 这样的路由器上配置也是可以的)

首先在一台机器上安装 iPXE 启动环境,这里不需要对主路由器或者提供 dhcp 的机器做任何改动即可完成。

安装 dnsmasq-2.77test4, 其他版本应该也行,但是我用这个做的实验。
下载 http://www.thekelleys.org.uk/dnsmasq/test-releases/dnsmasq-2.77test4.tar.xz 并解包
make BINDIR=/usr/bin PREFIX=/usr
make BINDIR=/usr/bin PREFIX=/usr install
建立文件 dnsmasq.proxydhcp 内容如下
########begin########
no-daemon
port=0
log-dhcp
log-queries
dhcp-range=192.168.1.0,proxy #改成你的网段
leasefile-ro

dhcp-match=ipxe,175
dhcp-boot=net:ipxe,http://<文件服务器 ip 或域名>/netboot/boot.ipxe
pxe-service=x86PC,"iPXE for 200M linux",undionly_menu.kpxe

enable-tftp
tftp-root=/srv/tftp
########end##########
运行
sudo dnsmasq -C dnsmasq.proxydhcp

这样安装 dnsmasq 是有些粗糙,下个版本的 200M linux 会内置 dnsmasq ,能通过服务启动。
还有替代 dnsmasq 的 tftp 功能的性能好一些的 tftp-hpa 也会内置。

这时用网络启动同一子网的其他机器能看到一个 iPXE for 200M linux 的菜单,但实际不能真实启动,这一步就算成功了。

然后下载 https://l-lfsp200.rhcloud.com/netboot/undionly_menu.kpxe 保存到 /srv/tftp 下面。
这时再网络启动其他机器,正常的话能看到一个菜单,其中有两个菜单是用前面的网址启动系统的。

最后一步下载镜像文件
在 web 服务器文件目录下面建立文件夹 netboot
再把 https://l-lfsp200.rhcloud.com/netboot/ 下面的所有文件下载到 netboot 目录里面。
这一步有个脚本能方便操作
wget https://l-lfsp200.rhcloud.com/netboot/netboot_dl.sh
sh netboot_dl.sh #这个脚本是从 sourceforge 下载文件,可编辑改成从 rhcloud 下载,看那个快吧。

再次网络启动其他机器,正常的话会直接启动系统,看不到刚才那个菜单了。

然后就是怎么让加载额外的配置文件了。
无盘系统启动后,进行所需的设置(参考一下之前的帖子介绍),然后进入 /mnt/tmpfs
有一个一串字符的目录, 忽略.work 后缀的那个。这个目录就是配置文件了,
把它 tar 成一个 <原来的一串字符>.tar.xz 的文件,放到文件服务器 netboot/ovl 目录下面。
这台机器再次启动的时候就能加载这个文件了。
为了减少体积,可把这个 .tar.xz 解压到别处删除一些临时文件日志文件重新打包的。
如果要把这个文件当作共用的模板,解压后重命名成 default 再打包成 default.tar.xz 放到 netboot/ovl 下面即可。


罗哩罗嗦算是写完了,可能说的不太明白,等下次发布的时候弄个脚本自动设置吧。感觉看脚本更清晰。
10613 次点击
所在节点    Linux
20 条回复
zhoushiya
2017-02-26 04:17:23 +08:00
牛逼!
airski
2017-02-26 07:25:24 +08:00
实际应用,这一套方案太重,不如直接 docker
goodryb
2017-02-26 09:47:20 +08:00
@airski #2 感觉这个和 docker 是不同的类型吧
dphdjy
2017-02-26 10:33:25 +08:00
啊 正在日一套最小 Linux+docker 的系统,(ง •̀_•́)ง
目前正在纠结 GUI 的问题~
gwind
2017-02-26 11:16:10 +08:00
LFS 在按需定制系统方面确实方便,定制的系统方案在一些场景非常有用。
LZ 还可以参考下 coreos 。

以后可能很多场景底层架构只需: kernel + 极简的 ramdisk 启动好 docker ,加入集群环境。
jarell
2017-02-26 11:33:08 +08:00
@airski 这个是在真实机器上安装的,当然 vmware qemu 这些虚拟机也行。
这个系统启动后才有类似 docker 的东西,我们用的是 lxc ,配合 overlayfs ,每个 lxc 的存储开销最小在几十 KB 左右。

@dphdjy 不用 gui 不纠结

@gwind 我这个就是类似“ kernel + 极简的 ramdisk ”的方案来,内核两兆多, initrd 两兆多,那个 150MB 的 root.squashfs 可以不用加载也能启动进入 busybox 。
在加载 root.squashfs 的时候按 Ctrl+C 取消,然手输入 boot 就能启动进入 initrd 里面的 busybox 了。
dphdjy
2017-02-26 11:39:18 +08:00
@jarell 我准备用 rancheros 做底层~它介绍说 22m 大,最新版本就 60m 大,还原生支持 docker~
Arnie97
2017-02-26 11:45:57 +08:00
有趣,先 Mark
可以考虑在 Coding 放个镜像加快下载
jarell
2017-02-26 11:52:01 +08:00
@dphdjy 这么点的话东西不全吧。我这个的基本工具可都是全的啊, gcc perl python gdb valgrind qemu lxc 。也就是说除了 lfs 的包还有以下这些包
bridge-utils
openssl
c-ares
curl
cacerts
cpio
dosfstools
fcron
gdb
libffi
sqlite
python
pcre
apr
apr-util
scons
serf
subversion
git
popt
gptfdisk
hdparm
which
htop
libnl
libusb
libpcap
iftop
iperf
iptraf
libxml
libxslt
linux-firmware
luit
lua
lxc
alsa-lib
mpg123
glib
mtr
unzip
net-tools
netcat
nginx
ntp
openssh
paco
parted
wget
pciutils
proxychains-ng
alsa-utils
dnsmasq
busybox
pixman
qemu
reiserfsprogs
rsync
samba
screen
socat
squashfs
strace
sudo
sysstat
tcpdump
tftp-hpa
tofrodos
traceroute
miniupnpc
libnatpmp
libevent
transmission
tree
unrar
usbutils
valgrind
whois
efivar
efibootmgr
grub-efi
hostapd
iw
wpa_supplicant

而且你做 docker 的话,每个镜像又要占用很多空间。 我这里用 lxc ,直接共享使用宿主这个 150 兆的镜像,每个 lxc 最少也就额外占用几十 K 空间,而且还是一个相对完整的系统。
jarell
2017-02-26 11:55:29 +08:00
@Arnie97 Coding 能 ssh 访问么,能直接上传文件然后 web 访问么?
jarell
2017-02-26 12:17:09 +08:00
@Arnie97 这个好像只能 web 上传文件, 下载 url 和文件名不对应,也没有路径,做 iPXE 启动镜像很不方便的说
dphdjy
2017-02-26 16:15:45 +08:00
@jarell rancheros 是底包

docker 开始就是基于 lxc ,现在已经换成 runc 和 containerd

然后用 Union FS 做文件系统,分层并且互相引用,比如一个 helloworld 就是一个可执行文件

所以就咱目前看来,你这个感觉就是手动实现了初代 docker 低配版。

咱主要是改个系统,来运行支持 docker ,尽量全部在 docker 跑,如果要特殊的功能直接在 docker 构造一个 Ubuntu ,所以只要提供对 docker 的接口就行~~
dphdjy
2017-02-26 16:17:01 +08:00
@jarell 刚刚发现 rancheros 支持 VirtIO 和 iPEX ,简直完美
dphdjy
2017-02-26 16:17:43 +08:00
@jarell 不过上面提供的这堆软件包,考虑放一点进去。先 mark
jarell
2017-02-27 14:27:59 +08:00
如果遇到大量机器同时启动比较慢的情况,可以多配置几台同样的机器。这样每台机器都会分担一些启动请求,基本是随机的。
station
2017-03-17 07:15:37 +08:00
@jarell vmware 启动后找不到内核配置文件( make menuconfig ),在什么路径 ?
jarell
2017-03-17 21:47:01 +08:00
@station 挂载 /dev/sda1
station
2017-03-18 07:26:29 +08:00
@jarell 我试了试是挂载 dev/sda3 下的目录才找到.config 文件
jarell
2017-03-18 11:48:57 +08:00
@station 是我弄错了,第一个分区是 BIOS boot ,第二个分区是 grub ,第三个分区才是。
你是要调整什么东西么? live 模式启动的话是无法重新安装内核的(确切说是很不方便),你应该参照这个手册 https://l-lfsp200.rhcloud.com/ 把它安装到硬盘才行。
station
2017-03-18 12:39:19 +08:00
@jarell 用你的.config 去改成我需要的~, 重头配置麻烦,发行版的头大

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/343188

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX