| 流浪的妖精's profile流浪妖精のForestPhotosBlogLists | Help |
|
8/3/2006 2.6内核编译项详解内核版本:2.6.17
make menuconfig 后你将看到linux内核配置页面一次有下列选项
1. Code maturity level options 代码成熟等级。此处只有一项:prompt for development and/or incomplete code/drivers,如果你要试验现在仍处于实验阶段的功能,比如khttpd、IPv6等,就必须把该项选择为Y了;否则可以把它选择为N。
2.General setup 这里是对最普通的一些属性进行设置。这部分内容非常多,一般使用缺省设置就可以了。
() Local version - append to kernel release :这里填入的是64字符以内的字符串,你在这里填上的字符口串可以用uname -a命令看到。
[*] Support for paging of anonymous memory (swap) 这是使用交换分区或者交换文件来做为虚拟内存的,当然要选上了。 [*] System V IPC 表示系统5的Inter Process Communication,它用于处理器在程序之间同步和交换信息,如果不选这项,很多程序运行不起来 [*] POSIX Message Queues 这是POSIX的消息队列,它同样是一种IPC。建议你最好将它选上 [*] BSD Process Accounting这是充许用户进程访问内核将账户信息写入文件中。这通常被认为是个好主意,建议你最好将它选上。 [*] BSD Process Accounting version 3 file format 指定信息写入格式
[*] Sysctl support 这个选项能不重新编译内核修改内核的某些参数和变量,如果你也选择了支持/proc,将能从/proc/sys存取可以影响内核的参数或变量。建议你最好将它选上 [ ] Auditing support审记支持,用于和内核的某些子模块同时工作,例如SELinux。只有选择此项及它的子项,才能调用有关审记的系统调用 [*] Kernel .config support
将.config配置信息保存在内核中,选上它及它的子项使得其它用户能从/proc中得到内核的配置 [*] Enable access to .config through /proc/config.gz [] Cpuset support 多CPU时用到,一般不选 [*] Kernel Userspace relay support (formerly relayfs)内核中分为系统区和用户区,这里系统区和用户区进行通讯的一种方式,选上。 ()Initramfs source file(s)
[*]Enable 16-bit UID system calls []Enable VM86 support 虚拟X86支持,应该是嵌入式系统上或个别软件会用到
[]Optimize for size 修改gcc的参数“-0s”代替“-02”,为了编译较小的内核代码等
[ ] Configure standard kernel features (for small systems) ---> 这是为了编译某些特殊的内核使用的,通常要很熟悉自己要做个什么样的内核的时候才会用到。
[ ] Load all symbols for debugging/kksymoops
是否装载所有的调试符号表信息,如果你不需要对内核调试,不需要选择此项。 [*] Enable futex support 不选这个内核不一定能正确的运行使用glibc的程序,当然要选上 [*] Enable eventpoll support 不选这个内核将不支持事件轮循的系统调用,最好选上 [*] Optimize for size 这个选项使gcc使用-Os的参数而不是-O2的参数来优化编译,以获得更小尺寸的内核,建议选上。 [*] Use full shmem filesystem 除非你在很少的内存且不使用交换内存时,才不要选择这项 (0) Function alignment (0) Label alignment (0) Loop alignment (0) Jump alignment 3.Loadable module support 对模块的支持。这里面有三项: Enable loadable module support:除非你准备把所有需要的内容都编译到内核里面,否则该项应该是必选的。 Module unloading:模块可卸载,如果不选这项,加载的模块就不能被卸载 Forced module unloading:内核不管是模块被使用,强迫卸载模块(rmmod -f),即使有些模块被卸载是不安全的。
Module versioning support:有一些模块在你内核重新编译后,需要重新编译这些模块
Source checksum for all modules:
Automatic Kernel module loader:让内核在启动时有自己装入必需模块的能力,建议选上 4.Block layer 块设备层 Support for Large Block Devices:支持大的块设备, 大于2T的硬盘或者raid磁盘阵列等
Support for tracing block io actions:
Support for Large Single Files:支持单个大文件
5.Processor type and features:处理器(CPU)l类型和属性设置
Symmetric multi-processing support:对称多处理支持。除非你富到有多个CPU,否则就不用选了。
Processor family:根据你自己的情况选择CPU类型。 High Memory Support:大容量内存的支持。可以支持到4G、64G,一般可以不选。 Math emulation:协处理器仿真。协处理器是在386时代的宠儿,现在早已不用了。 MTTR support:MTTR支持。可不选。 6.Power Management Options电源管理选项 [*] Power Management support
[ ] Power Management Debug Support [ ] Software Suspend (EXPERIMENTAL) ACPI (Advanced Configuration and Power Interface) Support ---> APM (Advanced Power Management) BIOS Support ---> CPU Frequency scaling ---> ACPI (Advanced Configuration and Power Interface) Support ---> [*] ACPI Support 这是一种电源管理方式,你可以看看你的BIOS是否支持。如果支持的话建议你选上这项 [ ] Sleep States (EXPERIMENTAL) < > AC Adapter < > Battery <*> Button 捕获Power、Sleep、Lid(我也不知道这是什么按钮)等按钮是否按下,并做相应的动作 <*> Video 集成在板上的显卡的ACPI支持,对有些板卡可能不起作用 < > Fan <*> Processor <*> Thermal Zone < > ASUS/Medion Laptop Extras < > IBM ThinkPad Laptop Extras < > Toshiba Laptop Extras (0) Disable ACPI for systems before Jan 1st this year [ ] Debug Statements [*] Power Management Timer Support APM (Advanced Power Management) BIOS Support ---> < > APM (Advanced Power Management) BIOS support 高级电源管理的支持,一般来说笔记本应该选上,台式机可以不选。 [ ] Ignore USER SUSPEND [*] Enable PM at boot time [ ] Make CPU Idle calls when idle [ ] Enable console blanking using APM [ ] RTC stores time in GMT 按Unix的标准,硬件的时钟应该设为格林威治时间 [ ] Allow interrupts during APM BIOS calls [*] Use real mode APM BIOS call to power off [*] CPU Frequency scaling 这一选项允许改变CPU的主频,使CPU在低负荷或使用电池时降低主频,达到省电的目的。 [ ] Enable CPUfreq debugging < > /proc/cpufreq interface (deprecated) Default CPUFreq governor (performance) ---> --- 'performance' governor <*> 'powersave' governor <*> 'userspace' governor for userspace frequency scaling [ ] /proc/sys/cpu/ interface (2.4. / OLD) <*> 'ondemand' cpufreq policy governor自动调节主频 <*> CPU frequency table helpers 多数的CPU需要这一项来调节主频 <*> ACPI Processor P-States driver 报告处理器的状态 < > AMD Mobile K6-2/K6-3 PowerNow! < > AMD Mobile Athlon/Duron PowerNow! < > AMD Opteron/Athlon64 PowerNow! < > Cyrix MediaGX/NatSemi Geode Suspend Modulation <*> Intel Enhanced SpeedStep Intel的变频技术支持 [ ] Use ACPI tables to decode valid frequency/voltage pairs --- Built-in tables for Banias CPUs < > Intel Speedstep on ICH-M chipsets (ioport interface) < > Intel SpeedStep on 440BX/ZX/MX chipsets (SMI interface) < > Intel Pentium 4 clock modulation < > nVidia nForce2 FSB changing < > Transmeta LongRun < > VIA Cyrix III Longhaul --- shared options [ ] /proc/acpi/processor/../performance interface (deprecated) [ ] Relaxed speedstep capability checks
7.Bus Options(PCI,PCMCIA,EISA,MCA,ISA)
[*] PCI support
PCI access mode (Any) --->强列建议选Any,系统将优先使用MMConfig,然后使用BIOS,最后使用Direct检测PCI设备。 [ ] Message Signaled Interrupts (MSI and MSI-X) [ ] Legacy /proc/pci interface [ ] PCI device name database [ ] ISA support [*] EISA support [*] Vesa Local Bus priming [*] Generic PCI/EISA bridge [*] EISA virtual root device [ ] EISA device name database [ ] MCA support < > NatSemi SCx200 support PCCARD (PCMCIA/CardBus) support ---> PCI Hotplug Support ---> PCCARD (PCMCIA/CardBus) support --->一般只有笔记本电脑上才会有PCMCIA插槽,如果你是台式机的话,可以不选这一项,然后跳过这一部份。 PCI Hotplug Support ---> < > Support for PCI Hotplug (EXPERIMENTAL) 一般来讲只有服务器上会有热插拔的设备,如果你使用的是台式机,你可以不选择此项并跳过这一部份。 8.Executable file formats可执行文件格式支持 [*] Kernel support for ELF binaries ELF是开放平台下最常用的二进制文件,它支持不同的硬件平台
< > Kernel support for a.out and ECOFF binaries <*> Kernel support for MISC binaries此选项允许插入二进制的封装层到内核中,当使用Java、.NET、Python、Lisp等语言编写的程序时非常有用 9.Networking网络
10.Device Drivers设备驱动
11.File systems文件系统
<*> Second extended fs support
[*] Ext2 extended attributes [*] Ext2 POSIX Access Control Lists [*] Ext2 Security Labels <*> Ext3 journalling file system support [*] Ext3 extended attributes [*] Ext3 POSIX Access Control Lists [*] Ext3 Security Labels [ ] JBD (ext3) debugging support <*> Reiserfs support [ ] Enable reiserfs debug mode [ ] Stats in /proc/fs/reiserfs [*] ReiserFS extended attributes [*] ReiserFS POSIX Access Control Lists [*] ReiserFS Security Labels JFS filesystem support [*] JFS POSIX Access Control Lists [ ] JFS debugging [ ] JFS statistics XFS filesystem support [*] Realtime support (EXPERIMENTAL) [*] Quota support [*] Security Label support [*] POSIX ACL support < > Minix fs support < > ROM file system support [*] Quota support < > Old quota format support Quota format v2 support [*] Dnotify support < > Kernel automounter support < > Kernel automounter version 4 support (also supports v3) CD-ROM/DVD Filesystems ---> DOS/FAT/NT Filesystems ---> Pseudo filesystems ---> Miscellaneous filesystems ---> Network File Systems ---> Partition Types ---> Native Language Support ---> 12.Instrumentation Support 13.Kernel hacking配置了这个,即使在系统崩溃时,你也可以进行一定的工作了。普通用户是用不着这个功能的。
14.Security options 安全相关
15.Cryptographic options
16.Library routines
5/18/2006 系统引导管理器GRUB一、什么是多重操作系统引导管理器,什么是GRUB;
系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载、传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化及启动过程则完全由内核来控制完成; Windows也有类似的工具NTLOADER;比如我们在机器中安装了Windows 98后,我们再安装一个Windows XP ,在机器启动的会有一个菜单让我们选择进入是进入Windows 98 还是进入Windows XP。NTLOADER就是一个多系统启动引导管理器,NTLOADER 同样也能引导Linux,只是极为麻烦罢了; 在Powerpc 架构的机器中,如果安装了Linux的Powerpc 版本,大多是用yaboot 多重引导管理器,比如Apple机目前用的是IBM Powerpc处理器,所以在如果想在Apple机上,安装Macos 和Linux Powerpc 版本,大多是用yaboot来引导多个操作系统; 因为目前X86架构的机器仍是主流, 所以目前GRUB和LILO 仍然是我们最常用的多重操作系统引导管理器;
我们欣喜的看到LinuxSir.Org 社区的好多弟兄都曾经或正在写GRUB实践文档,也有的弟兄也总结了GRUB的一些基础知识,比如 probing兄弟的 《GRUB 学习笔记》;由于每个人的写文档时风格不同,可能同一份文档不同的人来写就有不同的风格;所以今天也抖胆也一篇入门级的教程,由于北南不会写高级教程,所以还得请高手弟兄指教,先谢过;
基于在X86架构的CPU而开发操作系统,系统引导管理器不仅仅有GRUB ,而且也有LILO,但对于多重系统引导管理器,你只能选择其一而用;不能两个同时使用; 目前这两个多重系统引导管理器是大家最常用的,也是主流Linux发行版而采用的;有的弟兄喜欢GRUB,比如我个人,有的弟兄喜欢LILO ,比如etony兄(谁是etony,请参见 http://debian.linuxsir.org ); 主流发行版 Fedora、Redhat、Centos等基于RPM包的系统,在最新版本中都默认GRUB引导;Slackware 目前仍采用LILO;而Debian发行版目前最新的版本也是采用GRUB; 从目前看来,GRUB有逐渐取代LILO之势,GRUB 2.0正在开发之中;所以我们有理由用GRUB,我也有理由写GRUB使用教程;
GRUB不但有Linux版本,也有Windows版本;现我们一一介绍; 如前面所说,目前在在Unix类的操作系统中,大多是都有GRUB;GRUB几乎能引导所有X86架构的操作系统;功能之强,使用简单是GRUB最大的卖点;由于Windows 操作系统的先入为主的优势,使得大家对Windows的NTLOADER了解的比较多,而对开源社区的GRUB显得有点寞生,由此而带来使用上的“心理恐惧”;究其初学者对GRUB“恐惧”的主要原因还是对GRUB没有太多的了解和深入;无论是WINGRUB还是Linux版本的GRUB,最方便的还是对GRUB命令行的操作;一谈到命令行(Command)的操作,可能初学者对此恐惧;其实没有什么难的,象北南这样低级的写手,还能操作得起来,您也应该能行;
请参考:《以WINGRUB 引导安装Fedora 4.0 为例,详述用WINGRUB来引导Linux的安装》
其实对于Linux的GRUB,几乎所有的Linux主流发行版都有打包,如果您安装了Linux,并且在开机后出现GRUB字样的,证明您已经安装了GRUB;而无需再次安装;Linux的GRUB软件包安装部份并不是本文的重点; 如果您的Linux系统没有安装GRUB,或者采用的是LILO,而您想用GRUB,可以用系统安装盘自带GRUB软件包来安装,或者到相关发行版本的软件仓库下载后安装; GRUB 的Linux版本目前在各大发行版中都有打包;比如Fedora/Redhat/Centos/Mandrive/Mandriva/SuSE等以RPM包管理机制的系统,可以通过如下的命令来安装;
[root@localhost ~]# rpm -ivh grub*.rpm如果是Slackware 您可以用如下的办法来安装;
[root@localhost ~]# installpkg grub*.tgz其它的发行版本请用其自己特色的软件包管理工具来安装; 当然您也可以通过源码包,在任何Linux的发行版上安装;至于源码包的安装方法; 请参考:《如何编译安装源码包软件》
[root@localhost ~]#tar zxvf grub*.tar.gz确认您是否成功安装了GRUB,您可以测试是否有如下两个命令;
[root@localhost ~]# grub如果您不能找到这两个命令,可能您的可执行程序的路径没有设置; 请参考:《设置可执行程序路径》,当然您可以用绝对路径;比如下面的;
[root@localhost ~]# /usr/sbin/grub如果您还是找不到GRUB软件包安装在哪了;您可以用下面的命令来解决和查找;
[root@localhost ~]# updatedb 注:这个要花很长时间;是索引slocate 的库,然后再通过locate来查找;比如找到的是有类似如下的; [root@localhost ~]# locate grub在一般情况下,在路径中带有bin或sbin中字样的,这些路径下都是可执行程序;sbin 是超级权限用户才能使用的管理命令;要使用这些命令一般的情况下得切换到root用户下才能使用;比如
[beinan@localhost ~]$ su - 注:切换到root用户,并且切换到其家目录;
grub-install 命令有何用呢?其实就是把我们前面已经安装的软件包中的一些文件复制到 /boot/grub中;对于新安装GRUB软件包后,也是一个必经的过程;我们前面所说的GRUB软件包的安装;而现在我们说的是GRUB配置的过程中的安装;虽然在洋文中都是install ,但表达的意思是不一样的; 我们首先要运行 fdisk -l 来确认到底是硬盘的标识; 这个过程主要是确认硬盘的标识是哪个调备,到底是/dev/hda还是/dev/hdb 还是其它的;
[root@localhost ~]# fdisk -l如果通过fdisk -l 出现有/dev/hda字样的,我们就要用下面的命令来安装;
[root@localhost ~]# grub-install /dev/hda如果是您fdisk -l 出现的有/dev/hdb呢,那就如下运行;
[root@localhost ~]# grub-install /dev/hdb如果既有/dev/hda和/dev/hdb 就安装到/dev/hda中;
[root@localhost ~]# grub-install /dev/hda值得注意的是如果您有一个/boot分区,应该用如下的办法来安装;
[root@localhost ~]#grub-install --root-directory=/boot /dev/hda注解:具体是/dev/hda还是/dev/hdb,请以fdisk -l 为准;如果两个都有,就看您把/boot分区是放在第一块硬盘还是第二块硬盘上了,以实际情况为准;
[root@localhost ~]# grub会出现grub>提示符,这是grub命令行模式 ,如果能在开机中出现提示符,没有引导不起来的系统,除非您的系统破坏的极为严重。如果仅仅是GRUB被破坏了,GRUB命令行是能让操作系统引导起来的; 接着看例子,我们要找到 /boot/grub/stage1的,在grub>后面输入;
grub> find /boot/grub/stage1注解: (hd0,6) 这是/boot所在的分区;不要误解为是Linux 的/所在的分区,这是值得注意的;
grub>root (hd0,6) 注:这是/boot所在的分区;注解: 上面这步骤是根据 find /boot/stage1而来的,仔细看一下就明白了;现在我们一般安装很少会把/boot分区列为一个单独的分区;不过有的弟兄可能也喜欢这么做;所以还是有必要说一下为好;
对于GRUB来说,如果没有配置menu.lst,无论是Linux版本的GRUB,还是WINGRUB,都会有命令行可用,通过命令行是一样能把操作系统引导起来的;有些弟兄总以为menu.lst 配置错了, 或者在机器启动后出现grub>命令行模式就要重新安装系统,其实根本没有这个必要;只要学会GRUB的命令行的用法,根本没有必要重装系统; menu.lst 位于/boot/grub目录中,也就是/boot/grub/menu.lst 文件;您可以用vi或您喜欢的编辑器来编辑他;如果您不会用vi,还是去学习一下吧;简单的用法怎么也得会,对不对?毕竟这个文档不是讲vi的用法的; 有的弟兄会说,我没有menu.lst怎么办?那就创建一个;用下面的命令;
[root@localhost ~]# touch /boot/grub/menu.lst然后我们再做一个/boot/grub/menu.lst 的链接 /boot/grub/grub.conf [root@localhost ~]# cd /boot/grub现在我们来写GRUB的menu.lst了,因为/boot/grub/grub.conf是 /boot/grub/menu.lst的链接文件,改哪个都行。链接文件相当于Windows的快捷方式,这样可能能更好的理解;
首先我们看一下我的Fedora 4.0 中的/boot/grub/menu.lst 的内容;
default=0注解: default=0default=0 是默认启动哪个系统,从0开始;每个操作系统的启动的定义都从title开始的,第一个title 在GRUB的启动菜单上显示为0,第二个启动为1,以此类推; timeout=5注:表示在开机后,GRUB画面出现几秒后开始以默认启动;如果在启动时,移动上下键,则解除这一规则; #splashimage=(hd0,6)/boot/grub/splash.xpm.gz 注:GRUB的背景画面,这个是可选项;我不喜欢GRUB的背景画面,所以加#号注掉,也可以删除; hiddenmenu注解:隐藏GRUB的启动菜单,这项也是可选的,也可以用#号注掉; 一般的情况下对Linux操作系统的启动,一般要包括四行;title 行;root行;kernel 行;initrd 行;
title XXXXX 注:title 后面加一个空格,title 是小写的,后面可以自己定义;比如FC4,自己定义一个名字就行; 有的弟兄会问,root (hd[0-n],y)是怎么来的? 请参考:《在Linux系统中存储设备的两种表示方法》 kernel 一行,是通指定内核及Linux的/分区所在位置; 比如例子中是; kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/在这里以kernel 起始,指定Linux的内核的文件所处的绝对路径;因为内核是处在/boot目录中的, 如果/boot是独立的一个分区,则需要把boot省略;如果/boot是独立的分区,这行要写成: kernel /vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ 因为/boot所处的分区已经在title 下一行root (hd[0-n],y)中指定了,所以就无需要再指明内核处在哪个分区了;另外Linux系统的硬盘分区的挂载配置文件在/etc/fstab ,原理是通过 mount /dev/hd[a-z]X /boot 来进行的;您可以对照着来理解; ro 表示只读; root=LABEL=/ 来表示Linux的根所处的分区。LABEL=/ 这是硬盘分区格式化为相应文件系统后所加的标签;如果您不了解什么是标签,也可以直接以/dev/hd[a-z]X 或者/dev/sd[a-z]X来表示;就看您的Linux是根分区是在哪个分区了。比如我的是在/dev/hda7 , 那这里就可以写成root=/dev/hda7; 如果查看系统运行所挂载的分区,请用 df -lh 来查看,就能明白是不是/boot是独立的分区,或者查看/etc/fstab也能知道;
[root@localhost ~]# df -lh在这个例子中,我们可以发现 /boot并没有出现只有/dev/hda7,这表示/boot并不是独立的一个分区;所有的东西都包含在/中;于是我们在/boot中查看内核版本; [root@localhost ~]# ls /boot/vmlinuz*于是我们就可以这样kernel 这行了;
kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda73)initrd 命令行的写法; 如果是/boot独立一个分区,initrd 一行要把/boot中省略;如果/boot不是处于一个分区,而是和Linux的/分区处于同一分区,不应该省略; 比如我们在2)中用的例子;现在拿到这里,我们应该首先查看 /boot中的initrd的文件名到底是什么;
[root@localhost ~]# ls /boot/initrd*如果是通过df -lh 得知或查看/etc/fstab 也行, 得知/boot是独立的分区;这时initrd 应该写成;
initrd /initrd-2.6.11-1.1369_FC4.img如果是 /boot不是独处一个分区,而是在/同一处一个分区, 则要写成;
initrd /boot/initrd-2.6.11-1.1369_FC4.img
在这里,我们只说重要的,不重要的就一带而过了; 比如我们确认/boot和Linux的/分区同处一个分区;
[root@localhost ~]# df -lh然后我们/etc/fstab 中,查看/分所在的分区或分区标签是什么; [root@localhost ~]# more /etc/fstab经过上面的df -lh 和more /etc/fstab 的对照中得知,/boot并是独处一个分区,而是和/在同一个分区;这个Linux系统安装在/dev/hda7上,文件系统(此分区)的标签为LABEL=/ ,/boot也是处于/dev/hda7 ,/dev/hda7也可以说是 root (hd0,6);
[root@localhost ~]# ls -lh /boot/vmlinuz*
我们根据上面所提到的,可以写成如下的样子;
default=0也可以写成;
default=0注解:上面两个不同之处在于一指定Linux的根/所在的分区时,一个是用了文件系统的标签,另一个没有用标签; 本写法主要是把指定/boot所位于的所分区直接写入kernel 指令行;这样就省略了通过root (hd[0-n],y)来指定/boot所位于的分区;
有前面的那么多的讲解,menu.lst写法之二就好理解多了;也得分两种情况,咱们先把/boot并不是独处一个分区,而是和Linux的根分区处于同一个分区;我们以 4)menu.lst第一种方法的写法总结 的实例为例子;
default=0注解: title FC4x 注:自己为这个Linux 起个简单的名,以title开头,然后一个空格,后面就自己发挥吧,FC4或FC4x都行; kernel 空格 (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 空格 ro 空格 root=/dev/hda7 kernel 这行这样理解 kernel (boot所在的分区)/boot/内核文件件全称 ro root=Linux根所位于的分区或标签 initrd 空格 (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img
比如我们查看到df -lh 得到的是 [root@localhost ~]# df -lh我们再进一行查看/etc/fstab 得知; LABEL=/ / ext3 defaults 1 1所以我们应该写成如下的;
title FC4x因为Linux的根分区是/dev/hda7,通过/etc/fstab和df -h的内容得知标签为 LABEL=/的分区就是/dev/hda7 ,所以有;
title FC4x
GRUB的命令行才是王道,如果知道怎么用命令行来启动操作系统,那理解menu.lst的写法也不难;也就是说在开机的时候,不用GRUB的菜单,通过GRUB的命令也是一样能把操作系统引导起来。 因为menu.lst的内容就是GRUB的一个一个的指令集合;是不是Linux这玩意很神奇? 通过命令行来引导操作系统的流程,也没有什么难的;无非是把指令手工输入到grub>提示符的后面;在这个过程中,tab键的命令补齐功能就显得很重要了。如果您不知道有哪些命令,可以输入help;
grub>2)获取帮助GRUB的 help 只要您在grub>提示符的后面输入help 就能得到GRUB所有的命令提示;
grub> help如果需要得到某个指令的帮助,就在 help 后面空一格,然后输入指令,比如;
grub>help kernel3)cat的用法; cat指令是用来查看文件内容的,有时我们不知道Linux的/boot分区,以及/根分区所在的位置,要查看/etc/fstab的内容来得知,这时,我们就要用到cat (hd[0-n],y)/etc/fstab 来获得这些内容;注意要学会用tab键命令补齐的功能; grub> cat ( 按tab 键会出来hd0或hd1之类的;有的弟兄可能会说,我不知道Linux安装在了哪个分区。那根据文件系统来判断一个一个的尝试总可以吧我;只要能cat出/etc/fstab就能为以后引导带来方便; 主要查看/etc/fstab中的内容,主要是Linux的/分区及/boot是否是独立的分区;如果没有/boot类似的行,证明/boot和Linux的/处于同一个硬盘分区;比如上面的例子中LABEL=/ 这行是极为重要的;说明Linux系统就安在标签为LABEL=/的分区中; 如果您的Linux系统/boot和/没有位于同一个分区,可能cat (hd[a-n],y) 查到的是类似下面的;
LABEL=/ / ext3 defaults 1 1
其实这个root (hd[0,n],y)是可以省略的,如果省略了,我们要在kerenl 命令中指定;我们前面已经说过 (hd[0-n],y) 硬盘分区的表示方法的用途;主要是用来指定 /boot所在的分区; 比如我们确认/boot和 (hd0,6),所以就可以这样来输入root (hd0,6) grub> root (hd0,6)如果发现不对,可以重新来过;没有什么大不了的;
kernel 这个指令可能初学者有点怕,不知道内核在哪个分区,及内核文件名的全称是什么。不要忘记tab键的命令补齐的应用; 在这里 root=/dev/hd[a-z]X 是Linux 的/根所位于的分区,如果不知道是哪个分区,就用tab出来的来计算,一个一个的尝试;或用cat (hd[0-n],y)/etc/fstab 中得到Linux的/所在的分区或分区的标签;
grub> kernel /boot/在这里按tab键;这样就列出/boot中的文件了;注解: root=LABEL=/ 是Linux的/所在的分区的文件系统的标签;如果您知道Linux的/在哪个具体的分区,用root=/dev/hd[a-z]X来指定也行。比如下面的一行也是可以的;
grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7也可以把/boot所在的分区的指定 root (hd[0-n],y)这行省掉,直接在kernel 中指定/boot所在的分区;所以就在下面的语法; 如果是/boot和Linux的根同处一个分区; kernel (hd[0-n],y)/boot/vmlinuz ro root=/dev/hd[a-z]X比如: grub>kernel如果是/boot和Linux所在的根不在一个分区;则是; kernel (hd[0-n],y)/vmlinuz ro root=/dev/hd[a-z]X
grub> kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7或下面的输入,以cat 出/etc/fstab内容为准;
grub> kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/
grub> initrd /boot/initrd在这里tab 来补齐;如果/boot是独立的一个分区,应该是如下样子的语法;比如下面的;
grub> initrd /initrd在这里tab 来补齐;7)boot 引导系统;
grub>boot前面的几个步骤都弄好 。就进入引导;尝试一下就知道了。。 实例:/boot和Linux的/处于同一个硬盘分区; grub> cat (hd0,6)/etc/fstab我们指定Linux的根时,可以用cat出来的fstab的内容中Linux的/分区文件系统标签来替代;也就是kernel 那行中 root=/dev/hd[a-z]X;
grub> cat (hd0,6)/etc/fstab如果是/boot和Linux的根分区不在同一个分区,要把kernel和initrd 指令中的/boot去掉,也就是/vmlinuzMMMMMM 或 /initrdNNNN 也可以不用root (hd[0-n]来指定/boot所在分区,要在kernel 和initrd 中指定;比如Linux的/根所位于的分区和/boot所位于的分区都是(hd0,6),并且我们cat出来的/etc/fstab是Linux的/根分区的文件系统的标签为LABEL=/,引导操作系统的例子如下; grub>kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/或
grub>kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7如果/boot位于 /dev/hda6,也就是(hd0,5),Linux的根/位于分区/dev/hda7,并且我们cat 出来的/etc/fstab 中/分区的标签为 LABEL=/。下面的两种方法都可以引导;
grub>kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/或
grub>kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7六、通过GRUB引导Windows操作系统; 1、通过编辑 menu.lst 来引导Windows 系统; 如果您的Windows所处于的分区在(hd0,0),可以在menu.lst 加如下的一段就能引导起来了; title WinXp如果您的机器有两块硬盘,而Windows 位于第二个硬盘的第一个分区,也就是(hd1,0) 您可以用grub的map来指令来操作把两块硬盘的序列对调,这样就不用在BIOS中设置了;在menu.lst中加如下的内容,比如下面的;
title WinXp如果Windows的分区不位于硬盘的第一个分区怎么办呢?比如在(hd0,2); 这个也好办吧,把rootnoverify 这行的(hd0,0)改为 (hd0,2)
title WinXp如果Windows的在第二个硬盘的某个分区,比如说是位于(hd1,2),则要用到map指令;
title WinXp如果有多个Windows 系统,怎么才能引导出来呢?应该用hide 和unhide指令操作;比如我们安装了两个Windows ,一个是位于(hd0,0)的windows 98 ,另一个是安装的是位于(hd0,1)的WindowsXP;这时我们就要用到hide指令了;
title Win982、通过GRUB指令来引导Windows ; 其实我们会写menu.lst了,在menu.lst中的除了title外,都是一条条指令;如果我们启动Windows ,只是输入指令就行了; 比如 Windows的分区在 (hd0,0),我们在开机后,按ctrl+c ,进入GRUB的命令模式;就可以用下面的
grub> rootnoverify (hd0,0)其它同理... ... 如果GRUB是Linux版本才出会这样的问题;WINGRUB可以不写在MBR上;所以不会出现这样的问题。WINGRUB用起来比较简单。menu.lst 和命令行的用法和Linux版本的GRUB是一样的;
请参考:《Linux 系统的单用户模式、修复模式、跨控制台登录在系统修复中的运用》 首先:您根据前面所说grub-install来安装GRUB到/boot所在的分区;要仔细看文档,/boot是不是处于一个独立的分区是重要的,执行的命令也不同; 其次:要执行grub ,然后通过 root (hd[0-n],y)来指定/boot所位于的分区,然后接着执行 setup (hd0),这样就写入MBR了,比如下面的例子; grub>root (hd0,6)重新引导就会再次出现MBR的菜单了或命令行的提示符了;
存在的问题可能是/boot/grub/menu.lst丢失,要自己写一个才行;您可以用命令行来启动系统,进入系统后写一写menu.lst就OK了。前面已经谈过了; 写好后还要建一个grub.conf的链接,如下:
[root@localhost ~]# cd /boot/grub
GRUB有很多内容,比如对BSD的引导,还有一些其它指令的用法,我并没有在本文提到;主要我目前还未用到,如果您需要了解更多,请查看 《GNU GRUB 手册和FAQ》
本文前后写了三四天,中间发现并不能把Linux设备的两种表现形式说的清楚,于是被迫写了《在Linux系统中存储设备的两种表示方法》;由于没有BSD系统,所以没有写关于BSD的引导;如果正在用BSD的弟兄如果有时间不妨写一写;写的时候注意文档的结构,这样方便大家的阅读; GRUB有很多内容,需要大家慢慢的学习和研究;有的弟兄抑制GRUB,说不如NTLOADER,其实这是错误的;如果您想学习和使用Linux就得学习和适应Linux的操作;习惯成自然,如果您抵制学习Linux,那可能您永远会说“Linux不如Windows”; 5/10/2006 中国企业比日本企业少了什么我们的企业究竟比日本少了什么? 在我看来,国内优秀企业与国际社会的最大差距不在于人的素质,而在于管理的体制和方法。作为世界上最发达的工业化国家之一,日本的很多管理方法和经验是世界上公认最好的。由于同样是东方国家,同样是黄色人种,又有相似的文化背景,我认为日本经验的价值可能高于其他任何工业化国家。我们应当更多地学习和借鉴日本的经验,对于其中特别符合中国国情的部分,甚至可以采取“拿来主义”。 盖楼先打好基础。同样,要学习日本企业管理,最好从其基本的地方入手。在日本企业工作的8年,我以此为出发点,一步一步地探索着日本企业的精神和管理的精髓。 1.树立认真踏实的工作态度,培养员工顽强的斗志 毛主席说:“世界上怕就怕认真二字。”凡事只要采取认真的态度,就不怕不成功。这句话真是放之四海而皆准。 一位一同留学的朋友,曾经在勤工俭学期间大骂日本老板。他的工作是打扫洗澡堂。因为日本老板特别讲究干净,要求不锈钢水龙头上不能有指纹,这令他难以接受。“日本人真是吃饱了没事干,吹毛求疵”。一年以后,当他回国探亲时,却不断抱怨家乡的洗澡堂不干净:“还是干净的澡堂洗着舒服,还是认认真真地工作好啊。”他为此感叹不已。 我认识一个餐馆的老板,做事一丝不苟。餐馆里有两道菜他特别注意,一道是烤龙虾,另一道是煎神户牛排(一种相当高级的菜)。当客人没有将这两道菜吃完时,他便要切下剩菜的一小块尝尝,以确认到底是菜做得不好,还是因为客人吃饱了而剩下的。如果发现是前一种原因便会立即向客人道歉,并迅速重新做好一份献上。工作结束后还会长时间的反思和检讨:“我今天工作为什么会这样差,真不像话,再也不能这样了。”老板这样做,其他的员工也这样做。结果,这个餐馆的服务质量一直是这一带最好的。在经济萧条的岁月里,那个地区的其他几家餐馆都倒闭了,唯他生意兴隆。 任何时候都以最认真、最踏实、最兢兢业业的态度对待工作,一丝不苟,精益求精,最大限度地做到最好。这就是日本企业的精神。个人有了这种精神就能在企业内立足;企业有了这种精神就能在行业内立足;国家有了这种精神就能在世界立足。 许多人认为,日本能创造一流的产品,是因为有一流的技术,其实这是不正确的。上世纪50年代初的日本,并没有什么太多的好技术,但日本人已经创造很多一流的产品了,靠的就是这种态度和精神。日本企业重视培养员工的敬业精神,为日本产品走向世界奠定了坚实的基础。 此外,日本企业还重视培养员工顽强的斗志,并认为这是职工能持续地高效率工作的精神支柱。 在日本企业工作,有时候会看见这样的情景:已经深夜了,但办公室仍有不少人在废寝忘食地工作。我工作过的一个公司,一线工作人员的办公室上写的是“前线”二字,工作人员就是前线作战人员,工程的进展就等于战线的推进。“老子大不了今天就死在战场上”,几乎所有的人都有这样的精神。部长经常说的话就是:“大家记住,我们的精神是:有一流的工作条件也好,没有一流的工作条件也好,都要创造一流的产品,努力,努力,努力。”所以,在日本你会发现尽管前一天深夜离开公司时,大家已经筋疲力尽了,但第二天一早,大伙又像上足了发条一样,生龙活虎。 认真踏实的工作态度和顽强的斗志就像两个大力士一样,将日本企业乃至整个国家稳稳当当地支撑起来。 2.工作汇报总结力求简短 现代社会,会议繁多,进入管理层以后,会议就更多了。给上级汇报,听下级的汇报;今天写设计大纲,明天写工作总结;横向的汇报,纵向的汇报等,让人忙得不可开交。如果所有的汇报总结都长篇大论,不仅时间不够用,说不定人会被累死。而且,冗长的汇报总结也让听取者难于抓住重点,严重影响工作效率。 日本企业对付这个问题的方法就是:采取强有力的手段让汇报总结力求简短。 我刚在日本企业就职时,一位部长希望我在写报告时学习两个人,一位是前苏联领导人斯大林,另一位是英国前首相丘吉尔。斯大林要求部下汇报时言简意赅,要使用发电报的语言;而丘吉尔在二战期间,不管战况多么惨烈,国际国内发生了多少重大事件,只允许报告官将每天的所有情况写在一张信签纸上向他汇报。 不知有多少次,社长向我们呼吁:“汇报总结只需要精华,多一个字都不要。”有时,社长看见谁的汇报书特别厚,会问:“你有这么多的精华吗,是因为你是天才呢,还是因为你总结能力不够?”一句话,令长篇大论者羞得无地自容。 3.培养员工单纯化的思想 要让员工将所有精力投入到工作中去,就必须培养单纯化的思想。 回国后,一位同行曾经问我:“在日本企业工作时你能把多少精力投入到工作中去?”“95%”,我回答。“真幸运,我只有40%,也许更少,怪不得你能做这么多工程,既做管理,还能做设计。而我不得不每天将大量的时间花在各种关系应酬上、花在与同事和上级的感情联络上、花在琢磨别人的真实意图上。”假设我和他在单位时间内的效率一样,则我一天的工作效率是他的2.4倍。 在日本企业,你会发现,大家的思想都很单纯。在工作中,人人都自由地表达自己的思想和看法,说话直来直去,毫不掩饰自己的观点,不用琢磨说出一句不好听的话或表达了一个与众不同的观点,是否会影响自己的前途。 企业非常注意培养员工单纯化的思想,尽力将员工的精力最大限度地引导到工作上来,不让公司内部出现复杂的关系网、感情网,也绝不允许记恨或打击报复的现象存在。所以,不管是刚刚毕业的大学生还是即将退休的老职工;不管是技术骨干还是人事干部;不管是最高领导还是底层员工;不管是提拔前还是提拔后,人们的思想结构没有太大的变化,想的都是一个问题:怎样把精力百分之百地投入到本职工作中去,除此之外,什么都不想。 在国有企业工作过的人也许对以下现象有深刻体会:某某经过多年的锻炼,成熟了,老练了,说话会三思而行了。在对他的进步赞美的同时,人们是否计算过他有多少精力消耗在毫无意义的关系应酬和言语词令上,他有多少闪光的智慧和谋略被埋葬在企业内部复杂的思想体系中呢? 为什么获得诺贝尔奖的炎黄子孙到目前为止都是外国籍,在国有企业现有体制下他们还能取得如此成就吗? 4.不论奖惩都公开进行 奖励和批评是管理的一大技巧,在运用这一技巧时,不论是奖励还是批评,都最好是正式的、严肃的,并且面对大家进行。 奖励赞美先进者,批评训斥后进者是理所当然的事。赞美是对先进者的肯定;批评是对后进者的鞭策。但如果将此技巧施展于大庭广众时,会更有利于工作效率的提高。 人是有荣誉感和耻辱感的。在众人面前,这种感觉尤其强烈,且刻骨铭心。正式地、大声地在众人面前奖励和赞美受奖者能使其获得最大的满足,舒缓其因工作带来的压力,激励其再接再厉,加倍努力。同样,在坐满工作人员的办公室或会议室里严厉地批评后进者和犯错误者,更能使其深刻反省,催促其痛改前非。 这便是管理方面的双赢。而众多的旁观者既能从受奖者方面得到好的影响,以其为榜样努力工作;也容易从被批评者上吸取教训,不至于重蹈覆辙。 5.合理编制精干的工作小组 以我工作过的土木设计咨询公司设计部为例。每个小组由4~5名设计人员组成,在一名主任设计工程师的领导下进行工作,称为“三三制(即主任设计工程师1/3的时间用于指导工作小组的设计;1/3的时间用于自己部分的设计;1/3的时间用于管理、协调,解决技术难题及平衡工作)五人团队”。 从美国、日本等工业化国家的经验来看,以这样的小组组成的团体既有强大的战斗力,又比较精干,分工较清晰,人员不容易重叠,便于管理,并且能很好地保障工程的顺利进行。各小组负责人既要具有较高的设计水平,又要具有较强的协调、交流和平衡能力。各小组之间实行公平竞争,完全以业绩进行考核。但各小组之间的设计成果毫不保密,一旦哪个小组有好的建议、方法及成功的经验,立即在其他小组推广。既提高了效率,又充分发挥了设计人员的主观能动性。 这样的编制和时间分配也使各小组负责人管理任务并不繁重,有充裕的时间自己进行设计和指导小组成员进行设计。各小组中指定一名各方面能力比较强的预备负责人,以备在特殊情况下临时接管负责人的工作和职务。由上级领导指定的具有很高设计水平和协调能力的总监监督总体工作的进展,解决技术难题,协调与各分包公司、上下级公司的关系以及向业主汇报工程进展。各小组负责人每天向总监简要地汇报工作。总监每周定时召集所有的设计人员召开短时间的业务会,公开表扬业绩好的小组及个人,赞美提出合理化建议的人员,并承诺业绩和合理化建议将作为颁发奖金、评定职称的一个参数,以此激励人们的聪明才智和灵感,保证工程一直能按高质量、高标准进行。 大型工程不是一个人就能完成的产品,即使是天才所发出的光芒也是有限的,它是一个团队共同创造的成果。通过合理化的编制、强有力的工作小组以及适时的横向和纵向的协调工作就能集思广益,威力无穷,创造出最好的作品来。 6.培养员工的追赶意识和追赶精神 科学家们发现:在追赶一个领先的目标时,人所展示出的能力可能是没有目标时的数倍。 1945年日本二战战败时,无疑是世界上最穷的国家之一。战后的日本政府迅速制定了国家重振计划,锁定了短期、中期和长期的追赶目标,并在国民中推广追赶意识和追赶精神,强化危机感教育。 全国上下群情振奋,斗志高昂。各城市、各公司、各项目组以及每个人都确定了追赶目标;城市与城市比,公司与公司比,个人与个人比;除了与国内同行比,还与国际同行比;比产品质量比吃苦耐劳,比谁先追上目标,比谁更赢得顾客的尊重。 为了早一点赶上目标,大多数人会自愿将自己的精力尽量多用在工作上。每当赶上一个目标,便欢呼雀跃,击掌庆祝。集体和集体之间相互鼓励;个人和个人之间也相互鼓励。于是,日本人的能力得到了最大程度的发挥;日本企业显示出惊人的效率;日本的GDP增长达到了世界最快;日本人创造了一个又一个的奇迹…… 日本被公认为最成功的追赶国家。今天的日本,拥有世界上最先进、最繁忙、最密集的铁路网络系统;日本的外汇储备雄踞世界第一;日本的海外资产有两万多亿美元;日本人的平均寿命连续十几年世界最长,但日本人还在各个领域寻找追赶的目标。 7.提倡模仿 在日本生活时间稍长一点的人也许会发现,日本中小企业人员素质并不高,工作环境和软硬件设施也不比国内同行好,但效率却很高,很有活力。原因是什么呢?很简单:模仿。 中国有一句谚语:照葫芦画瓢。很多人对此不屑一顾,认为照葫芦画瓢的人都很笨,没有创新,没有出息。其实,对普通人来说,一生中的创新也就那么一点,大部分还是学习和继承别人的精华,而学习和继承的最简单方法就是模仿。 拿我在日本的公司来说,大部分雇员的素质不及现在设计院的同事,但设计图和设计计算书的质量仍然很高。原因是他们选用的样本比较标准,雇员也照样本认真做,因此做出的东西质量很高。 我在日本从事铁路桥梁的设计,每当新设计规范发行时,“日本铁道综合技术研究所”就会发行相应的设计算例或范本。设计算例都是由专家做的,并且经过了反复检查审核,覆盖了可能出现的各种问题,堪称精品。这些精品说穿了就是为了教大家模仿用的。 每当要进行设计工作时,设计人员便选出相应的算例,然后基本上按照相同的步骤展开工作。通常情况下,按部就班就能完成80%~90%的工作,剩下很小的一部分才请教专家或通过集体讨论解决。 一个工程下来,不管是新手还是老手都进步显著,几个工程下来就会在头脑中形成一整套设计思路,并且通过总结还可以提出一些改进的建议和措施。几年下来,大部分人已在某个领域有所建树了,优秀者甚至已成了专家。所以模仿是一种很好的学习和进步的方法,应该提倡模仿。 8.对员工行为举止高标准严要求 学生时代起,老师和长辈就告诉我们:“一个人的外表可以反映心灵。”外国人说:“一流的企业由绅士和淑女组成,三流企业的雇员仪表行为举止个个邋遢。”中外认识惊人的一致。 端庄整洁的外貌让人亲近;也使自己心情舒畅,充满自信。在社会交往中,容易给人留下美好的印象,是提高你地位的最佳方式,无形中,你已经战胜很多对手了。 看看丰田公司的骨干,男人哪个不是穿着整洁,西装革履,头发梳理得整整齐齐,从下到上,标准的绅士打扮;而女雇员则人人略施粉黛,衣着得体,完全的淑女。站有站相,坐有坐相,行为举止优雅,彬彬有礼是上班第一天的必修课。奇装异服、衣着不洁者被拒绝进入公司,行为举止粗鲁者请到别处去。 也许你会问:“我也见过日本大公司的职员有染着黄头发,上班穿着牛仔服的。”我的回答是:“上司会告诉你,别和那些人一般见识,他们没有前途,你要为公司增光,做一个绅士。” 在日本工作时,部长要我们随身携带两样东西:口香糖和梳子。以备与客人商谈前进行短暂的形象处理。 我当过兼职翻译,参加过一些国际谈判。亲眼见过我方的一些代表团成员由于不注意仪表仪态而被对方看不起的痛心事例。很多时候,我方在谈判前就已经输给其对手一半了。 9.要求员工体育锻炼 回国工作时间虽短,有一点却很清楚,国内同行个个都相当聪明,绝对优秀,但健康状况普遍不及日本同行。大肚子明显比日本同行多,体育锻炼意识不强。 现代社会的发展,使得社会分工越来越细,环节也越来越多,往往是一人负责一环,环环相扣。如果谁身体不好,经常生病,自己不但要受罪,还会增加公司负担。更重要的是,工程进展得不到保证,影响公司经营。 为了自我的生存,集体的生存,也为了国家的生存,日本企业便极度重视员工的身体健康,倡导员工参加体育锻炼。 在企业内部,工作以外最多的话题就是有关身体健康和体育锻炼了。上级有责任向下级、前辈有责任向后辈灌输身体健康和体育锻炼重要性的思想,教导养成良好生活习惯的方法。 周末一到,上司总是苦口婆心地劝我们休息日别待在家里,要多锻炼身体,这样才能消除疲劳,恢复体力。 每次公司员工体检完毕,部长总是打听每人的各项检查指标。“远藤的肺活量比去年增加了,不错。”“小野寺的脂肪率超过全国平均值6个百分点,不像话,给我锻炼。”“对了,向先生,金井可是你的部下哟,你别只管自己,休息日你带上他一块跑步。” 因为我长期以来比较重视体育锻炼,每年检查时各项指标都比较好。去年,由于我在仰卧起坐这个项目上的成绩超出日本平均水平很多,得到了部长的特别表扬:“大家看啦,向先生真厉害,仰卧起坐成绩这么好,中国人超过日本人啦,您们要好好向他学习,加油啊。这个周末都打棒球去。” 10.正视员工的发泄及正确引导员工发泄 长期以来,发泄被认为是一个贬义词,是一个不友好、不健康的行为。其实,发泄是人的一种本能。当肉体和精神的压力达到一定程度时,人是需要通过发泄来缓解或消除紧张的。无视这种现象不仅会伤害员工的身体健康,挫伤员工的工作积极性,还可能加大同事之间、上下级之间的误解。正确引导员工的发泄能显示领导者的管理艺术。 体育锻炼是一种非常好的发泄方式,特别是剧烈的、对抗性强的体育项目,如足球、排球、棒球、橄榄球等。 卡拉OK的发泄效果相当好。卡拉OK是日本人20世纪的杰作,当初发明的意图除了自我表现以外,还考虑了发泄因素。我们经常能看到这样一种现象,日本人在卡拉OK厅唱歌就如同杀猪一样的嚎叫,甚至泪流满面、泣不成声,但第二天上班却精神抖擞,如猛虎下山。 下班后偶尔去餐馆吃顿饭喝喝酒也是一种很好的发泄方式。大家天天在一起工作,朝夕相处,就算是最好的关系,也难免发生矛盾,产生误解。如果让矛盾、误解积小成大,终有一天会出事的。于是,周末或月末,同事、上下级相邀,外出吃饭喝酒,在谈笑声中,在觥筹交错之中,相互问候,祝愿对方健康,祈祷公司发展,互赔不是。结果,不满和误解得到发泄,同事关系、上下级关系拉近了,大家也不计较以前的言语过失了。 结语 我以为,本文探讨的十方面内容既体现了日本企业的精神,也构成了日本企业管理的最基本的框架,是最行之有效的措施,也是我们的企业比日本缺少的宝贵财富。 回国后发现,我周围有大量青年朋友和同事。他们从来耻于与日本人为伍,更别提向日本人学习。另外,不少国人特别是热血青年因为历史原因痛恨日本的一切,否定日本的一切,甚至瞧不起日本,不愿意学习其先进的东西。 近几年中日关系的恶化更加剧了这种趋势。在当今开放的社会,在我们这个刚刚恢复元气,有着远大志向并在各个方面正加倍努力的国家,抵制日本先进的思想、技术和管理方式只会阻碍自己的进步,满腔的热血和震耳欲聋的口号如果不化为实际的行动,将是毫无意义的,而狭隘的爱国主义更会引人误入歧途。 以我之见,真正的爱国者应该勇于承认与对手的差距,尊重对手,毫不犹豫地学习对手的一切长处。如果要让我向勇敢的企业改革者和管理者奉献更精辟的提案,那便是:学习日本,彻底改革。 3/1/2006 squid和squidGuard配置代理服务器前言: 本文主要介绍了在linux使用squid和squidGuard配置代理服务器,以www代理服务为例介绍如何过滤有害站点和限制用户对internet的访问。 一. 介绍 Squid是linux下最为流行的代理服务器软件,它功能强大,支持对HTTP,FTP,Gopher,SSL和WAIS等协议的代理;设置简单,只需对配置文件中稍稍改动就可使代理服务器运转起来。而且Squid具有页面缓存功能,它接收用户的下载申请,并自动处理所下载的数据。也就是说,当一个用户象要下载一个主页时,它向Squid发出一个申请,要Squid替它下载,然后Squid连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid把保存的备份立即传给用户,使用户觉得速度相当快。 squidGuard则是作为squid的辅助软件,完成过滤、重定向和访问控制的功能。它是一个自由软件,功能强,便于安装、易于配置、而且处理速度快。功能主要包括:根据web服务器或URLs列表限制一些用户的访问;阻塞某些用户对黑名单上的web服务器和URLs的访问;阻塞某些用户对正则表达式匹配的URLs的访问;在URL路径加强了使用域名访问而禁止用IP访问;重定向阻塞的URLs到一个智能CGI的信息页;重定向非授权用户到一个注册页面;具有基于日期、每周、每天具体时间的访问规则;对不同用户组有不同的规则。但是不能过滤、检查文档中的文本以及HTML中的JavaScript或Vbscript脚本语言。 二. 安装 1。安装squid: 从www.squid-cache.org下载squid-2.4.STABLE2-src.tar.gz存在本地/usr/local/squid/src下。 在编译Squid之前,建立一个专门运行Squid的用户和组,这里建立了名为squid的组和用户,用户目录设为/usr/local/squid #su squid $cd /usr/local/squid/src $tar xvzf squid-2.4.STABLE2-src.tar.gz $ cd squid-2.4.STABLE2 $./configure $make $make install (默认安装到/usr/local/squid目录下) 2。安装Berkeley DB 2.x: 从http://www.sleepycat.com 下载db-2.7.7.tar.gz并存在/usr/local/squidGuard/src/目录下 $su #cd /usr/local/squidGuard/src/ #tar xvzf db-2.7.7.tar.gz #cd db-2.7.7 #cd build_unix #../dist/configure #make #make install (默认安装到/usr/local/BerkeleyDB目录下) 注意:squidGuard不支持Berkeley DB 3.x版本 3。安装squidGuard 从http://ftp.ost.eltele.no/pub/www/proxy/squidGuard/squidGuard-1.1.4.tar.gz下载软件包并存于本地/usr/local/squidGuard/src/ #cd /usr/local/squidGuard/src/ #tar xvzf squidGuard-1.1.4.tar.gz #cd squidGuard-1.1.4 #./configure --with-sg-config=/usr/local/squidGuard/squidGuard.conf --with-sg-logdir=/usr/local/squidGuard/logs --with-sg-dbhome=/usr/local/squidGuard/db #make #make test //测试ok,即可进行下一步安装 #make install 三. 配置 1.配置squid: 修改squid的配置文件/usr/local/squid/etc/squid.conf: http_port 8080 #squid的代理端口,使用1024以下的端口,squid必须以root身份运行 http_access allow all #允许所有的用户通过代理进行http访问 redirect_program /usr/local/squid/bin/squidGuard -c /usr/local/squidGuard/squidGuard.conf #squid启用squidGuard进行过滤和转发 其它参数: cache_mem:设置代理服务使用的内存大小,一般推荐为物理内存的三分之一 cache_dir:指定cache目录的路径,默认为/usr/local/squid/cache。 maximum_object_size: 指定Squid可以接收的最大对象的大小。Squid缺省值为4M,可以根据自己的需要进行设定。 cache_dir:设定缓存的位置、大小。一般格式如下: cache_dir /usr/local/squid/cache 100 16 256 /usr/local/squid/cache代表缓存的位置;100代表缓存最大为100M;16和256代表一级和二级目录数。 cache_effective_user:设定使用缓存的有效用户。缺省为用户nobody,如果系统中没有用户nobody,最好建一个或以非root用户运行Squid。这里是以squid身份运行的 cache_effective_group:设定使用缓存的有效用户组。缺省组为nogroup,如果系统中没有组nogroup,最好建一个组。这里是squid组。 (其余参数用默认值即可!) 2.配置squidGuard: 修改squidGuard的配置文件/usr/local/squidGuard/squidGuard.conf文件: logdir /usr/local/squidGuard/logs #日志目录定义 dbhome /usr/local/squidGuard/db #db目录定义 time testtime { #时间规则定义 weekly mtwhf 05:00 - 10:30 weekly as 08:00 - 19:00 date *-*-01 08:00 - 16:30 date 2001.10.01 - 2001.10.09 } src admin { #源组定义 ip 192.168.100.18 } src client{ ip 192.168.100.20 192.168.100.21 192.168.100.22 ip 192.168.200.0/24 } dest porn { #目标组定义 domainlist porn/domains urllist porn/urls expressionlist porn/expressions } acl { #访问规则定义 admin within testtime { pass !porn all } else { pass all } client { pass !in-addr !porn all } default { pass none redirect http://admin.foo.com (#也可以重定向到一个含有一些信息的cgi页面,如下: http://admin.foo.com/cgi/blocked?clientaddr=%a&clientname=%n&clientuser=%i&clientgroup=%s&targetgroup=%t&url=%u) } } # vi db/porn/domains (域列表文件:主要是阻塞一些定义的站点) co.za sex.com (如上,可以阻塞如hack.co.za、sex.com、www.sex.com、whatever.sex.com,但是不同于.*[^.]sex.com,不匹配ssex.com) # vi db/porn/urls (url列表文件,主要是阻塞一些站点及其一些栏目) qihui.com/sex valen.sohu.com/album (如上可阻塞http://qihui.com/sex、http://qihui.com/sex/whatever、ftp://qihui.com/sex、http://www.qihui.com/sex等) # vi db/porn/expressions (表达式列表文件,主要是阻塞一些与表达式匹配的URL访问) (^|[?+=/])(.*)(girl)(.*)([?+=/]|$) (上面的正则表达式可以阻塞URL中包括girl站点的访问,如:www.girlzine.com、girl.huabao.net、www.huayu.net/girl、www.universiti.com/girl等 ) 注意:squidGuard对配置文件的语法要求很严,如果配置文件语法有误,squidGuard仍能运行,但是squidGuard已进入应急模式,此时代理服务不具有任何阻塞作用,所有通过该代理的访问都可通过,可以查看logs/squidGuard的日志文件,即可发现错误,例如: 2001-12-20 17:08:44 [2430] parse error in configfile /usr/local/squidGuard/squidGuard.conf line 8 2001-12-20 17:08:44 [2430] going into emergency mode ……. 其中配置文件第8行有误,squidGuard进入应急模式。 配置的具体说明详见http://www.squidguard.org/ 四. 运行: $ chmod 777 /usr/local/squid/logs (设置logs对所有用户为可写。这样,不特定的squid代理客户才能正常访问代理服务器,并能在logs目录、产生access.log、cache.log等文件。) $ /usr/local/squid/bin/squid -z (手工建立squid的缓存目录/usr/local/squid/cache。) #/usr/local/squid/bin/squid (后台执行squid。如果想前台执行squid:如果你想前台执行Squid执行命令: $/usr/local/squid/bin/squid -NCd1 该命令正式启动Squid。如果一切正常,你会看到一行输出: Ready to serve requests ) # ps ax|grep squid 20198 ? S 0:00 /usr/local/squid/bin/squid 20200 ? S 0:27 (squid) 20310 ? S 0:00 (squidGuard) -c /usr/local/squidGuard/squidGuard.conf 20311 ? S 0:00 (squidGuard) -c /usr/local/squidGuard/squidGuard.conf 20312 ? S 0:00 (squidGuard) -c /usr/local/squidGuard/squidGuard.conf 20313 ? S 0:00 (squidGuard) -c /usr/local/squidGuard/squidGuard.conf 20314 ? S 0:00 (squidGuard) -c /usr/local/squidGuard/squidGuard.conf (此时squidGuard也已启用,每次修改配置后squid -k reconfigure重新起用即可,要杀掉squid执行squid -k kill) 查看squidGuard日志文件: init domainlist /usr/local/squidGuard/db/porn/domains 2001-12-20 16:14:43 [2270] init domainlist /usr/local/squidGuard/db/porn/domains 2001-12-20 16:14:43 [2270] init urllist /usr/local/squidGuard/db/porn/urls 2001-12-20 16:14:43 [2270] init expressionlist /usr/local/squidGuard/db/porn/expressions 2001-12-20 16:14:43 [2270] squidGuard 1.1.4 started (1008836083.022) 2001-12-20 16:14:43 [2270] recalculating alarm in 917 seconds 2001-12-20 16:14:43 [2270] squidGuard ready for requests (1008836083.044) 表示squidGuard已正常启动 五. 测试: 配置客户端,然后测试代理服务: 在另一台win2k上,(以Internet Explore5.0为例)运行IE,单击"工具",接着单击"Internet选项",再单击"连接"选项卡,单击"局域网设置";在"局域网设置"窗口中,在"地址"处填上squid服务器的IP地址192.168.100.16,在"端口"处填上"8080"(修改后squid代理使用的端口号,也就是squid.conf中的http_port,默认值为3128),确定后退出。 接下来,先把IP改成192.168.100.20,浏览一些网站,如sohu,163等,然后再试试domains和urls中定义的,如hack.co.za、qihui.com/sex,会发现主页被重定向到http://admin.foo.com。然后再试试浏览有关girl的网站,去不了了:(;在sohu中搜girl也被重定向了;用IP试试(有些代理程序对IP不做限制,用IP可以绕过代理的限制访问一些禁止的站点),可惜不行!(因为squidGuard配置文件中使用了!in_addr,所以可以强迫用户使用域名访问而不能使用ip访问) 再下来,把IP改成192.168.100.18,然后时间改为testtime外的时间,浏览网页,试试结果,然后再将时间改为testtime内浏览网页! 最后,把IP改成192.168.100.30,浏览网页测试。 (可以查看logs下的access.log和cache.log,看看是否代理运行正常以及访问的站点记录) 总结: 由上可见,用squid和squidGuard建立的代理服务器,配置比较简单,而且功能强大,可以有效的限制一些用户对internet的访问并过滤一些黑名单列出的站点(如色情站点等)。 这里只简单的介绍了关于http代理的例子,其它的应用和功能大家可以自己试试。 2/24/2006 人生常遇到的九个定律办事定律:总是匆匆忙忙的人其实没办什么大事;办大事的人从来不会匆匆忙忙。 时髦定律:某种服饰一旦被大家认为时髦 时,就已经不时髦了。 失误定律:越是怕失误的时候,失误就越是会找上门来。 面子定律:逞多大的能,出多大的丑。 会议定律:参加会议的人越多,会议的内容越不重要。 合作定律:合作做生意,朋友会变仇人;合作去历险,仇人会变朋友。 个性定律:一个人的个性与他的业务能力成正比。一个人的业务能力越强,个性也越强;一个人的业务能力越差,也也越没个性。 尊重定律:越是表面上被大家尊重的人,就越是容易受到大家的轻视。 幸福定律:如果你不是总在想自己是否幸福的时候,其实你就是幸福的。 1/24/2006 busyboxbusybox简介 busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分力式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用,另外,大多数linux发行版的安装程序中都有busybox的身影,安装linux的时候案ctrl+alt+F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接.
#tar xvfz busybox-1.00.tar.gz 下面是需要编译进busybox的功能选项,其他的可以根据需要自选 Build Options Installation Options 其他选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了. 配置好后退出并保存. #make 编译好后在busybox目录下生成子目录_install,里面的内容: Linux下cron的使用cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
/sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service crond restart //重启服务 /sbin/service crond reload //重新载入配置 你也可以将这个服务在系统启动的时候自动启动: 在/etc/rc.d/rc.local这个脚本的末尾加上: /sbin/service crond start 现在Cron这个服务已经在进程里面了,我们就可以用这个服务了,Cron服务提供以下几种接口供大家使用: 1.直接用crontab命令编辑 cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明: crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 crontab -l //列出某个用户cron服务的详细内容 crontab -r //删除没个用户的cron服务 crontab -e //编辑某个用户的cron服务 比如说root查看自己的cron设置:crontab -u root -l 再例如,root想删除fred的cron设置:crontab -u fred -r 在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e 进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt 分钟 (0-59) 小時 (0-23) 日期 (1-31) 月份 (1-12) 星期 (0-6)//0代表星期天 除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"*/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。以下举几个例子说明问题: 每天早上6点 0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。 每两个小时 0 */2 * * * echo "Have a break now." >> /tmp/test.txt 晚上11点到早上8点之间每两个小时,早上八点 0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点 0 11 4 * 1-3 command line 1月1日早上4点 0 4 1 1 * command line 每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。 2.编辑/etc/crontab 文件配置cron cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是: SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 HOME=/ //使用者运行的路径,这里是根目录 # run-parts 01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本 02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本 22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本 42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本 大家注意"run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了。 Linux 实时技术与典型实现分析Linux 实时技术与典型实现分析 一、实时的概念 二、衡量实时性的指标 1. 中断延迟 中断延迟就是从一个外部事件发生到相应的中断处理函数的第一条指令开始执行所需要的时间。很多实时任务是靠中断驱动的,而且中断事件必须在限定的时限内处理,否则将产生灾难性后果,因此中断延迟对于实时系统来说,是一个非常重要的指标。 2. 抢占延迟 有时也称调度延迟,抢占延迟就是从一个外部事件发生到相应的处理该事件的任务的第一条命令开始执行的时间。大多数实时系统都是处理一些周期性的或非周期性的重复事件,事件产生的频度就确定了任务的执行时限,因此每次事件发生时,相应的处理任务必须及时响应处理,否则将无法满足时限。抢占延迟就反映了系统的响应及时程度。 如果以上两个指标是确定的,可预测的,那么就可以说系统是实时的。 三、影响系统实时性的因素 现代的高性能的硬件都使用了cache技术来弥补CPU和内存间的性能差距,但是cache却严重地影响着实时性,指令或数据在cache中的执行时间和指令或数据不在cache中的执行时间差距是非常巨大的,可能差几个数量级,因此为了保证执行时间的确定性和可预测性,来满足实时需要,一些系统就失效了cache或使用没有cache的CPU。 另一个硬件方面的影响因素就是虚存管理,对于多用户多任务的操作系统,它确实非常有用,它使得系统能够执行比物理内存更大的任务,而且各任务互不影响,完全有自己的独立的地址空间。但是虚存管理的缺页机制严重地影响了任务执行时间的可预测性和确定性,任务执行时使用缺页机制调入访问的指令或数据和被执行的指令和数据已经在内存中需要的执行时间的差距是非常大的。因此一些实时系统就不使用虚存技术,例如 Wind River的VxWorks。 在软件方面,影响因素包括关中断、不可抢占、一些O(n)的算法。 前面已经提到,中断延迟是衡量系统实时性的一个重要指标。关中断就导致了中断无法被响应,增加了中断延迟。 前面提到的抢占延迟也是衡量系统实时性的重要指标。如果发生实时事件时系统是不可抢占的,抢占延迟就会增加。 还有就是一些时间复杂度为O(n)的算法也影响了执行时间的不确定性,例如任务调度算法,要想执行实时任务必须进行调度,如果调度算法的执行时间取决于当前系统运行的任务数,那么调度实时任务所花费的时间就是不确定的,因为它是与系统运行的任务数呈线性关系的函数,运行的任务越多,时间就越长。 四、嵌入式系统需要实时Linux Linux的开放性和低成本是实时Linux发展的优势,越来越多的研究机构和商业团体开展了实时Linux的研究与开发,其中最著名的就是FSMLab的Rtlinux和TimeSys Linux。还有一个就是Ingo's RT patch。 五、标准Linux内核制约实时性的因素 1.内核不可抢占 在Linux 2.4和以前的版本,内核是不可抢占的,也就是说,如果当前任务运行在内核态,即使当前有更紧急的任务需要运行,当前任务也不能被抢占。因此那个紧急任务必须等到当前任务执行完内核态的操作返回用户态后或当前任务因需要等待某些条件满足而主动让出CPU才能被考虑执行,这很明显严重影响抢占延迟。 在Linux 2.6中,内核已经可以抢占,因而实时性得到了加强。但是内核中仍有大量的不可抢占区域, 如由自旋锁 (spinlock)保护的临界区,以及一些显式使用preempt_disable失效抢占的临界区。 2.中断关闭 Linux在一些同步操作中使用了中断关闭指令,中断关闭将增大中断延迟,降低系统的实时性。 3.自旋锁(spinlock) 自旋锁是在可抢占内核和SMP情况下对共享资源的一种同步机制,一般地一个任务对共享资源的访问是非常短暂的,如果两个任务竞争一个共享的资源时,没有得到资源的任务将自旋以等待另一个任务使用完该共享资源。这种锁机制是非常高效的,但是在保持自旋锁期间将失效抢占,这意味着抢占延迟将增加。在2.6内核中,自旋锁的使用非常普遍,有的甚至对整个一个数组或链表的便历过程都使用自旋锁。因此抢占延迟非常不确定。 4.大内核锁 由于历史原因,内核一直保留有几个大内核锁,大内核锁实质上也是一种自旋锁,但是它与一般的自旋锁的区别是,它是用于同步整个内核的,而且一般该锁的保持时间较长,也即抢占失效时间长,因此它的使用将严重地影响抢占延迟。 5.中断总是最高优先级的 在Linux中,中断(包括软中断)是最高优先级的,不论在任何时刻,只要产生中断事件,内核将立即执行相应的中断处理函数以及软中断,等到所有挂起的中断和软中断处理完毕有才执行正常的任务。因此在标准的Linux系统上,实时任务根本不可能得到实时性保证。例如,假设在一个标准Linux系统上运行了一个实时任务(即使用了SCHED_FIFO调度策略并且设定了最高的实时优先级),但是该系统有非常繁重的网络负载和I/O负载,那么系统可能一直处在中断处理状态而没有机会运行任何任务,这样实时任务将永远无法运行,抢占延迟将是无穷大。因此,如果这种机制不改,实时Linux将永远无法实现。 6.调度算法和调度点 在Linux 2.4和以前的版本,调度器的时间复杂度是O(n)的,而且在SMP的情况下性能低,因为所有的CPU共享一个任务链表,任何时刻只能有一个调度器运行。因此,抢占延迟很大程度上以来于当前系统的任务数,具有非常大的不确定性和不可预测性。 在2.6内核中引入的O(1)调度器很好地解决了这些问题。 此外,即使内核是可抢占的,也不是在任何地方可以发生调度,例如在中断上下文,一个中断处理函数可能唤醒了某一高优先级进程,但是该进程并不能立即运行,因为在中断上下文不能发生调度,中断处理完了之后内核还要执行挂起的软中断,等它们处理完之后才有机会调度刚才唤醒的进程。在标准Linux内核中,调度点(有意安排的执行任务调度的点)并不多,对2.4和2.6内核测试的结果表明,缺乏调度点是影响Linux实时性的一个因素。 六、现存的Linux实时技术 1. RTLinux RTLinux是著名的研究机构FSMLab研发的一款实时Linux,既有GPL和Free版本,又有商业版本。它使用的实现方式是子内核方法,即把Linux内核作为一个新实现的子内核的闲暇任务,子内核位于Linux内核和硬件抽象层之间,实时任务运行于子内核之上,只有当没有实时任务需要运行时,Linux内核才有机会运行。 特别是对中断的管理,它采用了一种软件的方式来处理Linux内的中断关闭,当Linux内核关闭中断后,并不是真正地屏蔽了硬件中断,相反,它使用了一个变量来保存Linux内核的中断标志位,Linux内核的开关中断只是影响了该变量,硬件的中断由子内核来接管,当Linux内核关闭了中断,子内核仍然可以响应任何中断,只是如果子内核不需要处理的中断才交给Linux内核来处理,如果Linux内核关闭了中断,子内核将记录该中断并在Linux内核打开中断后提交它处理。 在RTLinux里,每一个实时任务都是内核线程,运行在内核空间,RTLinux提供了一套专门的机制来在实时任务和普通的Linux任务之间进行进程间通信。 这种子内核的实现提供了非常好的实时性,完全是一个硬实时的Linux。 2.TimeSys Linux Timesys很早就发布了实时Linux的商业版以及GPL版,它采用了与RTLinux完全不同的实现方式。前面已经提到了标准Linux内核的实时限制,TimeSys Linux就是通过消除这些限制来达到实时性的。它把中断(IRQ)和软中断(softIRQ)全部线程化并赋予不同的优先级,实时任务可以有比中断线程更高的优先级,它使用Mutex替代spinlock来使得自旋锁完全可抢占。它也对调度器做了优化使它是O(1)的(注:因为使用2.4内核)。由于中断已经线程化了,很多中断关闭就没必要了,因而消除了很多中断关闭区域。它还实现了对CPU和网络资源的预定来改善实时性。后面将说的Ingo's RT patch就是借鉴这些思路来实现实时性的。 这种实现方式保持了全部的Linux应用编程模式,实时应用和普通的应用采用同样的编程方式,使用同样的API,只是实时任务需要明确指定自己的优先级与调度策略。但是这种实现方式也有弊病,那就是它满足硬实时性有一定的困难,因为即使中断关闭和不可抢占区大为减少,但是还是存在,一些中断还是无法线程化,如时钟中断等。 3. Ingo's RT patch Ingo's RT patch是又一个Linux实时实现,它采用了与TimeSys完全相同的技术路线,而且有一些实现是基于TimeSys的源代码的,如IRQ和softirq线程化。但是它与前面提到的两个实时实现不同的地方是,它可能并入到标准Linux内核(作者预见,可能并入到2.6.13或以后的某个版本中)。在最新的标准内核Linux 2.6.11中,已经出现了这个补丁曾经包含的部分代码,如IRQ子系统,那是IRQ和softirq线程化的基础,已经隐含了一些线程化的代码,如自愿抢占代码,那是2.4的低延迟补丁(low latency patch)和Ingo的一些自愿抢占代码以及Robert Love的锁分解补丁的集合,还有可抢占的大内核锁。 Makefile介绍Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中纪录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。 Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。 Makefile的基本结构不是很复杂,但当一个程序开发人员开始写Makefile时,经常会怀疑自己写的是否符合惯例,而且自己写的Makefile经常和自己的开发环境相关联,当系统环境变量或路径发生了变化后,Makefile可能还要跟着修改。这样就造成了手工书写Makefile的诸多问题,automake恰好能很好地帮助我们解决这些问题。 使用automake,程序开发人员只需要写一些简单的含有预定义宏的文件,由autoconf根据一个宏文件生成configure,由automake根据另一个宏文件生成Makefile.in,再使用configure依据Makefile.in来生成一个符合惯例的Makefile。下面我们将详细介绍Makefile的automake生成方法。 Makefile 的分布: 由于 Linux 内核源代码是按照树形结构组织的,所以 Makefile 也被分布在目录树中。 用户通过 make menuconfig 配置内核à产生.configà 顶层 Makefile 读入 .config 中的配置选择à顶层 Makefile 递归的进入到内核的各个子目录中,分别调用位于这些子目录中的 Makefile。至于到底进入哪些子目录,取决于内核的配置à 位于各个子目录下的 Makefile 同样也根据 .config 给出的配置信息,构造出当前配置下需要的源文件列表,并在文件的最后有
$@ 规则的目标所对应的文件名
隐式规则 模式规则 .PHONY :clean -c DIR 读取makefile之前改变到指定的目录DIR 1/23/2006 Linux 系统裁减指南《Linux 系统裁减指南 (LiPS)》 【原创】 (LiPS: Linux Powered System) 华中科技大学信息存储系统实验室 产品版本 密级 项目名称 项目ID 共 46 页 文档编号 NAS 项目 LiPS 详细设计说明书 ———————————— (Linux 系统裁减指南) 一种创建小型化Linux系统的方法 拟制: 董晓明 日期: 2003-6-17 评审: 日期: 批准: 日期: yyyy/mm/dd 签发: 日期: yyyy/mm/dd 华中科技大学信息存储系统国家专业实验室 版权所有 不得复制 修 订 记 录 日期 修订版本 描述 作者 2003-6-17 0.1 初稿,文档结构,USB引导盘制作步骤。 董晓明 2003-8-19 0.9 完成了文档的主要内容。 董晓明 2003-10-15 参考[9]对文档中进行了完善和补充,修正了一些不准确的描述。本文档的内容组织 跟该书的结构不谋而合啊。 董晓明 2003-10-24 补充了init,PAM和再论initrd节。 董晓明 2003-12-9 增加有关远程串口控制台的内容。 董晓明 目 录 1 引言 6 1.1 编写目的 6 1.2 背景 6 1.3 定义 6 1.4 参考资料 6 2 总体描述 8 2.1 硬件环境 8 2.2 软件环境 8 2.3 需求规定和约束 8 3 总体设计 9 3.1 基本设计概念 9 3.2 软件结构 9 4 内核 10 4.1 创建内核的方法 10 4.2 内核配置 10 4.2.1 概述 10 4.2.2 Loadable module support 11 4.2.3 Processor type and features 11 4.2.4 General setup 12 4.2.5 Plug and Play configuration 12 4.2.6 Block devices 12 4.2.7 Multi-device support (RAID and LVM) 13 4.2.8 Networking options 13 4.2.9 ATA/IDE/MFM/RLL support 14 4.2.10 SCSI support 15 4.2.11 Network device support 15 4.2.12 Character devices 16 4.2.13 File systems 17 4.2.14 Console drivers 18 4.2.15 USB support 18 4.3 提示 19 4.3.1 EXTRAVERSION 19 4.3.2 .config 19 5 根文件系统 21 5.1 根文件系统 21 5.2 文件系统的内容 21 5.2.1 应用程序(applications) 21 5.2.2 设备文件(device files) 21 5.2.3 脚本和配置文件(scripts and configuration files) 22 5.2.4 库文件(libraries) 23 5.2.5 必要的目录 24 5.3 初始化RAM盘(initrd) 24 5.3.1 操作步骤 24 5.3.2 引导选项 24 5.3.3 安装 25 5.3.4 改变根目录设备 26 5.3.5 使用场合 27 5.3.6 淘汰的根转换机制(change_root) 27 5.4 系统初始化(init) 27 5.4.1 init的任务 28 5.4.2 SysVinit 28 5.4.3 两种风格:Slackware vs. Debian 28 5.5 PAM 29 5.5.1 什么是PAM 29 5.5.2 PAM的结构 29 5.5.3 配置文件 29 5.5.4 other 29 5.6 再论initrd 30 5.6.1 根到底在哪里 31 5.6.2 linuxrc 31 5.6.3 根转换机制:新的?旧的? 32 5.7 提示 34 5.7.1 文件系统目录层次结构 34 5.7.2 mklips.sh(制作LiPS的脚本) 34 5.7.3 lips.conf(LiPS配置文件) 34 5.7.4 cp –dpR 35 5.7.5 如何判断一个程序依赖哪些文件 35 5.7.6 带库文件复制——lcp() 35 5.7.7 库文件的命名 36 6 引导 38 6.1 引导过程概述 38 6.2 几种引导方式 38 6.3 grub引导器 38 6.4 USB引导 38 6.4.1 制作步骤 39 6.5 提示 40 6.5.1 版本问题? 40 7 远程串口控制台 41 7.1 概述 41 7.2 配置方法 41 7.3 提示 41 7.4 Linux 远程串口控制台指南 41 8 系统安装光盘 44 8.1 概述 44 8.2 boot.iso光盘的文件结构分析 44 8.3 制作步骤 45 9 源代码(配置文件和脚本) 46 9.1 lips.conf 46 9.2 mklips.sh 46 1 引言 1.1 编写目的 说明Linux系统裁减的过程及解决的主要技术问题。本文档的编写是为了说明L iPS的详细设计过程,也可以作为构造一个小型化Linux系统的指南。 本文档内容的组织如下所述:这一部分是引言,第2部分是对项目软、硬件环境 和需求的总体描述,第3部分说明了裁减LINUX的相关基本概念。后面几个部分是具 体实现方法的详细说明,4~6分别详细描述了创建内核、创建根文件系统和引导系 统的方法。最后的内容可以看作附录,其中7说明了一般Linux系统安装光盘的创建 方法,8列出了相关的配置文件和源代码。 1.2 背景 华中科技大学计算机存储系统国家专业实验室,NAS项目(2003.3——2003.8) 。 1.3 定义 O boot loader: 引导器 O kernel: 内核 O root filesystem: 根文件系统 O USB: 通用串行总线 O 1.4 参考资料 [1] DIY:自己动手做一个迷你 Linux 系统. IBM developerWorks 中国网站. htt p://www-900.ibm.com/developerWorks/cn/linux/embed/diy/index.shtml [2] Linux From Scratch. http://clfsbook.mylab.idv.tw/index.html [3] Linux启动过程综述. http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1& i=15750 [4] The Linux Bootdisk HOWTO (中译版). http://www.linux.org.tw/CLDP/gb/B ootdisk-HOWTO.html [5] Using the initial RAM disk (initrd). /usr/src/linux-2.4/Documentatio n/initrd.txt. (译文:http://zope.slat.org/Project/3ybaby/discuss-area/c d-boot/cdboot_refer/initrd.htm) [6] Quickmouse于2003.1发表于白云黄鹤BBS (http://bbs.whnet.edu.cn Linux讨 论区的帖子“裁减Linux”。 [7] Filesystem Hierarchy Standard. http://www.pathname.com/fhs/pub/fhs-2 .2.pdf [8] LINUX ALLOCATED DEVICES. /usr/src/linux-2.4/Documentation/device.txt . 或者最新的列表在http://www.kernel.org/pub/linux/docs/device-list/ [9] Karim Yaghmour. Building Embedded Linux Systems. O'Reilly, April 200 3. [10] Alessandro Rubini. Take Command: Init. http://www.linux.it/kerneldo cs/init/ , November 1998. [11] 深入 Linux PAM 体系结构. IBM developerWorks 中国网站. http://www-90 0.ibm.com/developerWorks/cn/linux/l-pam/index.shtml . 2003.7. [12] 2 总体描述 2.1 硬件环境 开发主机: Intel 845芯片组主板,P4赛扬1.8GHz CPU,256M内存,60G IDE硬盘,RTL813 9网卡。 目标机: 与主机同构。 2.2 软件环境 开发主机: Redhat Linux 7.3 (kernel 2.4.18-3),或者Redhat Linux 9 (kernel 2.4.2 0-8)。可以根据需要使用其他版本的内核,比如Redhat 7.3+kernel 2.4.20。 目标机: LiPS,以及应用程序。 2.3 需求规定和约束 我们目标系统LiPS,即Linux Powered Storage是一个嵌入式Linux操作系统, 主要着眼于提供各种文件服务,不包括X GUI;并且足够小,可以装入32M USB盘或 者DOC/DOM等常用设备引导。 3 总体设计 3.1 基本设计概念 提起“裁减Linux”,最容易想到的方法是以一个已经安装好的系统为基础,删 除掉不需要的文件,以减小整个系统的尺寸。而事实上这个方法几乎是行不通的, 因为通过光盘安装的一个Redhat 9 Linux系统,即便是只选择了比较少的软件包, 其所占空间也可以轻松达到300~500MB,想在这个基础上裁减到30MB左右是比较困 难的。更困难的是确定哪些东西是可以删除的?如果删除了系统必须的文件,可能 导致系统不能引导。 另一个途径是从零开始根据需要构建整个系统。“Linux From Scratch”采用 的就是这种方式,一个个安装需要的软件包。类似的,更简单的方法是,安装一个 完整的Linux系统,然后将必要的软件(可执行程序)、配置文件、库文件、内核等 复制出来构建一个小系统。我们采取后一种方式。 3.2 软件结构 LiPS包括3部分:Linux内核,根文件系统和引导器。 内核(Kernel)提供了一个操作系统的基本功能,如内存管理、进程调度、文 件系统、网络等,以及设备驱动程序。 根文件系统(Root filesystem)是存放运行、维护系统所必须的各种工具软件 、库文件、脚本、配置文件和其他特殊文件(比如设备节点)的地方,也可以安装 各种软件包。通常根文件系统位于某个磁盘分区,而在LiPS中应用了initrd(初始 RAM盘)机制,将根文件系统放在RAM Disk中。 引导器(Boot Loader)的任务是从引导设备装载内核,引导系统运行。Linux 系统常见的引导器包括早期的LILO和近期的GRUB。LiPS用的是GRUB。 4 内核 4.1 创建内核的方法 Linux提供了方便灵活的方法来定制内核,主要步骤包括:下载安装内核源代码 树,配置内核,编译内核。具体方法请参考相关文档。关键指令如下: cd /usr/src/linux-2.4 make menuconfig make dep; make clean; make bzImage 编译成功的内核文件为arch/i386/boot/bzImage. 4.2 内核配置 4.2.1 概述 make menuconfig之后可以看到类似如下的内容(编号是为了描述方便而加上的 )。根据内核版本的不同,列出的项目会有差异。而变化主要发生在发行版为标准 内核打的各种补丁上面,其实标准内核是比较稳定的。 如下所示,我们配置的内核版本为2.4.20-8,这个“-8”就是Redhat所打的补 丁版本号。补丁一般是对标准内核错误的修正和新增的功能。与2.4.20内核配置选 项比较会发现,[10,25,30]都属于Redhat的补丁。 一般地,这些补丁选项都不是必须的,因此我们的LiPS内核中都没有包括这些 选项。其实,完全可以通过直接配置一个标准的内核版本(比如2.4.20)来产生我 们所需要的内核。 Linux Kernel v2.4.20-8-R2Lips Configuration [1] Code maturity level options ---> [2] Loadable module support ---> [3] Processor type and features ---> [4] General setup ---> [5] Memory Technology Devices (MTD) ---> [6] Parallel port support ---> [7] Plug and Play configuration ---> [8] Block devices ---> [9] Multi-device support (RAID and LVM) ---> [10] Cryptography support (CryptoAPI) ---> [11] Networking options ---> [12] Telephony Support ---> [13] ATA/IDE/MFM/RLL support ---> [14] SCSI support ---> [15] Fusion MPT device support ---> [16] I2O device support ---> [17] Network device support ---> [18] Amateur Radio support ---> [19] IrDA (infrared) support ---> [20] ISDN subsystem ---> [21] Old CD-ROM drivers (not SCSI, not IDE) ---> [22] Input core support ---> [23] Character devices ---> [24] Multimedia devices ---> [25] Crypto Hardware support ---> [26] File systems ---> [27] Console drivers ---> [28] Sound ---> [29] USB support ---> [30] Additional device driver support ---> [31] Bluetooth support ---> [32] Kernel hacking ---> [33] Library routines ---> Load an Alternate Configuration File Save Configuration to an Alternate File <Select> < Exit > < Help > 下面我们以2.4.20内核为例,来详细说明内核的配置,也就是选哪些东西、不 选哪些东西。没有说明的选项,比如“Code maturity level options”,表示不选 。 4.2.2 Loadable module support[*] Enable loadable module support [ ] Set version information on all module symbols[*] Kernel module loader 可加载模块支持。虽然目前所选项目全部编译进内核,但是内核是支持模块的 。可以考虑将一些硬件设备的驱动程序编译为模块,从而减小内核尺寸,同时增加 适应不同硬件平台的灵活性。 4.2.3 Processor type and features (Pentium-III/Celeron(Coppermine)) Processor family[*] Machine Check Exception < > Toshiba Laptop support < > Dell laptop support < > /dev/cpu/microcode - Intel IA32 CPU microcode support < > /dev/cpu/*/msr - Model-specific register support < > /dev/cpu/*/cpuid - CPU information support (off) High Memory Support [ ] Math emulation [ ] MTRR (Memory Type Range Register) support [ ] Symmetric multi-processing support [ ] Local APIC support on uniprocessors [ ] Unsynced TSC support 处理器特性。选择一下Processor family,其余基本上都没有选。High Memor y Support也可以打开,不清楚有什么用。 4.2.4 General setup[*] Networking support[*] PCI support (Any) PCI access mode[*] ISA bus support[*] PCI device name database [ ] EISA support [ ] MCA support [ ] Support for hot-pluggable devices[*] System V IPC[*] BSD Process Accounting[*] Sysctl support (ELF) Kernel core (/proc/kcore) format < > Kernel support for a.out binaries <*> Kernel support for ELF binaries < > Kernel support for MISC binaries[*] Power Management support < > Kernel support for MISC binaries[*] Power Management support <*> Advanced Power Management BIOS support[*] Ignore USER SUSPEND[*] Enable PM at boot time[*] Make CPU Idle calls when idle[*] Enable console blanking using APM[*] RTC stores time in GMT[*] Allow interrupts during APM BIOS calls[*] Use real mode APM BIOS call to power off 总体设置。这一部分选项比较重要,包括网络、总线、进程、二进制文件格式 、电源管理等。其中APM相关的选项比较搞不清楚,有时候halt –p命令不能关闭系 统电源跟这里有关系。 4.2.5 Plug and Play configuration <*> Plug and Play support < > ISA Plug and Play support 即插即用设置。 4.2.6 Block devices <*> Normal floppy disk support < > XT hard disk support < > Compaq SMART2 support < > Compaq Smart Array 5xxx support < > Mylex DAC960/DAC1100 PCI RAID Controller support <*> Loopback device support < > Network block device support <*> RAM disk support (4096) Default RAM disk size[*] Initial RAM disk (initrd) support[*] Per partition statistics in /proc/partitions 块设备。软驱也可以不选。这里的关键选项是Loopback device,RAM disk和i nitrd,一定要选中。Default RAM disk size多少都没有关系。 4.2.7 Multi-device support (RAID and LVM)[*] Multiple devices driver support (RAID and LVM) <*> RAID support <*> Linear (append) mode <*> RAID-0 (striping) mode <*> RAID-1 (mirroring) mode <*> RAID-4/RAID-5 mode <*> Multipath I/O support <*> Logical volume manager (LVM) support MD支持。软RAID和LVM的支持在这里选择,如果不使用,也可以不选。 4.2.8 Networking options <*> Packet socket[*] Packet socket: mmapped IO < > Netlink device emulation[*] Network packet filtering (replaces ipchains) [ ] Network packet filtering debugging[*] Socket Filtering <*> Unix domain sockets[*] TCP/IP networking[*] IP: multicasting[*] IP: advanced router [ ] IP: policy routing [ ] IP: equal cost multipath [ ] IP: use TOS value as routing key [ ] IP: verbose route monitoring [ ] IP: large routing tables[*] IP: kernel level autoconfiguration[*] IP: DHCP support[*] IP: BOOTP support[*] IP: RARP support <*> IP: tunneling < > IP: GRE tunnels over IP [ ] IP: multicast routing [ ] IP: TCP Explicit Congestion Notification support [ ] IP: TCP syncookie support (disabled per default) IP: Netfilter Configuration ---> < > 802.1Q VLAN Support --- < > The IPX protocol < > Appletalk protocol support Appletalk devices ---> < > DECnet Support < > 802.1d Ethernet Bridging QoS and/or fair queueing ---> Network testing ---> 网络选项。这里选项也比较多,如果没有什么特殊要求,又不是十分理解这些 选项的意义,基本上可以用缺省设置。注意DHCP选项,如果要用到的话要记得选中 这个。 IP: Netfilter Configuration(跟iptables有关)等几个子选项都没有选。 4.2.9 ATA/IDE/MFM/RLL support <*> ATA/IDE/MFM/RLL support IDE, ATA and ATAPI Block devices ---> <*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support --- Please see Documentation/ide.txt for help/info on IDE drives [ ] Use old disk-only driver on primary interface <*> Include IDE/ATA-2 DISK support[*] Use multi-mode by default[*] Auto-Geometry Resizing support <*> Include IDE/ATAPI CDROM support < > Include IDE/ATAPI TAPE support < > Include IDE/ATAPI FLOPPY support <*> SCSI emulation support [ ] IDE Taskfile Access --- IDE chipset support/bugfixes [ ] CMD640 chipset bugfix/support [ ] RZ1000 chipset bugfix/support[*] Generic PCI IDE chipset support[*] Sharing PCI IDE interrupts support[*] Generic PCI bus-master DMA support [ ] Boot off-board chipsets first support [ ] Force enable legacy 2.0.X HOSTS to use DMA[*] Use PCI DMA by default when available [ ] Enable DMA only for disks [ ] AEC62XX chipset support [ ] ALI M15x3 chipset support [ ] AMD Viper support [ ] CMD64X and CMD680 chipset support [ ] CY82C693 chipset support [ ] Cyrix CS5530 MediaGX chipset support [ ] HPT34X chipset support [ ] HPT366/368/370 chipset support[*] Intel PIIXn chipsets support[*] PIIXn Tuning support [ ] PROMISE PDC202{46|62|65|67|68|69|70} support [ ] ServerWorks OSB4/CSB5 chipsets support [ ] SiS5513 chipset support [ ] SLC90E66 chipset support [ ] VIA82CXXX chipset support [ ] Other IDE chipset support [ ] IGNORE word93 Validation BITS IDE设备支持。要用IDE硬盘,当然要选中。CDROM选项看情况也可以不要。SCS I emulation似乎对使用USB盘有影响。剩下的很多都是跟IDE chipset有关的。 最好是用dmesg命令找出目标系统主板芯片组,然后选中对应的芯片组支持,这 样相当于安装了IDE芯片组的驱动程序。如果没有指定应该也可以,只是性能可能会 受到一些影响。 4.2.10 SCSI support <*> SCSI support --- SCSI support type (disk, tape, CD-ROM) <*> SCSI disk support (40) Maximum number of SCSI disks that can be loaded as modules < > SCSI tape support < > SCSI OnStream SC-x0 tape support < > SCSI CD-ROM support <*> SCSI generic support --- Some SCSI devices (e.g. CD jukebox) support multiple LUNs [ ] Enable extra checks in new queueing code [ ] Probe all LUNs on each SCSI device [ ] Verbose SCSI error reporting (kernel size +=12K) [ ] SCSI logging facility SCSI low-level drivers ---> SCSI支持。如果要用到SCSI硬盘等SCSI设备,这里当然要选。目前我们的目标 系统其实没有SCSI硬盘,但是为了使用USB盘,也要选中SCSI支持。 SCSI low-level drivers子选项中是一些SCSI卡,都不用选。 4.2.11 Network device support[*] Network device support ARCnet devices ---> < > Dummy net driver support < > Bonding driver support < > EQL (serial line load balancing) support < > Universal TUN/TAP device driver support Ethernet (10 or 100Mbit) --->[*] Ethernet (10 or 100Mbit)[*] EISA, VLB, PCI and on board controllers <*> EtherExpressPro/100 support (eepro100, original Becker driv er <*> RealTek RTL-8139 PCI Fast Ethernet Adapter support Ethernet (1000 Mbit) ---> [ ] FDDI driver support < > PPP (point-to-point protocol) support < > SLIP (serial line) support Wireless LAN (non-hamradio) ---> Token Ring devices ---> [ ] Fibre Channel driver support Wan interfaces ---> 网络设备支持。主要选择网卡类型,Ethernet (10 or 100Mbit)子选项中列出 了内核可以支持的10/100M以太网卡,这里仅列出了我们选中的2种。其他子选项都 没有选。 4.2.12 Character devices[*] Virtual terminal[*] Support for console on virtual terminal <*> Standard/generic (8250/16550 and compatible UARTs) serial suppo rt[*] Support for console on serial port [ ] Extended dumb serial driver options [ ] Non-standard serial port support [ ] Unix98 PTY support I2C support ---> Mice ---> Joysticks ---> < > QIC-02 tape support Watchdog Cards ---> < > AMD 768 Random Number Generator support < > Intel i8x0 Random Number Generator support < > AMD 76x native power management (Experimental) < > /dev/nvram support < > Enhanced Real Time Clock Support < > Double Talk PC internal speech card support < > Siemens R3964 line discipline < > Applicom intelligent fieldbus card support Ftape, the floppy tape device driver ---> < > /dev/agpgart (AGP Support) [ ] Direct Rendering Manager (XFree86 DRI support) < > ACP Modem (Mwave) support 字符设备。这里主要就是选择了最前面4个跟终端和串口有关的选项,以支持虚 拟终端(远程登录要用到),支持标准串口,支持串口控制台。 4.2.13 File systems[*] Quota support < > Kernel automounter support <*> Kernel automounter version 4 support (also supports v3) <*> Reiserfs support [ ] Enable reiserfs debug mode[*] Stats in /proc/fs/reiserfs <*> Ext3 journalling file system support [ ] JBD (ext3) debugging support <*> DOS FAT fs support <*> MSDOS fs support < > UMSDOS: Unix-like file system on top of standard MSDOS fs <*> VFAT (Windows-95) fs support < > Compressed ROM file system support[*] Virtual memory file system support (former shm fs) <*> ISO 9660 CDROM file system support[*] Microsoft Joliet CDROM extensions [ ] Transparent decompression extension < > JFS filesystem support < > Minix fs support < > FreeVxFS file system support (VERITAS VxFS(TM) compatible) < > NTFS file system support (read only) < > OS/2 HPFS file system support[*] /proc file system support < > QNX4 file system support (read only) < > ROM file system support <*> Second extended fs support < > System V/Xenix/V7/Coherent file system support < > UDF file system support (read only) < > UFS file system support (read only) Network File Systems ---> < > Coda file system support (advanced network fs) <*> NFS file system support[*] Provide NFSv3 client support [ ] Root file system on NFS <*> NFS server support[*] Provide NFSv3 server support <*> SMB file system support (to mount Windows shares etc.) [ ] Use a default NLS < > NCP file system support (to mount NetWare volumes) Partition Types ---> Native Language Support ---> Default NLS Option: "iso8859-1" <*> Codepage 437 (United States, Canada) <*> Simplified Chinese charset (CP936, GB2312) <*> Traditional Chinese charset (Big5) 文件系统。这部分内容比较多,也很重要。首先是Quota,如果目标系统支持这 个功能,这里就要选中。然后是选择要支持的文件系统,常用的有Reiserfs,Ext3 ,FAT,ISO9660,JFS等等,可以根据情况选择。/proc和ext2一定要选中。 还有Network File Systems子选项,可以选择是否支持NFS和SMB。Native Lan guage Support子选项跟所支持的语言有关,这里没有全部列出来,我们选中了英语 和简体、繁体中文字符集。 4.2.14 Console drivers[*] VGA text console [ ] Video mode selection support 控制台驱动。调试的时候可以给目标系统接显示器看一下,实际系统应该可以 不选。 4.2.15 USB support <*> Support for USB [ ] USB verbose debug messages --- Miscellaneous USB options[*] Preliminary USB device filesystem [ ] Long timeout for slow-responding devices (some MGE Ellipse UP Se --- USB Host Controller Drivers <*> UHCI Alternate Driver (JE) support <*> OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support --- USB Device Class drivers < > USB MIDI support <*> USB Mass Storage support[*] USB Mass Storage verbose debug [ ] Freecom USB/ATAPI Bridge support [ ] ISD-200 USB/ATA Bridge support [ ] Microtech CompactFlash/SmartMedia support < > USB Modem (CDC ACM) support < > USB Printer support --- USB Human Interface Devices (HID) <*> USB Human Interface Device (full HID) support --- Input core support is needed for USB HID input layer or HID BP [ ] /dev/hiddev raw HID device support --- USB Imaging devices < > USB Kodak DC-2xx Camera support < > USB Scanner support < > Microtek X6USB scanner support --- USB Multimedia devices --- Video4Linux support is needed for USB Multimedia device suppo rt --- USB Network adaptors --- USB port drivers USB Serial Converter support ---> --- USB Miscellaneous drivers < > Texas Instruments Graph Link USB (aka SilverLink) cable suppo rt < > USB LCD device support USB支持。如果没有使用USB设备,这部分可以不选。要使用USB盘,一定要选中 USB Mass Storage support。其余很多选项我也不清楚是干什么用的。 4.3 提示 4.3.1 EXTRAVERSION 在系统中使用uname可以获得系统版本信息。比如Redhat 9: [root@lips root]# uname -r 2.4.20-8 [root@lips root]# 返回结果表示了Redhat修订后的内核版本号。前面我们提到过,这个“-8”就 是Redhat附加在标准内核版本号后面的一个信息。 在一个运行LiPS的系统中,我们也需要确定当前使用的内核版本,通过版本信 息来知道这个内核的配置,也可以通过在标准内核版本后面附加特定的编码来实现 。 /usr/src/linux-2.4/Makefile中的变量EXTRAVERSION可以帮助我们达到这个目 标。下面是Makefile文件的最前面几行内容: VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 20 EXTRAVERSION = -8 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) 现在KERNELRELEASE的值就是2.4.20-8。这个信息会被编译到内核中,uname工 具会从内核文件中提取出版本号。如果将Makefile做一些修改,比如, EXTRAVERSION = -8-R2Lips 那么我们可以得到内核版本号2.4.20-8-R2Lips,表示为了创建LiPS而编译的一 个特定配置的内核,这个内核是以2.4.20-8为基础,R2Lips(Release 2 Lips)即 第二个版本。 对Makefile的修改要在编译内核之前完成。 4.3.2 .config 内核配置(make menuconfig)完成之后,会询问: Do you wish to save your new kernel configuration? < Yes > < No > 回答Yes,配置信息会保存在/usr/src/linux-2.4/.config文件中。注意以“. ”开头的文件是个隐藏文件,要用ls –a才看的到。.config是个文本文件,内容类 似下面: # # Loadable module support # CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set CONFIG_KMOD=y 所以可以把这个文件保存起来,并且给文件名带上版本号,方便管理、使用。 cp .config ~/config-2.4.20-8-R2Lips 5 根文件系统 创建根文件系统比编译内核要复杂的多,也更难理解。这里的关键是掌握init rd(初始化RAM盘)的使用方法。 5.1 根文件系统 这里我们将要创建的根文件系统与通常Linux主机的根文件系统类似,只是它应 该仅仅包括系统运行所必须的应用程序、库和相关文件的最小集合。根文件系统的 尺寸大小是一个重要的指标。 5.2 文件系统的内容 5.2.1 应用程序(applications) /bin,/sbin,/usr/bin,/usr/sbin 应用程序大致可以分为3部分,第一是操作系统正常运行所需的基本工具软件, 比如bash,cp,rm等;第二是提供某项服务的服务器软件,比如httpd,telnetd, proftpd等;第三是我们所开发的应用程序。其实后面讲的配置文件等也可以粗略按 照这个原则来分类。 到底需要复制哪些软件,弹性是比较大的,很多软件都是可要可不要,可以实 际情况灵活选择。这个列表可能很长,并且变化也比较大,因此不在这里列出。 为了进一步减小所创建的根文件系统的尺寸,可以考虑使用下列工具包软件来 替代某些标准的工具: O BusyBox(http://www.busybox.net) O TinyLogin(http://tinylogin.busybox.net) O Embutils(http://www.fefe.de/embutils/) 其详细使用方法请参考相关资料,此处不再赘述。LIPS的实现目前没有使用这 些软件包。 5.2.2 设备文件(device files) /dev 设备文件也可以称作设备节点(device node)。设备文件非常重要,缺少某些 有些设备文件可能导致系统不能正常运行甚至不能引导。有些设备文件是必须的, 而更多的是根据具体目标系统的硬件配置来进行取舍。 比如硬盘的设备文件,在完整的系统中一般有hda,hdb,……,hdt,即最多支 持20个IDE硬盘,每个硬盘有hdX1,hdX2,……,hdX32,(其中X表示a-t),即支 持32个分区,另外还有表示SCSI硬盘的节点。根据实际情况,如果只需要支持少量 的硬盘、少量的分区,这些节点可以被大大简化。如果目标系统中没有的设备,其 对应的设备文件也可以省掉。 设备文件 描述 /dev/console 系统控制台设备,非常重要。 /dev/fd0 第一个软驱 /dev/hda /dev/hda[1-8] IDE硬盘及分区 /dev/initctl 实际上是一个FIFO设备,跟init有关(切换运行级别时用于新init与原init通信) /dev/initrd Initial RAM disk /dev/input (目录)Input core(包括游戏杆、鼠标等) /dev/kmem 内核虚拟内存 /dev/loop[0-7] Loopback设备 /dev/mem 访问物理内存 /dev/null NULL设备 /dev/psaux PS/2鼠标 /dev/ptmx UNIX98 PTY master /dev/pts (目录)UNIX98 PTY slaves /dev/ptyp[0-7] 伪终端主设备(远程登录使用) /dev/ram[0-7] /dev/ramdisk /dev/ram RAM Disk设备。至少/dev/ram0是应用initrd机制所必须的。 /dev/ramdisk链接到/dev/ram0,是为了兼容老版本内核而保留的。 /dev/ram链接到/dev/ram1。 /dev/random 随机数发生器 /dev/sda /dev/sda[1-8] SCSI磁盘及分区设备 /dev/shm 共享内存设备 /dev/systty 指向系统tty设备的符号链接,一般是tty0。 /dev/tty 当前TTY设备 /dev/tty[0-7] 虚控制台(Virtual console) /dev/ttyp[0-7] 伪终端从设备 /dev/ttyS0 /dev/ttyS1 串口(COM1和COM2) /dev/urandom 速度更快、安全性较差的随机数发生器 /dev/zero 零设备,只能读0出来 设备节点的主设备号(Major)、次设备号(Minor)的文档是内核源代码中的 /Documentation/device.txt,如果有疑问可以查看这个文件[8]。 5.2.3 脚本和配置文件(scripts and configuration files) /etc /etc/rc.d目录下的启动脚本是系统的重要部分。必须对启动脚本做相应的修改 以简化系统的启动过程。 系统和各种应用程序用到的几乎所有的配置文件都位于/etc目录,是裁减Linu x最麻烦的部分,最容易出问题。配置文件的选择需要综合很多方面的信息,需要对 系统有比较全面、深入的了解,并结合经验才能做出正确的判断。 配置文件 描述 /etc/default (目录)某个命令(比如useradd)的缺省设置(man useradd(8)) /etc/ld.so.cache 由ldconfig命令根据/etc/ld.so.conf文件产生 /etc/ld.so.conf 库文件路径配置文件,ldconfig命令根据该配置文件生成/etc/ld.so.cache /etc/localtime 本地时间、时区设置 /etc/login.defs 全局缺省设置 /etc/fstab 文件系统列表(man fstab(5)) /etc/group 组文件(man group(5)) /etc/hosts 列出主机名和IP地址(man hosts(5)) /etc/init.d 符号链接到/etc/rc.d/init.d /etc/initlog.conf Initlog日志配置文件(man initlog(8)) /etc/inittab Init配置文件(man inittab(5)) /etc/ioctl.save 该文件包含了用于单用户模式的串口和终端参数,因为这些参数是由getty设置的, 而在单用户模式时没有运行getty,所以用该文件保存参数。单用户模式对系统安全 是个威胁,我们应该禁止使用单用户模式,因此这个文件实际上并没有必要复制过 来。 /etc/issue 登录信息和标识文件(man issue(5)) /etc/modules.conf 模块的配置文件(man modules.conf(5)) /etc/mtab 已经挂载的文件系统列表(man mount(8)) /etc/nsswitch.conf Name Service Switch的配置文件(配置名称服务数据源和查询的顺序)(man nss witch.conf(5)) /etc/pam.d 放置PAM配置文件的目录(有关PAM请参考5.5节) /etc/passwd 用户口令文件(man passwd(5)) /etc/profile 系统环境变量和登录配置文件 /etc/rc.d 放置启动脚本的目录 /etc/services 列出可用的网络服务及其端口(man services(5)) /etc/termcap 终端(terminal)功能数据库(man termcap(5)) 还有那些跟特定应用程序相关的配置文件,比如apache服务器需要的/etc/htt pd/conf/httpd.conf 等,此处不再一一列出。 5.2.4 库文件(libraries) /lib,/usr/lib,/usr/share 库文件也是系统运行所必需的。到底需要哪些库文件,是根据所复制的可执行 程序用 ldd 工具来确定的。比如,要知道/bin/bash需要哪些库文件,使用如下命 令: [root@lips xmdong]# ldd /bin/bash libtermcap.so.2 => /lib/libtermcap.so.2 (0x40020000) libdl.so.2 => /lib/libdl.so.2 (0x40024000) libc.so.6 => /lib/tls/libc.so.6 (0x42000000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 对复制到新的根文件系统的每个可执行程序,都要使用这种方法来确定其所需 要的库,然后把这些库文件也复制过来。 需要注意的是,有些库文件使用上述方法是找不出来的,但是却是系统必须的 。比如: 库文件 描述 /lib/libnss_files* 这个库是跟/etc/nsswitch.conf有关的,必不可少,否则系统不能正常使用。(ma n nsswitch.conf(5)) /lib/security/pam_unix.so 这个库跟PAM有关,是安全、认证方面的,必不可少,否则系统无法登录。 5.2.5 必要的目录 /home,/mnt,/proc,/root, /var,/var/log,/var/run,/var/lock/subsys 5.3 初始化RAM盘(initrd) (参考资料[5]) 初始化RAM盘(initrd)提供了引导器加载RAM盘的能力。这个RAM盘可以被挂载 (mount)成根文件系统,并执行其上的程序。然后,可以从另一个设备挂载一个新 的根文件系统,而原来的根文件系统(也就是initrd)会被移到一个目录里并卸载 。 initrd技术主要设计用来让系统启动过程可以分两个阶段进行,首先让内核以 一组最小的、被编译进内核里的驱动程序来启动,然后从initrd中加载其他的模块 。 5.3.1 操作步骤 使用initrd时,系统典型的引导步骤如下: 1) 引导器加载内核和初始化RAM盘; 2) 内核把initrd转到一个一般的RAM盘中,并且释放原来被initrd占用的RAM; 3) initrd以可读写模式被挂载到根目录; 4) 执行/linuxrc(linuxrc可以是任何可执行文件,包括shell脚本在内;它具有u id 0即超级用户的权限,基本上可以做init程序中能够做的任何事情); 5) 在linuxrc中挂载真正的根文件系统; 6) linuxrc使用pivot_root系统调用,把真正使用的根文件系统挂载到根目录; 7) 在根文件系统上执行通常的引导过程(比如执行/sbin/init); 8) initrd文件系统被删除。 注意,改变根目录并不包括卸载旧的根文件系统,因此有可能在转变过程中仍 有进程在initrd上运行。另外,挂载在initrd目录下的根文件系统仍然是可用的。 5.3.2 引导选项 initrd技术增加了下列引导选项: initrd=<path> 装入指定的文件作为初始化RAM盘。当使用 LILO 当引导器时,你可以用/etc/ lilo.conf 文件中 INITRD 这个配置参数,来指定初始化RAM盘文件。 noinitrd initrd的数据仍会保留,但不会装入到一个RAM盘里,真正使用的根文件系统将 会被挂载。initrd的数据能夠从 /dev/initrd 这个设备中被读出来。注意,initr d的数据可以是任何结构,并不一定必须是一个文件系统的映像,这个选项主要用来 进行debug。 注意:/dev/initrd 是一个只读并且只能使用一次的设备,最后一个程序一旦 关闭它, 所有数据将被释放,而且设备也不能再被打开。 root=/dev/ram0 initrd 先被挂载成根目录,接着进行正常的启动过程(这时RAM盘仍被挂载成 根)。 5.3.3 安装 首先:我们要在正常的根文件系统中创建一个容纳initrd文件系统的目录,例 如: # mkdir /initrd 对目录名称并没有特别的限制,在pivot_root(2)的man手册页中有更详细的说 明。 如果根文件系统是在引导程序时被建立的(例如,你在制作安装软盘),在建 立根文件系统的同时应该创建 /initrd 目录。 在某些情况下initrd虽然未被挂载,只要有下列设备存在,它的內容仍是可被 访问的。(注意:这个设备无法在 devfs 下使用) # mknod /dev/initrd b 1 250 # chmod 400 /dev/initrd 第二:支持初始化RAM盘的能力,及所有执行格式和文件系统模块,都必须直接 编译进内核,不能采用可加载模块的方式。 第三:必须制作一个RAM盘映像文件。大概的步骤是,在一个块设备上创建一个 文件系统,把需要的文件复制进去,然后把这个块设备的内容输出成一个initrd文 件。目前至少有3种设备适合作为这种块设备: O 软盘(能拿到任何地方试验,但速度太慢); O RAM盘(最快,但浪费内存); O Loopback设备(比较合适的解决方案)。 下面,我们将讨论使用loopback设备创建initrd文件的方法。 1) 确认lookback设备已经配置到内核里。 2) 创建一个适当大小的空白文件系统,例如: # dd if=/dev/zero of=initrd bs=300k count=1 # mke2fs -F -m0 initrd 3) 把这个文件系统挂载进来,例如: # mount -t ext2 -o loop initrd /mnt 4) 创建控制台设备。 # mkdir /mnt/dev # mknod /mnt/dev/console c 5 1 5) 复制所有可能在initrd环境中用到的文件到/mnt目录中。(别忘了/linuxrc文 件) 6) initrd执行环境的测试需要反复进行修正,为了避免不断的重新启动,可以使 用下列命令: # chroot /mnt /linuxrc 当然这样启用initrd还是有限制的,就是不能干扰正常系统的执行状态(比如 重新配置网络接口等等。如果在一个用pivot_root指令转换根目录的执行环境中, 就可以做这些事情了)。 7) 卸载这个文件系统: # umount /mnt 8) 这时,初始化RAM盘系统就在“initrd”这个文件中了。可以把它压缩小一点: # gzip -9 initrd 最后,必须启动内核并载入initrd系统。需要设置下列引导参数: root=/dev/ram0 init=/linuxrc rw (只有需要写入initrd文件系统时才需要附加rw参数)。 使用 LOADLIN 当引导器时,可以执行: LOADLIN C:\LINUX\BZIMAGE initrd=C:\LINUX\INITRD.GZ root=/dev/ram0 i nit=/linuxrc rw 使用 LILO当引导器时,可以在 /etc/lilo.conf 中如下设置: image = /boot/bzImage initrd = /boot/initrd.gz append = "root=/dev/ram0 init=/linuxrc rw" 如果使用其他引导器,请参考相关文档。 5.3.4 改变根目录设备 在执行完重要任务的尾声,linuxrc一般会执行改变根目录设备的动作,并让所 有程序在真实的根文件系统中展开。这个过程包括下列步骤: O 挂载新的根文件系统 O 把initrd自己转到这个根文件系统中 O 结束所有旧的对initrd根文件系统的存取动作 O 卸载initrd文件系统并释放RAM盘内存 挂载新的根文件系统很简单:只需要把它挂载到当前根文件系统中的一个目录 下即可。例如: # mkdir /new-root # mount -o ro /dev/hda1 /new-root 最终改变根文件系统由pivot_root()系统调用或者pivot_root工具来完成(参 考手册页pivot_root(8))。pivot_root可以把当前根文件系统转移到新根的一个目 录中,然后把指定的目录当作新的根。在调用pivot_root之前,必须先为旧根准备 目录,例如: # cd /new-root # mkdir initrd # pivot_root . initrd 现在,linuxrc仍然可以访问旧的根文件系统。执行下列指令将完全结束与旧根 的联系: # exec chroot . what-follows <dev/console >dev/console 2>&1 其中what-follows是新根下面的一个程序,比如/sbin/init。(注意,这时如 果没有/dev/console,系统不能启动)。同时,为了保持不同版本之间的兼容性, 需要特别注意下列事项: O 在调用pivot_root之前,当前目录应该是新的根目录; O 使用“.”(当前目录)作为pivot_root的第一个参数(新根),为旧根指定目录 的第二个参数也要用相对路径; O chroot这个命令应该在新、旧根系统当中都能使用; O 然后调用chroot转移根文件系统; O 在exec命令中使用象 dev/console 这样的相对路径。 特别提示:让initrd文件系统的目录结构与新根文件系统的结构一致,有利于 转换过程的顺利。 这时,initrd可以卸载,RAM盘也可以释放: # umount /initrd # blockdev --flushbufs /dev/ram0 注意:如果linuxrc或者它调用的其他程序的执行因为某种原因中断,则会启用 旧的change_root机制。 5.3.5 使用场合 实现initrd的主要动机是允许系统安装时模块化的内核配置。这个过程大致如 下: 1) 系统可以用一个最小配置的内核从软盘或者其他存储媒体启动,然后载入initr d系统; 2) /linuxrc来决定需要什么来进一步挂载真实的根文件系统(如设备类型、驱动程 序等)或者支持发行版媒体(如CD-ROM,网络,磁带等); 3) /linuxrc载入必须的内核模块; 4) /linuxrc建立并安装根文件系统; 5) /linuxrc调用pivot_root改变根文件系统,并通过chroot一个程序(继续安装过 程); 6) 安装引导器; 7) 引导器被配置成装入initrd以及相关的模块,建立起系统环境; 8) 现在,系统可以引导,并执行其他的安装任务。 Initrd的关键作用是能够多重配置一个正常操作的系统,而不需要用一个庞大 的内核,或者重新编译、连接内核。在制作Linux发行版(光盘等)、系统恢复盘等 方面有广泛的应用。 5.3.6 淘汰的根转换机制(change_root) 可以通过改写/proc/sys/kernel/real-root-dev这个文件的数字值来改变真实 的根设备。例如: # echo 0x301 >/proc/sys/kernel/real-root-dev 但是这个机制已经被淘汰,虽然目前的内核仍然支持,不能保证以后的内核会 支持。所以不要使用。 5.4 系统初始化(init) (参考资料[10]) 5.4.1 init的任务 UNIX的init指的不是一个程序、而是一类程序。Init一般是指系统引导时执行 的第一个进程,也是唯一的进程。当内核完成计算机硬件的设置之后,就把控制权 交给init。内核只产生init这一个进程,而系统中其他所有进程都是由init负责产 生(spawn),主要包括各种系统服务进程,比如控制台的登录会话(getty)。主 要任务包括: O 产生其他进程; O 重新启动已经退出的进程; O 负责清理系统中的“僵尸”进程(init是所有其他进程的祖先); O 处理系统关机(stop所有进程,unmount文件系统); 内核并不关心拿什么来作为系统的init,可以是下列几种选择之一: O SysVinit (作者:Miquel van Smoorenburg),或者 O simpleinit (作者:Peter Orbaek),或者 O 一个shell脚本,或者 O 嵌入式系统中你的应用程序。 不过路径名字必须是/sbin/init,/etc/init,或/bin/init(因为已经编译到 内核里面了)。如果这几个路径都找不到,系统就完蛋了。为了增加灵活性,内核 提供了命令行选项可以指定init路径:“init=”。 5.4.2 SysVinit /etc/inittab /etc/rc.d 大多数Linux发行版使用的init是SysVinit,也就是System V UNIX的实现。其 主要思想是规定了不同的“运行级别(runlevel)”。通过配置文件/etc/inittab ,定义了系统引导时做什么,进入或者切换到一个运行级别时做什么。配置文件每 一行的语法为: id:runlevel:action:command 细节请参考手册页inittab(5)。 整个过程中用到的脚本都放在/etc/rc.d目录。 5.4.3 两种风格:Slackware vs. Debian 关于配置文件/etc/inittab和脚本/etc/rc.d的实现和组织主要有两种不同的风 格,其有代表性的发行版分别为Slackware和Debian(Redhat同Debian)。这两种风 格之间有几个明显的区别,可以比较容易的识别。 例如在/etc/inittab中,定义进入运行级别0时运行的脚本分别为/etc/rc.d/r c.0和/etc/init.d/rc 0(在Redhat中/etc/init.d是指向/etc/rc.d/init.d的一个 符号链接,注意这里0是脚本rc的命令行参数)。因此,Slackware风格的/etc/rc. d中应该是一系列相对独立的脚本,对应于配置文件中每个动作的定义(我没有见过 Slackware哦)。 在我们所熟悉的Redhat中,/etc/rc.d的组织要复杂的多,每个运行级别对应一 个子目录/etc/rc.d/rcX.d(X表示运行级别0~6),下面放的是一系列形如SXXfoo 和KXXbar(S表示Start某个服务,K表示Kill某个服务,XX是两位数字,决定了该脚 本执行的顺序)的符号链接,指向/etc/rc.d/init.d中的脚本,每个脚本对应一项 服务程序。 另外,还有两个重要脚本值得一提:/etc/rc.d/rc.sysinit是系统引导时首先 要执行的(完成系统初始化的各项工作),而/etc/rc.d/rc.local在最后执行(类 似DOS的autoexec.bat)。 读一下/etc/rc.d/rc.sysinit,/etc/rc.d/rc和/etc/rc.d/init.d/中的某个脚 本,就会对Redhat的启动过程和风格有比较清晰的了解。 据说Slackware风格比Debian的速度要快一些。可能是后者的组织结构比较复杂 的缘故吧。 5.5 PAM (参考资料[11],http://www.kernel.org/pub/linux/libs...??手册页pam (8)) 5.5.1 什么是PAM PAM(Pluggable Authentication Modules)是为了解决计算机系统中用户认证 的问题而引入的一种实现方案。PAM的目标为: O 将认证功能从应用中独立出来,单独进行模块化设计、实现和维护(而不是象以 前那样,将认证功能的代码跟应用程序编译在一块); O 为这些认证模块建立标准API,以便各应用程序能方便的使用它们提供的各种功能 ; O 认证机制对其上层用户(包括应用程序和最终用户)是透明的。 PAM机制由SUN设计并首先在Solaris 2.3上部分实现,后来逐渐在其他UNIX平台 上实现,包括Linux(其实现称为Linux-PAM)。 5.5.2 PAM的结构 PAM采用分层的体系结构。最下面是模块层,负责实现具体的认证功能,包括帐 户管理(account)、口令鉴别(auth)、口令管理(password)和会话管理(ses sion)4个模块。 应用接口层位于模块层之上,调用下层提供的服务,并向上(应用程序)隐藏 PAM实现的细节。 5.5.3 配置文件 /etc/pam.conf /etc/pam.d (如果存在这个目录,则忽略/etc/pam.conf) 配置文件是应用接口层的另一个重要组件。其作用主要是为应用选定具体的鉴 别模块,模块间的组合以及规定模块的行为。 /etc/pam.conf的语法为每行5项(在Linux-PAM的手册页pam(8)中有更详细的描 述): service type control module-path module-arguments Service是服务的名字,比如login,su等。注意,/etc/pam.d目录下面有许多 配置文件,分别对应某项系统服务,文件名即等于service,因此每行只有4项。 Type为account,auth,password,session之一,即要使用的认证模块。每个 应用可以使用多个认证模块,或者说可以将模块“堆叠”使用,但是每一行只能定 义一个,因此一项服务可以有多行配置。 Control规定了如何处理模块认证失败或成功,可以是requisite、required、 sufficient或optional。 Module-path是PAM库文件的文件名。缺省路径是/lib/security/。 Module-arguments是可以传给模块的参数。 5.5.4 other 特别需要指出的是,有一个特殊的服务名字——other。如果没有明确指明应用 于某项服务的规则,就用other的定义来处理。因此,我们可以想到,系统中PAM的 最简配置为,只有/etc/pam.d/other这一个配置文件,即可处理所有的认证请求。 下面是我们用过的一个other配置文件的例子: [xmdong@lips pam.d]$ cat other #%PAM-1.0 auth required /lib/security/pam_unix.so account required /lib/security/pam_unix.so password required /lib/security/pam_unix.so session required /lib/security/pam_unix.so 当然,这样处理对系统的安全性来说是不利的,最好还是给每项服务定义单独 的配置文件。这不过是一种简化问题的临时方案。 5.6 再论initrd 在前面的5.3节中,对initrd机制已经有了比较详细的讨论。准确的说,该部分 内容来自linux-2.4/Documentation/initrd.txt 文件。但是在实践中,我们发现其 中描述的有些方法并不适用。是新版本内核的变化造成的(内核实现与文档不同步 ),还是2.4版内核的bug,不得而知。在我查证的过程中,看到网上有不少相关的 问题和讨论。遗憾的是至今我还不能确认到底是什么原因。 后来我又专门读了2.2版内核中所附带的 initrd.txt 文件。我感觉实际的情况 似乎更接近于这个老文档的描述。我还看到一个有关的patch文件,从该文件中可以 明确看到新的initrd.txt文档的改变。下面是该文件的开始部分(行首的-表示老文 档有而新文档中已经删除,+表示新文档中增加的内容)。 Using the initial RAM disk (initrd) =================================== -Written 1996 by Werner Almesberger <almesber@lrc.epfl.ch> and - Hans Lermen <lermen@elserv.ffm.fgan.de> +Written 1996,2000 by Werner Almesberger <werner.almesberger@epfl.ch > and + Hans Lermen <lermen@fgan.de> -initrd adds the capability to load a RAM disk by the boot loader. T his -RAM disk can then be mounted as the root file system and programs c an be -run from it. Afterwards, a new root file system can be mounted from a -different device. The previous root (from initrd) is then either mo ved -to the directory /initrd or it is unmounted. +initrd provides the capability to load a RAM disk by the boot loade r. +This RAM disk can then be mounted as the root file system and progr ams +can be run from it. Afterwards, a new root file system can be mount ed +from a different device. The previous root (from initrd) is then mo ved +to a directory and can be subsequently unmounted. 下面我试图将我遇到的问题和能够确认的东西记录一下。(后面我们分别称新 、老文档为initrd.txt-2000和initrd.txt-1996) 5.6.1 根到底在哪里 在配置使用initrd之前,首先你要清楚,系统正常运行时,根文件系统挂载在 什么设备上(也就是说,root device是什么——root在哪里?)。 我们知道,使用initrd机制的话,系统启动时先以RAM Disk(/dev/ram0)作为 根,然后通过某种方法将根转换到“真实的根(real-root-dev)”(之所以说rea l,是与前面的RAM里临时的根比较而言)。一种常见的情形是启动时用initrd,然 后切换到一个硬盘分区,比如/dev/hda1。 事实上,这个根转换不是必须的。我们完全可以就把/dev/ram0作为我们真实的 根设备。这时,系统启动之后所有的操作都在RAM Disk中进行。当然这样做也有一 个明显的缺点,即无法保存数据。比如对系统配置进行的修改(象IP地址),重新 启动之后就丢掉了。如果要保存数据,就要想别的办法。 LiPS目前的做法就是这一种(没有根转换,initrd就是真实的根)。为了在重 新启动之后保持配置文件的修改,我们将目录/etc链接到了其他非易失存储器(例 如,一个硬盘分区,或者USB盘的分区)。 指定根设备是通过内核参数“root=”来完成的。以GRUB引导器的配置为例: kernel /boot/bzImage ro ramdisk_size=65536 root=/dev/ram0 initrd /boot/initrd.img 其中 ramdisk_size=65536 说明初始RAM盘的大小为64MB,root=/dev/ram0 说 明根的位置。下面第二个例子来自一台在hda1安装了Redhat 9的机子: kernel /boot/vmlinuz-2.4.20-8 ro root=/dev/hda1 initrd /boot/initrd-2.4.20-8.img 很明显,这里 root=/dev/hda1 指定了真实的根,其启动过程包含根的转换。 但是这里没有指定 ramdisk_size,因为initrd的缺省大小是4MB,而initrd-2.4.2 0-8.img比较小,所以用缺省值即可。 (我们多次提到root, root filesystem, root device, 自己体会吧。) 5.6.2 linuxrc 在initrd机制的设计中,初始RAM盘只是作为一个过渡性质的根设备,由/linu xrc来完成操作环境准备(比如加载一些不常用的、没有编译进内核的驱动程序模块 )和根转换工作。 Linuxrc的执行是自动的,即内核挂载initrd盘作为根,如果根下面有这个文件 (也就是/linuxrc),就执行它。(如果没有呢?当然什么也不做。所以linuxrc也 并不是必不可少的。) 接下来说说linuxrc的内容。下面的例子是从initrd-2.4.20-8.img中释放出来 的: [root@lips initrd]# cat linuxrc #!/bin/nash echo "Loading jbd.o module" insmod /lib/jbd.o echo "Loading ext3.o module" insmod /lib/ext3.o echo Mounting /proc filesystem mount -t proc /proc /proc echo Creating block devices mkdevices /dev echo Creating root device mkrootdev /dev/root echo 0x0100 > /proc/sys/kernel/real-root-dev echo Mounting root filesystem mount -o defaults --ro -t ext3 /dev/root /sysroot pivot_root /sysroot /sysroot/initrd umount /initrd/proc 该脚本中首先加载了支持ext3文件系统所需的模块,然后挂载真实的根文件系 统,并进行转换。特别需要注意的是,linuxrc脚本一般是用nash解释执行的,而不 是通常的bash。有关nash的详情请看手册页nash(8)。简单说,nash内置实现了多数 在执行linuxrc这个阶段可能用到的命令,比如mount, pivot_root, umount;而如 果使用bash,象mount等都是“外部命令”,就需要复制/bin/mount到initrd映像文 件中。实际上,在initrd-2.4.20-8.img的/bin中只有insmod和nash两个程序(mod probe符号链接到insmod): [root@lips initrd]# ls bin/ insmod modprobe nash 当我按照5.3.4节描述的方法测试linuxrc的时候发现,我的脚本头两句执行就 报错。 mount –o ro /dev/hda11 /sysroot cd /sysroot 这里我的真实的根设备是/dev/hda11,/sysroot是initrd映像中存在的一个目 录。这两句完全是按照该文档的要求写的。后来经过多次试验才发现问题之所在。 第一,nash实现的mount命令语法与我们常用的/bin/mount并不完全兼容;第二,n ash根本没有实现cd命令。 因此,可以推断initrd.txt-2000中讲linuxrc时所举例子不是用的nash。实际 上在该文档中根本没有指明用什么shell。再回头仔细看才发现,所有例句都是在r oot的shell命令提示符“#”后面的,那么它用的是bash之类了。但是令人迷惑的是 ,同样在该小节中稍后出现如下例句: # exec chroot . what-follows <dev /console >dev/console 2>&1 为什么用exec执行chroot呢?chroot可以在命令行直接用啊。文档中讲到,wh at-follows可以是/sbin/init。我用nash试了下面这个句子(nash中用exec执行外 部命令): exec chroot . /sbin/init <dev/console >dev/console 2>&1 还是不行。错误信息: Usage: init 0123456SsQqAaBbCcUu 开始我还以为后面那一串是个“magic number”,后来想以Usage开头应该是讲 使用这个命令的语法。看init(8)手册页,果然要求给一个参数,0~6当然是运行级 别啦,试了一个init 3也还是不行。尤其搞不明白后面那些个console什么意思。 5.6.3 根转换机制:新的?旧的? 前面我们多次提到了根的转换。在initrd.txt的两个版本中,分别描述了两种 根转换机制,其中2000版中称1996版的内容已经“过时”,不推荐使用。然而事实 上要麻烦的多,事情并不总是按照预期(如文档所述)运行。 为了弄清楚这个问题,我进行了一系列测试。环境是这样的: O 使用initrd机制,已经准备好了根文件系统映像文件initrd.img,准备好了内核 bzImage; O initrd.img的所有内容释放到一个硬盘分区/dev/hda11,ext2文件系统; O 在/dev/hda11上面增加一个/boot目录,存放bzImage和initrd.img文件; O 以/dev/ram0作为根启动,然后以某种机制转换到“真实的根”/dev/hda11。 系统的引导器是GRUB,安装在硬盘MBR,grub.conf位于/dev/hda1(也就是做测 试的实际的根文件系统)。按照上述环境配置,在grub.conf中增加如下内容: title lips (testing ......) root (hd0,10) kernel /boot/bzImage ro root=/dev/hda11 ramdisk_size=65536 initrd /boot/initrd.img 下面我们分别使用不同的/linuxrc进行了测试,以确认到底哪种机制是可行的 。 第一,如果没有/linuxrc会怎么样呢? 结果是系统能够成功启动到以/dev/hda11作为根,并且把initrd(也就是旧根 文件系统)的内容移到了/initrd目录。这是符合initrd.txt-1996文档中第一段的 描述的。所以只要你使用了initrd,指定了新的根,并且准备好了/initrd目录(已 经在/dev/hda11创建了/initrd),内核可以自动完成根的转换工作。终端上面有如 下输出信息: Trying to move old root to /initrd ... okay 这里有个小问题,即最后/initrd没有卸载,这意味着initrd所分配内存也没有 释放。因此umount /initrd不是内核自动完成的,而应该在/linuxrc中的某个位置 进行。如果linuxrc仅包含卸载/initrd的命令,如下: #!/sbin/nash umount /initrd 则执行情况是这样的:umount命令报错(返回错误码22),然后出现前面所示 Trying…的信息。结果跟前面是一样的。因为linuxrc执行在先,当时旧根还没有被 转移到/initrd中来。 如果没有/initrd目录会怎样?我们把/dev/hda11上面的/initrd目录删除,重 新启动(没有/linuxrc),结果是可以启动到以/dev/hda11为根,且看不到原来的 initrd。该过程中出现如下信息: Trying to move old root to /initrd ... failed Unmouting old root Trying to free ramdisk memory ... okey 第二,pivot_root可以用,但是chroot不能用。 pivot_root是在initrd.txt-2000文档中引入的新机制。在测试pivot_root的过 程中,除了在nash中不能用cd命令造成的困惑(这个问题前面已经说明)之外,使 用pivot_root基本上是成功的。/linuxrc脚本的主要内容如下: #!/sbin/nash mount -o defaults --ro -t ext2 /dev/hda11 /sysroot pivot_root /sysroot /sysroot/initrd 但是,用这个脚本不能启动,造成系统挂起: VFS: Cannot open root device “hda11” or 03:0b Please append a correct “root=” boot option Kernel panic: VFS: Unable to mount root fs on 03:0b 如果按照initrd.txt-2000的指导,pivot_root之后应该执行chroot,但是我始 终没有办法使chroot成功执行(有关情况前面已经说明)。不过可以肯定的是,pi vot_root执行成功之后,当前目录就是新的根目录。 第三,/proc/sys/kernel/real-root-dev initrd.txt的新版本中最后一节专门指出,向/proc/sys/kernel/real-root-d ev文件中echo数字的方法(称为change_root机制)是过时的。然而令人迷惑的是, Redhat 9的缺省安装产生的initrd-2.4.20-8.img中(前面已经列出了其/linuxrc文 件内容),同时使用了pivot_root和change_root机制。 测试下列/linuxrc脚本,系统可以启动到/dev/hda11,但是/initrd没有卸载。 如果在脚本末尾umount /initrd,会返回错误码16。 #!/sbin/nash mount -t proc /proc /proc mkrootdev /dev/root echo 0x0100 > /proc/sys/kernel/real-root-dev #echo 0x030b > /proc/sys/kernel/real-root-dev mount -o defaults --ro -t ext2 /dev/hda11 /sysroot pivot_root /sysroot /sysroot/initrd umount /initrd/proc 虽然这样可以启动,但是有关real-root-dev还有几个没有弄清楚的问题: real-root-dev的值到底是什么? 目前我还没有看到解释real-root-dev的值是什么东西的正式文档,根据情况判 断的话,我认为应该是该设备的“major-minor”(主、次设备号)。 为什么用0100而不是030b? 如果上述判断准确的话,那么写入0100就表示/dev/ram0。这就奇怪了,“真实 的根设备”应该是/dev/hda11呀,那么是不是应该写030b呢?但是测试发现用030b 同样会导致不能启动。 Kernel panic: VFS: Unable to mount root fs on 03:0b 5.7 提示 5.7.1 文件系统目录层次结构 根文件系统的目录结构最好符合“Filesystem Hierarchy Standard(文件系统 层次标准)”[7],而不能自己随意创建。 顺便说一下,象这种情况:/bin, /sbin, /usr/bin, /usr/sbin 这4个目录都 可以放应用程序,具体放在哪个目录,则要根据该应用程序在系统中的作用来确定 。一般地,系统的关键应用程序放在/bin,只能给超级用户root访问的关键应用程 序放在/sbin,相比之下比较次要的应用程序和root应用程序分别放在/usr/bin和/ usr/sbin。 5.7.2 mklips.sh(制作LiPS的脚本) 复制文件的工作全部可以手工进行,但是做一个shell脚本来完成所有工作显然 是一个更好的办法。 在我们的项目中,制作LiPS(也就是完成裁减Linux)的工作,除了编译内核之 外,都可以通过mklips.sh脚本完成。 5.7.3 lips.conf(LiPS配置文件) lips.conf是LiPS的配置文件,由mklips.sh脚本使用,主要用来控制所制作的 LiPS系统包括哪些可选的模块,例如: INCLUDE_APACHE=no INCLUDE_IPTABLES=no INCLUDE_PROFTPD=yes INCLUDE_NFSD=no INCLUDE_SAMBA=yes 通过一系列的INCLUDE_?=yes或者no,可以实现LIPS的模块化。在mklips.sh脚 本中,判断每个INCLUDE的值,来确定是否复制某个模块相关的文件。 配置文件中还可以包括其他可配置的信息。 5.7.4 cp –dpR 复制文件请使用“cp –dpR”命令,可以保留文件的属性(特别是对于设备节 点和符号连接等特殊文件),还可以复制整个目录。 5.7.5 如何判断一个程序依赖哪些文件 除了库文件外,关键是找出相关的配置文件。man手册页是判断应用程序配置文 件的重要依据。我们以安装Apache Server为例来说明判断复制哪些文件的过程。 首先确定其可执行文件是/usr/sbin/httpd。然后看httpd的手册页,即 [root@lips lips]# man httpd httpd(8) httpd(8) NAME httpd - Apache hypertext transfer protocol server …………(略) FILES /etc/httpd/conf/httpd.conf /etc/mime.types /etc/httpd/conf/magic /var/log/httpd/error_log /var/log/httpd/access_log /var/run/httpd.pid February 1997 httpd(8) (END) 这时关键看最后一段FILES,列出了有关的配置文件、日志文件和进程文件,那 么我们就知道了httpd要在目标系统中运行,这几个配置文件是必不可少的。 把httpd和用ldd找出的库文件以及上述配置文件复制到目标系统,运行httpd试 一下,看看是否正常。一般情况下应该没有问题。但是httpd比较特殊,除了ldd找 出的库文件外,它还需要很多可加载的模块(库)。怎么发现呢?重要的一点是看 出错信息(有时候还要查看日志中的信息,/var/log/messages或者应用程序日志) ,看httpd报告缺少什么;还可以看看相关的配置文件httpd.conf,也能找到有用的 信息。然后我们发现需要/usr/lib/httpd这个目录下的库,把它也复制过去即可。 5.7.6 带库文件复制——lcp() 在复制可执行文件(软件)的过程中,如果没有正确复制相关的库文件,该软 件肯定不能在目标系统中正常运行。而通过ldd命令手工确定每个软件的库文件,是 一个繁琐且费时的任务。另一个隐含的缺陷是,当你不再需要某个软件时,删掉可 执行文件之后,相应的库文件是否需要删除呢?如果删除了,而该库文件是其他软 件也需要的,会导致其他软件不能用;如果不删除,就有可能留一些垃圾库文件在 目标根文件系统中。 因此,最好是能够保证每次复制可执行文件的同时自动复制相关联的库文件。 我写了一个脚本函数 lcp() 来解决这个问题。语法和主要代码如下(以#开头的行 为注释): # lcp BIN BINPATH LIBPATH # BIN:可执行文件路径 # BINPATH:可执行文件的目标路径(复制到哪里) # LIBPATH:相关库文件的目标路径 lcp() # run()是另一个函数,执行它后面的shell命令,并在遇到错误时报错、写错 误日志 # 首先复制BIN到BINPATH run "$CP $BIN $BINPATH" # 使用ldd找出与BIN相关的库文件,把ldd的输出送给LDDSTR LDDSTR=`ldd $BIN` # 循环检查LDDSTR字符串的每一项 for STR in $LDDSTR; do # 判断出库文件路径 LIB=`echo $STR | grep "/lib/" ` if [ -z "$LIB" ]; then continue fi # 复制LIB到LIBPATH,除非要复制的库文件在目标路径中已经存在 LIBNAME=`basename $LIB` if [ ! -f "$LIBPATH/$LIBNAME" ]; then run "$CP $LIB $LIBPATH" run "cp $LIB $LIBPATH" else log "Warning: File "$LIBPATH/$LIBNAME" exis t." fi done } 5.7.7 库文件的命名 (参考资料[9]之6.2节) 我们这里所说的“库”都是指的GNU C Library,也就是glibc。 在/lib下面可以看到很多库文件,主要分为4类: O 实际的共享库(Actual shared libraries) 文件名格式为 libLIBRARY_NAME-GLIBC_VERSION.so,其中LIBRARY_NAME是库的真正 名称,GLIBC_VERSION是glibc包的版本号。比如glibc 2.2.3版math(数学)库的文 件名为libm-2.2.3.so。 O 主修订版本符号链接(Major revision version symbolic links) 库的主修订版本号与glibc版本号不同。比如,glibc 2.2.3的C共享库libc-2.2.3的 主修订版本号为6,libdl-2.2.3为2。主修订版本符号链接的命名格式为 :libLIB RARY_NAME.so.MAJOR_REVISION_VERSION,那么C共享库的符号链接即 libc.so.6。 一个程序连接到一个库之后,它在运行时访问的就是这个符号链接。 O 版本无关的符号链接(Version-independent symbolic links to the major re vision version symbolic links) 这些符号链接的作用是为用到某个库的所有程序提供一个统一的入口,而不管实际 上glibc的版本或者该库的主修订版本。其命名格式为 libLIBRARY_NAME.so。比如 ,libm.so链接到libm.so.6,libm.so.6又链接到libm-2.2.3.so。唯一的例外是li bc.so,是个脚本。连接一个程序时用的是这个符号链接。 O 静态库文件(Static library archives) 这些库是应用程序静态连接用的。格式为 libLIBRARY_NAME.a. 6 引导 6.1 引导过程概述 6.2 几种引导方式 几种引导方式的粗略比较如下表所示。 优点 缺点 DOC DOM FLOPPY HARDDISK NETWORK USB-HDD 容量大,读写可靠 6.3 grub引导器 有了前面生成的Linux内核和根文件系统映像文件后,制作引导盘非常简单。在 动手制作引导盘之前,最好先了解一下grub引导器。 Grub是一个通用的多引导加载软件,与较早期多数Linux发行版本提供的另一个 引导器lilo相比,grub的功能更强大、设置更方便、更灵活。因此本项目选用grub 作为引导器软件。 本文档不是grub的教学文档,所以有关grub的详细用法,请参考其他有关文档 。这里仅强调几点: O 引导盘的文件系统可以是ext2,ext3,msdos (FAT),vfat (FAT32),等等; O grub表示硬盘、分区的方式与Linux的方式不同。Linux系统的IDE硬盘表示为/de v/hd{a,b,c,d},SCSI设备表示为/dev/sd{a,b,c,d,…},分区从1开始编号,比如P rimary Master IDE硬盘的第二个分区是/dev/hda2;而grub的硬盘(包括IDE和SCS I)统一从0开始编号,分区也是从0开始编号,比如系统中的第一个硬盘是(hd0), 其第一个分区是(hd0,0)。 O 在grub的提示符下面输入命令和参数时,按TAB键可以自动补全。 6.4 USB引导 使用USB引导盘有很多好处,比如说,容量大、读写可靠,不占用IDE接口,携 带方便等等。 6.4.1 制作步骤 6.4.1.1 创建文件系统 首先,必须在USB盘上面创建文件系统(也就是格式化)。你几乎可以使用gru b支持的所有文件系统,包括常见的各种文件系统,比如ext2,ext3,FAT,FAT32等 。但是根据我的经验,需要注意的是: O 最好不要使用FAT,即msdos,因为FAT的文件名有“8.3”的限制,所以象“grub .conf”这种文件名就被截断成了“GRUB.CON”。 O FAT和FAT32都不能表示符号链接文件,虽然有变通的方法,即将文件再复制一份 。 顺便说一下在Linux下面怎么访问USB盘。 如果系统中没有其他的SCSI设备,那么插在USB 1接口上面的USB盘的设备名为 /dev/sda,其分区为/dev/sda1。依此类推。一般插入USB盘后,窗口中会出现驱动 程序输出的一些信息,其中有sd?的字眼。接下来就跟访问普通的硬盘分区没有什么 两样了。 #mke2fs /dev/sda1 #mount –t ext2 /dev/sda1 /mnt 注意:Redhat 7.3不支持Intel 845系列芯片组的主板。 6.4.1.2 复制文件 按照下面的列表,复制文件(包括目录结构)到USB引导盘: 备注 /boot/ bzImage 或者vmlinuz initrd.img /grub/ grub.conf menu.lst 符号链接 stage1 stage2 6.4.1.3 安装grub 安装grub到USB盘的引导扇区。假设系统有一块IDE硬盘,这时USB盘是grub看到 的第二块“硬盘”,所以表示为(hd1)。 #grub grub> root (hd1,0) grub> setup (hd1) root命令告诉grub,内核文件所在的位置。Setup命令安装grub到hd1的引导扇 区,如果是setup (hd1,0),则安装到第一个分区(即/dev/sda1)。 上述命令序列也可以通过执行脚本完成。 6.4.1.4 用USB盘引导系统 在用新制作的USB引导盘引导之前,还需要确认BIOS的一个设置,即第一个启动 设备应该设置为“USB-HDD”。 OK,插上USB盘,试一试。 6.5 提示 6.5.1 版本问题? 我们的项目开始的时候用Redhat 7.3,但是后来做USB引导盘时发现,我们的环 境不支持USB盘。我想Redhat 7.3应该是支持USB盘的,因为我以前在7.1下面就用过 。那么有可能是主板的问题,i845的芯片组比Redhat 7.3要新,也许是没有该芯片 组的正确驱动。 后来在Redhat 7.3下更新了内核,使用2.4.20版本的Linux内核即可正常支持U SB盘。 然而还有一个问题,Redhat 7.3的GRUB版本是0.91,在使用中发现,制作USB引 导盘没有问题,但是一旦你改变USB盘的文件(比如复制一个新的文件上去),本来 可以引导的USB盘就不行了。 而Redhat 9.0使用的是GRUB 0.93,就没有上述问题,并且使用USB盘也没有问 题。也就是说,使用Redhat 9就可以了。不过Redhat 9集成的其他很多软件也有变 化,比如Apache升级到了2.0版本,以前的httpd.conf配置文件要修改过之后才能正 常使用;另外quota接口也有变化。 因此改变版本需要一定的代价,究竟使用什么版本应该综合考虑,最好在项目 开始时就做出正确的选择,并保持稳定。 7 远程串口控制台 7.1 概述 7.2 配置方法 7.3 提示 7.4 Linux 远程串口控制台指南 (这是我以前写的一份简单的文档,曾经贴到网上,附在这里供参考) Linux 远程串口控制台指南 dot <anonymou@163.com> Dec 27, 2002 2002年圣诞节期间,我在 Redhat Linux 7.0 (kernel 2.2.16-22) 平台上配置 了远程串口终端,整个过程基本顺利,但是也经历了一些意想不到的波折,幸好最 终是成功了的。乘着记忆还比较清晰的时候,写下这篇文档,以供自己和他人参考 。 首先参考 "Linux-Remote-Serial-Console-HOWTO",该文档已经足够详尽,按 要求一步步地做即可。该文档描述的是 Redhat 7.2 平台,个别地方跟 7.0 有些差 异,不过问题不大。 要注意的问题主要是: * 串口直连电缆 开始我并没有在意这个问题,我手头上有一根以前做的直连电缆,是只用了3根 线的那种(2、3交叉,5对接),因此 HOWTO 文档中讲电缆制作的章节我就跳过去 了,没有仔细看,以为我这根电缆就可以了。事实也给人以这种假相:当我按照文 档的说明完成了配置文件的修改,重新引导 Linux 机子,这时在 Windows 的超级 终端中确实显示了所有该显示的信息,看起来没问题。然而接下来配置 getty 时就 不行了,应该出现在超级终端中的 login: 提示符死活不肯出现。以为是 getty 软 件的问题,先后测试了 getty 和 mgetty,都不行。后来在 quickmouce 的提醒下 ,又仔细看文档,按照 11.3 节的图 11-1 重新制作了串口直连电缆,才解决问题 。 * getty 软件 HOWTO 文档中已经指出,mingetty 不支持串口终端,所以这个软件要首先排除 (mingetty 的手册页中也有相关说明)。而 Redhat 缺省安装的就是这个软件,所 以要重新下载安装其他的 getty 类软件。文档中也已经列出了几种常用的 getty 的变种。 来说说 mgetty 先。为什么我先使用了这个软件呢,一是因为 Redhat 7.0 的 安装盘上面有它的 RPM 包,直接拿来装很方便,另外是因为 mingetty 的手册页中 推荐使用 mgetty 。结果是 mgetty 运行后在日志文件中报告大量错误,莫名其妙 。我想可能是这个光盘上的版本老了,于是上网下载了比较新的版本 mgetty-1.1. 25-5.i386.rpm ,运行之后情况好多了,似乎要成功的样子。在没有使用新的串口 线之前,login: 出不来,但是在超级终端中敲的字符 mgetty 可以收到(从日志中 看的出来);换了新制作的串口线之后,第一次!成功了,一切都象预期的那样, 我可以从超级终端登录。可是当我退出想再登录一次,就不行了,甚至我把两台机 子全部重启也不行啦。我又试用 Linux 的 minicom 终端来连接,也是只成功了一 次,就再也不行了。真是怪哉,脑袋都快想破了,也不知道是为什么。后来终于怀 疑 mgetty 有问题,换了其他的,天哪,终于解脱了。不知道后面更新的版本是否 可以,我是没有劲去试了。 再来说说 agetty 。其实没有什么好说的,因为我根本没有用过这个。我本来 想试一下的,但是从网上下载安装太麻烦了。下载了 agetty-2.11w-2.i386.rpm , 安装时 RPM 说要先安装 login 包,然后又要求什么 pam 包,然后又需要 awk , 真是 faint 了,太麻烦了,所以最终我也没有安装它。 最后说 getty 啦。也就是 HOWTO 文档中所谓的 “传统” getty 。我下载的 RPM 包的名字叫 getty_ps-2.0.7j-9.i386.rpm 。当我正在为 mgetty 的问题头疼 的时候,换成它之后就一切 OK 了。 * 终端软件 Windows 下面可以用超级终端、NetTerm,Linux 下面有 Minicom 。都比较好 用,注意参数配置与目标机的串口一致。 * 修改过的配置文件列表 /etc/lilo.conf /etc/inittab /etc/gettydefs /etc/securetty /etc/makedev.d/linux-2.2.x /etc/security/console.perms /etc/sysconfig/init /etc/sysconfig/kudzu * 再谈串口直连电缆 这次调试在串口直连电缆上面花费了不少力气,对它们的了解也增加了不少。 以前以为直连电缆就是接 3 根线,其实不然。只用了 2、3、5 引脚的直连电缆不 能提供握手信号,因此如果软件需要使用 CTS/RTS 或者 DTR/DSR 流控,就需要连 接更多的引脚。 PC DB9 DB9 -------------------- ----------------------- RxD Receive Data 2 <----- 3 TxD Transmit Data TxD Transmit Data 3 -----> 2 RxD Receive Data |--> 6 DSR Data Set Ready DTR Data Terminal Ready 4 --|--> 1 DCD Carrier Detect GND Signal Ground 5 ------ 5 GND Signal Ground DCD Carrier Detect 1 <--| DSR Data Set Ready 6 <--|-- 4 DTR Data Terminal Ready RTS Request To Send 7 -----> 8 CTS Clear To Send CTS Clear To Send 8 <----- 7 RTS Request To Send RI Ring Indicator 9 (not used) 上面是两端都是 DB9 接头的标准 NULL MODEM 电缆的接线图,可以提供全部握 手信号。这也是 Remote-Serial-Console-HOWTO 中要求的直连电缆做法。我做通串 口控制台使用的就是这种电缆。 如果你打算自己制作电缆,就会发现一些问题。我们一般利用网线(双绞线) 来做,这种双绞线是 8 芯的,而按照图示的连接方法则需要 9 根线。因此最简单 的方法是用那种很多芯的排线来做,需要多少根割多少根(最好是彩色的,不容易 弄混)。后来我想,我们用到的其实就是 CTS/RTS 流控信号,到 2000 年为止 Li nux 还不支持 DTR/DSR 流控,应该用不了这么多线。于是我就用网线做了根不完整 的直连电缆:2、3 交叉,5 对接,7、8 交叉,还空 3 根线,就把 1、4 也交叉连 上了,结果是用了 7 根线,还空 1 根,与上面比只是少了 4、6 交叉,也就是没 有 DTR/DSR 信号。事实证明这样也是通的。我猜想 1、4 交叉不要应该也是通的, 只是没有试过,已经焊上去懒得再弄了。 关于串口方面的更多内容可以参考 "Linux-Text-Terminal-HOWTO" 和 "Linux -Serial-HOWTO" 文档。 * 为什么要用串口终端(控制台)? 为什么费劲做这个 Serial Console 呢?最容易想到的理由是省钱,呵呵,省 掉了显卡、显示器、键盘,只剩下一个 "Box",多好玩。 说正经的,这种做法在嵌入式系统的开发中也是很有价值的。现在很多人都在 利用 X86 平台做嵌入式系统开发,甚至做产品。我曾经测试过清华某某做的 foob ar 服务器,镜像光盘用的,卖给你的就是一个主机,我自己给接上显示器、键盘, 开机就是 Linux ,还可以进入单用户模式,两分钟就把 root 口令改了,你说这样 的服务器有什么安全性可言?如果能够屏蔽本地控制台,配置串口终端,不是更“ 象”一个产品吗? (完) 8 系统安装光盘 8.1 概述 本节介绍一种系统安装光盘的制作方法。安装光盘用于产品阶段的生产安装。 因此该安装光盘必须是可引导的、简单好用,并且一般不包含源代码。 制作可引导光盘的方法有很多种,我们用了一种最简单的方法,就是拿来一个 可引导光盘的ISO映像,然后做必要的修改以满足我们的要求。 请准备Redhat 9的第一张安装光盘,我们将要用到的文件是 /images/boot.is o。(其他发行版本应该也可以,只要原理是一样的。) 另外如果你的工作平台是Windows,请准备WinISO 5.3软件,用来编辑光盘ISO 映像文件。 当然如果你要烧盘测试的话,还要准备刻录机和CD-RW或者CD-R光盘。 8.2 boot.iso光盘的文件结构分析 用WinISO打开boot.iso即可看到该光盘的文件(其实Redhat 9第一张安装光盘 的/isolinux目录就是boot.iso解开后的内容)。下面是文件列表: [xmdong@lips isolinux]$ ls boot.cat initrd.img options.msg snake.msg vmlinuz boot.msg isolinux.bin param.msg splash.lss general.msg isolinux.cfg rescue.msg TRANS.TBL 其中关键的文件是boot.cat,initrd.img,isolinux.bin,isolinux.cfg和vm linuz;isolinux.cfg是如何引导的配置文件,我们主要修改这个文件即可;initr d.img和vmlinuz分别是初始化RAM盘和内核,其作用在前面章节中已经详细描述过; 另外两个文件是光盘引导需要的,不动它。 其余的*.msg文件是一些引导过程中可能会显示的文本信息,可以不管;splas h.lss是引导时显示的一个图片,也可以不管。 下面来看看isolinux.cfg的内容。 default linux prompt 1 timeout 600 display boot.msg F1 boot.msg F2 options.msg F3 general.msg F4 param.msg F5 rescue.msg F7 snake.msg label linux kernel vmlinuz append initrd=initrd.img label text kernel vmlinuz append initrd=initrd.img text label expert kernel vmlinuz append expert initrd=initrd.img label ks kernel vmlinuz append ks initrd=initrd.img label lowres kernel vmlinuz append initrd=initrd.img lowres 这个配置文件的语法结构跟其他引导器的配置文件,比如grub.conf或者lilo. conf,非常类似,比较好懂。如果再对照光盘引导安装Redhat的实际过程看一下, 基本上不需要什么解释就可以理解。其中以label开头的每个小节是一种引导配置, 缺省(或者timeout后)以label linux引导。每个配置的第一句,kernel指定引导 所用的内核,第二句append指定内核引导参数(主要说明initrd文件的位置,以及 其他参数)。 8.3 制作步骤 1) 复制boot.iso,用WinISO打开; 2) 解放出isolinux.cfg文件,并从光盘映像中删除之; 3) 修改配置文件isolinux.cfg; 4) 制作bzImage和initrd.img,这两个文件用于光盘引导至一个比较正常的Linux系 统下,包括常用的工具软件和服务,我们要在这个环境下进行产品的安装; 5) 将修改后的isolinux.cfg以及initrd.img,bzImage加入光盘; 6) 准备一个setup目录,将产品安装需要的文件和脚本放在这个位置,然后将setu p目录加入光盘; 7) 删除没有用到的文件,也可以不管,除非加入文件时遇到冲突,必须先把原来光 盘上的文件删除或者改名; 8) 存盘退出,刻录光盘。 下面是一个修改后的isolinux.cfg配置文件的例子,很简单: default linux prompt 1 timeout 600 label linux kernel bzImage append initrd=initrd.img ramdisk_size=65536 root=/dev/ram0 几个重要的RedHat Linux内核文件介绍
制作自己的Linux操作系统(5)
附录D hdlist和hdlist2生成方 假设在/tmp/cdimage/RedHat/RPMS目录下收录着RPM包的话,则通过使用
生成hdlist和hdlist2文件,文件的生成位置在目录/tmp/cdimage/RedHat/base/下 附录E sensor.py文件清单
附录F syslinux.cfg文件清单
附录G boot.img制作启动盘方法
附录H Linux光盘映像制作方法 在Linux下光盘映像的制作用mkisofs命令,具体的,假设在/tmp/cdimage/目录下收录着将要被制作的光盘内容,则执行
即可在/tmp目录下做出一命名为NetCopLinux.iso的光盘映像文件,它以/tmp/cdimage/images/boot.img 作为光盘启动文件。 制作自己的Linux操作系统(4)4. 原始资料及参考文献
附录 附录A boot.img和initrd.img的解析过程 1.首先建立两个映像文件解析后的装载点(mount point):
2.写shell脚本进行解析和还原: 解析脚本命名为up
还原脚本命名为down
附录B stage2.img解析过程 1.首先建立映像文件解析后的装载点(mount point):
2.写shell脚本进行解析和还原: 解析脚本命名为up2
还原脚本命名为down2
附录C comps文件清单
制作自己的Linux操作系统(3)●建立硬盘介质中的调试目录 在硬盘的Linux分区中建立形如RedHat安装光盘目录结构的调试目录及相关文件,如下所示:
建立这种目录结构和相关文件的原因是在安装程序中已经以代码的形式确定了它们的命名及结构。其中,对boot.img和stage2.img的相关修改如前所述,而涉及到对comps,hdlist,hdlist2的修改,则需在后续的裁剪过程中确定。 至此,调试环境建立完毕。现在可以用做好的启动盘来引导系统,并且可以从指定的硬盘上测试安装程序和RPM包的正确性。 2.3对安装步骤的简化 在对RPM 包的剪裁进行之前,还要对原有的安装步骤做出简化,去掉一些与系统需求大致无关的项目,使安装者可以集中精力地配置Sensor的主要参数,忽略诸如对键盘,鼠标,和多国语言的配置。具体的如下所示: 原有的安装步骤有: 1.安装语言选择 2.键盘配置 3.鼠标配置 4.欢迎信息 5.安装类型选择(包括安装或升级,安装部分又包括workstation,server,laptop,custom四种类型) 6.选择分区方式(自动分区,手动分区,专业分区) 7.选择以上部分或全部分区格式化 8.Lilo操作系统引导器配置 9.网卡及网络配置 10.防火墙配置 11.语言配置 12.时区配置 13.账户配置 14.认证配置 15.包组及单RPM包选择 16.包独立性检查 17.X-Window配置 18.安装前确认 19.安装过程 20.制作启动盘 21.安装完毕确认 在这些安装步骤中很多都是在确定了RPM包组及调试完成后不必要存在的,所以去掉第1,2,3,4,7,8,10,11,14,16,17和第20项安装步骤,所有去掉步骤的相关设置都采取默认的设置值,如第7步 采取分区全部格式化的方案,第8步,采取Lilo放置在MBR上,default boot 为Linux的设置等等,并修改第5步,去掉升级类型和安装类型中的所有4种既定类型,添加IDS sensor类型。修改完成以后的安装步骤如下所示: 1.安装类型选择(现有的为IDS sensor一种) 2.选择分区方式(自动分区,手动分区,专业分区) 3.网卡及网络配置 4.时区配置 5.账户配置 6.包组及单RPM包选择 7.安装过程 8.安装完毕确认 为此,需要修改Python脚本语言 ● 在安装程序运行之初,需要先禁止掉安装语言选择,键盘配置,鼠标配置和欢迎信息,在anaconda中在判断语言是否有效之前即Line491 if lang:之前加上以下四句:
并在gui.py中的类class InstallInterface的run函数中注释掉Line371至Line371,即在commonSteps结构中除保留( InstallPathWindow, "installtype" )外,注释掉( LanguageWindow, "language" ),( KeyboardWindow, "keyboard" ),( MouseWindow, "mouse" )和( WelcomeWindow, "welcome" ) ●对安装类型进行精简。在installclasses目录下去掉upgrateonly.py , workstation.py , server.py , laptop.py和custom.py即去掉升级类型和安装类型中的所有4种既定类型, 添加IDS sensor类型,即在目录中添加sensor.py文件,文件的具体内容请参考附录E。 除此之外,还要修改iw/installpath_gui.py脚本文件,以便在图形界面上不显示Install和Upgrate图标和选项,只显示IDS Sensor项目。具体的,注释掉Line223,Line 227,Line 233和Line 234代码,即在类class InstallPathWindow中的getScreen函数的最后部分不执行显示。 ● 去掉其他多余步骤,主要修改iw/installpath_gui.py脚本文件。注释掉类class InstallPathWindow初始化函数__init__里结构self.installSteps中的( FormatWindow, "format" ) , ( FirewallWindow, "firewall" ) , ( LanguageSupportWindow, "languagesupport" ) , ( AuthWindow, "authentication" ) , ( UnresolvedDependenciesWindow, "dependencies" ) , ( XConfigWindow, "xconfig" ) , ( BootdiskWindow, "bootdisk" ),即对应着去掉的第7,10,11,14,16,17和第20步骤。 当这三步完成后,进行make和make install,重新编译程序,使修改生效,并把这些文件Copy至stage2.img中的相关位置,替换掉旧文件。这样就完成了对安装步骤的简化。 2.4对RPM 包的剪裁 对RPM包的裁剪依这次的需求进行。项目整体分析时已做出说明,制作目的是为了在系统前端Sensor 中能够快速,正确地建立运行Snort的Linux系统环境。所以只需保留Linux基本系统和运行snort所需的环境即可。 Linux基本系统的RPM包组成在comps文件中的base部分中有详细的描述,所以就以它为蓝本,去掉除base以外的所有component,并去掉base中以下不必要的RPM包:
在comps文件中增加IDS Sensor component并在此组中添加必要的RPM包,如snort-1.8.1就需要snort , libpcap , mysql , openssl , openssl-clients , perl等RPM包,除此之外,为了方便调试,也保留了一些用于操作和诊断的RPM包,如tcpdump , iputils , zip等,完成的comps请参考附录C。 同时,在/RPM目录中依照上面所有确认保留的RPM包名称,删除不予保留的各RPM文件(文件后缀.rpm)。此时在/base中的comps文件和在/RPM中的各rpm文件都已剪裁完成,可以利用genhdlist生成hdlist和hdlist2文件了,genhdlist 在anaconda-7.1的源代码中的utils目录里。具体生成方法见附录D。 3. 存在的问题及今后目标 此次对NetCop Linux发布的制作是以RPM包作为裁剪单元进行的,所以必然存在很大缺陷,即对RPM包的内部毫无办法,无法去掉RPM包内部对需求无用的大量文件并且无法对内核,脚本文件等做出制定修改。所以,下一步所要做的工作,是逐一打开每一个候选的RPM包,依需求对包内的每一个文件做出修改或丢弃,这样才能做出真正适合sensor的Linux发布,无疑,工作量是巨大的。
制作自己的Linux操作系统(2)●行为部分 RedHat 7.1的安装程序被命名为anaconda。如前所述,当boot.img所代表的启动介质被系统引导之后,在内存中就建立了一个完整的Linux系统(包括Linux内核和一个内存虚拟文件系统),之后便执行文件系统中存在的loader命令,从适当的介质中执行安装程序(例:安装介质是CD-ROM,就解析CD-ROM上的stage2.img,并从中执行安装程序),即执行anaconda,完成Linux系统的安装任务。 此次利用RedHat 7.1的安装程序源代码的SRPM包形式:anaconda-7.1-5.src.rpm来获得anaconda的源程序,经解包后在/usr/src/redhat/SOURCES/anaconda-7.1形成了源代码树。
分析如下: anaconda安装程序主要用Python语言写成,它是一种解释性的,面向对象的脚本语言。源文件后缀为.py,也可生成可执行的字节码,后缀为.pyc或.pyo。其中: installclasses/ 子目录中各文件定义了在安装过程中用户可选择的安装类型,通常由四个文件workstation.py , server.py , laptop.py和custom.py来描述workstation(工作站)安装类型,server(服务器)安装类型,laptop(膝上型电脑)安装类型和custom(自定义)安装类型。每个脚本文件的内部,则是根据自己安装类型的特点对安装步骤,分区策略以及包的取舍做出了不同的方案。 iw/ 子目录中各文件定义了在图形界面安装状态时各步骤对Next(下一步)和Prev(上一步)的响应函数。 loader/ 安装程序装载器的源代码目录,用C语言写成。 pixmap/ 图形资源目录,包括安装过程中使用到的所有位图,图标。 utils/ 安装程序实用工具目录。 anaconda 是安装程序的主执行文件,它建立了Python语言的运行环境,提供了程序的入口点并以模块的方式将各个子系统结合在一起。 gui.py 定义了安装程序图形界面使用的各种窗口类,包括MessageWindow,ProgressWindow,WaitWindow,ExeceptWindow等,和控制这些窗口及图形界面行为的InstallInterface, InstallControlWindow, InstallControlState类。总之,控制gui。 todo.py 定义了安装程序的各种行为函数,它是图形界面背后真正进行各项操作的函数集合。 harddrive.py 定义了当安装介质为硬盘时,系统该如何找到安装程序的光盘映像,并从中执行程序。 安装程序源代码的编译由make和make install组成,完成后在/usr/src/RedHat目录下形成了如下目录结构:
此目录结构基本与stage2.img的文件结构相同。 2.2调试环境的建立: ●对源程序的修改 在分析完安装程序的基本构成之后,就要建立相应的调试环境。建立此环境的目的是为了可以方便地对修改过的安装程序及裁减后的RPM包进行随时的确认。显然,可以选用CD-ROM或本地硬盘作为调试介质,下表比较了两者的差别:
在两者各有优缺点的情况下,考虑折衷的方案,即为了首先保证调试的效率,采用硬盘作为调试介质,但对应的映像文件选取stage2.img,这样能达到效率最大化,同时调试界面采取图形方式。采用此方案时,须修改源代码,以达到预期的效果。 从前面对安装系统的分析,可以看出在initrd.img中的/sbin/loader程序负责判断安装介质的有效性,并从中执行安装程序。所以要首先修改它的源代码文件loader.c,从中找出硬盘安装时默认读出光盘映像文件*.iso的函数setupIsoImages,并注释掉其中在硬盘目录中寻找映像文件*.iso的相关操作,具体对应Line 582 至 Line590行中包含sprintf和if(){}循环的语句,以避免打开子目录,并在其后加入mountLoopback("/tmp/hdimage/RedHat/base/stage2.img","/mnt/runtime", "loop0");一句以便实现直接使用stage2.img的目的,并注释掉其后从errno=0开始的代码,经过整个while循环到closedir(dir),但保留umount(“/tmp/hdimage”);注释掉if(!net) return NULL;一句。以上操作目的是防止程序读出光盘映像文件*.iso。在loader.c的主函数main()中的结尾部分,注释掉if (!FL_TESTING(flags)) { 和 }的条件判断的两条语句,让程序毫无疑问地执行硬盘上的安装程序。至此,对loader.c修改完毕。 同时还要对Python脚本的一些相关文件进行修改以保证对stage2.img文件的支持。具体的,在harddrive.py的类class HardDriveInstallMethod中,注释掉函数 mountMedia(self, cdNum)中的所有内容并加Pass语句的方法使此函数失效,同样方法处理umountMedia函数,mountDirectory函数和umountDirectory函数,为了保险起见,在其他函数中注释掉有关上面函数的调用。并在类的构造函数(初始化)中的# Go ahead…语句之前加self.tree=”/tmp/hdimage/”语句,并注释掉后面的所有语句。这样做仍然是要保证废弃iso映像转而对stage2.img实现控制。不仅如此,最好还注释掉todo.py中的Line1781至Line1783调用self.method.systemMounted一段,以确保不出差错。接着进行make和make install,重新编译程序,使修改生效,并把新的loader程序从编译的目标目录中copy到boot.img中initrd.img中的相应目录并覆盖旧的loader文件。为了启动时的快速,修改boot.img中的syslinux.cfg文件,去掉启动提示,延时和其他Linux启动选项,修改后的syslinux.cfg文件,请参考附录F 最后,把boot.img做成启动盘,方法请参考附录G。
制作自己的Linux操作系统(1)1.项目整体分析 制作Linux发布的目的是为了在系统中能够快速,正确地建立Linux系统环境。制作Linux发布的主要工作是决定各种软件的去留,因为有了RPM(RedHat Package Manager)包对其提供优良的管理能力,所以以目前比较成熟的RedHat 7.1(Linux Kernel Version 2.4.2-12)Linux发布程序作为蓝本,以RPM包作为基本的制定单元,以需求为原则对其进行取舍,得到适合实际需要的Linux系统。 由此,项目自然而然的以分析RedHat Linux的光盘安装系统为起点,在掌握了其结构和行为的基础上,在包一级(结构部分)和代码一级(行为部分)进行修改,同时建立相应的测试环境,以便对修改进行及时的规范。 2.项目分步骤实施细节 2.1对Linux光盘安装系统的分析 ●结构部分 在安装光盘中,主要的目录结构和文件大致如下: images/ 此目录下包含了制作启动盘的映像文件(文件后缀img), 其中boot.img是当安装介质为CD-ROM时负责引导系统的映像文件 bootnet.img是当安装介质为FTP,NFS等时负责引导系统的映像文件 driver.img是由一些特殊设备驱动程序模块组成的映像文件,在当前内核不支持这些设备的情况下,提供了对它们进行访问的一种方法 其中,boot.img映像文件中主要包含以下文件:
其中,initrd.img为Linux ext2文件系统,构成如下:
可执行文件/sbin/loader的任务是判断安装介质的有效性,并从中执行安装程序。 其实正是boot.img,在系统启动时被执行,经解析之后在内存建立起了Linux内核,并根据配置文件syslinux.cfg装载虚拟文件系统,形成了完整的Linux System,为后续的工作提供了必要的操作系统环境。Boot.img映像的文件系统类型为msdos,而其中的initrd.img映像的文件系统类型必为Linux系统自己的ext2,所以对于它们的解析操作是不同的,具体请参考附录A 。 RedHat/ 此目录是RedHat Linux发布的核心目录,主要的目录结构都在这里,其中 RPMS/ 包含了RedHat Linux发布的主要部分,即以RPM包的形式将Linux系统中的二进制可执行文件,配置文件,文档等等组织在一起,形成能完成一定功能的比较独立的软件包(文件后缀rpm)。这个目录就是把这些软件包都集合在一起,形成了RedHat Linux发布。 base/ 包含了在安装过程中要用到的描述组织结构和安装行为的所有文件,其中comps,hdlist和hdlist2是描述RPM包组织结构的文件。 comps 此文件把各个RPM包按一定的原则组织成若干组,即components,这样在安装过程中就不必对每一个包做出取舍,而以组为单位。comps文件为简单文本格式,它的结构如下所示:
hdlist和hdlist2 这两个文件维护从RPM包名到真实包文件名的映射过程,例如从snort这个RPM包名到真实包文件名snort-1.8.1-1.1.2.i386.rpm的映射。这两个文件是用特殊的程序生成的,无法用简单的方法察看其中的内容和结构。具体的生成方法请参考附录D。 stage2.img , hdstg1.img , hdstg2.img , netstg1.img 和netstg2.img 是描述安装行为的映像文件,其中 stage2.img 是当安装介质为CD-ROM时的安装程序映像文件 hdstg1.img 是当安装介质为HardDisk时的安装程序映像文件 hdstg2.img 是当安装介质为HardDisk时的安装程序映像文件 netstg1.img 是当安装介质为FTP,NFS时的安装程序映像文件 netstg2.img 是当安装介质为FTP,NFS时的安装程序映像文件 这里主要讨论stage2.img的内容
如上所示,stage2.img映像文件中的主要部分是安装程序anaconda,它的主执行体是/usr/bin下的anaconda,由其调用的大量例程分布在/usr/lib/anaconda下,而安装过程中要用到的资源文件分布在/usr/share/anaconda下。stage2.img 的解析方法请参考附录B。 linux 引导过程
|