构建Linux文件系统:硬盘读取与udev安装

继成功利用initrd.img机制完善简单文件系统并实现shell直接启动后,本次实验的目标是扩展文件系统功能,以实现更高级的操作和系统集成。具体任务如下:

  1. 手工加载驱动程序(V0.55) :深入了解和实践Linux系统中的驱动管理机制,手工加载必要的硬件驱动,以保证系统与硬件的正确交互。
  2. 实现硬盘上标准Linux系统挂载:扩展文件系统以访问和使用硬盘上现有的标准Linux系统文件,增强系统的兼容性和实用性。
  3. 动态设备节点管理(udevd,V0.6) :通过引入udev实现设备节点的自动识别和加载,优化系统的配置过程。

实验过程

首先使用root权限,进入系统文件

bash 复制代码
su
cd myfilesystem

先把一些必要的指令移动过去

bash 复制代码
cp /bin/ls /bin/mkdir /bin/cat /bin/mount /bin/udevadm  /bin/login  /bin/mknod bin/
mkdir sbin
cp /sbin/modprobe /sbin/reboot sbin

然后把这些指令需要的链接库移动过去

bash 复制代码
cp /lib/x86_64-linux-gnu/libselinux.so.1 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libpcre2-8.so.0 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libmount.so.1 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libblkid.so.1 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libkmod.so.2 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libacl.so.1 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libcap.so.2 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libzstd.so.1 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/liblzma.so.5 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libcrypto.so.3 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libpam.so.0 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libpam_misc.so.0 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libaudit.so.1 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libcap-ng.so.0 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/liblz4.so.1 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libgcrypt.so.20 lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libgpg-error.so.0 lib/x86_64-linux-gnu

接下来我们要复制一些必要的驱动过来,先把/lib/modules/6.5.0-26-generic/modules.* 全部移动过来,这些是一些必要的文件,包括各种模块的依赖关系和信息。

bash 复制代码
mkdir lib/modules/
mkdir lib/modules/6.5.0-26-generic/
cp /lib/modules/6.5.0-26-generic/modules.* lib/modules/6.5.0-26-generic/

接下来,为了能够正确加载硬盘,我们需要mptspi驱动程序,它用于支持基于 LSI Logic Fusion-MPT 架构的 SCSI 并行接口控制器。它的位置在/lib/modules/6.5.0-26-generic/kernel/drivers/message下面,我们把它和一些必要文件拷贝过来

bash 复制代码
mkdir lib/modules/6.5.0-26-generic/kernel
mkdir lib/modules/6.5.0-26-generic/kernel/drivers
cp /lib/modules/6.5.0-26-generic/kernel/drivers/message/ lib/modules/6.5.0-26-generic/kernel/drivers/ -r
cp /lib/modules/6.5.0-26-generic/kernel/drivers/scsi/ lib/modules/6.5.0-26-generic/kernel/drivers/ -r
cp /lib/modules/6.5.0-26-generic/kernel/drivers/ata/ lib/modules/6.5.0-26-generic/kernel/drivers/ -r
cp /lib/modules/6.5.0-26-generic/kernel/drivers/block/ lib/modules/6.5.0-26-generic/kernel/drivers/ -r

接下来我们要在init中加载驱动,同时为了能够看到各种设备,硬盘信息,我们还需要把一些系统文件进行挂载。同时,由于我们没有udev,我们需要手动创建块设备文件,通过mknod可以进行创建,最后,我们将创建的设备文件挂载到我们的文件上。

bash 复制代码
mkdir mnt
mkdir mnt/hd
vim init
bash 复制代码
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
modprobe mptspi
mknod /dev/sda3 b 8 3
mount /dev/sda3 /mnt/hd
exec /bin/bash

接下来,我们打包文件并更新grub

bash 复制代码
find . | cpio -o -H newc | gzip > /boot/my-initrd.img
update-grub

现在,我们重启进入我们的小系统就可以从/mnt/hd看见我们的硬盘了。

接下来,我们要把udev移植到我们的小系统里面,我们先把udev和它的相关规则迁移过来。

bash 复制代码
mkdir lib/systemd
cp /lib/systemd/systemd-udevd  lib/systemd/
cp /bin/udevadm  bin/
mkdir lib/udev/
cp /lib/udev/rules.d lib/udev/rules.d -r

现在我们修改init,让系统启动udev,同时我们不再需要手动挂载节点

bash 复制代码
#!/bin/sh 
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
modprobe mptspi
/lib/systemd/systemd-udevd 
udevadm trigger --action=add
udevadm settle || true
mount /dev/sda3 /mnt/hd
exec /bin/bash

最后,我们打包并更新,完成了udev的安装使用。

相关推荐
雯宝3 小时前
mnt_init 函数
linux
律宏阔9 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔9 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴9 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千9 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei379 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei379 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei379 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
GeW9 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
GeW9 小时前
工业场景中的Linux与数据库选型:高端化转型的技术底座
linux