主要观点:在 Linux 中创建 chroot 通常需使用 sudo,但通过用户命名空间(user namespaces)和unshare
工具,可在不使用超级用户权限的情况下创建 chroot。
关键信息:
chroot
命令本身及创建 rootfs 和挂载/proc
、/sys
等文件系统都需要 root 权限。pmbootstrap
创建可安装手机镜像需设置多个 chroot 及执行很多命令,会多次输入密码。- 用户命名空间可隔离安全相关标识符等,
unshare
可方便操作各种命名空间,是util-linux
的一部分。 - 创建 Alpine Linux rootfs 时,使用
apk.static
,初始获取apk.static
二进制文件无需超级用户权限,但后续操作大多需要,如创建 Alpine 安装、挂载/dev
等。 - 可通过
unshare
的一些参数创建新的 userns 并将 uid/gid 改为 0 以获得 root 权限,但chown
仍可能失败,需修改/etc/subuid
和/etc/subgid
文件。 - 重映射 uid 后可能导致
unshare
命令内部的命令无法启动,需将可执行文件复制到/tmp
。 - 完成 rootfs 后,仍需解决文件系统挂载和创建文件的问题,可利用 mount 命名空间功能,通过 bind-mount 现有设备节点来过滤不需要的设备。
重要细节: - 文中给出了各种
unshare
参数的使用示例,如unshare --user --map-users=10000,0,10000 --map-groups=10000,0,10000 --setuid 0 --setgid 0 --wd "${chroot_dir}"
等。 - 展示了如何通过
echo
和unshare
结合来创建和修改文件,如echo "nameserver a.b.c.d" | unshare... sh -c 'cat > /etc/resolv.conf'
。 - 提到代码在~martijnbraam/ambootstrap仓库,后续需解决文件系统复制等问题,且 PinePhone 刷机需实际超级用户权限。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。