[qemu+chroot] & [qemu-user -L]
前情提要:使用qemu仿真固件的二进制文件(httpd)时,如果直接使用 sudo qemu-arm-static ./www/httpd ,肯定会报错:/lib/ld-uClibc.so.0: No such file or directory.
这是由于仿真需要依赖squashfs-root下的环境,以及依赖其他的库文件。
可以使用以下两种方法来解决以上的问题。
注:qemu-arm-static需要拷贝到要仿真固件的squashfs-root目录下。
1. qemu+chroot chroot的用法
chroot命令用来在指定的根目录下运行指令。chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以/
,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/
位置。
但是需要注意以下几点:
① 在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,限制用户的访问范围 → 增强了系统的安全性
② 使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构,也就是说新目录与原系统之间是隔离的。→ 方便用户进行与系统不相关的独立开发
2. qemu-user -L qemu-user
qemu-user有一个 -L path 选项,可以用来变更动态库查找路径(/set the elf interpreter prefix to 'path'/),当使用该选项时,程序启动后将优先到设定的path中查找所需要的动态库。
3. 实例分析
下面通过一个实例:qemu仿真固件的web服务程序httpd,来分析两者之间的不同。
(1)使用qemu+chroot方法:
该指令的含义是,
chroot ./,将当前路径squashfs-root指定为新的根目录;
./qemu-arm-static ./www/httpd,运行根目录下的qemu-arm-static程序,参数为./www/httpd,即httpd程序,使用qemu仿真运行httpd程序。
但是它产生了一个报错:/var/run/httpd.pid找不到。这是什么原因呢?
我们可以在系统的根目录下的/var/run文件夹中找到目标文件,就是因为chroot命令将新根下的目录结构与原系统的目录结构隔离开了,所以导致没有找到对应的文件。
(2)使用qemu-user -L方法:
此时路径为/www,并且qemu-arm-static程序也复制到了该路径下。
该指令的含义是,
-L ../,将上级目录,即squashfs-root目录设置为动态库查找路径,解决httpd程序的依赖库的问题。
本次执行就没有(1)中的错误,是因为当没有在path中找到需要的依赖文件时,会自动去系统的相应路径中去寻找。(请忽略其他的错误)
以上就是这两种方法产生不同结果的原因分析,谢谢大家。