手把手带你自制Linux系统之五 一些小细节的完善

手把手带你自制Linux系统之五 一些小细节的完善

1. 设置主机名

"hostname+主机名" 命令可以用来设置主机名。这样设置的hostname立即生效,但重启后还需要再次设置。
想要主机名每次启动后自动生效可以在/etc/sysconfig/network文件中保存一个HOSTNAME变量。每次开机时
读取这个文件,并使用hostname命令使HOSTNAME变量作为主机名。

创建network文件

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


使用bincp.sh拷贝hostname命令

开机后主机名即可生效:


2. 终端提示信息

系统在完成所有初始化工作后会启动虚拟终端,如mingetty和agetty,它们在调用login前会打印一段信息,

来提示当前系统是哪个发行版,内核版本号及平台架构。比如:


这段信息其实来自/etc/issue文件, 这个文件也常被用来获取当前系统发行版。


[root@localhost ~]# cat /etc/issue
CentOS release 5.4 (Final)
Kernel \r on an \m


isssue文件中的\r和\m会被替换为相应的信息, \r 替换为内核版本号,\m 替换为平台架构。
\r     inserts operating system release (uname -r),
\m     inserts machine architecture (uname -m),


为MiniLinux添加issue文件
vi /mnt/sysroot/etc/issue

内容为
Mini Linux (2.6.18)
Kernel \r on an \m
My Mini Linux

开机后,进入login前会看到我们添加到issue文件中的内容,\r和\m也正确的被替换。


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


单用户模式下,init会使用/bin/sh,所以需要创建软链接 /bin/sh,指向/bin/bash


开机时指定进入单用户模式,在GRUB选择界面进入编辑模式,在kernel后加入 1/s/S,即可直接进入。

5. 重新挂载根文件系统可读写

其实挂载根文件系统为可读写应该在更早的时候先做,之所以放最后是因为MiniLinux的硬盘是挂载在工作机CentOS_5.5中的,这块硬盘中的文件都在工作机中添加和修改,从工作机切换到MiniLinux时为了方便,总是使用虚拟机的挂起功能(暂停)将工作机挂起,这时候如果MiniLinux也去写磁盘,就有可能导致文件系统损坏。为了不去频繁修复文件系统,才把挂载文件系统为可读写放到了最后。

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会导致命令执行失败。

-o 特殊选项,remount,rw 指明重新挂载,并且是读写方式

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系统,不过这次不再使用现成的东西,而改用源码编译的方式来制作,真正达到自制的目的。



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Toormi/article/details/50465450
上一篇手把手带你自制Linux系统之四 添加网络功能
下一篇手把手带你自制Linux系统之六 编译内核及busybox完成系统定制
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭