参考1: 精华帖 Debian 9.9 文件系统制作
参考2: 在 x86 下 chroot 到 ARM 平台的 rootfs
1. 准备工作:
sudo apt install qemu-user-static -y
2. 编译buildroot, 或单独编译 busybox 等。
3. 找到buidlroot的target目录, 复制qemu-user-static到target目录
$ cp /usr/bin/qemu-arm-static /buildroot-2018.08.2/output/target/usr/bin/
4. chroot:
sudo chroot /buildroot-2018.08.2/output/target/ /bin/sh
好了, 现在你可以为所欲为, 就像在嵌入式系统一样,执行任何busybox 命令了:
whycan@ubuntu$ sudo chroot /buildroot-2018.08.2/output/target/ /bin/sh
/ $ ls
THIS_IS_NOT_YOUR_ROOT_FILESYSTEM linuxrc run
bin media sbin
dev mnt sys
etc opt tmp
lib proc usr
lib32 root var
/ $
/ $
/ $ ping
BusyBox v1.27.2 (2017-11-10 15:34:58 CST) multi-call binary.
Usage: ping [OPTIONS] HOST
Send ICMP ECHO_REQUEST packets to network hosts
-c CNT Send only CNT pings
-s SIZE Send SIZE data bytes in packets (default 56)
-t TTL Set TTL
-I IFACE/IP Source interface or IP address
-W SEC Seconds to wait for the first response (default 10)
(after all -c CNT packets are sent)
-w SEC Seconds until ping exits (default:infinite)
(can exit earlier with -c CNT)
-q Quiet, only display output at start
and when finished
-p Pattern to use for payload
/ $
在线
我先占个位,回头测试
离线
chroot /buildroot-2019.02.4/output/target /bin/sh
chroot: failed to run command ‘/bin/sh’: No such file or directory
显示没有这条命令,实际上是存在链接至busybox的
最近编辑记录 太一酱鸭 (2019-11-19 13:59:49)
离线
执行了,/target/usr/bin里也有qemu-arm-static
离线
问题解决,不是缺lib,而是大端小端弄错了,选择小端之后可以执行!!!感谢晕哥!!!
离线
你在 buildroot 配置成了大端?
是的、、、、有点蠢
离线
测试成功!
不过,target/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM 这个文件有说明,不要把这个目录当作根文件系统来挂载,它是一个中间产物。
是不是解压 tar 包之后,再用 qemu 模拟会更合适?
离线
应该可以的,最终的rootfs.tar是由target打包成的。修改后make试试,会打包进rootfs.tar
测试成功!
不过,target/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM 这个文件有说明,不要把这个目录当作根文件系统来挂载,它是一个中间产物。
是不是解压 tar 包之后,再用 qemu 模拟会更合适?
离线
这个 THIS_IS_NOT_YOUR_ROOT_FILESYSTEM target目录实际上也能用,到底是为什么呢?
离线
应该可以的,最终的rootfs.tar是由target打包成的。修改后make试试,会打包进rootfs.tar
这个文件里面有解释了, 因为 buildroot 支持普通用户进行制作根文件系统,tartget/ 下面的文件 **可能** 并不是 root 创建,再这种情况,是没权限进行创建设备节点之类的动作的。 这里可能大家都是 root 用户下执行的,所以可以工作。另外一点是,buildroot 有个 post 脚本会再打包前执行,如果直接用 target/,相当于错过了这个步骤。
离线
这就奇怪了,我都是非root用户执行buildroot make,直接拷贝 target 目录,也没啥问题。
离线
优秀的操作, 顶起来.
离线
多谢大佬分享!
离线
还有如此骚操作!又学到了新姿势了,看起来是用 qemu 模拟arm指令集吧?
离线
这操作,佩服,很值得学习,多谢分享啊
离线
还有这种骚操作,奇怪的姿势又增加了。
离线
学习了,正需要看一下 Chroot,不是很明白呢
离线
$ sudo chroot ${PWD} /bin/sh
/ # passwd
Changing password for root
New password:
Bad password: too weak
Retype password:
qemu: Unsupported syscall: 382
passwd: Function not implemented
passwd: can't update password file /etc/shadow
/ # whoami
root
奇怪, 我的更新不了密码?
离线
请问qemu-arm 和 qemu-arm-static 有什么区别?
离线
请问qemu-arm 和 qemu-arm-static 有什么区别?
qemu-arm 需要依赖一些库才能运行,不适合chroot场合,因为还要拷贝这些库到新的rootfs里面,甚至可能无法运行;
qemu-arm-static 是静态链接的,单个文件就能运行。qemu-arm-static比qemu-arm大不少。
离线
很好的工具。
比如ubuntu 不再发布 armhf 版的 server了,但是可以下载ubuntu base,一个比 ubuntu core 还mini的文件系统。
通过 chroot和 qemu 可以再host上给这个rootfs 安装各种软件、配置网络,然后就能在 arm 板子上跑了。
离线
离线
准备使用ubuntu base做rootfs,这个方法刚好适用
离线