我想为一些朋友准备一个发行版。
由于周围没有其他东西,我使用了16Gb SD卡。

我从默认的Debian Weezy 2Gb映像开始,并没有进行任何大小调整。

[我使用Windows // Win32DiskImager,因为现在没有任何内容可以粘在rPI中]


我可以截断图像文件后面的图像文件吗?划分空间并将引导部分转移到较小的卡上,然后?


评论

如果可以访问linux计算机,请运行dd if = / dev / path / to / SD / card of ~~ / SpecialImage.img,然后安装GParted并运行gparted〜/ SpecialImage.img。 GParted打开您的.img文件后,只需根据您的喜好调整分区大小即可! (两个命令都必须以root身份运行,sudo su应该可以为您提供所需的东西。当$切换为#时,您就是Root。请注意,这等效于Linux。)GParted基本上是GUI前端您需要的奥秘分区管理工具。使用GParted会使一切变得更加简单和成功。

请仔细阅读我的问题。

是的,我阅读了您的问题,我可以告诉您,仅截断磁盘映像是危险的。当然,您可以剪切图像的最后一个字节,但是没有保证您不会意外剪切任何文件,特别是因为Linux故意将其文件间隔开了。另外,文件系统的末尾可能会有一些重要的元数据或类似的东西。总体上来说,使用正确的文件系统大小调整实用程序比尝试自己放弃文件结尾更安全。

好吧,但是我说的是未分区的空间。甚至Linux也不会​​在磁盘空间上放置任何标记为未分区的数据,而是保留在分区表中写入的块内。我的担心是由图像文件格式引起的:可能是图像文件的元数据位于文件末尾,所以我担心会切断文件信息。 (希望我以前的评论听起来不太难,对不起;)

哦,我明白你现在在说什么。如果您担心尾随的可用空间已损坏,请在将其截断后在图像上运行GParted。它可能会将最后一个区域列出为“未分配”或“损坏”-在该空间中创建一个新的“未格式化”分区。这样,您就不会有任何问题。 :)

#1 楼

我终于找到了一个解释我问题的资源。


http://softwarebakery.com/shrinking-images-on-linux


简短说明:

是的,可以截断!

过程摘要:

使用fdisk从映像中提取分区信息:

$ fdisk -lu image.img
Disk image.img: 4096 MB, 4096000000 bytes, 8000000 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: 0x000a1bc7

      Device Boot      Start         End      Blocks   Id  System
image.img1              2048     5872026     5869978    b  W95 FAT32


我们看到,该分区的大小约为2.8Gb(5872026 * 512),其余分区未分区。

所以,一切可以删除分区末尾后。
这将使用工具truncate完成。不要忘记在扇区数上加1,因为块数从0开始。

$ truncate --size=$[(5872026+1)*512] image.img




编辑:

对于那些懒于切换到Linux的人:
也可以在Windows上使用Cygwin的fdisk.exetruncate.exe

什么是Cygwin?

我可能会引用:“ Cygwin:在Windows上具有Linux的感觉”(https://www.cygwin.com/)。
这是一组可执行程序,可以在Windows下运行,但提供所有命令行如果您在安装过程中选择了每个软件包,Cygwin可能会花费很长的安装时间,但是要遵循此示例,只需确保除了默认配置以外,还要软件包util-linux(fdisk)和选择了coreutils(截断)。
根据您的环境,您需要在/usr/bin中添加/usr/sbin$PATH

评论


我需要安装什么软件包才能获取fdisk.exe和truncate.exe?

– PythonNut
15年5月28日在17:54

@PythonNut,您好,我在上面更新了我的答案,并添加了所需的软件包:o)

– Nippey
15年5月29日在7:28

如果分区具有磁盘大小(即使使用的磁盘空间较小)怎么办?

– Piegames
17年2月3日在18:21

#2 楼

我知道这是一个老问题,但是我想展示如何在Mac上执行此过程,因为它并不那么容易:fdisk没有-l选项,并且默认情况下未安装truncate

1。步骤1:在Mac OS X上安装truncate:

您需要MacPorts或Homebrew。我使用MacPorts。如果您没有这些,请先安装它们。链接到MacPorts

现在,我们可以安装truncate。打开您的终端,然后键入:

sudo port install truncate


对于Brew安装:

brew install truncate


这应该做到。

2。使用Disk Utilities挂载我们的IMG,以便它对diskutil终端命令可见。

您稍后会看到我们为什么需要此步骤。打开“磁盘工具”应用程序。单击文件(在顶部栏上)->打开磁盘映像,然后选择您的IMG文件。

3。检查IMG的分区大小及其安装位置。

在终端上,键入:

diskutil list


,它应该显示类似最终,在某个地方:

/dev/disk3 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        +16.0 GB    disk3
   1:             Windows_FAT_32 boot                    62.9 MB    disk3s1
   2:                      Linux                         3.9 GB     disk3s2


因此,我们看到大约12GB未被分区。我们需要截断这些。

我们需要此命令的原因是检查磁盘映像的安装位置。就我而言,它位于:/ dev / disk3

4。找出实际的分区大小。

3.9 GB和62.9 MB是不适用于截断的值。我们需要找到以字节为单位的分区大小。

5。运行fdisk。

在终端中,运行以下命令:

   fdisk /dev/diskX


其中X是您在上一步中找到的数字。结果应该是这样的:

         Starting       Ending
 #: id  cyl  hd sec -  cyl  hd sec [     start -       size]
------------------------------------------------------------------------
 1: 0C    0 130   3 -    8  40  32 [      8192 -     122880] Win95 FAT32L
 2: 83    8  40  33 -  478  79  49 [    131072 -    7553024] Linux files*
 3: 00    0   0   0 -    0   0   0 [         0 -          0] unused      
 4: 00    0   0   0 -    0   0   0 [         0 -          0] unused      


6。是时候截断了!

在您的终端上,cd到图像所在的目录。然后,写:

truncate FILE SIZE


FILE当然是您的文件。

SIZE是字节大小。我所做的就是将fdisk命令的size列添加到start列中,并乘以512。因此,在我的情况下,SIZE为:512 *(7553024 + 131072)= 3934257152,大约3.9 GB。

您将需要fdisk显示的最后一个分区的开始和大小。 (不一定是最大的,而是IMG文件末尾的那个)。


我做了一些实验,每当输入7553024 * 512或(7553024
+ 1 )* 512字节,IMG文件已损坏。因此,请确保按照我上面的指示进行操作。它可能会增加实际所需的数量,但这是一个安全的选择。


7。 (可选)轻松测试IMG是否未损坏。

在“磁盘工具”中再次进入,然后尝试像以前一样打开新的IMG文件。如果已安装,您还可以看到新的(较小的)尺寸。如果未安装,则出了点问题。
(也许尝试在truncate命令中增加大小)


这不是最好的测试,但是它是检查新版本是否正确的肯定方法
IMG是否损坏。因此,不要真的指望它,但是值得一试。

评论


好一个!感谢您扩展知识:)好的,您指出512 *(Size + 1)不起作用。如您所见,我使用End而不是Size,因为如果有多个分区,则必须保留两个分区。因此,使用7553024 + 131072(+1)是100%正确!

– Nippey
16年6月13日在6:55

#3 楼

最近的Win32DiskImager实际上具有一个选项,可以仅在磁盘映像中包括分配的分区。一键即可进行修剪。



评论


太好了,这使得在Windows上更加轻松!

– Nippey
18/12/12在14:20

#4 楼

这是我最近注意到的事情,因为我做了很多Win32diskimg操作来备份RPI映像以进行部署。我最近开始测试SD“修整”功能,以清洁SD卡中未用于理论磨损平衡的部件。不确定会产生什么效果,但是有一个副作用是当我对16GB SD分区进行映像,然后使用7zip对其进行压缩时。我从通常的16GB增加到9.5GB,现在变成了2.5GB。现在,我正在测试以确保没有问题,但是使用TRIM将未使用的空间标记为0似乎使图像压缩效率更高(这确实有意义)。只是想报告这一点非常容易完成,没有多个步骤。

评论


虽然没有错,但并不能真正解决问题。

– RalfFriedl
19年4月27日在7:02