qemu 内核启动(实操教程)(libstdc++.so.6?No file??)

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去使用两个对话,这里就可以各司其职,不用在各个目录之间来回切换,具体表示如下

qemu启动

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

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容