<>

3.4. 创建系统启动体系

系统启动之后,有很多种方式可以得到所希望的使用环境(你甚至可以直接 ln -s bin/bash init 或在 Grub 中直接指定 init=/bin/bash 直接进入 shell)。

本文使用了相对“完整”的 SysVinit 启动体系,可以通过本节大致了解 SysVinit 的启动流程。(当然,我们的 bootcd 仅需要 run-level 3)

3.4.1. /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

3.4.2. /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

3.4.3. /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

3.4.4. rc 启动脚本

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