1. 设置主机名
mkdir /mnt/sysroot/etc/sysconfig
vi /mnt/sysroot/etc/sysconfig/network
内容:
HOSTNAME="minilinux"
rc.sysinit中使用hostname命令使HOSTNAME生效
vi /mnt/sysroot/etc/rc.d/rc.sysinit
添加
echo "Set the hostname..."
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
[ -z $HOSTNAME -o "$HOSTNAME" == "(none)" ] && HOSTNAME=localhost
/bin/hostname $HOSTNAME
2. 终端提示信息
系统在完成所有初始化工作后会启动虚拟终端,如mingetty和agetty,它们在调用login前会打印一段信息,
来提示当前系统是哪个发行版,内核版本号及平台架构。比如:
这段信息其实来自/etc/issue文件, 这个文件也常被用来获取当前系统发行版。
[root@localhost ~]# cat /etc/issue
CentOS release 5.4 (Final)
Kernel \r on an \m
vi /mnt/sysroot/etc/issue
Mini Linux (2.6.18)
Kernel \r on an \m
My Mini Linux
3. 设置内核参数
Linux内核启动后,仍然可以通过向内核传递参数的方式来对内核进行一系列的配置,达到优化内核的目的,传递给内核的这些参数就是内核参数。
调整内核参数有两种方式:
1). 修改/proc下内核参数文件内容,/proc是虚拟文件系统,不能使用编辑器来修改,可以使用echo value重定向的方式修改。
如:将 timeout_timewait 参数设置为30秒:
# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
参数修改后立即生效,但是重启系统后,该参数恢复成默认值。
2). 修改/etc/sysctl.conf文件。检查sysctl.conf文件,如果已经包含需要修改的参数,则修改该参数的值,如果没有需要修改的参数,在sysctl.conf文件中添加参数。如:
net.ipv4.tcp_fin_timeout=30
保存退出后,可以重启机器使参数生效,如果想使参数马上生效,也可以执行如下命令:
# sysctl -p
下面就使用第二种方式修改内核参数,打开IP转发功能。
创建内核参数文件:
vi /mnt/sysroot/etc/sysctl.conf
添加内容:
net.ipv4.ip_forward = 1
使sysctl.conf文件每次开机生效:
vi /mnt/sysroot/etc/rc.d/rc.sysinit
添加:
sysctl -p &>/dev/null
[ $? -eq 0 ] && success "Set kernel parameter" || failure "Set kernel parameter"
bincp.sh 复制 sysctl命令
开机后查看/proc/sys/net/ipv4/ip_forward,内容为1,说明内核参数生效
4. 单用户模式
当runlevel(运行级别)为1时,系统进入单用户模式。一个非常有用的应用场景是在忘记登录密码时,
进入单用户模式(不需要密码),然后重设密码。
在inittab中添加runlevel为1时的动作
vi /mnt/sysroot/etc/inittab
增加一行
l1:1:wait:/etc/rc.d/rc 1
rc.d下添加rc1.d,其中加入相应服务的软链接,目前只有一个network服务
mkdir /mnt/sysroot/etc/rc.d/rc1.d
cd /mnt/sysroot/etc/rc.d/rc1.d
ln -sv ../init.d/network K90network
使用init 1/S/s 命令可以进入单用户模式。类似关机/重启脚本,关机时进入0运行级别,重启时进入6进行级别。使用init命令进入1运行级别时会遍历/etc/rc.d/rc1.d下的脚本,关闭或打开相应服务。需要在rc1.d中添加一个真正切换到单用户模式下的服务脚本。
创建单用户模式服务脚本
vi /mnt/sysroot/etc/rc.d/init.d/single
内容
#!/bin/bash
#
exec /sbin/init S
添加可执行权限,并在rc1.d下创建软链接
chmod +x /mnt/sysroot/etc/rc.d/init.d/single
cd /mnt/sysroot/etc/rc.d/rc1.d/
ln -sv ../init.d/single S98single
5. 重新挂载根文件系统可读写
vi etc/rc.d/rc.sysinit
添加:
echo "Remount rootfs..."
mount -n -o remount,rw /
[ $? -eq 0 ] && success "Remount rootfs" || failure "Remount rootfs"
-n 选项很关键,指明挂载时不要写入 /etc/mtab文件,因为这条命令执行前,文件系统还是只读的,不加-n会导致命令执行失败。
6. 挂载/etc/fstab中定义的其他文件系统
/etc/fstab中定义了各种文件系统的信息,系统在启动后应该保证挂载的文件系统和fstab中描述的信息一致。
创建fstab文件
vi /mnt/sysroot/etc/fstab
内容:
/dev/hda2 / ext3 defaults 0 0
/dev/hda1 /boot ext3 defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
查看/proc/mounts文件中已挂载的文件系统,对比/etc/fatab找出还没有挂载的文件系统,然后挂载。
在rc.sysinit中加入如下命令:
echo "Mount other filesystem..."
grep -E -v "\<swap|proc|sysfs\>" /etc/fstab | awk '{print $1}' |
while read LINE;
do
awk '{print $1}' /proc/mounts | grep "^$LINE$" > /dev/null;
if [ $? -ne 0 ]; then
echo "mount -o rw $LINE `grep "^$LINE\>" /etc/fstab | awk '{print $2}'`"
mount -o rw $LINE `grep "^$LINE\>" /etc/fstab | awk '{print $2}'`
fi
done
[ $? -eq 0 ] && success "Mount other filesystem" || failure "Mount other filesystem"
7. 总结
至此,一个具备丰富功能的MiniLinux算是完成了。但是这个Linux中使用的kernel,initrd,所有命令等,大部分来自另一个系统中现成的东西,将这些东西堆砌起来做成的这个MiniLinux顶多算是组装,完全谈不上自制。在下一章中将要从头开始做一个Linux系统,不过这次不再使用现成的东西,而改用源码编译的方式来制作,真正达到自制的目的。