1 实验目的
通过本实验的学习,掌握信创操作系统内核裁剪、根文件系统定制以及内核调参技术。
2 实验内容
在本次实验中,学生将利用qemu模拟器启动并运行一个虚拟机,以下是详细的实验操作步骤:
1. 修改Linux内核默认编译配置,移除对ext4文件系统的默认支持,并新增对btrfs文件系统的支 持,随后进行内核编译。
2. 利用buildroot工具构建根文件系统(rootfs),配置Target options为最终运行该系统的平台类 型。配置Filesystem images为btrfs格式,此操作将生成btrfs类型的虚拟磁盘,内含rootfs。 配置Target packages, 向rootfs 中添加vim和bash。配置System configuration,将默认 shell 设置为bash。
3. 通过qemu,添加共享文件夹和edu设备,结合已编译的内核及虚拟磁盘,尝试启动并运行基于 btrfs 虚拟磁盘的虚拟机。
4. 将在qemu虚拟机外编译好的edu驱动程序复制到虚拟机内,并进行安装和运行测试。
5. 使用默认配置的内核,进入虚拟机后查询内核参数kernel.shmmax的值,并尝试修改该参数。修 改完毕后,再次查询kernel.shmmax的值,以验证修改是否成功。
实验步骤:

这两个文件是红色的!需要进行设置下载
先进入kernel文件目录
cd kernel
再使用make menuconfig

enter进入,设置成如下这样

按两次Esc保存并返回,直到看到yes和no的界面,enter。
make -j $(nproc) Image.gz
键入等待完成,大约30分钟……

完成之后就会发现Image.gz变成了蓝绿色,然后进入buildroot-2024.02.6目录
键入make menuconfig

进入Target options,设置成AArch64(little endian)

进入Target packages,再进去 Text editors and viewers,勾选vim

进入Filesystem images,勾选btrfs root filesystem

然后退出,同上
键入make -j $(nproc),等待40分钟……

这里便于操作,使用tmux开启两个对话
(Tmux使用指南(在单个终端窗口创建多个虚拟对话)-CSDN博客)
也可以在一个终端上执行,但凡错了需要退出本虚拟机,重新操作!
在一个对话上创建一个share目录
mkdir /root/share
将实验三的代码写入share目录,或者可以将/root/lab/3/code/*所有文件写好再复制进去(包括编译执行)
进入/root/lab/4目录
bash start.sh
输入root
# 建立qemu-share目录
mkdir qemu-share
# 挂载Host侧的/root/share文件夹到Qemu侧的/root/qemu-share
mount -t 9p -o sharefd /root/qemu-share
(为什么这里是sharefd??详细可以去了解一下start.sh文件里面的内容)
# 编译的edu设备驱动
insmod edu_dev_blank.ko
# 设置驱动
mknod /dev/edu c 200 200
# 执行c++文件(这里在前面需要提前编译好)
./user_space
就会惊奇的发现下面这样的错误
./user: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
# 这里是因为他没有找到libstdc++.so.6这个文件,需要这个文件才能正常执行
怎么解决???
方案一:
你在root这个虚拟机上可以正常执行,说明这个虚拟机上是有libstdc++.so.6这个文件的,至于他放在哪,在root虚拟机上找到你编译出来的user_space这个可执行二进制文件
# 寻找libstdc++.so.6
ldd user_space

这个就是他的路径,我们将其复制到我们的share共享文件目录下来
# 将libstdc++.so.6复制到共享文件目录下
cp /usr/lib64/libstdc++.so.6 /root/share/
然后重新进入OpenEuler,再使用ls命令就可以发现多出来了一个libstdc++.so.6这个文件

然后指定使用libstdc++.so.6
# 指定使用libstdc++.so.6
export LD_PRELOAD="./libstdc++.so.6"
再去编译驱动和执行uer_space文件,就可以正常执行
方案二:
出现该问题的原因就是因为你的buildroot-2024.02.6里面没有libstdc++.so.6这个文件,我只需要给他添加不就可以了!!!
我们发现root虚拟机上,libstdc++.so.6文件放在/usr/lib64/libstdc++.so.6,我们去OpenEuler看是否也能找到同样的文件目录,去每个目录下寻找,其实也是有的
# 找到libstdc++.so.6应该装载的文件目录
cd buildroot-2024.02.6
cd output
cd target
cd usr
ls
# 就会发现有一个lib64文件目录

这里我已经将其复制过来了
然后退到buildroot-2024.02.6目录下,键入make(OpenEuler全部都要重新完成)
进入OpenEuler输入ldd user_space发现libstdc++.so.6不再是no found

此时再去执行user_space就不会报错!!!
这里所有的内容都已经搭建好,其余还需要截图的按照其要求就行,这里已经说了很多就不再赘述了。
补充:
这里再补充一些在操作时的一些快捷办法
1.假如说你进入了OpenEuler,但是你要退出到root虚拟机,点击Ctrl+a x
2.这里还是建议去使用tmux去使用两个对话,这里就可以各司其职,不用在各个目录之间来回切换,具体表示如下

3.在使用这个方法时,你左边对话在root虚拟机上操作时,需要将右边OpenEuler退出。

















暂无评论内容