📄 新建 文本文档 (5).txt
字号:
/bin/mount -av
/bin/hostname MiniLinux
/etc/rc.network
/etc/rc.firewall
/bin/sshd
第一行mount /proc,第二行把根remount为rw模式(漏了这个害得我查了两三天),第三行检查fstab里面是否还有其他的需要mount的分区,第四行设置主机名,后面分别根据脚本设置网络和防火墙,最后开启sshd服务。
设置网络在最小系统里面再也不是像/etc/init.d/network start那么简单,
呵呵,其实也不麻烦。通过命令ip、ifconfig可以很方便的设置。例如rc.network为:
#!/bin/sh
/bin/ifconfig eth0 192.168.0.254
/bin/ifconfig eth1 211.69.200.1
/bin/ip route add default via 211.69.200.2 dev eth1
/bin/ip route replace 192.168.0.0/24 dev eth0 scope link
/bin/ip route replace 211.69.200.0/24 dev eth1 scope link
前两行设置ip地址,第三行设置缺省网关,后面两行更改本网路由。
rc.firewall的写法大家可以自己参照iptables的HOWTO去完成
/etc/passwd,/etc/shadow,/etc/group记录有系统帐号信息,在最小系统上,我只留了root组(用户)的信息。
裁减Linux过程中,PAM是一个很关键的部分,由于资料不多,很多人束手无策。
如果仅仅要使用最小系统,从console登陆需要修改/etc/pam.d/login,从ssh 上来修改/etc/pam.d/sshd,不妨复制系统原来的配置文件略作修改/etc/pam.d/login为
#%PAM-1.0
auth required /lib/security/pam_stack.so service=system-auth
account required /lib/security/pam_stack.so service=system-auth
password required /lib/security/pam_stack.so service=system-auth
session required /lib/security/pam_stack.so service=system-auth
/etc/pam.d/sshd和login的内容一样。从其可知它们调用了system-auth这个服务,则还需要/etc/pam.d/system-auth,内容为:
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth sufficient /lib/security/pam_unix.so likeauth nullok
account required /lib/security/pam_unix.so
password sufficient /lib/security/pam_unix.so nullok md5 shadow
session required /lib/security/pam_unix.so
关机和重启
关机和重启在完整的Linux下面是有很长的脚本支持的,就像启动脚本/etc/rc.sysinit 等等。但是在最小系统上面,这些都需要自己来写,复制原有系统的肯定不行。
不过从前面/etc/inittab里面可以知道,最小系统上面reboot执行的是/etc/rc6,关机是/etc/rc0,如果不需要“善后”,则很简单,rc6如下:
[root@MiniLinux etc]# cat rc6
/sbin/reboot -i -d
rc0则为:
[root@MiniLinux etc]# cat rc0
/sbin/halt -i -d -p
整个etc目录下的东西列表大致为:
[root@MiniLinux etc]# ll
total 891
-rw-r--r-- 1 root root 6639 Apr 19 2002 fonts.cgz
-rw-r--r-- 1 root root 109 Dec 30 06:19 fstab
-rw-r--r-- 1 root root 14 Dec 14 00:10 group
-rw-r--r-- 1 root root 146 Dec 27 15:41 inittab
-rw------- 1 root root 60 Jan 6 15:14 ioctl.save
-rw-r--r-- 1 root root 57 Dec 12 01:26 issue
-rw-r--r-- 1 root root 28436 Apr 19 2002 keymaps.gz
-rw-r--r-- 1 root root 3758 Apr 19 2002 kon.cfg
-rw-r--r-- 1 root root 1281 Apr 19 2002 lang-table
-rw-r--r-- 1 root root 1320 Dec 30 06:55 ld.so.cache
-rw-r--r-- 1 root root 18 Dec 12 07:53 ld.so.conf
-rw-r--r-- 1 root root 54692 Apr 19 2002 loader.tr
-rw-r--r-- 1 root root 1180 Dec 23 09:07 login.defs
-rw-r--r-- 1 root root 30303 Apr 19 2002 minikon.fnt
-rw-r--r-- 1 root root 0 Dec 13 23:39 mtab
-rw-r--r-- 1 root root 270 Dec 23 04:03 nsswitch.conf
drwxr-xr-x 2 root root 1024 Dec 30 04:48 pam.d
-rw-r--r-- 1 root root 28 Dec 30 06:29 passwd
-rwxr-xr-x 1 root root 401 Dec 30 07:43 profile
-rw-r--r-- 1 root root 12359 Apr 19 2002 ramfs.img
lrwxrwxrwx 1 root root 7 Dec 26 03:03 rc -> rc.d/rc
drwxr-xr-x 2 root root 1024 Dec 27 15:33 rc.d
-rwxr-xr-x 1 root root 2631 Jan 6 02:18 rc.firewall
-rwxr-xr-x 1 root root 246 Jan 6 02:17 rc.network
-rwxr-xr-x 1 root root 20 Dec 27 15:38 rc0
-rwxr-xr-x 1 root root 19 Dec 27 15:39 rc6
-r-------- 1 root root 59 Dec 30 06:20 shadow
drwxr-xr-x 2 root root 1024 Dec 26 06:37 ssh
-rw-r--r-- 1 root root 737535 Dec 23 10:18 termcap
其中目录ssh为sshd的配置文件,复制原来机器上的即可。其他的大部分文件都是按照HOWTO上面提到的一些必备文件复制的。
nsswitch.conf是系统寻找一些配置文件的配置文件,呵呵,很拗口,man nsswitch.conf看看吧,稍作修改为:
[root@MiniLinux /]# cat etc/nsswitch.conf
passwd: files
shadow: files
group: files
hosts: files
services: files
networks: files
protocols: files
rpc: files
ethers: files
netmasks: files
bootparams: files
automount: files
aliases: files
netgroup: files
publickey: files
profile文件是bash shell的登陆脚本,主要为了限制历史命令记录大小
[root@MiniLinux etc]# cat profile
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
HISTSIZE=1000
HISTFILESIZE=20
PATH=/bin
PS1='[\u@\h \W]\$ '
HOSTNAME='/bin/hostname'
export PATH HISTSIZE HISTFILESIZE HOSTNAME PS1
alias l.='ls -d .[a-zA-Z]* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
关于/dev目录
完整linux的/dev目录下有很多设备文件,不过仔细辨别一下就会发现很多其实
用不上。我列出在我的最小Linux下面用到的设备文件:
[root@MiniLinux dev]# ls
agpgart hda hda6 input loop3 psaux ptyp3 ram3 tty3 ttyp4
console hda1 hda7 kbd loop4 ptmx ptyp4 ram4 tty4 urandom
fb hda2 hda8 kmem loop5 pts ram shm ttyp0 zero
fb0 hda3 hda9 loop0 mem ptyp0 ram0 tty0 ttyp1
fd0 hda4 initctl loop1 null ptyp1 ram1 tty1 ttyp2
fd1 hda5 initrd loop2 openprom ptyp2 ram2 tty2 ttyp3
其中input、shm、pts是目录,似乎是系统自己生成的,fb连接到fb0,ram连接到ram0 ,关于硬盘的保留了hda?,loop[0-5]用于支持回环设备(loopback devices),tty[0-4]用于支持主机直接操作,ttyp[0-4] & ptyp[0-4]用于共同支持ssh登陆,ram?用于支持虚拟盘,urandom是sshd服务必须的设备。
所有的设备文件均可以用cp -dpR从原系统的/dev目录下复制过来。
关于linuxrc
linuxrc是一个在initrd.img里面展开后直接自动执行的一个脚本。关于这个脚本的用途,建议大家读一下/usr/src/linux-2.4/Documentation/initrd.txt,我也是直接把系统提供的initrd-2.4.18-3.img里面带的linuxrc拿来用而已:
[root@MiniLinux /]# cat linuxrc
#!/bin/nash
echo Mounting /proc filesystem
mount -t proc /proc /proc
echo Creating root device
mkrootdev /dev/root
echo 0x0100 > /proc/sys/kernel/real-root-dev
echo Mounting root filesystem
mount --ro -t ext2 /dev/root /sysroot
umount /proc
pivot_root /sysroot /sysroot/initrd
注意,它用的shell是/bin/nash,而不是通常用的/bin/sh,大家man nash可以看到很多有意思的东西。
最后的一些工作
当你把一个文件虚拟为一个磁盘并挂接在系统上,复制了需要的可执行文件、库文件、配置文件并做了必要的修改之后,一个文件系统基本上已经成形了。
前面列出的最小系统的目录,如果没有特别提到都是留空的。这里要说的,最后的工作就是如何把kernel和文件系统结合起来。
我看到过很多讲一张或者两张软盘启动的linux,里面都提到用rdev定位文件系统,还要如何如何算。我是看明白了,不过觉得特别繁琐,就投机取巧了一番。
首先假定刚才我们挂载的根文件系统是挂载到现在的/mnt目录下,文件名是/root/newfs则首先umount
#umount /root/newfs
接着将newfs压缩
#gzip -v9 /root/newfs
此时会生成newfs.gz,接着rename:
#mv newfs.gz newfs.img
把它和前面编译的内核bzImage放到/boot目录下去。
我用的Linux引导器是grub。为什么不用LILO?我基本上没有用过LILO,是出道很晚很晚的Linux使用者,从grub的介绍上我发现它比LILO功能强很多,使用新内核不需要像grub那样重新安装,而且内置支持一些常见的文件系统。
看看/boot/grub/grub.conf吧,在其中增加一段:
title Test Combine
root (hd0,4)
kernel /bzImage ro ramdisk_size=8192 root=/dev/ram0
initrd /newfs.img
当然,你不可照抄我的配置,需要按照你的系统更改root (hd?,?),如果你建立的文件系统(未压缩前)容量是其他数值的,请用合适的值替代8192,单位是KB(还记得我前面说过的编译内核的时候不需要刻意更改缺省ramdisk容量吗?就在这里指定即可)
好了,可以试试裁减以后的系统了。大概有多大呢?我裁减出来的系统内核大约是<800k,文件系统8M,压缩成.img的是约3M,很小吧。
感想 及 说明
先说说这个最小Linux的启动过程。grub将内核载入以后,让内核将newfs.img载入内存并展开(自动展开到/dev/ram0)为临时根文件系统,此时执行/linuxrc,在linuxrc中又指定了新的文件系统。接着内核按照grub带入的参数root=/dev/ram0作为根文件系统正式init,此时/dev/ram0中的内容正是newfs.img的内容(如果你仔细观察的话,会发现完整linux启动过程中有Unmounting initrd....的字样,说明initrd.img是在进入init脚本的过程中才被卸载的),按照/etc/inittab脚本执行,缺省为runlevel 3,执行/etc/rc,最后由mingetty启动login完成引导。
我个人感觉,/linuxrc里面的脚本似乎对内核正式init时的根分区指定没有多少影响,并不像/usr/src/linux-2.4/Documentation/initrd.txt里面linuxrc例子那样要求严格。好像决定正式init根分区的是由grub带入内核的参数root=... 来决定的更多。有经验的大侠请多指点。
经过这次实验,感受颇多。首先对linux引导过程以及/etc下面的很多配置文件有了深入了解。Linux可改变的弹性很大,不过也需要大家沉得住气,慢慢去研究,man、HOWTO等等是少不了看的,第一手的资料还是man和英文HOWTO最权威,其次,缩减以后的大小让人非常振奋,裁减以后,系统加载重启登陆的速度都变得非常快,很多东西简直就是一眨眼就过去了。
文末,感谢各位耐心看完,不对之处请斧正。本人也是linux的新手,万望海涵。
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=142592
[点击此处收藏本文] 发表于 2004年10月21日 3:03 PM
log290 发表于2005-04-10 12:02 PM IP: 220.168.70.*
好文章
发表评论
大名:
网址:
验证码
评论
记住我?
Powered by:
Copyright ? quickmouse
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -