制作initrd.img

只是缺失libtinfo.so.5.9libncurses.so.5.9

[root@localhost sandisk]# ldd opt/MegaRAID/MegaCli/MegaCli64
	linux-vdso.so.1 (0x00007fff23c9c000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f27d5dda000)
	libncurses.so.5 => /lib64/libncurses.so.5 (0x00007f27d5bb4000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f27d59b0000)
	libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f27d561b000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f27d5299000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f27d5081000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f27d4cbe000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f27d5ffa000)
	libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f27d4a93000)
[root@localhost lib64]# cd /lib64
[root@localhost lib64]# cp -ar /lib64/libncurses.so.5 .
[root@localhost lib64]# cp -ar /lib64/libtinfo.so.5 .
[root@localhost lib64]# cd ../
[root@localhost sandisk]# cd usr/lib64/
[root@localhost lib64]# cp -ar /usr/lib64/libncurses.so.5.9 .
[root@localhost lib64]# cp -ar /usr/lib64/libtinfo.so.5.9 .
[root@localhost lib64]# ll libtinfo.so.5
[root@localhost lib64]# ll libncurses.so.5

在这里插入图片描述

//脚本
cd /lib64
cp -ar  /lib64/libtinfo.so.5.9 .
ln -s  libtinfo.so.5.9 libtinfo.so.5
cp -ar /lib64/libncurses.so.5.9 .
ln -s libncurses.so.5.9 libncurses.so.5

二、什么是initrd

1.initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在 linux内核启动前, boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。在 bootloader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行 initrd 文件系统中的"某个文件",完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init 进程。这里提到的"某个文件",Linux2.6 内核会同以前版本内核的不 同,所以这里暂时使用了"某个文件"这个称呼。第一阶段启动的目的是为第二阶段的启动扫清一切障爱,最主要的是加载根文件系统存储介质的驱动模块。我们知道根文件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核会多么庞大、臃肿。initrd分为两种,2.4内核及以前的版本中的initrd.img的文件需要先用zip方式解压得到 initrd文件。这里获得到的initrd文件已经是个标准的image文件了(这个文件我们称为image-initrd),在linux下需要进行挂载,然后可以直接访问。2.5内核及其以后的版本中的initrd.img文件(这里称为cpio-initrd), initrd.img 是个gz压缩文件,initrd.img改名为initrd.gz能用windows下的winrar或linux下的gunzip解压,解压后会得到一个initrd文件。这个文件就是cpio格式的文件,只能在linux下用cpio命令解压,执行cpio -i < initrd
initrd stands for Initial RAM Disk.
initrd is used by kernel as temporary root file system until kernel is booted and the real root file system is mounted. It also contains necessary drivers compiled inside, which helps it to access the hard drive partitions, and other hardware.

lzma下载按装包

wget http://mirror.centos.org/centos/8/PowerTools/x86_64/os/Packages/xz-lzma-compat-5.2.4-3.el8.x86_64.rpm

使用方式rpm -ivh ***.rpm

//解压缩
xz -dc initrd.img | cpio -id
cpio -idmv < ../xxxxxxxxxxxxxxx.rootfs.cpio


//打包方式1
bash# find . | cpio -c -o > ../initrd.img
bash# gzip ../initrd.img

//打包方式2
find . |cpio -o   -H newc > initrd
lzma initrd  initrd.lzma
mv initrd.lzma initrd.img

//打包方式3
find . | cpio --quiet -H newc -o | gzip -9 -n > /data/boot/initrd.img

//打包方法4
find . | cpio -o -H newc | xz -z --format=lzma > ../initramfs.cpio.xz

而传统initrd的制作过程比较繁琐,需要如下六个步骤

#假设当前目录位于准备好的initrd文件系统的根目录下
bash# dd if=/dev/zero of=../initrd.img bs=512k count=5
bash# mkfs.ext2 -F -m0 ../initrd.img
bash# mount -t ext2 -o loop ../initrd.img  /mnt
bash# cp -r  * /mnt
bash# umount /mnt
bash# gzip -9 ../initrd.img
mount --bind /proc /mnt/sysimage/proc
mount --bind /dev /mnt/sysimage/dev
mount --bind /sys /mnt/sysimage/sys
chroot /mnt/sysimage

如何制作initrd.img文件

2013年08月25日 ⁄ 综合 ⁄ 共 423字 ⁄ 字号 小 中 大 ⁄ 评论关闭
initrd.img文件是redhat,mandrake等linux发布使用的内存镜像文件。镜像中是一个微型系统。在安装系统时,将initrd.img展开到内存中。并运行rc安装脚本。另外现在比较流行的Live CD,也可以使用initrd.img的方法来实现。
了解initrd.img文件的制作和修改方法,可以用来制作自己的安装光盘和LIVE CD系统。
一,解开initrd.img

gzip –cd /root/isolinux/isolinux/initrd.img>/tmp/initrd.ext2
mount –o loop /tmp/initrd.ext2  /mnt/
//\/mnt/目录下就是initrd.img中的微型系统

二,生成initrd.img

umount /mnt/
gzip –c9 /tmp/initrd.ext2>/root/isolinux/isolinux/initrd.img

问题记录

no method given for cmdline mode aborting looking for installation images

将两个目录bind起来 ,会发现inode号全部变成 之前 /test1 的inode号了,所以
mount --bind命令是将前一个目录挂载到后一个目录上,所有对后一个目录的访问其实都是对前一个目录的访问
看起来,mount --bind命令和硬连接很像,都是连接到同一个inode上面,只不过hard link无法连接目录,而mount --bind命令弥补了这个缺陷,所以很多人将这个命令理解为针对目录的硬连接
但这种想法是错的!
因为这两者的系统执行原理是不一样的。
当mount --bind命令执行后,Linux将会把被挂载目录的目录项(也就是该目录文件的block,记录了下级目录的信息)屏蔽,在本例里就是 /test2 的下级路径被隐藏起来了(注意,只是隐藏不是删除,数据都没有改变,只是访问不到了)
同时,内核将挂载目录(本例里是 /test1)的目录项记录在内存里的一个s_root对象里
在mount命令执行时,VFS会创建一个vfsmount对象,这个对象里包含了整个文件系统所有的mount信息,其中也会包括本次mount中的信息,这个对象是一个HASH值对应表(HASH值通过对路径字符串的计算得来),表里就有 /test1 到 /test2 两个目录的HASH值对应关系
命令执行完后,当访问 /test2下的文件时,系统会告知 /test2 的目录项被屏蔽掉了,自动转到内存里找VFS,通过vfsmount了解到 /test2 和 /test1 的对应关系,从而读取到 /test1 的inode,这样在 /test2 下读到的全是 /test1 目录下的文件
由上述过程可知,mount --bind 和硬连接的重要区别有:
1.mount --bind连接的两个目录的inode号码并不一样,只是被挂载目录的block被屏蔽掉,inode被重定向到挂载目录的inode(被挂载目录的inode和block依然没变)
2.两个目录的对应关系存在于内存里,一旦重启挂载关系就不存在了


# 参考
[Linux initrd.img的加载机制](https://blog.csdn.net/computertechnology/article/details/16825865)
[Creating a New Initial RAM Disk](https://wiki.centos.org/TipsAndTricks/CreateNewInitrd)
[Certified Linux Administrator Linux booting, init and rc scripts](https://www.vskills.in/certification/certified-linux-administrator-linux-booting-init-and-rc-scripts)
https://www.kernel.org/doc/html/latest/admin-guide/initrd.html
https://developer.ibm.com/technologies/linux/articles/l-initrd/

猜你喜欢

转载自blog.csdn.net/qq_26884501/article/details/112311201
IMG