在RAM中创build一个块设备

我的日常任务之一就是用我们的软件创build一个USB pendrive的可启动镜像。 该映像必须由两个分区组成,第一个分区使用FAT32格式化,第二个分区使用EXT3格式化。 首先,我们把Linux内核和一个小的启动脚本放在设备上的引导加载程序,我们将在启动时读取。

在第二个分区上,我们放置了rootfs。

现在,我是这样做的:

  1. 插入一个USB pendrive到我的Linux comp。 找出它的设备文件(这里我们假设/ dev / sdx)

  2. 把它的前600MB清零:dd if = / dev / sdx = / dev / sdx bs = 1M count = 600

  3. 创build两个分区,第一个10 MB和第二个500 MB:sfdisk / dev / sdx –unit S << EOF,20000,c,1000000,83 EOF

    mkfs.vfat / dev / sdx1 mkfs.ext3 / dev / sdx2

(这是假定扇区大小是512字节!)

  1. 将内核和启动脚本复制到/ dev / sdx1
  2. 将预编译的RootFS解压到/ dev / sdx2
  3. 将现成的图像从USB随身碟复制回我们的HDD:dd if = / dev / sdx of = usb.img bs = 1M count = 520
  4. 压缩并发送给testing此软件的人员。
  5. 然后人们解压缩,使用dd将usb.img = / dev / sdx插入他们的设备并testing。

现在,所有这些工作。 显而易见的改进是创build一个能够自动执行此操作的脚本。 这也可以完成,但一个手动步骤将仍然存在:插入USB随身碟。

我在想,而不是实际的USB磁盘,我们可以在RAM中使用块设备。 这不仅会消除插入USB磁盘的手动步骤,而且会更快。

所以我需要的是RAM中的一个普通块设备。 一个可以像物理USB pendrive一样分割成分区。

我刚刚研究这个话题,似乎是唯一的select

  1. tmpfs和ramfs,这显然不适合我
  2. ramdisk和'brd'内核模块,在加载时会创build一些“分区”:/ dev / ram [0-15]

他们每个人都可以单独格式化和使用,但就像我说的 – 我想要一个普通的块设备在RAM中,然后我会分裂成两个分区10MB和500MB我自己,然后从那里我可以然后dd图像到我的硬盘上的文件。

我有什么select?

只需使用brd并创build一个brd设备(ram0)。 使用该设备代替你的USB驱动器。 您可以使用sfdisk对其进行分区,使用分区,然后使用dd将其连续转储到文件。

每个brd设备不需要使用一个文件系统。

或者(尽pipe很小),你可以使用tmpfs,创build图像文件,并使用它作为循环设备。 这可能是最简单的方法来实现你想要的。 作为奖励,你准备好了这个图像,并可以立即上传。 不需要dd。

# Create mountpoint for tmpfs mkdir /tmp/tmpfs # Mount tmpfs there mount -t tmpfs none /tmp/tmpfs # Create empty file of 600MB # (it creates 599MB hole, so it does not # consume more memory than needed) dd if=/dev/zero of=/tmp/tmpfs/img.bin bs=1M seek=599 count=1 # Partition the image file cfdisk /tmp/tmpfs/img.bin # Create loop block device of it (-P makes kernel look for partitions) losetup -P /dev/loop0 /tmp/tmpfs/img.bin # Create filesystems mkfs.vfat /dev/loop0p1 mkfs.ext4 /dev/loop0p2 # Now it's your turn: # mount loop0p1 and loop0p2 and copy whatever you want and unmount it # detach the loop device losetup -d /dev/loop0 # May i present you with your image ... ls -al /tmp/tmpfs/img.bin 

修改以适应您的需求。