写入SD卡之前如何调整图像文件的大小?


13

我一直在尝试使用其他内核(具有CAN支持)和安装的Python 3.3创建新的Raspbian映像。我认为与其在Raspberry Pi上进行所有操作,不如在计算机上进行操作(按照这些说明进行操作)会很有趣。但是,一旦挂载映像并准备就绪,我很快就会用光磁盘空间。我认为这是因为图像的大小仅够大,并且期望用户在将文件系统写入SD卡后会重新调整其大小。

在将图像和文件系统写入SD卡之前是否可以调整其大小,以便我可以做更多的自定义操作而不会耗尽空间?


这个问题可能会帮助您。
Jivings

1
@Jivings:所有这些答案都描述了在将图像写入SD卡如何调整图像大小。我知道该怎么做;我对在将图像写入SD卡之前如何调整图像大小感兴趣。
DrAl

Answers:


8

这是如何调整原始图像文件的大小。我知道这听起来很简单,但确实可以。

创建一个空白图像,其大小要扩展原始图像(在我的示例中,我使用5GB);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

将此附加到原始图像:

cat /path/to/temp_image >> /path/to/rasperrypi.img

调整位于磁盘末端的文件系统的大小(通常这是您想要更大的文件系统):

resize2fs -f /path/to/rasperrypi.img

做完了!您的磁盘现在应该更大5GB!


听起来很完美,谢谢:我今晚会测试一下。
DrAl

5
我刚刚尝试过,当我进入resize2fs阶段(向文件中添加1GB后)时,我在尝试打开2012-12-16-wheezy-raspbian.img时遇到“超级块中的错误魔术数字”找不到有效的文件系统超级块。” 关于我在做什么错的任何建议吗?
DrAl

在我看来,这是一个问题,因为我正在尝试调整整个映像的大小(等效于/ dev / sda)而不是分区(等效于/ dev / sda2)。但是,我可能是错的,并且尝试了其他一些尝试而没有成功(例如,使用fdisk调整分区大小,这似乎可以工作,但是并不能帮助我调整文件系统的大小)。
DrAl

3
好的,我通过使用谷歌搜索找到了最后一个答案:我需要创建一个指向映像分区的循环设备。我这样做是通过从fdisk -l file.img(122880)然后获得第二个分区的起始扇区开始的losetup --offset $((122880 * 512)) /dev/loop0 file.img。然后我可以使用resize2fs/dev/loop0与整理losetup -d /dev/loop0。如果您将答案更新为包括此答案,我会将其标记为可接受的答案。感谢您指出正确的方向。
DrAl

1
@DrAl嘿,我尝试在上使用您的解决方案resize2fs/dev/loop0但在启动时遇到内核恐慌,说超级块大小和分区大小不匹配:The filesystem size (according to the superblock) is 483840 blocks The physical size of the device is 458240 blocks您遇到过类似的东西吗?
GuySoft

4

这是上面和其他对我有用的答案的综合-如果出现错误,请备份您的图像:

首先,将图片文件放大(在此文件末尾添加1GB):

truncate -s +1G ./image.img

接下来将整个图像映射为一个循环设备,以便我们在分区表上戳一下

sudo losetup /dev/loop0 ./image.img

为了将来参考,我们将其转储:

sudo fdisk -l /dev/loop0

输出如下:

Disk /dev/loop0: 2962 MB, 2962227200 bytes
255 heads, 63 sectors/track, 360 cylinders, total 5785600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c4661

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop0p2          122880     5785599     2831360   83  Linux

现在,我们将删除最后一个分区,然后在相同的开始位置,相同的类型但不同的结束位置重新创建它。因此,记下loop0p2(分区2-Linux分区)的“开始”列-我们稍后将使用它-这里的122880。

sudo fdisk /dev/loop0

输入以下内容-他们可以安全输入-在您阅读以下我的解释之前,不会永久发生任何事情:

  1. p
  2. d
  3. 2
  4. n
  5. p
  6. 2
  7. 122880
  8. 只需按Enter接受默认值
  9. p

第1步-打印当前表格。步骤2-3-删除分区2,步骤4-8-重新创建具有新端点的分区2(默认为映像的结尾),步骤9-打印出新表。

假设新打印的表与原始表相同,除了可以准备提交的End值和Blocks值(即大小已更改)。

输入w以提交您的更改,然后输入q以退出。

您可以删除该回送设备,我们将为第二个分区创建另一个。请记住您在上面记录和使用的起始偏移量-我们将再次使用它:

sudo losetup -d /dev/loop0     # delete the old loop setup
sudo losetup -o $((122880*512)) /dev/loop0 ./image.img

这将在/dev/loop0指向分区2 时创建一个新的映射-参考512是您在第一个fdisk输出中看到的扇区大小。

现在调整分区大小以填充可用空间:

sudo e2fsck -f /dev/loop0
sudo resize2fs /dev/loop0

完成-现在清理:

sudo losetup -d /dev/loop0

谢谢...上面的说明对我不起作用,但确实如此。写入分区表时确实得到了一些警告:```命令(m以获取帮助):w分区表已被更改。调用ioctl()以重新读取分区表。重新读取分区表失败。:无效参数内核仍使用旧表。新表将在下次重新启动时或在运行partprobe(8)或kpartx(8)之后使用。我只是忽略了它,那很好。
StFS

优秀!您是唯一做出正确答案的人!谢谢。
yushulx

3

对于那些运行Oracle VM VirtualBox的用户来说,这很容易。

在Windows计算机上,情况如下:

input.img是此处应减小尺寸的图像,并且output.img是最终图像-在此示例中,该图像定义为7000 MB大。

ECHO "========================================================================="
ECHO "input.img => output.img"

ECHO "========================================================================="

DEL  input.vdi

DEL  output.vdi

DEL  output.img

ECHO "========================================================================="
"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertfromraw input.img input.vdi -format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" createhd --filename output.vdi --size 7000 --format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd input.vdi output.vdi --existing

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd output.vdi output.img --format RAW

希望这个对你有帮助。


感谢您的解决方案,非常狡猾。这是我唯一能找到的免费软件,并且可以在Windows上完美运行。16GB卡大小不完全相同,需要调整图像大小,但出现了一些问题。
乔什(Josh)

我收到内核恐慌错误。Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX

请注意,这会截断图像-如果超过7000MB标志,您将丢失数据-命令不会发出警告或抱怨。
Mike Redrobe

2

这是如何调整原始图像文件的大小。我知道这听起来很简单,但确实可以。

创建一个空白图像,其大小要扩展原始图像(在我的示例中,我使用5GB);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

将此附加到原始图像:

cat /path/to/temp_image >> /path/to/rpi.img

接下来是调整分区和文件系统的大小。首先,获取分区的偏移量;

fdisk -l /path/to/rpi.img

结果在这样的表中:

Device    Boot   Start      End   Sectors   Size  Id  Type
rpi.img1          8192   122879    114688    56M   c  W95 FAT32 (LBA)
rpi.img2       1122880  8447999   8325120     4G  83  Linux

注意第二个分区的起始偏移量

losetup --offset $((122880 * 512)) /dev/loop0 /path/to/rpi.img
e2fsck -f /dev/loop0
resize2fs -f /dev/loop0

最后卸载/ dev / loop

losetup -d /dev/loop0

做完了!您的磁盘现在应该更大5GB!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.