linux系统裁减指南_第1页
linux系统裁减指南_第2页
linux系统裁减指南_第3页
linux系统裁减指南_第4页
linux系统裁减指南_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《Linux系统裁减指南(LiPS)目目 引 编写目 背 定 参考资 总体描 硬件环 软件环 需求规定和约 总体设 基本设计概 软件结 内 创建内核的方 内核配 概 Loadablemodule Processortypeand General PlugandPlay Block Multi-devicesupport(RAIDand Networking SCSI Networkdevice Character File Console USB 提 根文件系 根文件系 文件系统的内 应用程序 设备文件(device 脚本和配置文件(scriptsandconfiguration 库文件 必要的目 初始化RAM盘 操作步 引导选 安 改变根目录设 使用场 淘汰的根转换机制 系统初始化 init的任 两种风格:Slackwarevs. 什么是 配置文 再论 根到底在哪 根转换机制:新的?旧的 提 文件系统目录层次结 mklips.sh(制作LiPS的脚本 lips.conf(LiPS配置文件 cp 如何判断个程序依赖哪些文 带库文件复制—— 库文件的命 引 引导过程概 几种引导方 grub引导 USB引 制作步 创建文件系 复制文 安装 提 版本问题 远程串控制 概 配置方 提 Linux远程串控制台指 系统安装光 概 boot.iso光盘的文件结构分 引言编写目的LinuxLiPS的详细设计过程,也可以作为构造一个小型化Linux系统的指南。本文档内容的组织如下所述:这一部分是引言,第2部分是对项目软、硬件环境和需求的总体描述,第3部分说明了裁减LINUX的相关基本概念。后面几个部分是具体实现7Linux系统安装光盘的创建方法,8列出了相关华中科技大学计算机存储系统国家专业实验室,NAS项目(2003.3——​ObootloaderOkernel:Orootfilesystem:OUSB:参考资料DIYLinux系统IBMdeveloperWorks中国网站.LinuxFromScratch.Linux启动过程综述.TheLinuxBootdiskHOWTO().UsingtheinitialRAMdisk(initrd)./usr/src/linux- Quickmouse2003.1发表于白云黄鹤BBS(http:///Linux讨论区的帖子“裁减Linux”。KarimYaghmour.BuildingEmbeddedLinuxSystems.O'Reilly,April200AlessandroRubini.TakeCommand:Init.cs/init/,NovemberLinuxPAM体系结构IBMdeveloperWorks中国网站http://www-90/0./developerWorks/cn/linux/l-pam/index.shtml.2003.7.[12]总体描述硬件环境Intel845芯片组主板,P41.8GHzCPU,256M内存,60GIDE硬盘,RTL8139软件环境RedhatLinux7.3kernel2.4.18-3)RedhatLinux9kernel0-8)。可以根据需要使用其他版本的内核,比如Redhat7.3+kernel2.4.20。需求规定和约束LiPSLinuxPoweredStorageLinux操作系统,主要着眼于提供各种文件服务,不包括XGUI;并且足够小,可以装入32MUSB盘或者DOC/DOM等常用设备引导。总体设计基本设计概念提起“裁减Linux”,最容易想到的方法是以一个已经安装好的系统为基础,删除掉不需要的文件,以减小整个系统的尺寸。而事实这个方法几乎是行不通的,因为通过光盘安装的一个Redhat9Linux系统,即便是只选择了比较少的软件包,其所占空间也可以轻300~500MB,想在这个基础裁减到30MB左右是比较困难的。更困难的是确定另一个途径是从零开始根据需要构建整个系统。“LinuxFromScratch”Linux系统,然软件结构LiPS3部分:Linux本、配置文件和其他特殊文件(比如设备节点)的地方,也可以安装各种软件包。通常根LiPS中应用了initrd(RAM盘)机制,将根文件系统放在RAMDisk中。引导器(BootLoader)的任务是从引导设备装载内核,引导系统运行。Linux系统常见的引导器包括早期的LILO和近期的GRUB。LiPS用的是GRUB。内核创建内核的方法Linux提供了方便灵活的方法来定制内核,主要步骤包括:下载安装内核源代码树,cd/usr/src/linux-2.4makemenuconfigmakedep;makeclean;make编译成功的内核文件为内核配置makemenuconfig之后可以看到类似如下的内容(编号是为了描述方便而加的)。补丁面,其实标准内核是比较稳定的。补丁一般是对标准内核错误的修正和新增的功能。与2.4.20内核配置选项比较会发现,[10,25,30]都属于Redhat的补丁。一般地,这些补丁选项都不是必须的,因此我们的LiPS内核中都没有包括这些选项。其实,完全可以通过直接配置一个标准的内核版本(比如 LinuxKernelv2.4.20-8-R2LipsCodematurityleveloptionsLoadablemodulesupportProcessortypeandfeaturesGeneralsetupMemoryTechnologyDevices(MTD)ParallelportsupportPlugandPlayconfigurationBlockdevicesMulti-devicesupport(RAIDandLVM)Cryptographysupport(CryptoAPI)NetworkingoptionsTelephonySupportSCSIsupportFusionMPTdevicesupportI2OdevicesupportNetworkdevicesupportAmateurRadiosupportIrDA(infrared)supportISDNsubsystemOldCD-ROMdrivers(notSCSI,notIDE)InputcoresupportCharacterdevicesMultimediadevicesCryptoHardwaresupportFilesystemsConsoledriversSoundUSBsupportAdditionaldevicedriversupportBluetoothsupportKernelhackingLibraryroutinesLoadanAlternateConfigurationFileSaveConfigurationtoanAlternateFile <Exit <Help东西。没有说明的选项,比如“Codematurityleveloptions”,表示不选​Loadablemodule[*]Enableloadablemodule[]Setversioninformationonallmodule[*]Kernelmodule虑将一些硬件设备的驱动程序编译为模块,从而减小内核尺寸,同时增加适应不同硬件Processortypeand[*]MachineCheckException<>ToshibaLaptop<>Delllaptop<>/dev/cpu/microcode-IntelIA32CPUmicrocode<>/dev/cpu/*/msr-Model-specificregister<>/dev/cpu/*/cpuid-CPUinformationsupport(off)HighMemorySupport[]Math[]MTRR(MemoryTypeRangeRegister)support[]Symmetricmulti-processingsupport[]LocalAPICsupportonuniprocessors[]UnsyncedTSCsupport处理器特性。选择一下Processorfamily,其余基本都没有选。HighMemoryGeneral[*]Networkingsupport[*]PCIsupport(Any)PCIaccessmode[*]ISAbussupport[*]PCIdevicenamedatabase[]EISAsupport[]MCA[]Supportforhot-pluggabledevices[*]SystemVIPC[*]BSDProcessAccounting[*]Sysctlsupport(ELF)Kernelcore(/proc/kcore)<>Kernelsupportfora.out<*>KernelsupportforELF<>KernelsupportforMISCbinaries[*]PowerManagementsupport<>KernelsupportforMISCbinaries[*]PowerManagementsupport<*>AdvancedPowerManagementBIOSsupport IgnoreUSERSUSPEND EnablePMatboot MakeCPUIdlecallswhen EnableconsoleblankingusingAPM RTCstorestimeinGMT[*]AllowinterruptsduringAPMBIOScallsUserealmodeAPMBIOScalltopower其中APM相关的选项比较搞不清楚,有时候halt–p命令不能关闭系统电源跟这里有关系。PlugandPlay<*>PlugandPlay<>ISAPlugandPlayBlock<*>Normalfloppydisk<>XTharddisk<>CompaqSMART2<>CompaqSmartArray5xxx<>MylexDAC960/DAC1100PCIRAIDController<*>Loopbackdevice<>Networkblockdevice<*>RAMdisk(4096)DefaultRAMdisk[*]InitialRAMdisk(initrd)[*]Perpartitionstatisticsin块设备。软驱也可以不选。这里的关键选项是Loopbackdevice,RAMdisk和initrd,一定要选中。DefaultRAMdisksize多少都没有关系。Multi-devicesupport(RAIDand[*]Multipledevicesdriversupport(RAIDand<*>RAID<*>Linear(append)<*>RAID-0(striping)<*>RAID-1(mirroring)<*>RAID-4/RAID-5<*>MultipathI/O<*>Logicalvolumemanager(LVM)MD支持。软RAIDLVMNetworking<*>Packet[*]Packetsocket:mmapped<>Netlinkdevice[*]Networkpacketfiltering(replacesipchains)[]Networkpacketfilteringdebugging[*]Socket<*>Unixdomainsockets[*]TCP/IPnetworking[*]IP:[*]IP:advancedrouter[] IP:policyrouting[ IP:equalcost[] IP:useTOSvalueasroutingkey[] IP:verboseroutemonitoring[ IP:largerouting[*]IP:kernellevelautoconfiguration IP:DHCPsupport IP:RARPsupport<*>IP:<>IP:GREtunnelsoverIP[]IP:multicastrouting[]IP:TCPExplicitCongestionNotificationsupport[]IP:TCPsyncookiesupport(disabledperIP:NetfilterConfiguration<>802.1QVLAN<>TheIPX<>AppletalkprotocolsupportAppletalkdevices><>DECnet<>802.1dEthernetBridgingQoSand/orfairqueueing>Networktesting>意义,基本可以用缺省设置。注意DHCP选项,如果要用到的话要记得选中这个。IP:NetfilterConfiguration(iptables有关)PleaseseeDocumentation/ide.txtforhelp/infoonIDEdrives[]Useolddisk-onlydriveronprimaryinterface<*>IncludeIDE/ATA-2DISKsupport Usemulti-modebydefault Auto-GeometryResizing<*>IncludeIDE/ATAPICDROM<>IncludeIDE/ATAPITAPE<>IncludeIDE/ATAPIFLOPPY<*>SCSIemulationsupport[]IDETaskfileAccessIDEchipset[]CMD640chipset[]RZ1000chipsetbugfix/supportGenericPCIIDEchipset SharingPCIIDEinterruptssupport GenericPCIbus-masterDMAsupport[] Bootoff-boardchipsetsfirstsupport[] Forceenablelegacy2.0.XHOSTStouseDMA UsePCIDMAbydefaultwhenavailable[]EnableDMAonlyfordisks[]AEC62XXchipsetsupport[]ALIM15x3chipsetsupport[]AMDVipersupport[]CMD64XandCMD680chipsetsupport[]CY82C693chipsetsupport[] CyrixCS5530MediaGXchipsetsupport[] HPT34Xchipsetsupport[] IntelPIIXnchipsetssupport PIIXnTuning[ [] [] SiS5513chipsetsupport[ SLC90E66chipset[] []OtherIDEchipsetsupport[]IGNOREword93ValidationIDE设备支持。要用IDE硬盘,当然要选中。CDROM选项看情况也可以不要。SCSIemulation似乎对使用USB盘有影响。剩下的很多都是跟IDEchipset有关的。最好是用deg命令找出目标系统主板芯片组,然后选中对应的芯片组支持,这样ESCSI<*>SCSISCSIsupporttype(disk,tape,CD-<*>SCSIdisk(40)MaximumnumberofSCSIdisksthatcanbeloadedas<>SCSItape<>SCSIOnStreamSC-x0tape<>SCSICD-ROM<*>SCSIgenericSomeSCSIdevices(e.g.CDjukebox)supportmultipleLUNs[]Enableextrachecksinnewqueueingcode[]ProbeallLUNsoneachSCSI[]VerboseSCSIerrorreporting(kernelsize+=12K)[]SCSIloggingfacilitySCSIlow-leveldriversSCSISCSI硬盘等SCSI设备,这里当然要选。目前我们的目标系统其实没有SCSI硬盘,但是为了使用USB盘,也要选中SCSI支持。SCSIlow-leveldrivers子选项中是一些SCSINetworkdevice[*]NetworkdeviceARCnetdevices<>Dummynetdriver<>Bondingdriver<>EQL(seriallineloadbalancing)<>UniversalTUN/TAPdevicedriversupportEthernet(10or100Mbit)>[*]Ethernet(10or[*]EISA,VLB,PCIandonboard EtherExpressPro/100support(eepro100,originalBecker RealTekRTL-8139PCIFastEthernetAdaptersupportEthernet(1000Mbit)>[]FDDIdriver<>PPP(point-to-pointprotocol)<>SLIP(serialline)supportWirelessLAN(non-hamradio)>TokenRingdevices>[]FibreChanneldriversupportWaninterfaces>网络设备支持。主要选择网卡类型,Ethernet10or100Mbit)Character[*]Virtual[*]Supportforconsoleonvirtual<*>Standard/generic(8250/16550andcompatibleUARTs)serial[*]Supportforconsoleonserialport[]Extendeddumbserialdriveroptions[]Non-standardserialportsupport[]Unix98PTYsupportI2Csupport>Mice>Joysticks><>QIC-02tapesupportWatchdogCards><>AMD768RandomNumberGenerator<>Inteli8x0RandomNumberGenerator<>AMD76xnativepowermanagement<>/dev/nvram<>EnhancedRealTimeClock<>DoubleTalkPCinternalspeechcard<>SiemensR3964line<>ApplicomintelligentfieldbuscardsupportFtape,thefloppytapedevicedriver><>/dev/agpgart(AGP[]DirectRenderingManager(XFree86DRI<>ACPModem(Mwave)File[*]Quota<>Kernelautomounter<*>Kernelautomounterversion4support(alsosupports<*>Reiserfs[]Enablereiserfsdebugmode[*]Statsin/proc/fs/reiserfs<*>Ext3journallingfilesystemsupport[]JBD(ext3)debuggingsupport<*>MSDOSfs< UMSDOS:Unix-likefilesystemontopofstandardMSDOS<*>VFAT(Windows-95)fs<>CompressedROMfilesystem[*]Virtualmemoryfilesystemsupport(formershm<*>ISO9660CDROMfilesystemsupport[*]MicrosoftJolietCDROMextensions[]Transparentdecompression<>JFSfilesystem<>Minixfs<>FreeVxFSfilesystemsupport(VERITASVxFS(TM)<>NTFSfilesystemsupport(read<>OS/2HPFSfilesystemsupport[*]/procfilesystemsupport<>QNX4filesystemsupport(read<>ROMfilesystem<*>Secondextendedfs<>SystemV/Xenix/V7/Coherentfilesystem<>UDFfilesystemsupport(read<>UFSfilesystemsupport(readonly)NetworkFileSystems><>Codafilesystemsupport(advancednetwork<*>NFSfilesystem[*]ProvideNFSv3clientsupport[]RootfilesystemonNFS<*>NFSserver[*]ProvideNFSv3server<*>SMBfilesystemsupport(tomountWindowssharesetc.)[]UseadefaultNLS<>NCPfilesystemsupport(tomountNetWarevolumes)PartitionTypes>NativeLanguageSupport>DefaultNLSOption:"iso8859-1"<*>Codepage437(UnitedStates,<*>SimplifiedChinesecharset(CP936,<*>TraditionalChinesecharsetReiserfs,Ext3,FAT,ISO9660,JFS等等,可以根据情况选择。/procext2一定要选中。还有NetworkFileSystems子选项,可以选择是否支持NFS和SMB。NativeLanguageSupport子选项跟所支持的语言有关,这里没有全部列出来,我们选中了英语和简体、繁Console[*]VGAtext[]VideomodeselectionUSB<*>Supportfor[]USBverbosedebugMiscellaneousUSB[*]PreliminaryUSBdevice[]Longtimeoutforslow-respondingdevices(someMGEEllipseUSBHostController<*>UHCIAlternateDriver(JE)<*>OHCI(Compaq,iMacs,OPTi,SiS,ALi,...)USBDeviceClass<>USBMIDI<*>USBMassStorage USBMassStorageverbose[] [] ISD-200USB/ATABridgesupport[ <>USBModem(CDCACM)<>USBPrinterUSBHumanInterfaceDevices<*>USBHumanInterfaceDevice(fullHID) InputcoresupportisneededforUSBHIDinputlayerorHIDBP[] /dev/hiddevrawHIDdevicesupportUSBImaging<>USBKodakDC-2xxCamera<>USBScanner<>MicrotekX6USBscannerUSBMultimediaVideo4LinuxsupportisneededforUSBMultimediadeviceUSBNetworkUSBportUSBSerialConvertersupportUSBMiscellaneous<>TexasInstrumentsGraphLinkUSB(akaSilverLink)cable<>USBLCDdeviceUSB支持。如果没有使用USB设备,这部分可以不选。要使用USBUSBMassStoragesupport在系统中使用uname可以获得系统版本信息。比如Redhat9:[root@lipsroot]#uname-r[root@lipsLiPS的系统中,我们也需要确定当前使用的内核版本,通过版本信息来◦/usr/src/linux-2.4/Makefile中的变量EXTRAVERSION面是MakefileVERSION=SUBLEVEL=EXTRAVERSION=-8现在KERNELRELEASE2.4.20-8。这个信息会被编译到内核中,uname工具会从内核文件中提取出版本号。如果将Makefile做一些修改,比如,EXTRAVERSION=-8-2.4.20-8-R2LipsLiPS而编译的一个特定配置的内核,这个内核是以2.4.20-8为基础,R2Lips(Release2Lips)即第二个版本。对Makefile内核配置(makemenuconfig)完成之后,会询问:Doyouwishtosaveyournewkernelconfiguration? <No个隐藏文件,要用ls–a才看的到。.config是个文本文件,内容类似下面:##Loadablemodulesupport#CONFIG_MODVERSIONSisnotsetcp.config~/config-2.4.20-8-根文件系统initrd(初始化RAM盘)的使用方法。根文件系统Linux文件系统的内容应用程序(应用程序大致可以分为3部分,第一是操作系统正常运行所需的基本工具软件,比如bash,cp,rmhttpd,telnetd,proftpd等;第OOEmbutils(http://www.fefe.de/embutils/)其详细使用方法请参考相关资料,此处不再赘述。LIPS的实现目前没有使用这些软设备文件(device设备文件也可以称作设备节点(devicenode)。设备文件非常重要,缺少某些有些设比如硬盘的设备文件,在完整的系统中一般有da,db,……,dt,即最多支持20个IE硬盘,每个硬盘有d1,d2,……,d2,(其中X表示t),即支持个分区,另外还有表示I设备文件描述/dev/console /dev/hda[1-8]IDE/dev/initctl实际是一个FIFO设备,跟init有关(init与原init通/dev/initrdInitialRAM/dev/input(目录)Inputcore(包括游戏杆、鼠标等/dev/kmem]/dev/mem/dev/nullNULL/dev/psauxPS/2/dev/ptmxUNIX98PTY/dev/pts(目录)UNIX98PTY/dev/ptyp[0-7]伪终端主设备(远程登录使用/dev/ramRAMDisk设备。至少/dev/ram0是应用initrd/dev/ram链接到/dev/ram1/dev/random/dev/sda[1-8]SCSI/dev/shm/dev/systty指向系统tty设备的符号链接,一般是tty0/dev/ttyTTY/dev/tty[0-7]虚控制台(Virtual/dev/ttyp[0-7]/dev/ttyS1串口(COM1/dev/urandom脚本和配置文件(scriptsandconfiguration系统和各种应用程序用到的几乎所有的配置文件都位于/etcLinux最麻配置文件描述/etc/default(目录)某个命令(比如useradd)的缺省设置(man/etc/ld.so.cacheldconfig命令根据/etc/ld.so.conf/etc/ld.so.conf库文件路径配置文件,ldconfig命令根据该配置文件生成/etc/fstab文件系统列表(man/etc/group组文件(man/etc/init.d符号链接到/etc/initlog.confInitlog日志配置文件(man/etc/inittabInit配置文件(man/etc/ioctl.save该文件包含了用于单用户模式的串口和终端参数,因为这些参数是由而在单用户模式时没有运行getty,所以用该文件保存参数。单用户模式对系统安全是个威胁,我们应该禁止使用单用户模式,因此这个文件实际并没有必要复制过来。/etc/issue登录信息和标识文件(man/etc/modules.conf模块的配置文件(man/etc/mtab已经挂载的文件系统列表(man/etc/nsswitch.confNameServiceSwitch的配置文件(配置名称服务数据源和查询的顺序(mannss/etc/passwd用户口令文件(man/etc/profile/etc/rc.d/etc/services列出可用的网络服务及其端口(man/etc/termcap终端(terminal)功能数据库(manapache/etc/httpd/conf/httpd.conf库文件(程序用ldd工具来确定的。比如,要知道/bin/bash需要哪些库文件,使用如下命[root@lipsxmdong]#lddlibtermcap.so.2=>/lib/libtermcap.so.2(0x40020000)libdl.so.2=>/lib/libdl.so.2(0x40024000)libc.so.6=>/lib/tls/libc.so.6/lib/ld-linux.so.2=>/lib/ld-linux.so.2对复制到新的根文件系统的每个可执行程序,都要使用这种方法来确定其所需要的库,然后把这些库文件也复制过来。需要注意的是,有些库文件使用/lib/libnss_files*这个库是跟/etc/nsswitch.conf(man必要的目录RAM盘(参考资料(mount)initrd技术主要设计用来让系统启动过程可以分两个阶段进行,首先让内核以一组最小的、被编译进内核里的驱动程序来启动,然后从initrd中加载其他的模块。操作步骤使用initrd引导器加载内核和初始化RAM内核把initrd转到一个一般的RAM盘中,并且释放原来被initrd占用的initrd执行/linuxrc(linuxrc可以是任何可执行文件,包括shell脚本在内;它具有uid0即超级用户的权限,基本可以做init程序中能够做的任何事情);在linuxrclinuxrc使用pivot_root在根文件系统执行通常的引导过程(比如执行initrd程在initrd 运行。另外,挂载在initrd目录下的根文件系统仍然是可用的。引导选项initrd装入指定的文件作为初始化RAM盘。当使用LILO当引导器时,你可以用/etc/lilo.conf文件中INITRD这个配置参数,来指定初始化RAM盘文件。initrd的数据仍会保留,但不会装入到一个RAM盘里,真正使用的根文件系统将会被挂载。initrd/dev/initrd这个设备中被读出来。注意,initrd的数据可以是任注意:/dev/initrd是一个只读并且只能使用一次的设备,最后一个程序一旦关闭它,initrd先被挂载成根目录,接着进行正常的启动过程(这时RAM盘仍被挂载成根)首先:我们要在正常的根文件系统中创建一个容纳initrd#mkdir对目录名称并没有特别的限制,在pivot_root(2)man手册页中有更详细的说明。/initrd在某些情况下initrd(devfs下使用#mknod/dev/initrdb1250#chmod400/dev/initrd第二:支持初始化RAM盘的能力,及所有执行格式和文件系统模块,都必须直接编第三:必须制作一个RAM盘映像文件。大概的步骤是,在一个块设备创建一个文件系统,把需要的文件复制进去,然后把这个块设备的内容输出成一个initrd文件。目前至少有3种设备适合作为这种块设备:O软盘(能拿到任何地方试验,但速度太慢ORAM盘(最快,但浪费内存OLoopback设备(比较合适的解决方案)下面,我们将讨论使用loopback设备创建initrd1)确认lookback设备已经配置到内核里。2)创建一个适当大小的空白文件系统,例如:#ddif=/dev/zeroof=initrdbs=300kcount=1#mke2fs-F-m0#mount-text2-oloopinitrd#mkdir#mknod/mnt/dev/consolec5复制所有可能在initrd环境中用到的文件到/mnt目录中。(别忘了/linuxrc件#chroot/mnt当然这样启用initrd还是有限制的,就是不能干扰正常系统的执行状态(比如重新配置网络接口等等。如果在一个用pivot_root指令转换根目录的执行环境中,就可以做这些#umount这时,初始化RAM盘系统就在“initrd”#gzip-9最后,必须启动内核并载入initrdroot=/dev/ram0init=/linuxrc(只有需要写入initrdrw参数)。使用LOADLIN当引导器时,可以执行:LOADLINC:\LINUX\BZIMAGEinitrd=C:\LINUX\INITRD.GZroot=/dev/ram0init=/linuxrcrwLILO/etc/lilo.confimage=/boot/bzImageinitrd=/boot/initrd.gzappend="root=/dev/ram0init=/linuxrc改变根目录设备在执行完重要任务的尾声,linuxrc一般会执行改变根目录设备的动作,并让所有程OO把initrdO结束所有旧的对initrdO卸载initrd文件系统并释放RAM#mkdir/new-#mount-oro/dev/hda1/new-最终改变根文件系统由pivot_root()系统调用或者pivot_root工具来完成(参考手册页pivot_root(8))。pivot_root可以把当前根文件系统转移到新根的一个目录中,然后把指定的目录当作新的根。在调用pivot_root之前,必须先为旧根准备目录,例如:#cd/new-root#mkdir#pivot_root.#execchroot.what-follows<dev/console>dev/console其中what-follows是新根下面的一个程序,比如/sbin/init。(O在调用pivot_rootO使用“.”(当前目录)作为pivot_root的第一个参数(新根),为旧根指定目录OchrootO然后调用chrootO在execdev/console特别提示:让initrd文件系统的目录结构与新根文件系统的结构一致,有利于转换过这时,initrd可以卸载,RAM#umount#blockdev--flushbufs注意:如果linuxrcchange_root使用场合实现initrd系统可以用一个最小配置的内核从软盘或者其他存储媒体启动,然后载入initrd/linuxrc来决定需要什么来进一步挂载真实的根文件系统(如设备类型、驱动程序等)或者支持发行版媒体(CD-ROM,网络,磁带等);/linuxrc/linuxrc/linuxrc调用pivot_root改变根文件系统,并通过chroot一个程序(继续安装过程引导器被配置成装入initrdInitrd的关键作用是能够多重配置一个正常操作的系统,而不需要用一个庞大淘汰的根转换机制(#echo0x301>/proc/sys/kernel/real-root-系统初始化(参考资料init的任务UNIX的init指的不是一个程序、而是一类程序。Init一般是指系统引导时执行的第一产生init这一个进程,而系统中其他所有进程都是由init负责产生(spawn),主要包括OOO负责清理系统中的“僵尸”进程(init是所有其他进程的祖先O处理系统关机(stop所有进程,unmount文件系统内核并不关心拿什么来作为系统的initOSysVinit(作者:MiquelvanSmoorenburg),或者Osimpleinit(作者:PeterOrbaek),或者O一个shellO不过路径名字必须是/b/t,//t,或b/t(因为已经编译到内核里面了)。定tt。Linux发行版使用的init是SysVinit,也就是SystemVUNIX的实现。其主要思细节请参考手册页inittab(5)整个过程中用到的脚本都放在/etc/rc.dSlackwarevs关于配置文件/etc/inittab和脚本/etc/rc.d的实现和组织主要有两种不同的风格,其有代表性的发行版分别为SlackwareDebian(RedhatDebian)。这两种风格之间有几个例如在/etc/inittab中,定义进入运行级别0时运行的脚本分别为/etc/rc.d/rc.0和/etc/init.d/rc0(Redhat中/etc/init.d是指向/etc/rc.d/init.d0rc的命令行参数)。因此,Slackware风格的/etc/rc.d中应该是一系列相对独立的脚本,对应于配置文件中每个动作的定义(我没有见过Slackware哦)。在我们所熟悉的Redhat中,/etc/rc.d的组织要复杂的多,每个运行级别对应一个子目录/etc/rc.d/rcX.d(X0~6),下面放的是一系列形如SXXfooKXXbar(S表示Start某个服务,K表示Kill某个服务,XX是两位数字,决定了该脚本执行的顺序)的符号链接,指向/etc/rc.d/init.d中的脚本,每个脚本对应一项服务程序。另外,还有两个重要脚本值得一提 (完成系统初始化的各项工作)/etc/rc.d/rc.local在最后执行(DOS读一下/etc/rc.d/rc.sysinit,/etc/rc.d/rc和/etc/rc.d/init.d/Redhat的据说Slackware风格比Debian的速度要快一些。可能是后者的组织结构比较复杂的缘PAM(PluggableAuthenticationModules)是为了解决计算机系统中用户认证的问题而引入的一种实现方案。PAM的目标为:O为这些认证模块建立标准API;O认证机制对其层用户(包括应用程序和最终用户)PAM机制由SUN设计并首先在Solaris2.3 部分实现,后来逐渐在其他UNIX平台实现,包括Linux(其实现称为Linux-PAM)。PAM的结构PAM采用分层的体系结构。最下面是模块层,负责实现具体的认证功能,包括帐户管理(account)、口令鉴别(auth)、口令管理(password)和会话管理(session)4个模应用接口层位于模块层之,调用下层提供的服务,并向(应用程序)隐藏配置文件/etc/pam.d(如果存在这个目录,则忽略/etc/pam.conf5项(Linux-PAM的手册页pam(8)中有更详细的描述servicetypecontrolmodule-pathmodule-Service是服务的名字,比如login,su等。注意,/etc/pam.d目录下面有许多配置文件,分别对应某项系统服务,文件名即等于service,因此每行只有4项。e为coutathaodeon使用多个认证模块,或者说可以将模块“堆叠”使用,但是每一行只能定义一个,因此一Control规定了如何处理模块认证失败或成功,可以是requisite、required、sufficientModule-pathPAM库文件的文件名。缺省路径是/lib/security/服务的规则,就用otherPAM的最简配置为,只有/etc/pam.d/other这一个配置文件,即可处理所有的认证请求。下面是我们用过的一个other[xmdong@lipspam.d]$catother accountrequired passwordrequired sessionrequired 5.3节中,对initrd机制已经有了比较详细的讨论。准确的说,该部分内容来适用。是新版本内核的变化造成的(内核实现与文档不同步),还是2.4版内核的后来我又专门读了2.2版内核中所附带的initrd.txt文件。我感觉实际的情况似乎更接近于这个老文档的描述。我还看到一个有关的patch文件,从该文件中可以明确看到新的UsingtheinitialRAMdiskinitrd) HansLermen> HansLermen-initrdaddsthecapabilitytoloadaRAMdiskbythebootloader.-RAMdiskcanthenbemountedastherootfilesystemandprogramscanbe-runfromit.Afterwards,anewrootfilesystemcanbemounted

-differentdevice.Thepreviousroot(frominitrd)istheneither-tothedirectory/initrdoritis+initrdprovidesthecapabilitytoloadaRAMdiskbytheboot+ThisRAMdiskcanthenbemountedastherootfilesystemand+canberunfromit.Afterwards,anewrootfilesystemcanbe+fromadifferentdevice.Thepreviousroot(frominitrd)isthen+toadirectoryandcanbesubsequently、老文档为initrd.txt-2000和initrd.txt-根到底在哪里在配置使用initrd之前,首先你要清楚,系统正常运行时,根文件系统挂载在什么设备(也就是说,rootdevice是什么——root在哪里?)。我们知道,使用initrd机制的话,系统启动时先以RAMDisk(/dev/ram0)作为根,然后通过某种方法将根转换到“真实的根(real-root-dev)”(之所以说real,是与前面的RAM里临时的根比较而言)initrd,然后切换到一个硬盘分事实,这个根转换不是必须的。我们完全可以就把/dev/ram0作为我们真实的根设备。这时,系统启动之后所有的操作都在RAMDisk中进行。当然这样做也有一个明显的缺点,即无法保存数据。比如对系统配置进行的修改(象IP地址),重新启动之后就丢LiPS目前的做法就是这一种(没有根转换,initrd就是真实的根)。为了在重新启动之后保持配置文件的修改,我们将目录/etc链接到了其他非易失存储器(例如,一个硬盘分区,或者USB盘的分区)。kernel/boot/bzImageroramdisk_size=65536root=/dev/ram0initrd/boot/initrd.imgramdisk_size=65536说明初始RAM64MB,root=/dev/ram0说明根的位置。下面第二个例子来自一台在hda1安装了Redhat9的机子:kernel/boot/vmlinuz-2.4.20-8roroot=/dev/hda1initrd/boot/initrd-2.4.20-8.img很明显,这里root=/dev/hda1指定了真实的根,其启动过程包含根的转换。但是这里没有指定ramdisk_size,因为initrd的缺省大小是4MB,而initrd-2.4.20-8.img比较小,所(root,rootfilesystemrootdevice,自己体会吧。initrd机制的设计中,初始RAM盘只是作为一个过渡性质的根设备,由/linuxrc来Linuxrc的执行是自动的,即内核挂载initrd盘作为根,如果根下面有这个文件(也就是/linuxrc),就执行它。(linuxrc也并不是必不可接下来说说linuxrc的内容。下面的例子是从initrd-2.4.20-8.img[root@lipsinitrd]#catlinuxrcecho"Loadingjbd.omodule"insmod/lib/jbd.oecho"Loadingext3.omodule"insmod/lib/ext3.oechoMounting/procfilesystemmount-tproc/proc/procechoCreatingblockdevicesmkdevices/devechoCreatingrootdevicemkrootdev/dev/rootecho0x0100>/proc/sys/kernel/real-root-devechoMountingrootfilesystemmount-odefaults--ro-text3/dev/root/sysrootpivot_root/sysroot/sysroot/initrdumount该脚本中首先加载了支持et3文件系统所需的模块,然后挂载真实的根文件系统,并进行转换。特别需要注意的是,iuc脚本一般是用ah解释执行的,而不是通常的ahh的详情请看手册页as8ah内置实现了多数在执行iuc这个阶段可能用到的命令,比如out,ptoout;而如果使用ash,象out外部命令”b/ot到td,在td.2-.gbn中只有sod和ahopbe符号链接到so[root@lipsinitrd]#lsbin/insmodmodprobenash5.3.4节描述的方法测试linuxrcmount–oro/dev/hda11/sysrootcd/sysroot第一,nash实现的mount命令语法与我们常用的/bin/mount并不完全兼容;第二,nash根本没有实现cd命令。因此,可以推断initrd.txt-2000中讲linuxrc时所举例子不是用的nash。实际在该文档中根本没有指明用什么shell。再回头仔细看才发现,所有例句都是在rootshell命令提示符“#”后面的,那么它用的是bash之类了。但是令人迷惑的是,同样在该小节中稍后出现如下例句:#execchroot.what-follows<dev/console>dev/console2>&1为什么用exec执行chroot呢?chroot可以在命令行直接用啊。文档中讲到,what-follows可以是/sbin/init。我用nash试了下面这个句子(nash中用exec执行外部命令):execchroot./sbin/init<dev/console>dev/consoleUsage:init开始我还以为后面那一串是个“magicnumber”,后来想以Usage开头应该是讲使用这init(8)手册页,果然要求给一个参数,0~6当然是运行级别啦,试了一个init3也还是不行。尤其搞不明白后面那些个console什么意思。根转换机制:新的?旧的?initrd.txt的两个版本中,分别描述了两种根转换机制,其中2000版中称1996版的内容已经“过时”,不推荐使用。然而事实要麻烦的多,O使用initrd机制,已经准备好了根文件系统映像文件initrd.imgOinitrd.img的所有内容释放到一个硬盘分区/dev/hda11,ext2O在 面增加一个/boot目录,存放bzImage和initrd.img文件O以/dev/ram0作为根启动,然后以某种机制转换到“真实的根”/dev/hda11系统的引导器是GRUB,安装在硬盘MBR,grub.conf位于/dev/hda1(也就是做测试的实际的根文件系统)。按照述环境配置,在grub.conf中增加如下内容:titlelips rootkernel/boot/bzImageroroot=/dev/hda11ramdisk_size=65536initrd/boot/initrd.img第一,如果没有/linuxrc会怎么样呢?结果是系统能够成功启动到以/dev/hda11作为根,并且把initrd(也就是旧根文件系统)的内容移到了/initrd目录。这是符合initrd.txt-1996文档中第一段的描述的。所以只要你使用了initrd,指定了新的根,并且准备好了/initrd目录(已经在/dev/hda11创建了/initrd),内核可以自动完成根的转换工作。终端面有如Tryingtomoveoldrootto 这里有个小问题,即最后/initrd没有卸载,这意味着initrd所分配内存也没有释放。因此umount/initrd不是内核自动完成的,而应该在/linuxrc中的某个位置进行。如果linuxrc仅包含卸载/initrd的命令,如下:umount/initrd则执行情况是这样的:umount命令报错(返回错误码22),然后出现前面所示Trying…linuxrc如果没有/initrd目录会怎样?我们把 面的/initrd目录删除,重新启(没有/linuxrc),结果是可以启动到以/dev/hda11为根,且看不到原来的initrd。该过程中Tryingtomoveoldrootto UnmoutingoldTryingtofreeramdisk 第二,pivot_root可以用,但是chroot在nash中不能用cd命令造成的困惑(这个问题前面已经说明)pivot_root基本是成功的。/linuxrc脚本的主要内容如下:mount-odefaults--ro-text2/dev/hda11/sysrootpivot_root/sysroot/sysroot/initrdVFS:Cannotopenrootdevice“hda11”or03:0bPleaseappendacorrect“root=”bootoptionKernelpanic:VFS:Unabletomountrootfson如果按照initrd.txt-2000的指导,pivot_root之后应该执行chroot,但是我始终没有办法使chroot成功执行(有关情况前面已经说明)。不过可以肯定的是,pivot_root执行成initrd.txt的新版本中最后一节专门指出,向/proc/sys/kernel/real-root-ev文件中echo数字的方法(change_root机制)是过时的。然而令人迷惑的是,Redhat9的缺省安装产生的initrd-2.4.20-8.img中(前面已经列出了其/linuxrc文件内容),同时使用了pivot_root和change_root机制。测试下列/linuxrc脚本,系统可以启动到/dev/hda11,但是/initrd没有卸载。如果在脚本末尾umount/initrd,会返回错误码16。mount-tproc/proc/procmkrootdev/dev/rootecho0x0100>/proc/sys/kernel/real-root-dev#echo0x030b>/proc/sys/kernel/real-root-devmount-odefaults--ro-text2/dev/hda11/sysrootpivot_root/sysroot/sysroot/initrdumountreal-root-devreal-root-dev的值是什么东西的正式文档,根据情况判断的话,如果述判断准确的话,那么写入0100就表示/dev/ram0。这就奇怪了,“真实的根设备”应该是/dev/hda11030b030b同样会导致Kernelpanic:VFS:Unabletomountrootfson文件系统目录层次结构根文件系统的目录结构最好符合FilesystemHierarchyStandard(文件系统层次标顺便说一下,象这种情况:/bin,/sbin,usr/binusr/sbin4个目录都可以放应用程序,用程序放在/bin,只能给超级用户root访问的关键应用程序放在/sbin,相比之下比较次要的应用程序和root应用程序分别放在/usr/bin和/usr/sbin。mklips.sh(LiPS的脚本)复制文件的工作全部可以手工进行,但是做一个shell脚本来完成所有工作显然是一在我们的项目中,制作LiPS(也就是完成裁减Linux)的工作,除了编译内核之外,都可以通过mklips.sh脚本完成。lips.conf(LiPS配置文件)lips.confLiPS的配置文件,由mklips.shLiPS系通过一系列的INCLUDE_?=yes或者no,可以实现LIPS的模块化。在mklips.sh脚本中,判断每个INCLUDE的值,来确定是否复制某个模块相关的文件。cp复制文件请使用“cp–dpR”命令,可以保留文件的属性(特别是对于设备节点和符号如何判断一个程序依赖哪些文件重要依据。我们以安装ApacheServer为例来说明判断复制哪些文件的过程。首先确定其可执行文件是/usr/sbin/httpd。然后看httpd[root@lipslips]#manhttpdhttpd-Apachehypertexttransferprotocol…………(略February们就知道了httpd要在目标系统中运行,这几个配置文件是必不可少的。把httpd和用ldd找出的库文件以及述配置文件复制到目标系统,运行httpd试一下,httpd比较特殊,除了ldd找出的库文件外,查看日志中的信息,/var/log/messages或者应用程序日志),httpd报告缺少什么;还可以看看相关的配置文件httpd.conf,也能找到有用的信息。然后我们发现需要/usr/lib/httpd带库文件复制——在复制可执行文件(软件)的过程中,如果没有正确复制相关的库文件,该软件肯定不能在目标系统中正常运行。而通过d命令手工确定每个软件的库文件,是一个繁琐应的库文件是否需要删除呢?如果删除了,而该库文件是其他软件也需要的,会导致其()#BINBINPATH:可执行文件的目标路径(复制到哪里)#LIBPATH:相关库文件的目标路径run()shell命令,并在遇到错误时报错、写错#首先复制BINrun"$CP$BIN使用ldd找出与BIN相关的库文件,把lddLDDSTRLDDSTR=`ldd$BIN`forSTRin$LDDSTR;do#判断出库文件路径LIB=`echo$STR|grep"/lib/"`if[-z"$LIB"];then复制LIBLIBPATH,除非要复制的库文件在目标路径中已经存在LIBNAME=`basename$LIB`run"$CP$LIB$LIBPATH"run"cp$LIB}

库文件的命名(参考资料[9]6.2节我们这里所说的“库”都是指的GNUCLibraryglibc。在/lib下面可以看到很多库文件,主要分为4类:O实际的共享库(Actualshared文件名格式为libLIBRARY_NAME-GLIBC_VERSION.soLIBRARY_NAME是库的真正名称,GLIBC_VERSION是glibcglibc2.2.3math(数学)库的文O主修订版本符号链接(Majorrevisionversionsymbolic库的主修订版本号与glibc版本号不同。比如,glibc2.2.3的C共享库libc-2.2.3的6,libdl-2.2.32O版本无关的符号链接(Version-independentsymboliclinkstothemajorrevisionversionsymboliclinks)链接到libm.so.6,libm.so.6又链接到libm-2.2.3.so。唯一的例外是libc.so,是个脚本。连接O静态库文件(Staticlibrary这些库是应用程序静态连接用的。格式为引导引导过程概述几种引导方式grub引导器制作引导盘之前,最好先了解一下grub引导器。Grub是一个通用的多引导加载软件,与较早期多数Linux本文档不是grub的教学文档,所以有关grub的详细用法,请参考其他有关文档。这O引导盘的文件系统可以是ext2,ext3,msdosFAT),vfatFAT32)Ogrub表示硬盘、分区的方式与Linux的方式不同。Linux系统的IDE硬盘表示为/dev/hd{a,b,c,d},SCSI设备表示为/dev/sd{a,b,c,d,…}1开始编号,比如PrimaryMasterIDE硬盘的第二个分区是/dev/hda2;而grub的硬盘(包括IDESCSI)0开始编号,分区也是从0开始编号,比如系统中的第一个硬盘是(hd0),其第一个分区是O在grub的提示符下面输入命令和参数时,按TABUSB使用USBIDE接口,携制作步骤创建文件系统首先,必须在USB盘面创建文件系统(也就是格式化)。你几乎可以使用grub支持的所有文件系统,包括常见的各种文件系统,比如ext2,ext3,FAT,FAT32等。但是根O最好不要使用FATmsdos,因为FAT的文件名有“8.3”的限制,所以象“grub.conf”这OFAT和FAT32都不能表示符号链接文件,虽然有变通的方法,即将文件再复制一份。顺便说一下在Linux下面怎么访问USB盘。如果系统中没有其他的SCSI设备,那么插在USB1接口面的USB/dev/sda,其分区为/dev/sda1。依此类推。一般插入USB盘后,窗口中会出现驱动#mke2fs#mount–text2/dev/sda1注意:Redhat7.3Intel845复制文件按照下面的列表,复制文件(包括目录结构)USB/boot/bzImage或者vmlinuzmenu.lst符号链接安装grubUSBIDE硬盘,这时USB盘是grub看到grub>root(hd1,0)grub>setuproot命令告诉grub,内核文件所在的位置。Setup命令安装grub到hd1的引导扇区,如果是setup(hd1,0),则安装到第一个分区(即/dev/sda1)。USB在用新制作的USB引导盘引导之前,还需要确认BIOS的一个设置,即第一个启动OK,插USB版本问题?我们的项目开始的时候用Redhat7.3,但是后来做USB引导盘时发现,我们的环境不支持USB盘。我想Redhat7.3应该是支持USB7.1下面就用过。那么有可能是主板的问题,i845的芯片组比Redhat7.3要新,也许是没有该芯片组的正确驱后来在Redhat0Linux内核即可正常支持USB盘。然而还有一个问题,Redhat7.3GRUB版本是0.91,在使用中发现,制作USB引导盘没有问题,但是一旦你改变USB盘的文件(比如复制一个新的文件去),本来可以引导的USB盘就不行了。Redhat9.0使用的是GRUB0.93,就没有述问题,并且使用USB盘也没有问题。也就是说,使用Redhat9就可以了。不过Redhat9集成的其他很多软件也有变化,比如Apache升级到了2.0版本,以前的httpd.conf配置文件要修改过之后才能正常使用;另外quota接口也有变化。远程串口控制台配置方法Linux远程串口控制台指南(这是我以前写的一份简单的文档,曾经贴到网,附在这里供参考Linuxdot<anonymou@163.com>Dec27,200222年圣诞节期间,我在Rdatnx.0(eel..-2)平台配置了远程串口首先参考"Linux-Remote-Serial-Console-HOWTO",该文档已经足够详尽,按要求一Redhat7.27.0有些差异,不过问题不开始我并没有在意这个问题,我手头有一根以前做的直连电缆,是只用了3根线的那种(23交叉,5对接)HOWTO文档中讲电

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论