当前位置: 首页 > 科技观察

私人定制:为自己打造一个Linux小系统

时间:2023-03-20 22:49:37 科技观察

一、前言Linux操作系统自1991年10月5日诞生以来,就因其开源、自由而受到众多技术达人的青睐。它贡献了自己的力量,无论是在Linux内核还是开源软件上,都为我们后人提供了良好的学习和研究环境。作为一名Linuxer,感谢前辈们给我们提供了一个自由的空间,让我们在学习的同时也可以学习Linux。本文主要通过对现有的Linux系统进行剪裁,搭建一个属于自己的小型Linux系统,使其能够加载网卡驱动,配置IP地址,实现网络功能。二、原理启动过程介绍:在制作Linux小系统之前,我们有必要先了解一下Linux的启动过程:1、首先,Linux必须通过POST自检,检查硬件设备是否正常。故障。2、如果有多个启动盘,需要在BIOS中选择启动盘3、启动MBR中的bootloader引导程序4、加载内核文件5、执行所有进程的父进程,祖先init6,打印欢迎界面在Linux的启动过程中,还需要加载内核文件借助另外两个文件:1)initrd,这是CentOS5上内存模拟的磁盘设备2)initramfs,这是一个文件CentOS6上内存模拟的系统。在启动的过程中,init主要用来进行哪些操作呢?init调用配置文件/etc/inittab,然后执行/etc/rc.d/rc.sysinit的系统初始化脚本,激发Linux打印欢迎界面,表示系统启动成功。如果我们要做一个Linux的小系统,只需要将启动过程中用到的所有文件一起加载,就可以点亮自己的系统了,而且Linux是一个模块化的操作系统,很多多功能组件通过模块传递。由专门的工具实现,支持动态加载和卸载。如果我们要实现某个功能,只需要加载相应的模块,就可以实现我们的Linux操作系统。三、操作步骤1、在宿主机上为目标磁盘分区挂载一块新磁盘,命名为soft-Linux。这个磁盘是宿主机上的第二个磁盘,所以这里是/dev/sdb,然后挂载到目标主机上,因为那里只有一个磁盘,所以目标主机上的名字应该是/dev/sda,不能混淆。首先,我们需要将目标磁盘分成两个区域并进行格式化。第一个分区500M,用于安装引导程序;第二个分区为10G,用于安装根文件系统。然后进行挂载操作,将/dev/sdb1挂载到/mnt/boot,将/dev/sdb2挂载到/mnt/sysroot。[root@nmshuishui~]#mount/dev/sdb1/mnt/bootmount:mountpoint/mnt/bootdoesnotexist[root@nmshuishui~]#mkdir-p/mnt/boot/mnt/sysroot[root@nmshuishui~]#mount/dev/sdb1/mnt/boot[root@nmshuishui~]#mount/dev/sdb2/mnt/sysroot/[root@nmshuishui~]#2.将grub安装到目标磁盘。一旦系统可以启动,它就需要被引导,所以我们首先需要在我们的新磁盘上安装一个grub引导加载程序。安装grubbootloader主要有两个命令,一个是grub-install,另一个是setup。这里最好使用grub-install来安装。因为:①grub-install会安装grub第二阶段引导的文件②setup不会安装第二阶段引导程序,是将引导信息安装到MBR中。第二个要注意的是--root-directory=后面的路径应该是boot目录所在的地方,而不是/mnt/boot,因为boot目录在mnt下;目标磁盘是/dev/sdb[root@nmshuishui~]#grub-install--root-directory=/mnt/dev/sdbProbingdevicestoguessBIOSdrives.Thismaytakealongtime.Installationfinished.Noerrorreported.Thisisthecontentsofthedevicemap/mnt/boot/grub/device.map.Checkifthisiscorrectornot.Ifanyofthelinesisincorrect,fixitandre-runthescript`grub-install'.(fd0)/dev/fd0(hd0)/dev/sda(hd1)dev/sdb[root@nmshuishui~]#cd/mnt/boot/[root@nmshuishuiboot]#lsgrublost+found[root@nmshuishuiboot]#cdgrub/[root@nmshuishuigrub]#lsdevice.mape2fs_stage1_5fat_stage1_5ffs_stage1_5iso9660_stage1_5jfs_stage1_5minix_stage1_5reiserfs_stage1_5stage1stage2ufs2_stage1_5vstafs_stage1_5xfs_stage1_5[root@nmshuishuigrub]#安装完Aftergrub,enterthegrubdirectory,youwillfindthatthereisnogrub.confconfigurationfile,这样会导致我们的boot程序不能正常运行,所以我们需要手动在里面写一个配置文件,但是这个需要知道内核的版本等等,弄完内核版本再回来添加这个步。3、复制内核文件和initrd文件init是用来生成系统中所有其他进程的程序。它作为守护进程存在,它的进程号为1,而init是所有进程的父进程,祖先,所以不移植是不可能的。它调用配置文件/etc/inittab,然后执行/etc/rc.d/rc.sysinit的系统初始化脚本。将内核文件和initrd文件拷贝到/dev/sdb下的boot目录下。[root@nmshuishuigrub]#cp/boot/vmlinuz-2.6.32-358.el6.x86_64/mnt/boot/vmlinuz-soft[root@nmshuishuigrub]#cp/boot/initramfs-2.6.32-358.el6.x86_64.img/mnt/boot/initramfs-soft.img[root@nmshuishuigrub]#4、创建目标主机根文件系统①使用命令展开创建文件系统[root@nmshuiishuisysroot]#mkdir/etcm/s/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}mkdir:createddirectory`/mnt/sysroot/etc'mkdir:createddirectory`/mnt/sysroot/etc/rc.d'mkdir:createddirectory`/mnt/sysroot/usr'mkdir:createddirectory`/mnt/sysroot/var'mkdir:createddirectory`/mnt/sysroot/proc'mkdir:createddirectory`/mnt/sysroot/sys'mkdir:createddirectory`/mnt/sysroot/dev'mkdir:createddirectory`/mnt/sysroot/lib'mkdir:createddirectory`/mnt/sysroot/lib64'mkdir:createddirectory`/mnt/sysroot/bin'mkdir:createddirectory`/mnt/sysroot/sbin'mkdir:createddirectory`/mnt/sysroot/boot'mkdir:createddirectory`/mnt/sysroot/srv'mkdir:createddirectory`/mnt/sysroot/mnt'mkdir:createddirectory`/mnt/系统根/媒体'mkdir:createddirectory`/mnt/sysroot/home'mkdir:createddirectory`/mnt/sysroot/root'[root@nmshuishuisysroot]#lsbinbootdevetchomeliblib64lost+foundmediamntprocrootsbinsrvsysusrvar[root@nmshuishuisysroot]#②移动bash命令文件到其他仓库root@nmshuishuimnt]#sh~/scripts/cporder.shEnteracommand:bashEnteracommand:shutdownEnteracommand:rebootEnteracommand:vimEnteracommand:touchEnteracommand:mkdirEnteracommand:rmEnteracommand:lsEnteracommand:catEnteracommand:lessEnteracommand:ifconfigEnteracommand:ipEnteracommand:routeEnteracommand:quitquit[root@nmshuishuimnt]#sync[root@nmshuishuimnt]#sync[root@nmshuishuimnt]#lsbootsysroot[root@nmshuishuimnt]#cdsysroot/[root@nmshuishuisysroot]#lsbinlib64sbinusr[root@nmshuishuisysroot]#cdbin/[root@nmshuishuibin]#lsbashcatlsmkdirrmtouch[root@binms]svbashsh`sh'->`bash'[root@nmshuiishuibin]#sync[root@nmshuishuibin]#附:指令移动植脚本#!/bin/bash#target=/mnt/sysrootclearCmd(){ifwhich$cmd&>/dev/空;然后cmdPath=`which--skip-alias$cmd`elseecho"Nosuchcommand"返回5fi}cmdCopy(){cmdDir=`dirname$1`[-d${target}${cmdDir}]||mkdir-p${target}${cmdDir}[-f${target}${1}]||cp$1${target}${cmdDir}}libCopy(){forlibin`ldd$1|grep-o"/[^[:space:]]\{1,\}"`;dolibDir=`dirname$lib`[-d${target}${libDir}]||mkdir-p${target}${libDir}[-f${target}${lib}]||cp$lib${target}${libDir}done}whiletrue;doread-p"Enteracommand:"cmdif["$cmd"=='quit'];thenecho"quit"exit0ficlearCmd$cmd[$?-eq5]&&continuecmdCopy$cmdPathlibCopy$cmdPathdone5.为grub提供配置文件移植内核后和initrd文件,我们可以根据内核版本和initrd版本编写grub.conf配置文件:[root@nmshuishuigrub]#vimgrub.confdefault=0timeout=5titlemshuishuisoft-Linuxroot(hd0,0)kernel/vmlinuz-softroroot=/dev/sda2quietselinux=0init=/bin/bashinitrd/initramfs-soft.img~quiet是静默安装,安装时不再显示很多信息,后面将selinux关掉,init需要使用/bin/bash,告诉内核不再寻找init程序。如果不指定这一步,启动过程中会报内核恐慌(kernelpanic),认为系统是唯一的,没有init进程,恐慌不会起作用。6.开始测试7.特别提醒,如果在vmvare上做这个实验,创建新虚拟机时一定要选择“Storevirtualdiskasasinglefile”,否则也会出现kernelpanic.四、加载模块实现网络功能1、查看宿主机网卡模块信息[root@nmshuiishuinet]#lsmod|grepe1000e10001706460[root@nmshuiishuinet]#2、查看网卡详细信息[root@nmshuishuinet]#modinfoe1000filename:/lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/e1000/e1000.koversion:7.3.21-k8-NAPIlicense:GPLdescription:Intel(R)PRO/1000NetworkDriver作者:IntelCorporation,srcversion:1D4F1E82BB99EA36D320B1Balias:pci:v00008086d00002E6Esv*sd*bc*sc*i*alias:pci:v00008086d000010B5sv*sd*bc*sc*i*alias:pci:v00008086d9sbalivc00*0scid9:v00008086d0000108Asv*sd*bc*sc*i*alias:pci:v00008086d0000107Csv*sd*bc*sc*i*这里找到网卡模块的路径,复制到/dev/sdb库文件中:[root@nmshuiishuinet]#mkdir-pv/mnt/sysroot/lib64/modulesmkdir:createddirectory`/mnt/sysroot/lib64/modules'[root@nmshuishuinet]#cp/lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/净/e1000/e1000.ko/mnt/sysroot/lib64/modules/e1000.ko3。虽然现在init程序是从module里copy过来的,但是还是不能用,不符合我们现在的进程需求,因为连最小的init程序都没有,如果我们要这个init,有两个选择,***,移植宿主系统,但是格式会比较复杂;所以我们先自己写脚本,把脚本作为init,可以让小系统运行起来。init一般在sbin目录下,所以我们需要在/dev/sdb2分区写脚本。初始化脚本。[root@nmshuishui~]#cd/mnt/sysroot/sbin/[root@nmshuishuisbin]#viminit#!/bin/bash#printWelcomeinfoecho-e"Welcometo\033[34mnmshuishuisoft-Linux\033[0m"#mountweiwenjiansystemwhenthesystemisrunning.mount-n-tprocproc/procmount-n-tsysfssysfs/sys#mountethernetdriverautlwhenthesystemisstart.insmod/lib64/modules/e1000.ko[$?-eq0]&&echo-e"Loade1000modulesucceeded[\033[32m0K\033[0m]"ifconfiglo172.0.0.1/8ifconfigeth0172.16.251.235/16#mountthe/dev/sda2tomakeitcanbewriteandread.mount-n-oremount,rw/dev/sda2/#run/bin/bash/bin/bash写完这个init脚本后,我们需要给它一个允许其执行的执行权限;mount、insmod等命令也在这个脚本中用到了,所以我们需要使用之前的脚本来移植这些命令。***还需要把/mnt/boot/grub/grub.conf中的init=/bin/bash替换成init=/sbin/init,因为我现在要用这个init脚本来执行系统启动,我永远不需要用/bin/bash代替。4、一个实现网络功能的Linux小系统完成以上步骤后,就可以在另一台主机上挂/dev/sdb来体验我们的私人定制小系统了。