<imghch AT gmail DOT com>
Abstract
系统启动之后,有很多种方式可以得到所希望的使用环境(你甚至可以直接 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