末尾包含未分区空间的16Gb卡的图像:截断可能吗?


18

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

我从默认的Debian Weezy 2Gb映像开始,没有进行任何大小调整。
现在,完成操作后,我想创建一个镜像,但是我得到了一个16Gb文件,最后包含14Gb的未分区(非分区和可用 空间空间。

[我使用Windows // Win32DiskImager,因为我现在没有空余时间可以粘贴到rPI中]

我可以直接在分区空间后面截断图像文件,然后将前导部分转移到较小的卡上吗?


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

请仔细阅读我的问题。
Nippey

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

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

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

Answers:


33

我终于找到了可以解释我的问题的资源。

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用的Cygwinfdisk.exetruncate.exe

什么是Cygwin?

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


1
什么包,我需要安装以获得fdisk.exetruncate.exe
PythonNut 2015年

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

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

5

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

1.步骤1:在Mac OS X上安装截断

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

现在,我们可以安装truncate。打开您的终端并输入:

sudo port install truncate

对于Brew安装:

brew install truncate

这应该做。

2.使用Disk Utilities挂载我们的IMG,以便diskutil terminal命令可以看到它。

稍后您将看到我们为什么需要此步骤。打开“磁盘工具”应用程序。单击文件 (在顶部栏上) ->打开磁盘映像,然后选择您的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是字节大小。我所做的就是在命令的size列中添加start列,然后乘以512。因此,在我的情况下,SIZE为:512 *(7553024 + 131072)= 3934257152,大约3.9 GB。fdisk

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

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

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

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

这不是最佳测试,但这是检查新IMG是否损坏的可靠方法。因此,不要指望它,但是值得一试...

我希望有人觉得这有帮助!


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


0

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


虽然没有错,但并不能真正解决问题。
RalfFriedl
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.