|
我们总有各种各样的理由,在单机环境安装多套 GNU/Linux 系统。
- 我想要尝试各种 GNU/Linux 发行版,如 LFS、gentoo、debian……。
- 我想要运行同一个 GNU/Linux 发行版的多个拷贝,如debian sid、lenny、etch。
- 我想要高安全性、易用性共存,需要一个小巧的根文件系统只读的主系统,用于监控、备份、救援、管理,一个桌面系统,用于开发、办公、娱乐,一个服务器系统,用于sshd、httpd、ftpd。
- 我有高配置的机器,想要高性能、高兼容性共存,想要运行多个平台架构兼容的 GNU/Linux 系统,如x86_64硬件环境下x86_64、i686两种架构的系统。
- 我想通过并行运行的X-window登录不同的系统
为什么还要不停的重启机器切换系统?
为什么还要使用性能受限的虚拟机?
为什么不更近一步发掘系统潜力,让多套系统并行运行?有如神奇的平行世界。
〇、主系统、附属系统、内核、根文件系统
主系统是第一个启动的 GNU/Linux 系统。
附属系统是 主系统 启动后,同时运行的 GNU/Linux 系统。
主系统 由 内核、根文件系统 组成。
附属系统可仅包括根文件系统,不需要内核。
多个同时运行的 GNU/Linux 系统,共享主系统的内核及内核模块,主系统内核同时对多个系统提供支持。
如 x86_64 硬件环境,应优选 x86_64 系统作主系统,并使用打开 32bit 兼容支持 x86_64 内核,
Executable file formats / Emulations ---> IA32 Emulation。
不建议使用主系统之外系统提供的内核模块,应根据需要统一编译主系统内核。
强调安全性的话,应使用禁用内核模块的内核。
主系统、附属系统可采用任意常规方法安装。
附属系统安装过程中可以不安装内核。
一、同时运行相同平台架构的多个 GNU/Linux 系统
下面的chroot.sh脚本可用来临时运行另一个 GNU/Linux 系统,可置于/sbin- #!/bin/sh
-
- CHROOT_DIR="$1"
- shift
- CHROOT_ARG="$@"
-
- [ "${CHROOT_DIR}" = "" ] && echo "chroot dir is null!" && exit 1
- [ ! -d ${CHROOT_DIR} ] && echo "chroot dir ${CHROOT_DIR} isn't exist!" && exit 1
-
- BIND_DIR="proc sys dev dev/shm dev/pts"
- REVERSE_DIR=
-
- cd ${CHROOT_DIR}
-
- for x in ${BIND_DIR}; do
- [ -d $x ] && mount --bind /$x $x && REVERSE_DIR="$x ${REVERSE_DIR}"
- done
-
- /sbin/[color=red]chroot[/color] . ${CHROOT_ARG}
-
- for x in ${REVERSE_DIR}; do
- umount $x
- done
复制代码 另一个 GNU/Linux 系统的根文件系统位于/rootfs。
以root帐号登录,运行即可取得另一个 GNU/Linux 系统的 root shell。
二、同时运行兼容平台架构的多个 GNU/Linux 系统
x86_64 GNU/Linux 系统为主系统;
i686 GNU/Linux 系统为附属系统,根文件系统位于/rootfs;
以root帐号登录,运行- /usr/bin/[color=red]linux32[/color] /sbin/chroot.sh /rootfs
复制代码 即可取得 i686 GNU/Linux 系统的 root shell。
linux32由setarch提供。
三、设置多个 GNU/Linux 系统跟随主系统自动启动、退出
另一个 GNU/Linux 系统的根文件系统位于/rootfs;
我们准备用虚拟控制台tty6登录这个 GNU/Linux 系统。
修改主系统下/etc/inittab,由
- 6:2345:respawn:/sbin/agetty -I '\033(K' tty6 38400
复制代码 如果是上面情况一修改为
- 6:2345:respawn:/sbin/chroot /rootfs /sbin/agetty -I '\033(K' tty6 38400
复制代码 如果是上面情况二修改为
- 6:2345:respawn:/usr/bin/linux32 /sbin/chroot /rootfs /sbin/agetty -I '\033(K' tty6 38400
复制代码
添加下面到启动脚本,如/etc/init.d/rc.local
- mount --bind /proc /rootfs/proc
- mount --bind /sys /rootfs/sys
- mount --bind /dev /rootfs/dev
- mount --bind /dev/shm /rootfs/dev/shm
- mount --bind /dev/pts /rootfs/dev/pts
复制代码
重启后即可通过tty6登录另一个 GNU/Linux 系统。
四、并行编译
以上面情况二为例说明:
主系统 x86_64,有构建CLFS-Sysroot x86的脚本/i686-pc-linux-gnu/new_os.sh,直接登录主系统,执行 /i686-pc-linux-gnu/new_os.sh;
附属系统 i686,有构建CLFS-Sysroot x86_64-pure64的脚本/x86_64-unknown-linux-gnu/new_os.sh,使用二或三给出的方法得到shell,执行/x86_64-unknown-linux-gnu/new_os.sh。
上面构建交叉编译工具链、构建交叉编译 temp system 的过程比一个一个单独执行大幅缩短。
在我自己的双核x86_64、单条内存、单块硬盘机器上,同时构建两个系统仅比单独构建一个系统多出若干分钟。
多用的时间主要浪费在硬盘读写过程,同时构建两个系统时cpu利用率大部分时间稳定在85%以上,峰值接近100%,解包时最低为30%左右。
如果再使用 make -j N 进一步提高 cpu 利用率也是可能的,只是天热,我不忍心再进一步虐待机器。
构建系统的方法请参考 Sysroot 方式从源码构建完全本地编译的 GNU/Linux 系统
五、并行X
关键是关闭X-window默认的tcp监听,这样才能同时运行多个X,建立如下~/.xserverrc 或 /etc/X11/xinit/xserverrc
目前,我暂时使用startx来启动不常用的系统。
常用系统使用gdm管理。
六、多个 GNU/Linux 系统共享设置
/etc/resolv.conf
/etc/mtab
(待续) |
|