擬制:
董曉明
日期:
2003-6-17
評審:
日期:
批準:
日期:
yyyy/mm/dd
簽發(fā):
日期:
yyyy/mm/dd
華中科技大學(xué)信息存儲系統(tǒng)國家專業(yè)實驗室
版權(quán)所有 不得復(fù)制
修 訂 記 錄
日期
修訂版本
描述
作者
2003-6-17
0.1
初稿,文檔結(jié)構(gòu),USB引導(dǎo)盤制作步驟。
董曉明
2003-8-19
0.9
完成了文檔的主要內(nèi)容。
董曉明
2003-10-15
參考[9]對文檔中進行了完善和補充,修正了一些不準確的描述。本文檔的內(nèi)容組織
跟該書的結(jié)構(gòu)不謀而合啊。
董曉明
2003-10-24
補充了init,PAM和再論initrd節(jié)。
董曉明
2003-12-9
增加有關(guān)遠程串口控制臺的內(nèi)容。
董曉明
目 錄
1 引言 6
1.1 編寫目的 6
1.2 背景 6
1.3 定義 6
1.4 參考資料 6
2 總體描述 8
2.1 硬件環(huán)境 8
2.2 軟件環(huán)境 8
2.3 需求規(guī)定和約束 8
3 總體設(shè)計 9
3.1 基本設(shè)計概念 9
3.2 軟件結(jié)構(gòu) 9
4 內(nèi)核 10
4.1 創(chuàng)建內(nèi)核的方法 10
4.2 內(nèi)核配置 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 根文件系統(tǒng) 21
5.1 根文件系統(tǒng) 21
5.2 文件系統(tǒng)的內(nèi)容 21
5.2.1 應(yīng)用程序(applications) 21
5.2.2 設(shè)備文件(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 引導(dǎo)選項 24
5.3.3 安裝 25
5.3.4 改變根目錄設(shè)備 26
5.3.5 使用場合 27
5.3.6 淘汰的根轉(zhuǎn)換機制(change_root) 27
5.4 系統(tǒng)初始化(init) 27
5.4.1 init的任務(wù) 28
5.4.2 SysVinit 28
5.4.3 兩種風(fēng)格:Slackware vs. Debian 28
5.5 PAM 29
5.5.1 什么是PAM 29
5.5.2 PAM的結(jié)構(gòu) 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 根轉(zhuǎn)換機制:新的?舊的? 32
5.7 提示 34
5.7.1 文件系統(tǒng)目錄層次結(jié)構(gòu) 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 帶庫文件復(fù)制——lcp() 35
5.7.7 庫文件的命名 36
6 引導(dǎo) 38
6.1 引導(dǎo)過程概述 38
6.2 幾種引導(dǎo)方式 38
6.3 grub引導(dǎo)器 38
6.4 USB引導(dǎo) 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 系統(tǒng)安裝光盤 44
8.1 概述 44
8.2 boot.iso光盤的文件結(jié)構(gòu)分析 44
8.3 制作步驟 45
9 源代碼(配置文件和腳本) 46
9.1 lips.conf 46
9.2 mklips.sh 46
1 引言
1.1 編寫目的
說明Linux系統(tǒng)裁減的過程及解決的主要技術(shù)問題。本文檔的編寫是為了說明L
iPS的詳細設(shè)計過程,也可以作為構(gòu)造一個小型化Linux系統(tǒng)的指南。
本文檔內(nèi)容的組織如下所述:這一部分是引言,第2部分是對項目軟、硬件環(huán)境
和需求的總體描述,第3部分說明了裁減LINUX的相關(guān)基本概念。后面幾個部分是具
體實現(xiàn)方法的詳細說明,4~6分別詳細描述了創(chuàng)建內(nèi)核、創(chuàng)建根文件系統(tǒng)和引導(dǎo)系
統(tǒng)的方法。最后的內(nèi)容可以看作附錄,其中7說明了一般Linux系統(tǒng)安裝光盤的創(chuàng)建
方法,8列出了相關(guān)的配置文件和源代碼。
1.2 背景
華中科技大學(xué)計算機存儲系統(tǒng)國家專業(yè)實驗室,NAS項目(2003.3——2003.8)
。
1.3 定義
O boot loader: 引導(dǎo)器
O kernel: 內(nèi)核
O root filesystem: 根文件系統(tǒng)
O USB: 通用串行總線
O
1.4 參考資料
[1] DIY:自己動手做一個迷你 Linux 系統(tǒng). IBM developerWorks 中國網(wǎng)站. 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/Bootdisk-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/cd-boot/cdboot_refer/initrd.htm)
[6] Quickmouse于2003.1發(fā)表于白云黃鶴BBS (
http://bbs.whnet.edu.cn Linux討
論區(qū)的帖子“裁減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/kerneldocs/init/ , November 1998.
[11] 深入 Linux PAM 體系結(jié)構(gòu). IBM developerWorks 中國網(wǎng)站.
http://www-900.ibm.com/developerWorks/cn/linux/l-pam/index.shtml . 2003.7.
[12]
2 總體描述
2.1 硬件環(huán)境
開發(fā)主機:
Intel 845芯片組主板,P4賽揚1.8GHz CPU,256M內(nèi)存,60G IDE硬盤,RTL813
9網(wǎng)卡。
目標機:
與主機同構(gòu)。
2.2 軟件環(huán)境
開發(fā)主機:
Redhat Linux 7.3 (kernel 2.4.18-3),或者Redhat Linux 9 (kernel 2.4.2
0-8)。可以根據(jù)需要使用其他版本的內(nèi)核,比如Redhat 7.3+kernel 2.4.20。
目標機:
LiPS,以及應(yīng)用程序。
2.3 需求規(guī)定和約束
我們目標系統(tǒng)LiPS,即Linux Powered Storage是一個嵌入式Linux操作系統(tǒng),
主要著眼于提供各種文件服務(wù),不包括X GUI;并且足夠小,可以裝入32M USB盤或
者DOC/DOM等常用設(shè)備引導(dǎo)。
3 總體設(shè)計
3.1 基本設(shè)計概念
提起“裁減Linux”,最容易想到的方法是以一個已經(jīng)安裝好的系統(tǒng)為基礎(chǔ),刪
除掉不需要的文件,以減小整個系統(tǒng)的尺寸。而事實上這個方法幾乎是行不通的,
因為通過光盤安裝的一個Redhat 9 Linux系統(tǒng),即便是只選擇了比較少的軟件包,
其所占空間也可以輕松達到300~500MB,想在這個基礎(chǔ)上裁減到30MB左右是比較困
難的。更困難的是確定哪些東西是可以刪除的?如果刪除了系統(tǒng)必須的文件,可能
導(dǎo)致系統(tǒng)不能引導(dǎo)。
另一個途徑是從零開始根據(jù)需要構(gòu)建整個系統(tǒng)?!癓inux From Scratch”采用
的就是這種方式,一個個安裝需要的軟件包。類似的,更簡單的方法是,安裝一個
完整的Linux系統(tǒng),然后將必要的軟件(可執(zhí)行程序)、配置文件、庫文件、內(nèi)核等
復(fù)制出來構(gòu)建一個小系統(tǒng)。我們采取后一種方式。
3.2 軟件結(jié)構(gòu)
LiPS包括3部分:Linux內(nèi)核,根文件系統(tǒng)和引導(dǎo)器。
內(nèi)核(Kernel)提供了一個操作系統(tǒng)的基本功能,如內(nèi)存管理、進程調(diào)度、文
件系統(tǒng)、網(wǎng)絡(luò)等,以及設(shè)備驅(qū)動程序。
根文件系統(tǒng)(Root filesystem)是存放運行、維護系統(tǒng)所必須的各種工具軟件
、庫文件、腳本、配置文件和其他特殊文件(比如設(shè)備節(jié)點)的地方,也可以安裝
各種軟件包。通常根文件系統(tǒng)位于某個磁盤分區(qū),而在LiPS中應(yīng)用了initrd(初始
RAM盤)機制,將根文件系統(tǒng)放在RAM Disk中。
引導(dǎo)器(Boot Loader)的任務(wù)是從引導(dǎo)設(shè)備裝載內(nèi)核,引導(dǎo)系統(tǒng)運行。Linux
系統(tǒng)常見的引導(dǎo)器包括早期的LILO和近期的GRUB。LiPS用的是GRUB。
4 內(nèi)核
4.1 創(chuàng)建內(nèi)核的方法
Linux提供了方便靈活的方法來定制內(nèi)核,主要步驟包括:下載安裝內(nèi)核源代碼
樹,配置內(nèi)核,編譯內(nèi)核。具體方法請參考相關(guān)文檔。關(guān)鍵指令如下:
cd /usr/src/linux-2.4
make menuconfig
make dep; make clean; make bzImage
編譯成功的內(nèi)核文件為arch/i386/boot/bzImage.
4.2 內(nèi)核配置
4.2.1 概述
make menuconfig之后可以看到類似如下的內(nèi)容(編號是為了描述方便而加上的
)。根據(jù)內(nèi)核版本的不同,列出的項目會有差異。而變化主要發(fā)生在發(fā)行版為標準
內(nèi)核打的各種補丁上面,其實標準內(nèi)核是比較穩(wěn)定的。
如下所示,我們配置的內(nèi)核版本為2.4.20-8,這個“-8”就是Redhat所打的補
丁版本號。補丁一般是對標準內(nèi)核錯誤的修正和新增的功能。與2.4.20內(nèi)核配置選
項比較會發(fā)現(xiàn),[10,25,30]都屬于Redhat的補丁。
一般地,這些補丁選項都不是必須的,因此我們的LiPS內(nèi)核中都沒有包括這些
選項。其實,完全可以通過直接配置一個標準的內(nèi)核版本(比如2.4.20)來產(chǎn)生我
們所需要的內(nèi)核。
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內(nèi)核為例,來詳細說明內(nèi)核的配置,也就是選哪些東西、不
選哪些東西。沒有說明的選項,比如“Code maturity level options”,表示不選
。
4.2.2 Loadable module support[*] Enable loadable module support
[ ] Set version information on all module symbols[*] Kernel module loader
可加載模塊支持。雖然目前所選項目全部編譯進內(nèi)核,但是內(nèi)核是支持模塊的
??梢钥紤]將一些硬件設(shè)備的驅(qū)動程序編譯為模塊,從而減小內(nèi)核尺寸,同時增加
適應(yīng)不同硬件平臺的靈活性。
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
總體設(shè)置。這一部分選項比較重要,包括網(wǎng)絡(luò)、總線、進程、二進制文件格式
、電源管理等。其中APM相關(guān)的選項比較搞不清楚,有時候halt –p命令不能關(guān)閉系
統(tǒng)電源跟這里有關(guān)系。
4.2.5 Plug and Play configuration
<*> Plug and Play support
< > ISA Plug and Play support
即插即用設(shè)置。
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
塊設(shè)備。軟驅(qū)也可以不選。這里的關(guān)鍵選項是Loopback device,RAM disk和i
nitrd,一定要選中。Default RAM disk size多少都沒有關(guān)系。
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 --->
網(wǎng)絡(luò)選項。這里選項也比較多,如果沒有什么特殊要求,又不是十分理解這些
選項的意義,基本上可以用缺省設(shè)置。注意DHCP選項,如果要用到的話要記得選中
這個。
IP: Netfilter Configuration(跟iptables有關(guān))等幾個子選項都沒有選。
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設(shè)備支持。要用IDE硬盤,當然要選中。CDROM選項看情況也可以不要。SCS
I emulation似乎對使用USB盤有影響。剩下的很多都是跟IDE chipset有關(guān)的。
最好是用dmesg命令找出目標系統(tǒng)主板芯片組,然后選中對應(yīng)的芯片組支持,這
樣相當于安裝了IDE芯片組的驅(qū)動程序。如果沒有指定應(yīng)該也可以,只是性能可能會
受到一些影響。
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設(shè)備,這里當然要選。目前我們的目標
系統(tǒng)其實沒有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 --->
網(wǎng)絡(luò)設(shè)備支持。主要選擇網(wǎng)卡類型,Ethernet (10 or 100Mbit)子選項中列出
了內(nèi)核可以支持的10/100M以太網(wǎng)卡,這里僅列出了我們選中的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
字符設(shè)備。這里主要就是選擇了最前面4個跟終端和串口有關(guān)的選項,以支持虛
擬終端(遠程登錄要用到),支持標準串口,支持串口控制臺。
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)
文件系統(tǒng)。這部分內(nèi)容比較多,也很重要。首先是Quota,如果目標系統(tǒng)支持這
個功能,這里就要選中。然后是選擇要支持的文件系統(tǒng),常用的有Reiserfs,Ext3
,F(xiàn)AT,ISO9660,JFS等等,可以根據(jù)情況選擇。/proc和ext2一定要選中。
還有Network File Systems子選項,可以選擇是否支持NFS和SMB。Native Lan
guage Support子選項跟所支持的語言有關(guān),這里沒有全部列出來,我們選中了英語
和簡體、繁體中文字符集。
4.2.14 Console drivers[*] VGA text console
[ ] Video mode selection support
控制臺驅(qū)動。調(diào)試的時候可以給目標系統(tǒng)接顯示器看一下,實際系統(tǒng)應(yīng)該可以
不選。
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設(shè)備,這部分可以不選。要使用USB盤,一定要選中
USB Mass Storage support。其余很多選項我也不清楚是干什么用的。
4.3 提示
4.3.1 EXTRAVERSION
在系統(tǒng)中使用uname可以獲得系統(tǒng)版本信息。比如Redhat 9:
[root@lips root]# uname -r
2.4.20-8
[root@lips root]#
返回結(jié)果表示了Redhat修訂后的內(nèi)核版本號。前面我們提到過,這個“-8”就
是Redhat附加在標準內(nèi)核版本號后面的一個信息。
在一個運行LiPS的系統(tǒng)中,我們也需要確定當前使用的內(nèi)核版本,通過版本信
息來知道這個內(nèi)核的配置,也可以通過在標準內(nèi)核版本后面附加特定的編碼來實現(xiàn)
。
/usr/src/linux-2.4/Makefile中的變量EXTRAVERSION可以幫助我們達到這個目
標。下面是Makefile文件的最前面幾行內(nèi)容:
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 20
EXTRAVERSION = -8
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
現(xiàn)在KERNELRELEASE的值就是2.4.20-8。這個信息會被編譯到內(nèi)核中,uname工
具會從內(nèi)核文件中提取出版本號。如果將Makefile做一些修改,比如,
EXTRAVERSION = -8-R2Lips
那么我們可以得到內(nèi)核版本號2.4.20-8-R2Lips,表示為了創(chuàng)建LiPS而編譯的一
個特定配置的內(nèi)核,這個內(nèi)核是以2.4.20-8為基礎(chǔ),R2Lips(Release 2 Lips)即
第二個版本。
對Makefile的修改要在編譯內(nèi)核之前完成。
4.3.2 .config
內(nèi)核配置(make menuconfig)完成之后,會詢問:
Do you wish to save your new kernel configuration?
< Yes > < No >
回答Yes,配置信息會保存在/usr/src/linux-2.4/.config文件中。注意以“.
”開頭的文件是個隱藏文件,要用ls –a才看的到。.config是個文本文件,內(nèi)容類
似下面:
#
# Loadable module support
#
CONFIG_MODULES=y
# CONFIG_MODVERSIONS is not set
CONFIG_KMOD=y
所以可以把這個文件保存起來,并且給文件名帶上版本號,方便管理、使用。
cp .config ~/config-2.4.20-8-R2Lips
5 根文件系統(tǒng)
創(chuàng)建根文件系統(tǒng)比編譯內(nèi)核要復(fù)雜的多,也更難理解。這里的關(guān)鍵是掌握init
rd(初始化RAM盤)的使用方法。
5.1 根文件系統(tǒng)
這里我們將要創(chuàng)建的根文件系統(tǒng)與通常Linux主機的根文件系統(tǒng)類似,只是它應(yīng)
該僅僅包括系統(tǒng)運行所必須的應(yīng)用程序、庫和相關(guān)文件的最小集合。根文件系統(tǒng)的
尺寸大小是一個重要的指標。
5.2 文件系統(tǒng)的內(nèi)容
5.2.1 應(yīng)用程序(applications)
/bin,/sbin,/usr/bin,/usr/sbin
應(yīng)用程序大致可以分為3部分,第一是操作系統(tǒng)正常運行所需的基本工具軟件,
比如bash,cp,rm等;第二是提供某項服務(wù)的服務(wù)器軟件,比如httpd,telnetd,
proftpd等;第三是我們所開發(fā)的應(yīng)用程序。其實后面講的配置文件等也可以粗略按
照這個原則來分類。
到底需要復(fù)制哪些軟件,彈性是比較大的,很多軟件都是可要可不要,可以實
際情況靈活選擇。這個列表可能很長,并且變化也比較大,因此不在這里列出。
為了進一步減小所創(chuàng)建的根文件系統(tǒng)的尺寸,可以考慮使用下列工具包軟件來
替代某些標準的工具:
O BusyBox(
http://www.busybox.net)O TinyLogin(
http://tinylogin.busybox.net)O Embutils(
http://www.fefe.de/embutils/) 其詳細使用方法請參考相關(guān)資料,此處不再贅述。LIPS的實現(xiàn)目前沒有使用這
些軟件包。
5.2.2 設(shè)備文件(device files)
/dev
設(shè)備文件也可以稱作設(shè)備節(jié)點(device node)。設(shè)備文件非常重要,缺少某些
有些設(shè)備文件可能導(dǎo)致系統(tǒng)不能正常運行甚至不能引導(dǎo)。有些設(shè)備文件是必須的,
而更多的是根據(jù)具體目標系統(tǒng)的硬件配置來進行取舍。
比如硬盤的設(shè)備文件,在完整的系統(tǒng)中一般有hda,hdb,……,hdt,即最多支
持20個IDE硬盤,每個硬盤有hdX1,hdX2,……,hdX32,(其中X表示a-t),即支
持32個分區(qū),另外還有表示SCSI硬盤的節(jié)點。根據(jù)實際情況,如果只需要支持少量
的硬盤、少量的分區(qū),這些節(jié)點可以被大大簡化。如果目標系統(tǒng)中沒有的設(shè)備,其
對應(yīng)的設(shè)備文件也可以省掉。
設(shè)備文件
描述
/dev/console
系統(tǒng)控制臺設(shè)備,非常重要。
/dev/fd0
第一個軟驅(qū)
/dev/hda
/dev/hda[1-8]
IDE硬盤及分區(qū)
/dev/initctl
實際上是一個FIFO設(shè)備,跟init有關(guān)(切換運行級別時用于新init與原init通信)
/dev/initrd
Initial RAM disk
/dev/input
(目錄)Input core(包括游戲桿、鼠標等)
/dev/kmem
內(nèi)核虛擬內(nèi)存
/dev/loop[0-7]
Loopback設(shè)備
/dev/mem
訪問物理內(nèi)存
/dev/null
NULL設(shè)備
/dev/psaux
PS/2鼠標
/dev/ptmx
UNIX98 PTY master
/dev/pts
(目錄)UNIX98 PTY slaves
/dev/ptyp[0-7]
偽終端主設(shè)備(遠程登錄使用)
/dev/ram[0-7]
/dev/ramdisk
/dev/ram
RAM Disk設(shè)備。至少/dev/ram0是應(yīng)用initrd機制所必須的。
/dev/ramdisk鏈接到/dev/ram0,是為了兼容老版本內(nèi)核而保留的。
/dev/ram鏈接到/dev/ram1。
/dev/random
隨機數(shù)發(fā)生器
/dev/sda
/dev/sda[1-8]
SCSI磁盤及分區(qū)設(shè)備
/dev/shm
共享內(nèi)存設(shè)備
/dev/systty
指向系統(tǒng)tty設(shè)備的符號鏈接,一般是tty0。
/dev/tty
當前TTY設(shè)備
/dev/tty[0-7]
虛控制臺(Virtual console)
/dev/ttyp[0-7]
偽終端從設(shè)備
/dev/ttyS0
/dev/ttyS1
串口(COM1和COM2)
/dev/urandom
速度更快、安全性較差的隨機數(shù)發(fā)生器
/dev/zero
零設(shè)備,只能讀0出來
設(shè)備節(jié)點的主設(shè)備號(Major)、次設(shè)備號(Minor)的文檔是內(nèi)核源代碼中的
/Documentation/device.txt,如果有疑問可以查看這個文件[8]。
5.2.3 腳本和配置文件(scripts and configuration files)
/etc
/etc/rc.d目錄下的啟動腳本是系統(tǒng)的重要部分。必須對啟動腳本做相應(yīng)的修改
以簡化系統(tǒng)的啟動過程。
系統(tǒng)和各種應(yīng)用程序用到的幾乎所有的配置文件都位于/etc目錄,是裁減Linu
x最麻煩的部分,最容易出問題。配置文件的選擇需要綜合很多方面的信息,需要對
系統(tǒng)有比較全面、深入的了解,并結(jié)合經(jīng)驗才能做出正確的判斷。
配置文件
描述
/etc/default
(目錄)某個命令(比如useradd)的缺省設(shè)置(man useradd(8))
/etc/ld.so.cache
由ldconfig命令根據(jù)/etc/ld.so.conf文件產(chǎn)生
/etc/ld.so.conf
庫文件路徑配置文件,ldconfig命令根據(jù)該配置文件生成/etc/ld.so.cache
/etc/localtime
本地時間、時區(qū)設(shè)置
/etc/login.defs
全局缺省設(shè)置
/etc/fstab
文件系統(tǒng)列表(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
該文件包含了用于單用戶模式的串口和終端參數(shù),因為這些參數(shù)是由getty設(shè)置的,
而在單用戶模式時沒有運行g(shù)etty,所以用該文件保存參數(shù)。單用戶模式對系統(tǒng)安全
是個威脅,我們應(yīng)該禁止使用單用戶模式,因此這個文件實際上并沒有必要復(fù)制過
來。
/etc/issue
登錄信息和標識文件(man issue(5))
/etc/modules.conf
模塊的配置文件(man modules.conf(5))
/etc/mtab
已經(jīng)掛載的文件系統(tǒng)列表(man mount(8))
/etc/nsswitch.conf
Name Service Switch的配置文件(配置名稱服務(wù)數(shù)據(jù)源和查詢的順序)(man nss
witch.conf(5))
/etc/pam.d
放置PAM配置文件的目錄(有關(guān)PAM請參考5.5節(jié))
/etc/passwd
用戶口令文件(man passwd(5))
/etc/profile
系統(tǒng)環(huán)境變量和登錄配置文件
/etc/rc.d
放置啟動腳本的目錄
/etc/services
列出可用的網(wǎng)絡(luò)服務(wù)及其端口(man services(5))
/etc/termcap
終端(terminal)功能數(shù)據(jù)庫(man termcap(5))
還有那些跟特定應(yīng)用程序相關(guān)的配置文件,比如apache服務(wù)器需要的/etc/htt
pd/conf/httpd.conf 等,此處不再一一列出。
5.2.4 庫文件(libraries)
/lib,/usr/lib,/usr/share
庫文件也是系統(tǒng)運行所必需的。到底需要哪些庫文件,是根據(jù)所復(fù)制的可執(zhí)行
程序用 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)
對復(fù)制到新的根文件系統(tǒng)的每個可執(zhí)行程序,都要使用這種方法來確定其所需
要的庫,然后把這些庫文件也復(fù)制過來。
需要注意的是,有些庫文件使用上述方法是找不出來的,但是卻是系統(tǒng)必須的
。比如:
庫文件
描述
/lib/libnss_files*
這個庫是跟/etc/nsswitch.conf有關(guān)的,必不可少,否則系統(tǒng)不能正常使用。(ma
n nsswitch.conf(5))
/lib/security/pam_unix.so
這個庫跟PAM有關(guān),是安全、認證方面的,必不可少,否則系統(tǒng)無法登錄。
5.2.5 必要的目錄
/home,/mnt,/proc,/root,
/var,/var/log,/var/run,/var/lock/subsys
5.3 初始化RAM盤(initrd)
?。▍⒖假Y料[5])
初始化RAM盤(initrd)提供了引導(dǎo)器加載RAM盤的能力。這個RAM盤可以被掛載
(mount)成根文件系統(tǒng),并執(zhí)行其上的程序。然后,可以從另一個設(shè)備掛載一個新
的根文件系統(tǒng),而原來的根文件系統(tǒng)(也就是initrd)會被移到一個目錄里并卸載
。
initrd技術(shù)主要設(shè)計用來讓系統(tǒng)啟動過程可以分兩個階段進行,首先讓內(nèi)核以
一組最小的、被編譯進內(nèi)核里的驅(qū)動程序來啟動,然后從initrd中加載其他的模塊
。
5.3.1 操作步驟
使用initrd時,系統(tǒng)典型的引導(dǎo)步驟如下:
1) 引導(dǎo)器加載內(nèi)核和初始化RAM盤;
2) 內(nèi)核把initrd轉(zhuǎn)到一個一般的RAM盤中,并且釋放原來被initrd占用的RAM;
3) initrd以可讀寫模式被掛載到根目錄;
4) 執(zhí)行/linuxrc(linuxrc可以是任何可執(zhí)行文件,包括shell腳本在內(nèi);它具有u
id 0即超級用戶的權(quán)限,基本上可以做init程序中能夠做的任何事情);
5) 在linuxrc中掛載真正的根文件系統(tǒng);
6) linuxrc使用pivot_root系統(tǒng)調(diào)用,把真正使用的根文件系統(tǒng)掛載到根目錄;
7) 在根文件系統(tǒng)上執(zhí)行通常的引導(dǎo)過程(比如執(zhí)行/sbin/init);
8) initrd文件系統(tǒng)被刪除。
注意,改變根目錄并不包括卸載舊的根文件系統(tǒng),因此有可能在轉(zhuǎn)變過程中仍
有進程在initrd上運行。另外,掛載在initrd目錄下的根文件系統(tǒng)仍然是可用的。
5.3.2 引導(dǎo)選項
initrd技術(shù)增加了下列引導(dǎo)選項:
initrd=<path>
裝入指定的文件作為初始化RAM盤。當使用 LILO 當引導(dǎo)器時,你可以用/etc/
lilo.conf 文件中 INITRD 這個配置參數(shù),來指定初始化RAM盤文件。
noinitrd
initrd的數(shù)據(jù)仍會保留,但不會裝入到一個RAM盤里,真正使用的根文件系統(tǒng)將
會被掛載。initrd的數(shù)據(jù)能夠從 /dev/initrd 這個設(shè)備中被讀出來。注意,initr
d的數(shù)據(jù)可以是任何結(jié)構(gòu),并不一定必須是一個文件系統(tǒng)的映像,這個選項主要用來
進行debug。
注意:/dev/initrd 是一個只讀并且只能使用一次的設(shè)備,最后一個程序一旦
關(guān)閉它, 所有數(shù)據(jù)將被釋放,而且設(shè)備也不能再被打開。
root=/dev/ram0
initrd 先被掛載成根目錄,接著進行正常的啟動過程(這時RAM盤仍被掛載成
根)。
5.3.3 安裝
首先:我們要在正常的根文件系統(tǒng)中創(chuàng)建一個容納initrd文件系統(tǒng)的目錄,例
如:
# mkdir /initrd
對目錄名稱并沒有特別的限制,在pivot_root(2)的man手冊頁中有更詳細的說
明。
如果根文件系統(tǒng)是在引導(dǎo)程序時被建立的(例如,你在制作安裝軟盤),在建
立根文件系統(tǒng)的同時應(yīng)該創(chuàng)建 /initrd 目錄。
在某些情況下initrd雖然未被掛載,只要有下列設(shè)備存在,它的內(nèi)容仍是可被
訪問的。(注意:這個設(shè)備無法在 devfs 下使用)
# mknod /dev/initrd b 1 250
# chmod 400 /dev/initrd
第二:支持初始化RAM盤的能力,及所有執(zhí)行格式和文件系統(tǒng)模塊,都必須直接
編譯進內(nèi)核,不能采用可加載模塊的方式。
第三:必須制作一個RAM盤映像文件。大概的步驟是,在一個塊設(shè)備上創(chuàng)建一個
文件系統(tǒng),把需要的文件復(fù)制進去,然后把這個塊設(shè)備的內(nèi)容輸出成一個initrd文
件。目前至少有3種設(shè)備適合作為這種塊設(shè)備:
O 軟盤(能拿到任何地方試驗,但速度太慢);
O RAM盤(最快,但浪費內(nèi)存);
O Loopback設(shè)備(比較合適的解決方案)。
下面,我們將討論使用loopback設(shè)備創(chuàng)建initrd文件的方法。
1)
確認lookback設(shè)備已經(jīng)配置到內(nèi)核里。
2)
創(chuàng)建一個適當大小的空白文件系統(tǒng),例如:
# dd if=/dev/zero of=initrd bs=300k count=1
# mke2fs -F -m0 initrd
3)
把這個文件系統(tǒng)掛載進來,例如:
# mount -t ext2 -o loop initrd /mnt
4)
創(chuàng)建控制臺設(shè)備。
# mkdir /mnt/dev
# mknod /mnt/dev/console c 5 1
5)
復(fù)制所有可能在initrd環(huán)境中用到的文件到/mnt目錄中。(別忘了/linuxrc文
件)
6)
initrd執(zhí)行環(huán)境的測試需要反復(fù)進行修正,為了避免不斷的重新啟動,可以使
用下列命令:
# chroot /mnt /linuxrc
當然這樣啟用initrd還是有限制的,就是不能干擾正常系統(tǒng)的執(zhí)行狀態(tài)(比如
重新配置網(wǎng)絡(luò)接口等等。如果在一個用pivot_root指令轉(zhuǎn)換根目錄的執(zhí)行環(huán)境中,
就可以做這些事情了)。
7)
卸載這個文件系統(tǒng):
# umount /mnt
8)
這時,初始化RAM盤系統(tǒng)就在“initrd”這個文件中了??梢园阉鼔嚎s小一點:
# gzip -9 initrd
最后,必須啟動內(nèi)核并載入initrd系統(tǒng)。需要設(shè)置下列引導(dǎo)參數(shù):
root=/dev/ram0 init=/linuxrc rw
?。ㄖ挥行枰獙懭雐nitrd文件系統(tǒng)時才需要附加rw參數(shù))。
使用 LOADLIN 當引導(dǎo)器時,可以執(zhí)行:
LOADLIN C:\LINUX\BZIMAGE initrd=C:\LINUX\INITRD.GZ root=/dev/ram0 i
nit=/linuxrc rw
使用 LILO當引導(dǎo)器時,可以在 /etc/lilo.conf 中如下設(shè)置:
image = /boot/bzImage
initrd = /boot/initrd.gz
append = "root=/dev/ram0 init=/linuxrc rw"
如果使用其他引導(dǎo)器,請參考相關(guān)文檔。
5.3.4 改變根目錄設(shè)備
在執(zhí)行完重要任務(wù)的尾聲,linuxrc一般會執(zhí)行改變根目錄設(shè)備的動作,并讓所
有程序在真實的根文件系統(tǒng)中展開。這個過程包括下列步驟:
O 掛載新的根文件系統(tǒng)
O 把initrd自己轉(zhuǎn)到這個根文件系統(tǒng)中
O 結(jié)束所有舊的對initrd根文件系統(tǒng)的存取動作
O 卸載initrd文件系統(tǒng)并釋放RAM盤內(nèi)存
掛載新的根文件系統(tǒng)很簡單:只需要把它掛載到當前根文件系統(tǒng)中的一個目錄
下即可。例如:
# mkdir /new-root
# mount -o ro /dev/hda1 /new-root
最終改變根文件系統(tǒng)由pivot_root()系統(tǒng)調(diào)用或者pivot_root工具來完成(參
考手冊頁pivot_root(8))。pivot_root可以把當前根文件系統(tǒng)轉(zhuǎn)移到新根的一個目
錄中,然后把指定的目錄當作新的根。在調(diào)用pivot_root之前,必須先為舊根準備
目錄,例如:
# cd /new-root
# mkdir initrd
# pivot_root . initrd
現(xiàn)在,linuxrc仍然可以訪問舊的根文件系統(tǒng)。執(zhí)行下列指令將完全結(jié)束與舊根
的聯(lián)系:
# exec chroot . what-follows <dev/console >dev/console 2>&1
其中what-follows是新根下面的一個程序,比如/sbin/init。(注意,這時如
果沒有/dev/console,系統(tǒng)不能啟動)。同時,為了保持不同版本之間的兼容性,
需要特別注意下列事項:
O 在調(diào)用pivot_root之前,當前目錄應(yīng)該是新的根目錄;
O 使用“.”(當前目錄)作為pivot_root的第一個參數(shù)(新根),為舊根指定目錄
的第二個參數(shù)也要用相對路徑;
O chroot這個命令應(yīng)該在新、舊根系統(tǒng)當中都能使用;
O 然后調(diào)用chroot轉(zhuǎn)移根文件系統(tǒng);
O 在exec命令中使用象 dev/console 這樣的相對路徑。
特別提示:讓initrd文件系統(tǒng)的目錄結(jié)構(gòu)與新根文件系統(tǒng)的結(jié)構(gòu)一致,有利于
轉(zhuǎn)換過程的順利。
這時,initrd可以卸載,RAM盤也可以釋放:
# umount /initrd
# blockdev --flushbufs /dev/ram0
注意:如果linuxrc或者它調(diào)用的其他程序的執(zhí)行因為某種原因中斷,則會啟用
舊的change_root機制。
5.3.5 使用場合
實現(xiàn)initrd的主要動機是允許系統(tǒng)安裝時模塊化的內(nèi)核配置。這個過程大致如
下:
1) 系統(tǒng)可以用一個最小配置的內(nèi)核從軟盤或者其他存儲媒體啟動,然后載入initr
d系統(tǒng);
2) /linuxrc來決定需要什么來進一步掛載真實的根文件系統(tǒng)(如設(shè)備類型、驅(qū)動程
序等)或者支持發(fā)行版媒體(如CD-ROM,網(wǎng)絡(luò),磁帶等);
3) /linuxrc載入必須的內(nèi)核模塊;
4) /linuxrc建立并安裝根文件系統(tǒng);
5) /linuxrc調(diào)用pivot_root改變根文件系統(tǒng),并通過chroot一個程序(繼續(xù)安裝過
程);
6) 安裝引導(dǎo)器;
7) 引導(dǎo)器被配置成裝入initrd以及相關(guān)的模塊,建立起系統(tǒng)環(huán)境;
8) 現(xiàn)在,系統(tǒng)可以引導(dǎo),并執(zhí)行其他的安裝任務(wù)。
Initrd的關(guān)鍵作用是能夠多重配置一個正常操作的系統(tǒng),而不需要用一個龐大
的內(nèi)核,或者重新編譯、連接內(nèi)核。在制作Linux發(fā)行版(光盤等)、系統(tǒng)恢復(fù)盤等
方面有廣泛的應(yīng)用。
5.3.6 淘汰的根轉(zhuǎn)換機制(change_root)
可以通過改寫/proc/sys/kernel/real-root-dev這個文件的數(shù)字值來改變真實
的根設(shè)備。例如:
# echo 0x301 >/proc/sys/kernel/real-root-dev
但是這個機制已經(jīng)被淘汰,雖然目前的內(nèi)核仍然支持,不能保證以后的內(nèi)核會
支持。所以不要使用。
5.4 系統(tǒng)初始化(init)
?。▍⒖假Y料[10])
5.4.1 init的任務(wù)
UNIX的init指的不是一個程序、而是一類程序。Init一般是指系統(tǒng)引導(dǎo)時執(zhí)行
的第一個進程,也是唯一的進程。當內(nèi)核完成計算機硬件的設(shè)置之后,就把控制權(quán)
交給init。內(nèi)核只產(chǎn)生init這一個進程,而系統(tǒng)中其他所有進程都是由init負責(zé)產(chǎn)
生(spawn),主要包括各種系統(tǒng)服務(wù)進程,比如控制臺的登錄會話(getty)。主
要任務(wù)包括:
O 產(chǎn)生其他進程;
O 重新啟動已經(jīng)退出的進程;
O 負責(zé)清理系統(tǒng)中的“僵尸”進程(init是所有其他進程的祖先);
O 處理系統(tǒng)關(guān)機(stop所有進程,unmount文件系統(tǒng));
內(nèi)核并不關(guān)心拿什么來作為系統(tǒng)的init,可以是下列幾種選擇之一:
O SysVinit (作者:Miquel van Smoorenburg),或者
O simpleinit (作者:Peter Orbaek),或者
O 一個shell腳本,或者
O 嵌入式系統(tǒng)中你的應(yīng)用程序。
不過路徑名字必須是/sbin/init,/etc/init,或/bin/init(因為已經(jīng)編譯到
內(nèi)核里面了)。如果這幾個路徑都找不到,系統(tǒng)就完蛋了。為了增加靈活性,內(nèi)核
提供了命令行選項可以指定init路徑:“init=”。
5.4.2 SysVinit
/etc/inittab
/etc/rc.d
大多數(shù)Linux發(fā)行版使用的init是SysVinit,也就是System V UNIX的實現(xiàn)。其
主要思想是規(guī)定了不同的“運行級別(runlevel)”。通過配置文件/etc/inittab
,定義了系統(tǒng)引導(dǎo)時做什么,進入或者切換到一個運行級別時做什么。配置文件每
一行的語法為:
id:runlevel:action:command
細節(jié)請參考手冊頁inittab(5)。
整個過程中用到的腳本都放在/etc/rc.d目錄。
5.4.3 兩種風(fēng)格:Slackware vs. Debian
關(guān)于配置文件/etc/inittab和腳本/etc/rc.d的實現(xiàn)和組織主要有兩種不同的風(fēng)
格,其有代表性的發(fā)行版分別為Slackware和Debian(Redhat同Debian)。這兩種風(fēng)
格之間有幾個明顯的區(qū)別,可以比較容易的識別。
例如在/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的命令行參數(shù))。因此,Slackware風(fēng)格的/etc/rc.
d中應(yīng)該是一系列相對獨立的腳本,對應(yīng)于配置文件中每個動作的定義(我沒有見過
Slackware哦)。
在我們所熟悉的Redhat中,/etc/rc.d的組織要復(fù)雜的多,每個運行級別對應(yīng)一
個子目錄/etc/rc.d/rcX.d(X表示運行級別0~6),下面放的是一系列形如SXXfoo
和KXXbar(S表示Start某個服務(wù),K表示Kill某個服務(wù),XX是兩位數(shù)字,決定了該腳
本執(zhí)行的順序)的符號鏈接,指向/etc/rc.d/init.d中的腳本,每個腳本對應(yīng)一項
服務(wù)程序。
另外,還有兩個重要腳本值得一提:/etc/rc.d/rc.sysinit是系統(tǒng)引導(dǎo)時首先
要執(zhí)行的(完成系統(tǒng)初始化的各項工作),而/etc/rc.d/rc.local在最后執(zhí)行(類
似DOS的autoexec.bat)。
讀一下/etc/rc.d/rc.sysinit,/etc/rc.d/rc和/etc/rc.d/init.d/中的某個腳
本,就會對Redhat的啟動過程和風(fēng)格有比較清晰的了解。
據(jù)說Slackware風(fēng)格比Debian的速度要快一些??赡苁呛笳叩慕M織結(jié)構(gòu)比較復(fù)雜
的緣故吧。
5.5 PAM
?。▍⒖假Y料[11],
http://www.kernel.org/pub/linux/libs/pam/,手冊頁pam(8))
5.5.1 什么是PAM
PAM(Pluggable Authentication Modules)是為了解決計算機系統(tǒng)中用戶認證
的問題而引入的一種實現(xiàn)方案。PAM的目標為:
O 將認證功能從應(yīng)用中獨立出來,單獨進行模塊化設(shè)計、實現(xiàn)和維護(而不是象以
前那樣,將認證功能的代碼跟應(yīng)用程序編譯在一塊);
O 為這些認證模塊建立標準API,以便各應(yīng)用程序能方便的使用它們提供的各種功能
;
O 認證機制對其上層用戶(包括應(yīng)用程序和最終用戶)是透明的。
PAM機制由SUN設(shè)計并首先在Solaris 2.3上部分實現(xiàn),后來逐漸在其他UNIX平臺
上實現(xiàn),包括Linux(其實現(xiàn)稱為Linux-PAM)。
5.5.2 PAM的結(jié)構(gòu)
PAM采用分層的體系結(jié)構(gòu)。最下面是模塊層,負責(zé)實現(xiàn)具體的認證功能,包括帳
戶管理(account)、口令鑒別(auth)、口令管理(password)和會話管理(ses
sion)4個模塊。
應(yīng)用接口層位于模塊層之上,調(diào)用下層提供的服務(wù),并向上(應(yīng)用程序)隱藏
PAM實現(xiàn)的細節(jié)。
5.5.3 配置文件
/etc/pam.conf
/etc/pam.d (如果存在這個目錄,則忽略/etc/pam.conf)
配置文件是應(yīng)用接口層的另一個重要組件。其作用主要是為應(yīng)用選定具體的鑒
別模塊,模塊間的組合以及規(guī)定模塊的行為。
/etc/pam.conf的語法為每行5項(在Linux-PAM的手冊頁pam(8)中有更詳細的描
述):
service type control module-path module-arguments
Service是服務(wù)的名字,比如login,su等。注意,/etc/pam.d目錄下面有許多
配置文件,分別對應(yīng)某項系統(tǒng)服務(wù),文件名即等于service,因此每行只有4項。
Type為account,auth,password,session之一,即要使用的認證模塊。每個
應(yīng)用可以使用多個認證模塊,或者說可以將模塊“堆疊”使用,但是每一行只能定
義一個,因此一項服務(wù)可以有多行配置。
Control規(guī)定了如何處理模塊認證失敗或成功,可以是requisite、required、
sufficient或optional。
Module-path是PAM庫文件的文件名。缺省路徑是/lib/security/。
Module-arguments是可以傳給模塊的參數(shù)。
5.5.4 other
特別需要指出的是,有一個特殊的服務(wù)名字——other。如果沒有明確指明應(yīng)用
于某項服務(wù)的規(guī)則,就用other的定義來處理。因此,我們可以想到,系統(tǒng)中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
當然,這樣處理對系統(tǒng)的安全性來說是不利的,最好還是給每項服務(wù)定義單獨
的配置文件。這不過是一種簡化問題的臨時方案。
5.6 再論initrd
在前面的5.3節(jié)中,對initrd機制已經(jīng)有了比較詳細的討論。準確的說,該部分
內(nèi)容來自linux-2.4/Documentation/initrd.txt 文件。但是在實踐中,我們發(fā)現(xiàn)其
中描述的有些方法并不適用。是新版本內(nèi)核的變化造成的(內(nèi)核實現(xiàn)與文檔不同步
),還是2.4版內(nèi)核的bug,不得而知。在我查證的過程中,看到網(wǎng)上有不少相關(guān)的
問題和討論。遺憾的是至今我還不能確認到底是什么原因。
后來我又專門讀了2.2版內(nèi)核中所附帶的 initrd.txt 文件。我感覺實際的情況
似乎更接近于這個老文檔的描述。我還看到一個有關(guān)的patch文件,從該文件中可以
明確看到新的initrd.txt文檔的改變。下面是該文件的開始部分(行首的-表示老文
檔有而新文檔中已經(jīng)刪除,+表示新文檔中增加的內(nèi)容)。
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之前,首先你要清楚,系統(tǒng)正常運行時,根文件系統(tǒng)掛載在
什么設(shè)備上(也就是說,root device是什么——root在哪里?)。
我們知道,使用initrd機制的話,系統(tǒng)啟動時先以RAM Disk(/dev/ram0)作為
根,然后通過某種方法將根轉(zhuǎn)換到“真實的根(real-root-dev)”(之所以說rea
l,是與前面的RAM里臨時的根比較而言)。一種常見的情形是啟動時用initrd,然
后切換到一個硬盤分區(qū),比如/dev/hda1。
事實上,這個根轉(zhuǎn)換不是必須的。我們完全可以就把/dev/ram0作為我們真實的
根設(shè)備。這時,系統(tǒng)啟動之后所有的操作都在RAM Disk中進行。當然這樣做也有一
個明顯的缺點,即無法保存數(shù)據(jù)。比如對系統(tǒng)配置進行的修改(象IP地址),重新
啟動之后就丟掉了。如果要保存數(shù)據(jù),就要想別的辦法。
LiPS目前的做法就是這一種(沒有根轉(zhuǎn)換,initrd就是真實的根)。為了在重
新啟動之后保持配置文件的修改,我們將目錄/etc鏈接到了其他非易失存儲器(例
如,一個硬盤分區(qū),或者USB盤的分區(qū))。
指定根設(shè)備是通過內(nèi)核參數(shù)“root=”來完成的。以GRUB引導(dǎo)器的配置為例:
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 指定了真實的根,其啟動過程包含根的轉(zhuǎn)換。
但是這里沒有指定 ramdisk_size,因為initrd的缺省大小是4MB,而initrd-2.4.2
0-8.img比較小,所以用缺省值即可。
?。ㄎ覀兌啻翁岬絩oot, root filesystem, root device, 自己體會吧。)
5.6.2 linuxrc
在initrd機制的設(shè)計中,初始RAM盤只是作為一個過渡性質(zhì)的根設(shè)備,由/linu
xrc來完成操作環(huán)境準備(比如加載一些不常用的、沒有編譯進內(nèi)核的驅(qū)動程序模塊
)和根轉(zhuǎn)換工作。
Linuxrc的執(zhí)行是自動的,即內(nèi)核掛載initrd盤作為根,如果根下面有這個文件
(也就是/linuxrc),就執(zhí)行它。(如果沒有呢?當然什么也不做。所以linuxrc也
并不是必不可少的。)
接下來說說linuxrc的內(nèi)容。下面的例子是從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文件系統(tǒng)所需的模塊,然后掛載真實的根文件系
統(tǒng),并進行轉(zhuǎn)換。特別需要注意的是,linuxrc腳本一般是用nash解釋執(zhí)行的,而不
是通常的bash。有關(guān)nash的詳情請看手冊頁nash(8)。簡單說,nash內(nèi)置實現(xiàn)了多數(shù)
在執(zhí)行l(wèi)inuxrc這個階段可能用到的命令,比如mount, pivot_root, umount;而如
果使用bash,象mount等都是“外部命令”,就需要復(fù)制/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節(jié)描述的方法測試linuxrc的時候發(fā)現(xiàn),我的腳本頭兩句執(zhí)行就
報錯。
mount –o ro /dev/hda11 /sysroot
cd /sysroot
這里我的真實的根設(shè)備是/dev/hda11,/sysroot是initrd映像中存在的一個目
錄。這兩句完全是按照該文檔的要求寫的。后來經(jīng)過多次試驗才發(fā)現(xiàn)問題之所在。
第一,nash實現(xiàn)的mount命令語法與我們常用的/bin/mount并不完全兼容;第二,n
ash根本沒有實現(xiàn)cd命令。
因此,可以推斷initrd.txt-2000中講linuxrc時所舉例子不是用的nash。實際
上在該文檔中根本沒有指明用什么shell。再回頭仔細看才發(fā)現(xiàn),所有例句都是在r
oot的shell命令提示符“#”后面的,那么它用的是bash之類了。但是令人迷惑的是
,同樣在該小節(jié)中稍后出現(xiàn)如下例句: # exec chroot . what-follows <dev
/console >dev/console 2>&1
為什么用exec執(zhí)行chroot呢?chroot可以在命令行直接用啊。文檔中講到,wh
at-follows可以是/sbin/init。我用nash試了下面這個句子(nash中用exec執(zhí)行外
部命令):
exec chroot . /sbin/init <dev/console >dev/console 2>&1
還是不行。錯誤信息:
Usage: init 0123456SsQqAaBbCcUu
開始我還以為后面那一串是個“magic number”,后來想以Usage開頭應(yīng)該是講
使用這個命令的語法。看init(8)手冊頁,果然要求給一個參數(shù),0~6當然是運行級
別啦,試了一個init 3也還是不行。尤其搞不明白后面那些個console什么意思。
5.6.3 根轉(zhuǎn)換機制:新的?舊的?
前面我們多次提到了根的轉(zhuǎn)換。在initrd.txt的兩個版本中,分別描述了兩種
根轉(zhuǎn)換機制,其中2000版中稱1996版的內(nèi)容已經(jīng)“過時”,不推薦使用。然而事實
上要麻煩的多,事情并不總是按照預(yù)期(如文檔所述)運行。
為了弄清楚這個問題,我進行了一系列測試。環(huán)境是這樣的:
O 使用initrd機制,已經(jīng)準備好了根文件系統(tǒng)映像文件initrd.img,準備好了內(nèi)核
bzImage;
O initrd.img的所有內(nèi)容釋放到一個硬盤分區(qū)/dev/hda11,ext2文件系統(tǒng);
O 在/dev/hda11上面增加一個/boot目錄,存放bzImage和initrd.img文件;
O 以/dev/ram0作為根啟動,然后以某種機制轉(zhuǎn)換到“真實的根”/dev/hda11。
系統(tǒng)的引導(dǎo)器是GRUB,安裝在硬盤MBR,grub.conf位于/dev/hda1(也就是做測
試的實際的根文件系統(tǒng))。按照上述環(huán)境配置,在grub.conf中增加如下內(nèi)容:
title lips (testing ......)
root (hd0,10)
kernel /boot/bzImage ro root=/dev/hda11 ramdisk_size=65536
initrd /boot/initrd.img
下面我們分別使用不同的/linuxrc進行了測試,以確認到底哪種機制是可行的
。
第一,如果沒有/linuxrc會怎么樣呢?
結(jié)果是系統(tǒng)能夠成功啟動到以/dev/hda11作為根,并且把initrd(也就是舊根
文件系統(tǒng))的內(nèi)容移到了/initrd目錄。這是符合initrd.txt-1996文檔中第一段的
描述的。所以只要你使用了initrd,指定了新的根,并且準備好了/initrd目錄(已
經(jīng)在/dev/hda11創(chuàng)建了/initrd),內(nèi)核可以自動完成根的轉(zhuǎn)換工作。終端上面有如
下輸出信息:
Trying to move old root to /initrd ... okay
這里有個小問題,即最后/initrd沒有卸載,這意味著initrd所分配內(nèi)存也沒有
釋放。因此umount /initrd不是內(nèi)核自動完成的,而應(yīng)該在/linuxrc中的某個位置
進行。如果linuxrc僅包含卸載/initrd的命令,如下:
#!/sbin/nash
umount /initrd
則執(zhí)行情況是這樣的:umount命令報錯(返回錯誤碼22),然后出現(xiàn)前面所示
Trying…的信息。結(jié)果跟前面是一樣的。因為linuxrc執(zhí)行在先,當時舊根還沒有被
轉(zhuǎn)移到/initrd中來。
如果沒有/initrd目錄會怎樣?我們把/dev/hda11上面的/initrd目錄刪除,重
新啟動(沒有/linuxrc),結(jié)果是可以啟動到以/dev/hda11為根,且看不到原來的
initrd。該過程中出現(xiàn)如下信息:
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命令造成的困惑(這個問題前面已經(jīng)說明)之外,使
用pivot_root基本上是成功的。/linuxrc腳本的主要內(nèi)容如下:
#!/sbin/nash
mount -o defaults --ro -t ext2 /dev/hda11 /sysroot
pivot_root /sysroot /sysroot/initrd
但是,用這個腳本不能啟動,造成系統(tǒng)掛起:
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的指導(dǎo),pivot_root之后應(yīng)該執(zhí)行chroot,但是我始
終沒有辦法使chroot成功執(zhí)行(有關(guān)情況前面已經(jīng)說明)。不過可以肯定的是,pi
vot_root執(zhí)行成功之后,當前目錄就是新的根目錄。
第三,/proc/sys/kernel/real-root-dev
initrd.txt的新版本中最后一節(jié)專門指出,向/proc/sys/kernel/real-root-d
ev文件中echo數(shù)字的方法(稱為change_root機制)是過時的。然而令人迷惑的是,
Redhat 9的缺省安裝產(chǎn)生的initrd-2.4.20-8.img中(前面已經(jīng)列出了其/linuxrc文
件內(nèi)容),同時使用了pivot_root和change_root機制。
測試下列/linuxrc腳本,系統(tǒng)可以啟動到/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
雖然這樣可以啟動,但是有關(guān)real-root-dev還有幾個沒有弄清楚的問題:
real-root-dev的值到底是什么?
目前我還沒有看到解釋real-root-dev的值是什么東西的正式文檔,根據(jù)情況判
斷的話,我認為應(yīng)該是該設(shè)備的“major-minor”(主、次設(shè)備號)。
為什么用0100而不是030b?
如果上述判斷準確的話,那么寫入0100就表示/dev/ram0。這就奇怪了,“真實
的根設(shè)備”應(yīng)該是/dev/hda11呀,那么是不是應(yīng)該寫030b呢?但是測試發(fā)現(xiàn)用030b
同樣會導(dǎo)致不能啟動。
Kernel panic: VFS: Unable to mount root fs on 03:0b
5.7 提示
5.7.1 文件系統(tǒng)目錄層次結(jié)構(gòu)
根文件系統(tǒng)的目錄結(jié)構(gòu)最好符合“Filesystem Hierarchy Standard(文件系統(tǒng)
層次標準)”[7],而不能自己隨意創(chuàng)建。
順便說一下,象這種情況:/bin, /sbin, /usr/bin, /usr/sbin 這4個目錄都
可以放應(yīng)用程序,具體放在哪個目錄,則要根據(jù)該應(yīng)用程序在系統(tǒng)中的作用來確定
。一般地,系統(tǒng)的關(guān)鍵應(yīng)用程序放在/bin,只能給超級用戶root訪問的關(guān)鍵應(yīng)用程
序放在/sbin,相比之下比較次要的應(yīng)用程序和root應(yīng)用程序分別放在/usr/bin和/
usr/sbin。
5.7.2 mklips.sh(制作LiPS的腳本)
復(fù)制文件的工作全部可以手工進行,但是做一個shell腳本來完成所有工作顯然
是一個更好的辦法。
在我們的項目中,制作LiPS(也就是完成裁減Linux)的工作,除了編譯內(nèi)核之
外,都可以通過mklips.sh腳本完成。
5.7.3 lips.conf(LiPS配置文件)
lips.conf是LiPS的配置文件,由mklips.sh腳本使用,主要用來控制所制作的
LiPS系統(tǒng)包括哪些可選的模塊,例如:
INCLUDE_APACHE=no
INCLUDE_IPTABLES=no
INCLUDE_PROFTPD=yes
INCLUDE_NFSD=no
INCLUDE_SAMBA=yes
通過一系列的INCLUDE_?=yes或者no,可以實現(xiàn)LIPS的模塊化。在mklips.sh腳
本中,判斷每個INCLUDE的值,來確定是否復(fù)制某個模塊相關(guān)的文件。
配置文件中還可以包括其他可配置的信息。
5.7.4 cp –dpR
復(fù)制文件請使用“cp –dpR”命令,可以保留文件的屬性(特別是對于設(shè)備節(jié)
點和符號連接等特殊文件),還可以復(fù)制整個目錄。
5.7.5 如何判斷一個程序依賴哪些文件
除了庫文件外,關(guān)鍵是找出相關(guān)的配置文件。man手冊頁是判斷應(yīng)用程序配置文
件的重要依據(jù)。我們以安裝Apache Server為例來說明判斷復(fù)制哪些文件的過程。
首先確定其可執(zhí)行文件是/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)
這時關(guān)鍵看最后一段FILES,列出了有關(guān)的配置文件、日志文件和進程文件,那
么我們就知道了httpd要在目標系統(tǒng)中運行,這幾個配置文件是必不可少的。
把httpd和用ldd找出的庫文件以及上述配置文件復(fù)制到目標系統(tǒng),運行httpd試
一下,看看是否正常。一般情況下應(yīng)該沒有問題。但是httpd比較特殊,除了ldd找
出的庫文件外,它還需要很多可加載的模塊(庫)。怎么發(fā)現(xiàn)呢?重要的一點是看
出錯信息(有時候還要查看日志中的信息,/var/log/messages或者應(yīng)用程序日志)
,看httpd報告缺少什么;還可以看看相關(guān)的配置文件httpd.conf,也能找到有用的
信息。然后我們發(fā)現(xiàn)需要/usr/lib/httpd這個目錄下的庫,把它也復(fù)制過去即可。
5.7.6 帶庫文件復(fù)制——lcp()
在復(fù)制可執(zhí)行文件(軟件)的過程中,如果沒有正確復(fù)制相關(guān)的庫文件,該軟
件肯定不能在目標系統(tǒng)中正常運行。而通過ldd命令手工確定每個軟件的庫文件,是
一個繁瑣且費時的任務(wù)。另一個隱含的缺陷是,當你不再需要某個軟件時,刪掉可
執(zhí)行文件之后,相應(yīng)的庫文件是否需要刪除呢?如果刪除了,而該庫文件是其他軟
件也需要的,會導(dǎo)致其他軟件不能用;如果不刪除,就有可能留一些垃圾庫文件在
目標根文件系統(tǒng)中。
因此,最好是能夠保證每次復(fù)制可執(zhí)行文件的同時自動復(fù)制相關(guān)聯(lián)的庫文件。
我寫了一個腳本函數(shù) lcp() 來解決這個問題。語法和主要代碼如下(以#開頭的行
為注釋):
# lcp BIN BINPATH LIBPATH
# BIN:可執(zhí)行文件路徑
# BINPATH:可執(zhí)行文件的目標路徑(復(fù)制到哪里)
# LIBPATH:相關(guān)庫文件的目標路徑
lcp()
# run()是另一個函數(shù),執(zhí)行它后面的shell命令,并在遇到錯誤時報錯、寫錯
誤日志
# 首先復(fù)制BIN到BINPATH
run "$CP $BIN $BINPATH"
# 使用ldd找出與BIN相關(guān)的庫文件,把ldd的輸出送給LDDSTR
LDDSTR=`ldd $BIN`
# 循環(huán)檢查LDDSTR字符串的每一項
for STR in $LDDSTR; do
# 判斷出庫文件路徑
LIB=`echo $STR | grep "/lib/" `
if [ -z "$LIB" ]; then
continue
fi
# 復(fù)制LIB到LIBPATH,除非要復(fù)制的庫文件在目標路徑中已經(jīng)存在
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 庫文件的命名
?。▍⒖假Y料[9]之6.2節(jié))
我們這里所說的“庫”都是指的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(數(shù)學(xué))庫的文
件名為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 版本無關(guān)的符號鏈接(Version-independent symbolic links to the major re
vision version symbolic links)
這些符號鏈接的作用是為用到某個庫的所有程序提供一個統(tǒng)一的入口,而不管實際
上glibc的版本或者該庫的主修訂版本。其命名格式為 libLIBRARY_NAME.so。比如
,libm.so鏈接到libm.so.6,libm.so.6又鏈接到libm-2.2.3.so。唯一的例外是li
bc.so,是個腳本。連接一個程序時用的是這個符號鏈接。
O 靜態(tài)庫文件(Static library archives)
這些庫是應(yīng)用程序靜態(tài)連接用的。格式為 libLIBRARY_NAME.a.
6 引導(dǎo)
6.1 引導(dǎo)過程概述
6.2 幾種引導(dǎo)方式
幾種引導(dǎo)方式的粗略比較如下表所示。
優(yōu)點
缺點
DOC
DOM
FLOPPY
HARDDISK
NETWORK
USB-HDD
容量大,讀寫可靠
6.3 grub引導(dǎo)器
有了前面生成的Linux內(nèi)核和根文件系統(tǒng)映像文件后,制作引導(dǎo)盤非常簡單。在
動手制作引導(dǎo)盤之前,最好先了解一下grub引導(dǎo)器。
Grub是一個通用的多引導(dǎo)加載軟件,與較早期多數(shù)Linux發(fā)行版本提供的另一個
引導(dǎo)器lilo相比,grub的功能更強大、設(shè)置更方便、更靈活。因此本項目選用grub
作為引導(dǎo)器軟件。
本文檔不是grub的教學(xué)文檔,所以有關(guān)grub的詳細用法,請參考其他有關(guān)文檔
。這里僅強調(diào)幾點:
O 引導(dǎo)盤的文件系統(tǒng)可以是ext2,ext3,msdos (FAT),vfat (FAT32),等等;
O grub表示硬盤、分區(qū)的方式與Linux的方式不同。Linux系統(tǒng)的IDE硬盤表示為/de
v/hd{a,b,c,d},SCSI設(shè)備表示為/dev/sd{a,b,c,d,…},分區(qū)從1開始編號,比如P
rimary Master IDE硬盤的第二個分區(qū)是/dev/hda2;而grub的硬盤(包括IDE和SCS
I)統(tǒng)一從0開始編號,分區(qū)也是從0開始編號,比如系統(tǒng)中的第一個硬盤是(hd0),
其第一個分區(qū)是(hd0,0)。
O 在grub的提示符下面輸入命令和參數(shù)時,按TAB鍵可以自動補全。
6.4 USB引導(dǎo)
使用USB引導(dǎo)盤有很多好處,比如說,容量大、讀寫可靠,不占用IDE接口,攜
帶方便等等。
6.4.1 制作步驟
6.4.1.1 創(chuàng)建文件系統(tǒng)
首先,必須在USB盤上面創(chuàng)建文件系統(tǒng)(也就是格式化)。你幾乎可以使用gru
b支持的所有文件系統(tǒng),包括常見的各種文件系統(tǒng),比如ext2,ext3,F(xiàn)AT,F(xiàn)AT32等
。但是根據(jù)我的經(jīng)驗,需要注意的是:
O 最好不要使用FAT,即msdos,因為FAT的文件名有“8.3”的限制,所以象“grub
.conf”這種文件名就被截斷成了“GRUB.CON”。
O FAT和FAT32都不能表示符號鏈接文件,雖然有變通的方法,即將文件再復(fù)制一份
。
順便說一下在Linux下面怎么訪問USB盤。
如果系統(tǒng)中沒有其他的SCSI設(shè)備,那么插在USB 1接口上面的USB盤的設(shè)備名為
/dev/sda,其分區(qū)為/dev/sda1。依此類推。一般插入USB盤后,窗口中會出現(xiàn)驅(qū)動
程序輸出的一些信息,其中有sd?的字眼。接下來就跟訪問普通的硬盤分區(qū)沒有什么
兩樣了。
#mke2fs /dev/sda1
#mount –t ext2 /dev/sda1 /mnt
注意:Redhat 7.3不支持Intel 845系列芯片組的主板。
6.4.1.2 復(fù)制文件
按照下面的列表,復(fù)制文件(包括目錄結(jié)構(gòu))到USB引導(dǎo)盤:
備注
/boot/
bzImage
或者vmlinuz
initrd.img
/grub/
grub.conf
menu.lst
符號鏈接
stage1
stage2
6.4.1.3 安裝grub
安裝grub到USB盤的引導(dǎo)扇區(qū)。假設(shè)系統(tǒng)有一塊IDE硬盤,這時USB盤是grub看到
的第二塊“硬盤”,所以表示為(hd1)。
#grub
grub> root (hd1,0)
grub> setup (hd1)
root命令告訴grub,內(nèi)核文件所在的位置。Setup命令安裝grub到hd1的引導(dǎo)扇
區(qū),如果是setup (hd1,0),則安裝到第一個分區(qū)(即/dev/sda1)。
上述命令序列也可以通過執(zhí)行腳本完成。
6.4.1.4 用USB盤引導(dǎo)系統(tǒng)
在用新制作的USB引導(dǎo)盤引導(dǎo)之前,還需要確認BIOS的一個設(shè)置,即第一個啟動
設(shè)備應(yīng)該設(shè)置為“USB-HDD”。
OK,插上USB盤,試一試。
6.5 提示
6.5.1 版本問題?
我們的項目開始的時候用Redhat 7.3,但是后來做USB引導(dǎo)盤時發(fā)現(xiàn),我們的環(huán)
境不支持USB盤。我想Redhat 7.3應(yīng)該是支持USB盤的,因為我以前在7.1下面就用過
。那么有可能是主板的問題,i845的芯片組比Redhat 7.3要新,也許是沒有該芯片
組的正確驅(qū)動。
后來在Redhat 7.3下更新了內(nèi)核,使用2.4.20版本的Linux內(nèi)核即可正常支持U
SB盤。
然而還有一個問題,Redhat 7.3的GRUB版本是0.91,在使用中發(fā)現(xiàn),制作USB引
導(dǎo)盤沒有問題,但是一旦你改變USB盤的文件(比如復(fù)制一個新的文件上去),本來
可以引導(dǎo)的USB盤就不行了。
而Redhat 9.0使用的是GRUB 0.93,就沒有上述問題,并且使用USB盤也沒有問
題。也就是說,使用Redhat 9就可以了。不過Redhat 9集成的其他很多軟件也有變
化,比如Apache升級到了2.0版本,以前的httpd.conf配置文件要修改過之后才能正
常使用;另外quota接口也有變化。
因此改變版本需要一定的代價,究竟使用什么版本應(yīng)該綜合考慮,最好在項目
開始時就做出正確的選擇,并保持穩(wěn)定。
7 遠程串口控制臺
7.1 概述
7.2 配置方法
7.3 提示
7.4 Linux 遠程串口控制臺指南
(這是我以前寫的一份簡單的文檔,曾經(jīng)貼到網(wǎng)上,附在這里供參考)
Linux 遠程串口控制臺指南
dot <anonymou@163.com>
Dec 27, 2002
2002年圣誕節(jié)期間,我在 Redhat Linux 7.0 (kernel 2.2.16-22) 平臺上配置
了遠程串口終端,整個過程基本順利,但是也經(jīng)歷了一些意想不到的波折,幸好最
終是成功了的。乘著記憶還比較清晰的時候,寫下這篇文檔,以供自己和他人參考
。
首先參考 "Linux-Remote-Serial-Console-HOWTO",該文檔已經(jīng)足夠詳盡,按
要求一步步地做即可。該文檔描述的是 Redhat 7.2 平臺,個別地方跟 7.0 有些差
異,不過問題不大。
要注意的問題主要是:
* 串口直連電纜
開始我并沒有在意這個問題,我手頭上有一根以前做的直連電纜,是只用了3根
線的那種(2、3交叉,5對接),因此 HOWTO 文檔中講電纜制作的章節(jié)我就跳過去
了,沒有仔細看,以為我這根電纜就可以了。事實也給人以這種假相:當我按照文
檔的說明完成了配置文件的修改,重新引導(dǎo) Linux 機子,這時在 Windows 的超級
終端中確實顯示了所有該顯示的信息,看起來沒問題。然而接下來配置 getty 時就
不行了,應(yīng)該出現(xiàn)在超級終端中的 login: 提示符死活不肯出現(xiàn)。以為是 getty 軟
件的問題,先后測試了 getty 和 mgetty,都不行。后來在 quickmouce 的提醒下
,又仔細看文檔,按照 11.3 節(jié)的圖 11-1 重新制作了串口直連電纜,才解決問題
。
* getty 軟件
HOWTO 文檔中已經(jīng)指出,mingetty 不支持串口終端,所以這個軟件要首先排除
(mingetty 的手冊頁中也有相關(guān)說明)。而 Redhat 缺省安裝的就是這個軟件,所
以要重新下載安裝其他的 getty 類軟件。文檔中也已經(jīng)列出了幾種常用的 getty
的變種。
來說說 mgetty 先。為什么我先使用了這個軟件呢,一是因為 Redhat 7.0 的
安裝盤上面有它的 RPM 包,直接拿來裝很方便,另外是因為 mingetty 的手冊頁中
推薦使用 mgetty 。結(jié)果是 mgetty 運行后在日志文件中報告大量錯誤,莫名其妙
。我想可能是這個光盤上的版本老了,于是上網(wǎng)下載了比較新的版本 mgetty-1.1.
25-5.i386.rpm ,運行之后情況好多了,似乎要成功的樣子。在沒有使用新的串口
線之前,login: 出不來,但是在超級終端中敲的字符 mgetty 可以收到(從日志中
看的出來);換了新制作的串口線之后,第一次!成功了,一切都象預(yù)期的那樣,
我可以從超級終端登錄??墒钱斘彝顺鱿朐俚卿浺淮?,就不行了,甚至我把兩臺機
子全部重啟也不行啦。我又試用 Linux 的 minicom 終端來連接,也是只成功了一
次,就再也不行了。真是怪哉,腦袋都快想破了,也不知道是為什么。后來終于懷
疑 mgetty 有問題,換了其他的,天哪,終于解脫了。不知道后面更新的版本是否
可以,我是沒有勁去試了。
再來說說 agetty 。其實沒有什么好說的,因為我根本沒有用過這個。我本來
想試一下的,但是從網(wǎng)上下載安裝太麻煩了。下載了 agetty-2.11w-2.i386.rpm ,
安裝時 RPM 說要先安裝 login 包,然后又要求什么 pam 包,然后又需要 awk ,
真是 faint 了,太麻煩了,所以最終我也沒有安裝它。
最后說 getty 啦。也就是 HOWTO 文檔中所謂的 “傳統(tǒng)” getty 。我下載的
RPM 包的名字叫 getty_ps-2.0.7j-9.i386.rpm 。當我正在為 mgetty 的問題頭疼
的時候,換成它之后就一切 OK 了。
* 終端軟件
Windows 下面可以用超級終端、NetTerm,Linux 下面有 Minicom 。都比較好
用,注意參數(shù)配置與目標機的串口一致。
* 修改過的配置文件列表
/etc/lilo.conf
/etc/inittab
/etcdefs
/etc/securetty
/etc/makedev.d/linux-2.2.x
/etc/security/console.perms
/etc/sysconfig/init
/etc/sysconfig/kudzu
* 再談串口直連電纜
這次調(diào)試在串口直連電纜上面花費了不少力氣,對它們的了解也增加了不少。
以前以為直連電纜就是接 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 中要求的直連電纜做法。我做通串
口控制臺使用的就是這種電纜。
如果你打算自己制作電纜,就會發(fā)現(xiàn)一些問題。我們一般利用網(wǎng)線(雙絞線)
來做,這種雙絞線是 8 芯的,而按照圖示的連接方法則需要 9 根線。因此最簡單
的方法是用那種很多芯的排線來做,需要多少根割多少根(最好是彩色的,不容易
弄混)。后來我想,我們用到的其實就是 CTS/RTS 流控信號,到 2000 年為止 Li
nux 還不支持 DTR/DSR 流控,應(yīng)該用不了這么多線。于是我就用網(wǎng)線做了根不完整
的直連電纜:2、3 交叉,5 對接,7、8 交叉,還空 3 根線,就把 1、4 也交叉連
上了,結(jié)果是用了 7 根線,還空 1 根,與上面比只是少了 4、6 交叉,也就是沒
有 DTR/DSR 信號。事實證明這樣也是通的。我猜想 1、4 交叉不要應(yīng)該也是通的,
只是沒有試過,已經(jīng)焊上去懶得再弄了。
關(guān)于串口方面的更多內(nèi)容可以參考 "Linux-Text-Terminal-HOWTO" 和 "Linux
-Serial-HOWTO" 文檔。
* 為什么要用串口終端(控制臺)?
為什么費勁做這個 Serial Console 呢?最容易想到的理由是省錢,呵呵,省
掉了顯卡、顯示器、鍵盤,只剩下一個 "Box",多好玩。
說正經(jīng)的,這種做法在嵌入式系統(tǒng)的開發(fā)中也是很有價值的?,F(xiàn)在很多人都在
利用 X86 平臺做嵌入式系統(tǒng)開發(fā),甚至做產(chǎn)品。我曾經(jīng)測試過清華某某做的 foob
ar 服務(wù)器,鏡像光盤用的,賣給你的就是一個主機,我自己給接上顯示器、鍵盤,
開機就是 Linux ,還可以進入單用戶模式,兩分鐘就把 root 口令改了,你說這樣
的服務(wù)器有什么安全性可言?如果能夠屏蔽本地控制臺,配置串口終端,不是更“
象”一個產(chǎn)品嗎?
?。ㄍ辏?br>
8 系統(tǒng)安裝光盤
8.1 概述
本節(jié)介紹一種系統(tǒng)安裝光盤的制作方法。安裝光盤用于產(chǎn)品階段的生產(chǎn)安裝。
因此該安裝光盤必須是可引導(dǎo)的、簡單好用,并且一般不包含源代碼。
制作可引導(dǎo)光盤的方法有很多種,我們用了一種最簡單的方法,就是拿來一個
可引導(dǎo)光盤的ISO映像,然后做必要的修改以滿足我們的要求。
請準備Redhat 9的第一張安裝光盤,我們將要用到的文件是 /images/boot.is
o。(其他發(fā)行版本應(yīng)該也可以,只要原理是一樣的。)
另外如果你的工作平臺是Windows,請準備WinISO 5.3軟件,用來編輯光盤ISO
映像文件。
當然如果你要燒盤測試的話,還要準備刻錄機和CD-RW或者CD-R光盤。
8.2 boot.iso光盤的文件結(jié)構(gòu)分析
用WinISO打開boot.iso即可看到該光盤的文件(其實Redhat 9第一張安裝光盤
的/isolinux目錄就是boot.iso解開后的內(nèi)容)。下面是文件列表:
[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
其中關(guān)鍵的文件是boot.cat,initrd.img,isolinux.bin,isolinux.cfg和vm
linuz;isolinux.cfg是如何引導(dǎo)的配置文件,我們主要修改這個文件即可;initr
d.img和vmlinuz分別是初始化RAM盤和內(nèi)核,其作用在前面章節(jié)中已經(jīng)詳細描述過;
另外兩個文件是光盤引導(dǎo)需要的,不動它。
其余的*.msg文件是一些引導(dǎo)過程中可能會顯示的文本信息,可以不管;splas
h.lss是引導(dǎo)時顯示的一個圖片,也可以不管。
下面來看看isolinux.cfg的內(nèi)容。
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
這個配置文件的語法結(jié)構(gòu)跟其他引導(dǎo)器的配置文件,比如grub.conf或者lilo.
conf,非常類似,比較好懂。如果再對照光盤引導(dǎo)安裝Redhat的實際過程看一下,
基本上不需要什么解釋就可以理解。其中以label開頭的每個小節(jié)是一種引導(dǎo)配置,
缺省(或者timeout后)以label linux引導(dǎo)。每個配置的第一句,kernel指定引導(dǎo)
所用的內(nèi)核,第二句append指定內(nèi)核引導(dǎo)參數(shù)(主要說明initrd文件的位置,以及
其他參數(shù))。
8.3 制作步驟
1) 復(fù)制boot.iso,用WinISO打開;
2) 解放出isolinux.cfg文件,并從光盤映像中刪除之;
3) 修改配置文件isolinux.cfg;
4) 制作bzImage和initrd.img,這兩個文件用于光盤引導(dǎo)至一個比較正常的Linux系
統(tǒng)下,包括常用的工具軟件和服務(wù),我們要在這個環(huán)境下進行產(chǎn)品的安裝;
5) 將修改后的isolinux.cfg以及initrd.img,bzImage加入光盤;
6) 準備一個setup目錄,將產(chǎn)品安裝需要的文件和腳本放在這個位置,然后將setu
p目錄加入光盤;
7) 刪除沒有用到的文件,也可以不管,除非加入文件時遇到?jīng)_突,必須先把原來光
盤上的文件刪除或者改名;
8) 存盤退出,刻錄光盤。
下面是一個修改后的isolinux.cfg配置文件的例子,很簡單:
default linux
prompt 1
timeout 600
label linux
kernel bzImage
append initrd=initrd.img ramdisk_size=65536 root=/dev/ram0
9 源代碼(配置文件和腳本)
9.1 lips.conf
9.2 mklips.sh
National Storage System Lab.