LINUX系统裁剪指南(LiPS)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《Linux 系统裁减指南 (LiPS)》
目录
目录 (1)
1 引言 (4)
1.1 编写目的 (4)
1.2 背景 (4)
1.3 定义 (4)
1.4 参考资料 (4)
2 总体描述 (5)
2.1 硬件环境 (5)
2.2 软件环境 (5)
2.3 需求规定和约束 (5)
3 总体设计 (6)
3.1 基本设计概念 (6)
3.2 软件结构 (6)
4 内核 (6)
4.1 创建内核的方法 (6)
4.2 内核配置 (7)
4.2.1 概述 (7)
4.2.2 Loadable module support (8)
4.2.3 Processor type and features (8)
4.2.4 General setup (8)
4.2.5 Plug and Play configuration (9)
4.2.6 Block devices (9)
4.2.7 Multi-device support (RAID and LVM) (10)
4.2.8 Networking options (10)
4.2.9 ATA/IDE/MFM/RLL support (11)
4.2.10 SCSI support (12)
4.2.11 Network device support (12)
4.2.12 Character devices (13)
4.2.13 File systems (14)
4.2.14 Console drivers (15)
4.2.15 USB support (15)
4.3 提示 (16)
4.3.1 EXTRA VERSION (16)
4.3.2 .config (17)
5 根文件系统 (17)
5.1 根文件系统 (17)
5.2 文件系统的内容 (17)
5.2.1 应用程序(applications) (17)
5.2.2 设备文件(device files) (18)
5.2.3 脚本和配置文件(scripts and configuration files) (19)
5.2.4 库文件(libraries) (20)
5.2.5 必要的目录 (20)
5.3 初始化RAM盘(initrd) (21)
5.3.1 操作步骤 (21)
5.3.2 引导选项 (21)
5.3.3 安装 (22)
5.3.4 改变根目录设备 (23)
5.3.5 使用场合 (24)
5.3.6 淘汰的根转换机制(change_root) (24)
5.4 系统初始化(init) (24)
5.4.1 init的任务 (24)
5.4.2 SysVinit (25)
5.4.3 两种风格:Slackware vs. Debian (25)
5.5 PAM (26)
5.5.1 什么是PAM (26)
5.5.2 PAM的结构 (26)
5.5.3 配置文件 (26)
5.5.4 other (27)
5.6 再论initrd (27)
5.6.1 根到底在哪里 (28)
5.6.2 linuxrc (28)
5.6.3 根转换机制:新的?旧的? (30)
5.7 提示 (31)
5.7.1 文件系统目录层次结构 (31)
5.7.2 mklips.sh(制作LiPS的脚本) (32)
5.7.3 lips.conf(LiPS配置文件) (32)
5.7.4 cp –dpR (32)
5.7.5 如何判断一个程序依赖哪些文件 (32)
5.7.6 带库文件复制——lcp() (33)
5.7.7 库文件的命名 (34)
6 引导 (35)
6.1 引导过程概述 (35)
6.2 几种引导方式 (35)
6.3 grub引导器 (35)
6.4 USB引导 (35)
6.4.1 制作步骤 (36)
6.4.1.1 创建文件系统 (36)
6.4.1.2 复制文件 (36)
6.4.1.3 安装grub (36)
6.5 提示 (37)
6.5.1 版本问题? (37)
7 远程串口控制台 (37)
7.1 概述 (37)
7.2 配置方法 (37)
7.3 提示 (37)
7.4 Linux 远程串口控制台指南 (37)
8 系统安装光盘 (40)
8.1 概述 (40)
8.2 boot.iso光盘的文件结构分析 (40)
1 引言
1.1 编写目的
说明Linux系统裁减的过程及解决的主要技术问题。
本文档的编写是为了说明LiPS的详细设计过程,也可以作为构造一个小型化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: 通用串行总线
1.4 参考资料
[1] DIY:自己动手做一个迷你 Linux 系统. IBM developerWorks 中国网站.
htt
p:///developerWorks/cn/linux/embed/diy/index.shtml
[2] Linux From Scratch. http://clfsbook.mylab.idv.tw/index.html
[3] Linux启动过程综述. /forum/showdoc.jsp?l=1&
i=15750
[4] The Linux Bootdisk HOWTO (中译版). .tw/CLDP/gb/B ootdisk-HO WTO.html
[5] Using the initial RAM disk (initrd). /usr/src/linux-2.4/Documentatio
n/initrd.txt. (译文:/Project/3ybaby/discuss-area/c d-boot/cdboot_refer/initrd. htm)
[6] Quickmouse于2003.1发表于白云黄鹤BBS (/
Linux讨论区的帖子“裁减Linux”。
[7] Filesystem Hierarchy Standard. /fhs/pub/fhs-2.2.pdf
[8] LINUX ALLOCATED DEVICES. /usr/src/linux-2.4/Documentation/device.txt
. 或者最新的列表在/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/
/developerWorks/cn/linux/l-pam/index.shtml . 2003.7.[12]
2 总体描述
2.1 硬件环境
开发主机:
Intel 845芯片组主板,P4赛扬1.8GHz CPU,256M内存,60G IDE硬盘,RTL8139网卡。
目标机:
与主机同构。
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/D OM等常用设备引导。
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 Memory Suppor t也可以打开,不清楚有什么用。
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选项看情况也可以不要。
SCSI 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
[*] 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 Language 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 UPSe
--- 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 Human Interface Devices (HID)
<*> USB Human Interface Device (full HID) support
--- Input core support is needed for USB HID input layer or HIDBP
[ ] /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 support
--- USB Network adaptors
--- USB port drivers
USB Serial Converter support --->
--- USB Miscellaneous drivers
< > Texas Instruments Graph Link USB (aka SilverLink) cable support
< > USB LCD device support
USB支持。
如果没有使用USB设备,这部分可以不选。
要使用USB盘,一定要选中U SB Mass Storage support。
其余很多选项我也不清楚是干什么用的。
4.3 提示
4.3.1 EXTRA VERSION
在系统中使用uname可以获得系统版本信息。
比如Redhat 9:
[root@lips root]# uname -r
2.4.20-8
[root@lips root]#
返回结果表示了Redhat修订后的内核版本号。
前面我们提到过,这个“-8”就是Redh at附加在标准内核版本号后面的一个信息。
在一个运行LiPS的系统中,我们也需要确定当前使用的内核版本,通过版本信息来知道这个内核的配置,也可以通过在标准内核版本后面附加特定的编码来实现。
/usr/src/linux-2.4/Makefile中的变量EXTRA VERSION可以帮助我们达到这个目标。
下面是Makefile文件的最前面几行内容:
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 20
EXTRA VERSION = -8
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSIO N)
现在KERNELRELEASE的值就是2.4.20-8。
这个信息会被编译到内核中,uname工具会从内核文件中提取出版本号。
如果将Makefile做一些修改,比如,
EXTRA VERSION = -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 根文件系统
创建根文件系统比编译内核要复杂的多,也更难理解。
这里的关键是掌握initrd(初始化RAM盘)的使用方法。
5.1 根文件系统
这里我们将要创建的根文件系统与通常Linux主机的根文件系统类似,只是它应该仅仅包括系统运行所必须的应用程序、库和相关文件的最小集合。
根文件系统的尺寸大小是一个重要的指标。
5.2 文件系统的内容
5.2.1 应用程序(applications)
/bin,/sbin,/usr/bin,/usr/sbin
应用程序大致可以分为3部分,第一是操作系统正常运行所需的基本工具软件,比如b
ash,cp,rm等;第二是提供某项服务的服务器软件,比如httpd,telnetd,proftpd等;第三是我们所开发的应用程序。
其实后面讲的配置文件等也可以粗略按照这个原则来分类。
到底需要复制哪些软件,弹性是比较大的,很多软件都是可要可不要,可以实际情况灵活选择。
这个列表可能很长,并且变化也比较大,因此不在这里列出。
为了进一步减小所创建的根文件系统的尺寸,可以考虑使用下列工具包软件来
替代某些标准的工具:
O BusyBox()/
O TinyLogin()/
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目录,是裁减Linux最麻烦的部分,最容易出问题。
配置文件的选择需要综合很多方面的信息,需要对系统有比较全面、深入的了解,并结合经验才能做出正确的判断。
配置文件描述
/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/httpd/conf/htt pd.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有关的,必不可少,否则系统不能正常使用。
(man 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脚本在内;它具有uid 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 这个设备中被读出来。
注意,initrd的数据可以是任何结构,并不一定必须是一个文件系统的映像,这个选项主要用来进行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。