我有一个基于 TI DaVinci(与 OMAP 类似的 ARM 架构)的系统,该系统使用 TFTP 和 NFS 安装的根文件系统进行网络启动,并尝试使其在没有网络启动服务器的情况下独立启动。
基本方法是将内核映像复制到 NAND 闪存,将根文件系统复制到连接的 SATA 磁盘(NAND 闪存对于整个系统而言还不够大),然后配置 u-boot 从 NAND 闪存加载内核并通过一个适当的root=
论点。
我陷入了复制文件系统的步骤。 这个问题是相关的,但没有一个建议有效,因为我只有 busybox 版本的cp
和cpio
工具,并且--one-file-system
busybox 不支持该选项。
只有busybox提供的工具能力,如何克隆根文件系统?在 NFS 服务器(运行 Ubuntu 的 x64 架构)上运行存档创建命令然后在目标上解压是否有帮助?
答案1
BusyBoxfind
支持该-xdev
选项,因此您可以通过这种方式制作根文件系统的 cpio 存档。与 tar 不同,cpio 在归档目录时并不归档该目录的内容。
find . -xdev | cpio -H newc -o |
{ cd /mnt && cpio -m -i; }
我不太明白为什么你要从设备构建图像。我希望在开发计算机上使用构建脚本构建文件系统映像,并部署该映像。
答案2
我认为你可以使用cp
.来自busybox.net 网站:
Usage: cp [OPTION]... SOURCE DEST
or: cp [OPTION]... SOURCE... DIRECTORY
Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.
Options:
-a Same as -dpR
-d Preserve links
-p Preserve file attributes if possible
-R Copy directories recursively
例子
$ cp -a / /mnt/newroot
柏油
如果cp
无法处理任何设备,例如/dev/zero
我很确定它不能,您也许可以使用tar
BusyBox 中也包含的设备。
$ (cd /; tar cf - .)|(cd /mnt/newroot; tar pxvf -)
答案3
似乎为此使用 busybox 残缺的工具带来的麻烦远远大于其价值,因为这确实需要单文件系统处理,而 busybox 缺少它cp
。可能find
可以用于单独复制文件并避免递归到安装点,但这会涉及很多单独的进程并且速度非常慢。
在 NFS 服务器上准备文件系统是一个更可行的替代方案。使用 计算分区大小(以字节为单位)fdisk -l
,然后
truncate -s N the-root-image
mkf.ext3 the-root-image
sudo mount -o loop the-root-image /mnt/somewhere
现在使用链接问题中找到的命令复制内容
sudo rsync --archive --inplace --hard-links --acls --xattrs --devices --specials --one-file-system --8-bit-output --human-readable --progress path/to/nfs/share /mnt/somewhere
将图像放在目标可以访问的网络位置:
sudo umount /mnt/somewhere
mv the-root-image path/to/nfs/share
最后,从目标将图像放置到目标磁盘上
dd if=/the-root-image of=/dev/sda1 bs=16M
答案4
您应该安装(或绑定安装)到某个目录:
mount /dev/mmcblk0p1 /mnt
cd /mnt
tar cjf /otherdisk/archive.tar.bz2 *
您还可以通过 ssh 发送结果(如果在 busybox 配置中启用)而不是存储在本地,顺便使用目标主机计算能力/安装的工具来执行压缩:
tar cf - * | ssh user@host "bzip2 | cat > archive.tar.bz2"
根据您的意愿调整压缩工具、存档名称等:)