第六十八讲——手动攒linux系统 本文共有35389个字,关键词: 当我们自己攒一个系统的时候,我们需要拿一块硬盘,先对其分区,boot应单独分区,避免空间使用殆尽操作系统无法启动,在分区上应有根目录,且要有/boot目录(挂载点的名称),分区好之后将分区挂载到对应的目录。 根目录下应有: /sbin、/bin、/etc、/var、/tmp、proc、/sys、/dev、/lib、/usr、/home 在目录建立好之后,我们应对硬盘安装grub引导程序,用于引导操作系统、 安装grub:grub-install –root-directory=/tmp /dev/sd# 我们把init程序及其依赖的库文件拷贝到对应目录。 将/boot/vmlinuz...cp到挂载点为*/boot的目录下,接下来生成initrd脚本。 对于rhel5来说,生成initrd的命令为mkinitrd 对于rhel6来说,生成initrd的命令为dracut,当然,也是支持mkinitrd命令的。 #mkinitrd initrd文件路径 #mkinitrd /boot/initrd-`uname -r`.img`uname -r`为当前系统创建initrd文件,uname –r调用的是当前系统的内核版本。我们需要注意的是,此命令不能对我们新的内核创建 initrd文件,所以我们需要将/boot/目录下的initrd-*.img文件展开进行修改,而后再组装起来,我们先拷贝一份initrd文件。 此init文件是一个压缩格式的文件,在拷贝时注意添加上.gz的后缀,使得解压缩时程序能够识别,我们可以使用file命令查看initrd文件的类型,可以看到是gzip格式的文件。 我们使用gzip –d将initrd文件进行解压缩,再次使用file命令查看initrd文件,会发现这是一个cpio类型的文件,这是一个比较古老的归档格式,我们还需要对其进行展开,为了避免展开后产生小文件,我们应当在目录中进行展开。在展开cpio类型的文件时,我们使用的是cpio命令。 cpio –id -i 进入copy-in模式,也就是解压缩模式 -d 在需要的地方创建开始目录。 在展开之后我们会发现有很多的目录,和根目录下的目录结构相似,简直就是一个linux操作系统,在对initrd文件进行操作的时候我们可以简化操作: zcat /boot/initrd-*.img |cpio –id 不解压缩查看压缩包的内容,并将其送给cpio命令,此命令只能解压到当前目录下。 我们需要编辑init文件(nash脚本),rhel5中init页末有指定根的位置,在修改完之后我们还需要对文件进行归档(cpio归档),依旧是在当前目录下对所有的文件进行归档: find . |cpio –H newc –quiet –o |gzip -9>/tmp/boot/initrd.gz -H newc 指定类型 --quiet 静默模式 -o 归档 gzip -9指定压缩比 并定向到指定目录下。 在sysroot挂载点目录下创建必要的目录(根目录下的文件) cd /path/to/somewhere mkdir –p /sbin /bin /lib /proc /sys /usr/{sbin,bin}/var/log /etc/rc.d /boot /dev /tmp 在创建完目录后,我们将常用的程序以及依赖的库文件cp到对应的目录下。 我们使用ldd查看对应程序所依赖的库文件,并将这些文件cp到lib目录下。 在正常的操作系统下有/etc/inittab文件,因此我们需要手动创建并写入几句: id:3:initdefault 设置默认的启动级别 我们可以将需要开机启动的脚本或者程序写入rc.local中,因为rc.local是最后启动的一个脚本。 我们在拷贝一个命令的时候,如果不知道命令的位置在哪里,我们可以使用which命令 #which COMMAND 查看命令的位置 #ldd COMMAND 查看命令所依赖的库文件。 bash的特性: 在刚才我们在mkdir命令中使用到了花括号展开{},这是bash的特性,其实bash的特性还有很多。为了使应用程序及其所依赖的库文件能够快速复制,我们应当写成脚本的形式,为了更方便的操作,我们需要介绍一下一个bash特性,距离来说明。 FILE=/etc/rc.d/rc/local echo ${FILE#/} 输出的结果为etc/rc.d/rc.local #号后为指定的关键字,关键字左边的内容会被统统去除。 echo ${FILE##*/} 输出的结果为rc.local ##*表示最后一次关键词左边的内容全部去除,包括关键字本身。 “#”以指定的字符为分隔符,从左向右第一次匹配到的字符串内容去除。只保留第一次匹配之后的字符串。 这个方法常用来取出一个文件的名称,我们还可以使用一种方法来提取一个文件的目录 %:从右向左去除关键字后的内容。 FILE=/tmp/1/2/3/4/5 echo ${FILE%/*} 输出结果为/etc/rc.d 即取得了一个文件的目录。 echo ${FILE%%/*}输出结果为空行,%%为最后一次匹配。 “%”以指定的字符为分隔符,而后从右往左第一次匹配到的字符串内容移除,只保留第一次匹配之前的字符串 为了实现手动攒系统的目的,我们还需要继续弄清楚系统的启动流程: POST加电自检,将ROM中的程序映射到内存中,以实现硬件的检 -->BIOS(boot sequence)引导程序,根据BIOS启动顺序去找到对应存储设备上的MBR,MBR存在则寻找MBR中的boot loader,boot loader中配置了所需要引导的操作系统的位置,当boot loader载入内存时,BIOS会将系统的控制权限移交给boot loader,boot loader会依靠配置寻找操作系统的内核(根据用户的选择),将内核装载进内存并解压缩,内核完成初始化后将权限移交内核。 -->kernel(initrd,initramfs) 内核初始化完成的工作: 一是硬件探测 二是装在驱动,借助initrd或者initramfs过渡到根 三是挂载根文件系统(rootfs) 四是启动用户空间中的第一个进程init initrd或者initramfs可以实现将真正的根文件系统同内核连接起来 -->执行init,配置文件为/etc/inittab,在红帽6上init不再是传统意义上的init,而是一个被称为upstart的程序,为了兼容还是命名为init upstart的配置文件为/etc/inittab、/etc/init/*.conf init完成的工作主要取决于/etc/inittab文件 一是设定默认的运行级别 二是系统初始化的脚本rc.sysinit 三是启动指定级别的服务脚本 /etc/rc.d/init.d/* 使用ln –s链接到/etc/rc.d/rc#.d,即0-6各级别下,链接文件以K/S开头 四是启动虚拟终端,如果运行级别为init5,还需要启动图形终端 以上就是init的工作 -->执行/etc/rc.d/rc.sysinit(系统初始化脚本),系统初始化完成的任务,我们再次强调,内核在装载根文件系统时为了避免根文件系统的损坏,是以只读方式挂载的。 第一步此脚本会检测并且以读写的方式重新挂载根文件系统 第二步是设置主机名 第三步是挂载文件系统,需要挂载的文件系统定义在/etc/fstab配置文件中,以实现开机自动挂载 第四部启用swap分区 第五步可能需要装载外围硬件设备驱动,内核的初始化只加载最核心的设备驱动(CPU内存等),网卡、显卡等设备都是在init的执行过程中完成驱动的。 第六步根据/etc/sysctl.conf设定内核参数 第七部激活udev、SElinux 第八步激活lvm、RAID设备 第九步清理过期的锁文件和PID文件 第十步装载键映射(键盘上的每一个键的具体功能) 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 几人行 (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 给自己讲linux 2017-02-06 评论 1636 次浏览