V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
jarell
V2EX  ›  Linux

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

  •  
  •   jarell · 2017-02-26 00:08:58 +08:00 · 10637 次点击
    这是一个创建于 2832 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前介绍的 /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 下面即可。


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

    以后可能很多场景底层架构只需: kernel + 极简的 ramdisk 启动好 docker ,加入集群环境。
    jarell
        6
    jarell  
    OP
       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
        7
    dphdjy  
       2017-02-26 11:39:18 +08:00 via Android
    @jarell 我准备用 rancheros 做底层~它介绍说 22m 大,最新版本就 60m 大,还原生支持 docker~
    Arnie97
        8
    Arnie97  
       2017-02-26 11:45:57 +08:00 via Android
    有趣,先 Mark
    可以考虑在 Coding 放个镜像加快下载
    jarell
        9
    jarell  
    OP
       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
        10
    jarell  
    OP
       2017-02-26 11:55:29 +08:00
    @Arnie97 Coding 能 ssh 访问么,能直接上传文件然后 web 访问么?
    jarell
        11
    jarell  
    OP
       2017-02-26 12:17:09 +08:00
    @Arnie97 这个好像只能 web 上传文件, 下载 url 和文件名不对应,也没有路径,做 iPXE 启动镜像很不方便的说
    dphdjy
        12
    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
        13
    dphdjy  
       2017-02-26 16:17:01 +08:00
    @jarell 刚刚发现 rancheros 支持 VirtIO 和 iPEX ,简直完美
    dphdjy
        14
    dphdjy  
       2017-02-26 16:17:43 +08:00
    @jarell 不过上面提供的这堆软件包,考虑放一点进去。先 mark
    jarell
        15
    jarell  
    OP
       2017-02-27 14:27:59 +08:00
    如果遇到大量机器同时启动比较慢的情况,可以多配置几台同样的机器。这样每台机器都会分担一些启动请求,基本是随机的。
    station
        16
    station  
       2017-03-17 07:15:37 +08:00
    @jarell vmware 启动后找不到内核配置文件( make menuconfig ),在什么路径 ?
    jarell
        17
    jarell  
    OP
       2017-03-17 21:47:01 +08:00
    @station 挂载 /dev/sda1
    station
        18
    station  
       2017-03-18 07:26:29 +08:00
    @jarell 我试了试是挂载 dev/sda3 下的目录才找到.config 文件
    jarell
        19
    jarell  
    OP
       2017-03-18 11:48:57 +08:00
    @station 是我弄错了,第一个分区是 BIOS boot ,第二个分区是 grub ,第三个分区才是。
    你是要调整什么东西么? live 模式启动的话是无法重新安装内核的(确切说是很不方便),你应该参照这个手册 https://l-lfsp200.rhcloud.com/ 把它安装到硬盘才行。
    station
        20
    station  
       2017-03-18 12:39:19 +08:00
    @jarell 用你的.config 去改成我需要的~, 重头配置麻烦,发行版的头大
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3116 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 80ms · UTC 14:17 · PVG 22:17 · LAX 06:17 · JFK 09:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.