标签: cpio

为什么我的initrd只有一个目录,即'kernel'?

我正在使用 debian live-build 在可启动系统上工作。在该过程结束时,我获得了用于启动实时系统的典型文件:squashfs 文件、一些 GRUB 模块和配置文件,以及一个 initrd.img 文件。

我可以使用这些文件很好地启动,通过将 initrd 传递给内核

initrd=/path/to/my/initrd.img
Run Code Online (Sandbox Code Playgroud)

在引导加载程序命令行上。但是当我尝试检查 initrd 映像的内容时,如下所示:

$file initrd.img
initrd.img: ASCII cpio archive (SVR4 with no CRC)
$mkdir initTree && cd initTree
$cpio -idv < ../initrd.img
Run Code Online (Sandbox Code Playgroud)

我得到的文件树看起来像这样:

$tree --charset=ASCII
.
`-- kernel
    `-- x86
        `-- microcode
            `-- GenuineIntel.bin
Run Code Online (Sandbox Code Playgroud)

实际的文件系统树在哪里,典型的 /bin , /etc , /sbin ... 包含引导期间使用的实际文件?

linux debian initrd cpio

41
推荐指数
4
解决办法
2万
查看次数

为什么对 initramfs 使用 cpio?

我正在按照Gentoo wiki制作我自己的 initramfs 。而不是熟悉的tarand gzip,页面告诉我使用cpioand gzip维基百科cpio2.6 内核的 initramfs 使用了它,但没有解释原因。

这只是一个约定还是cpio对 initramfs 更好?我还可以使用tarandgzip吗?

compression initramfs cpio

13
推荐指数
2
解决办法
4908
查看次数

如何说服 tar(等)归档块设备内容?

我有六个 Linux 逻辑卷,它们一起支持一个虚拟机。VM 当前已关闭,因此很容易为它们拍摄一致的图像。

我想将所有六个图像打包到一个存档中。简单地说,我可以做这样的事情:

cp /dev/Zia/vm_lvraid_* /tmp/somedir
tar c /tmp/somedir | whatever
Run Code Online (Sandbox Code Playgroud)

但这当然会创建一个额外的副本。我想避免额外的副本。

显而易见的方法:

tar c /dev/Zia/vm_lvraid_* | whatever
Run Code Online (Sandbox Code Playgroud)

不起作用,因为 tar 将文件识别为特殊文件(在这种情况下为符号链接),并且基本上将其存储ln -s在存档中。或者,使用--dereference或 直接指向/dev/dm-X,它会将它们识别为特殊(设备文件)并基本上存储mknod在存档中。

我搜索了 tar 的命令行选项来覆盖此行为,但找不到任何选项。我也试过cpio,同样的问题,也找不到任何覆盖它的选项。我也试过7z(同上)。与pax. 我什至尝试过zip,这只是让自己感到困惑。

编辑:查看 GNU tar 和 GNU cpio 的源代码,它们似乎都无法做到这一点。至少,并非没有严重的技巧(无法禁用对设备文件的特殊处理)。因此,将不胜感激或替代实用程序的严重诡计的建议。

TLDR:是否有一些存档器可以将多个磁盘映像打包在一起(从原始设备获取)并流式传输输出,而无需制作额外的磁盘副本?我的偏好是以通用格式输出,例如 POSIX 或 GNU tar。

tar cpio disk-image

13
推荐指数
1
解决办法
4027
查看次数

将文件附加到 initramfs 映像 - 可靠吗?

我正在修改initramfs来自不同 Linux 发行版的一堆档案,其中通常只更改一个文件。

我想在不切换到 root 用户的情况下自动执行该过程以提取initramfs图像中的所有文件并再次打包它们。

首先,我尝试在gen_init_cpio 提取initramfs存档中的所有内容的情况下生成文件列表,即通过脚本解析cpio -tvn initrd.img(如ls -l输出)的输出,该脚本将所有权限更改为八进制并将输出排列为所需的格式gen_init_cpio,例如:

dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
Run Code Online (Sandbox Code Playgroud)

这涉及一些替换,脚本可能很难为我编写,所以我找到了一个更好的方法,我在问它的​​安全性和便携性如何:

在某些发行版中,我们有一个initramfs包含连接部分的文件,显然内核会解析整个文件,提取打包在 1 字节边界中的所有部分,因此无需将每个部分填充为 512 字节的倍数。我认为这个“功能”对我来说很有用,可以避免在修改其中的文件时重新创建存档。确实它有效,至少对于DebianCloneZilla

例如,如果我们/initinitrd.gzDebian 8.2.0上修改了文件,我们可以将其附加到initrd.gz图像中:

$ echo ./init | cpio -H newc -o …
Run Code Online (Sandbox Code Playgroud)

boot kernel initramfs cpio

8
推荐指数
1
解决办法
6884
查看次数

如何使用busybox链接生成initramfs图像?

通过回答我之前的问题(谢谢!)而将其定向到 initramfs ,我一直在努力使 initramfs 工作。我现在可以启动内核并进入 shell 提示符,在那里我可以执行 busybox 命令,这很棒。

这就是我卡住的地方——(至少)有两种生成 initramfs 图像的方法:

  1. 通过向内核传递要压缩的预构建目录层次结构的路径
  2. 通过向内核传递列出要包含的文件的文件名。

第二种方法看起来更简洁,所以我一直在使用它。

仅供参考,这是我目前的文件列表:

dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox /home/brandon/rascal-initramfs/bin/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init /home/brandon/rascal-initramfs/init.sh 755 0 0
Run Code Online (Sandbox Code Playgroud)

不幸的是,我了解到busybox 需要一长串链接作为其所有不同命令的别名。有没有办法生成所有这些命令的列表,以便我可以将其添加到我的文件列表中?

或者,我可以使用预构建的目录层次结构切换到方法 …

linux kernel initramfs busybox cpio

7
推荐指数
2
解决办法
8733
查看次数

您将如何使用 cpio 命令?

在学习 lpic 考试时,我遇到了命令cpio.

cpio 的描述指出:

cpio 最初旨在以连续、连续的方式将备份文件存档存储在磁带设备上。cpio 不压缩任何内容,但生成的存档通常使用 gzip 或其他外部压缩器进行压缩。

在查看如何使用 cpio 的示例时,我找不到 cpio 比更常见的工具(如tar.

什么是使用cpio将被使用的示例(除了磁带备份),或者它在今天的系统中不再相关?

cpio

7
推荐指数
1
解决办法
3102
查看次数

update-initramfs 在 debian Stretch 上挂起

在 Debian 上使用apt-get upgrade让我决定更新到内核 4.9.0-6,但安装从未完成。它总是在以下阶段停滞:

Setting up linux-image-4.9.0-6-amd64 (4.9.82-1+deb9u3) ...
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-4.9.0-6-amd64
Run Code Online (Sandbox Code Playgroud)

之后什么都不会发生。我确实结束了进程并启动了update-initramfs -v -u所以看看会发生什么,不发生什么。update-initramfs 停在:

Building cpio /boot/initrd.img-4.9.0-6-amd64.new initramfs
Run Code Online (Sandbox Code Playgroud)

有谁知道该怎么做?从jessie到stretch(几天前)的更新没有任何问题,从那以后我没有修改任何东西。

debian apt initramfs cpio

6
推荐指数
1
解决办法
6733
查看次数

以用户身份解压、修改和打包initrd

我在initrd以用户身份重建图像时遇到问题。首先,当我尝试“解压缩”原始initrd图像时:

cpio -idm < initrd-base 
cpio: dev/tty8: Cannot mknod: Operation not permitted
cpio: dev/tty3: Cannot mknod: Operation not permitted
cpio: dev/zero: Cannot mknod: Operation not permitted
cpio: dev/loop0: Cannot mknod: Operation not permitted
cpio: dev/loop4: Cannot mknod: Operation not permitted
cpio: dev/loop7: Cannot mknod: Operation not permitted
cpio: dev/loop5: Cannot mknod: Operation not permitted
cpio: dev/loop2: Cannot mknod: Operation not permitted
cpio: dev/tty9: Cannot mknod: Operation not permitted
cpio: dev/tty4: Cannot mknod: Operation not permitted
cpio: …
Run Code Online (Sandbox Code Playgroud)

linux initrd cpio not-root-user

5
推荐指数
2
解决办法
1万
查看次数

提取连接的 cpio 档案

Linux 上的 initramfs 档案可以由一系列串联的、gzipped cpio 文件组成。

给定这样的档案,如何提取所有嵌入的档案,而不是仅提取第一个?

下面是一个模式的例子,虽然它看起来有可能工作,但只提取第一个存档:

while gunzip -c | cpio -i; do :; done <input.cgz
Run Code Online (Sandbox Code Playgroud)

我还尝试了dracutskipcpio 帮助程序将文件指针移过第一个 cpio 图像,但以下结果会导致发送到 cpio 的损坏流(不在输入中的正确点):

# this isn't ideal -- presumably would need to rerun with an extra skipcpio in the pipeline
# ...until all files in the archive have been reached.
gunzip -c <input.cgz | skipcpio /dev/stdin | cpio -i
Run Code Online (Sandbox Code Playgroud)

linux initramfs cpio

5
推荐指数
3
解决办法
4045
查看次数

如何创建 ASCII cpio 存档(无 CRC 的 SVR4)?

我有一个文件 /boot/initramfs.gz

使用tar -xzvf initramfs.gz -C ./I got a file提取它initramfs

???? $ file initramfs initramfs: ASCII cpio archive (SVR4 with no CRC)

可以使用ark. 但我想更改此文件中的一些文件initramfs

在此处输入图片说明

我使用提取它ark并得到一个文件夹initramfs。现在我想像以前一样保存它。

在此处输入图片说明

如何像原始文件一样创建 ASCII cpio 存档(无 CRC 的 SVR4)?

initramfs cpio mkinitcpio

5
推荐指数
1
解决办法
7321
查看次数