构建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的安装使用。

相关推荐
孙克旭_8 小时前
Docker 镜像构建|Vue+SpringBoot+Go 多语言项目 Dockerfile 案例
linux·运维·vue.js·spring boot·docker·dockerfile
life码农8 小时前
Linux截取Nginx指定时间段日志的三种方法(grep/awk/sed)
linux·nginx
Dawn-bit8 小时前
Linux网络进阶:TCP三次握手和四次挥手与TCP连接状态
linux·服务器·网络·tcp/ip·云计算·智能路由器
NJCloud9 小时前
MooseFS 分布式存储部署与高可用架构实践
linux·运维·分布式·架构
mounter6259 小时前
将 RDMA 引入容器:Soft-RoCE (RXE) 网络命名空间支持深度解析
linux·linux kernel·kernel·rdma·net namespace
奈斯先生Vector10 小时前
从 127.0.0.1:3080 到插件运行时:DeepSeek Harness 远程开发与版本治理实战
linux·运维·人工智能·ubuntu·aigc
wuminyu10 小时前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
Android系统攻城狮10 小时前
Linux PipeWire深度解析之pw_stream_new调用流程与实战(七十八)
linux·运维·服务器·音频进阶·pipewire音频实战进阶
换个号退隐江湖i11 小时前
LLM 调试日志刷屏怎么办?用 tee 边看边存
linux
DYWorker00112 小时前
搭建嵌入式Linux虚拟机开发环境
linux