首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux 系统裁减指南(LiPS) [转帖]

Linux 系统裁减指南(LiPS) [转帖]

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]
51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)
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
51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)
下面我们以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卡,都不用选。
  • 51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)
    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
  • 51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)
    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
    51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)
    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=
      装入指定的文件作为初始化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 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
      但是这个机制已经被淘汰,虽然目前的内核仍然支持,不能保证以后的内核会
    支持。所以不要使用。
    ************未完特续**********
    51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)
    返回列表