<imghch AT gmail DOT com>
系统启动之后,有很多种方式可以得到所希望的使用环境(你甚至可以直接 ln -s bin/bash init
或在 Grub 中直接指定 init=/bin/bash
直接进入 shell)。
本文使用了相对“完整”的 SysVinit 启动体系,可以通过本节大致了解 SysVinit 的启动流程。(当然,我们的 bootcd 仅需要 run-level 3)
/etc/inittab
/sbin/init
将调用 /etc/inittab
的信息, 现在建立这个文件:
mkdir $WORK/tmpfs/etc cat > $WORK/tmpfs/etc/inittab << EOF # Begin /etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/init.d/rc sysinit ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now 1:2345:respawn:/sbin/agetty -n tty1 9600 2:2345:respawn:/sbin/agetty -n tty2 9600 3:2345:respawn:/sbin/agetty -n tty3 9600 4:2345:respawn:/sbin/agetty -n tty4 9600 5:2345:respawn:/sbin/agetty -n tty5 9600 6:2345:respawn:/sbin/agetty -n tty6 9600 # End /etc/inittab EOF
/bin/login
/etc/inittab
中的 agetty
会调用 /bin/login
,而 /bin/login
则把控制权最终交给 /bin/bash
。由于我们并不需要用户登录,所以我们自己创建 /usr/login
:
cat > $WORK/tmpfs/bin/login << EOF && chmod +x $WORK/tmpfs/bin/login #!/bin/sh echo "Press Enter to activate this console..." read ENTER exec /bin/bash --login EOF
/etc/profile
/etc/profle
用以设置 bash 环境
cat > $WORK/tmpfs/etc/profile << 'EOF' # Begin /etc/profile NORMAL="\[\e[0m\]" RED="\[\e[1;31m\]" GREEN="\[\e[1;32m\]" export PATH=/bin:/usr/bin:/sbin:/usr/sbin export TERM=xterm export HISTSIZE=20 export PS1="$RED[ $NORMAL\w $RED]$GREEN\$?$RED# $NORMAL" alias ls="ls --color" alias ll="ls -lh" alias la="ll -a" cd ~ # End /etc/profile EOF
cp /etc/udev $WORK/tmpfs/etc/ -a mkdir -p $WORK/tmpfs/etc/rc.d/init.d cp -a /etc/rc.d/init.d/{functions,mountfs,mountkernfs,rc,udev,udev_retry} \ $WORK/tmpfs/etc/rc.d/init.d/ mkdir -p $WORK/tmpfs/etc/rc.d/rcsysinit.d cp -a /etc/rc.d/rcsysinit.d/{S00mountkernfs,S10udev,S40mountfs,S50udev_retry} \ $WORK/tmpfs/etc/rc.d/rcsysinit.d/ mkdir -p $WORK/tmpfs/etc/sysconfig cp -a /etc/sysconfig/rc $WORK/tmpfs/etc/sysconfig/rc