如何将 ext4 文件系统从 /dev/sdb 移动到 /dev/sdb1?

如何将 ext4 文件系统从 /dev/sdb 移动到 /dev/sdb1?

不知何故,我在 /dev/sdb 中有一个 ext4 文件系统。我预计它是/dev/sdb1。

我可以手动安装它;我可以访问数据;我可以在/etc/fstab中引用它;等等,但我希望它位于标准分区中。

我不想丢失数据,并且驱动器上没有足够的空间将其复制到另一个分区。这不是很多数据:我总是可以将其移动到外部设备,修复文件系统,然后将其移回来,但现在我很好奇:)

有没有一种方法可以将数据重新映射或移动到 /dev/sdb1 (目前还不存在)?

fdisk 给出以下内容:

$ sudo fdisk /dev/sdb1
fdisk: cannot open /dev/sdb1: No such file or directory

$ sudo fdisk /dev/sdb
Device /dev/sdb already contains a ext4 signature.
The signature will be removed by a write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x4096cdf8.

Command (m for help): p
Disk /dev/sdb: 200GiB, 214748364800 bytes, 419430400 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
Disklabel type: dos
Disk identifier: 0x4096cdf8

是的,这是一个非常小的驱动器!我在 VirtualBox 虚拟机中使用 Debian Stretch。

对 df 的回复:

$ df -h
Filesystem Size  Used  Avail  Use%  Mounted on
/dev/sdb   196G  116G   71G    63%  /media/mymountdir

我知道,正如 @MarkPlotnick 所说,由于我在虚拟机中,所以我可以相当轻松地完成此操作。但我想知道是否有基于 cli 的方法。谢谢!

答案1

在整个磁盘(而不是分区)上写入 ext4(或任何其他)文件系统,但这样做当然意味着没有分区表;您正在使用整个原始设备。

如果您从磁盘启动,这是可能的一个分区表,然后错误地(磁盘信息仍在内存中)将其格式化为 ext4,覆盖分区表(即使用mkfs.ext4 /dev/sdb而不是mkfs.ext4 /dev/sdb1)。结果是磁盘没有有效的分区表(它现在有一个 ext4 开始块),但文件系统独立存储其大小,因此它仍然可以工作(这也在某些外部磁盘上完成)。您可以像安装分区一样安装该设备 - 只需sdb在您本来要使用的地方使用即可sdb1

接下来是有风险就像你可以想象的那样。您应该已经有备份,如果没有,请获取一个现在。另一方面,如果您没有备份,则意味着您对该数据不太感兴趣(这些数据存在硬件故障、软件故障的风险,或者根据具体情况,有咖啡洒出、管道爆裂的风险) 、入室盗窃以及自然和非自然的灾难),所以即使最坏的情况发生,也不会造成太大的危害。

更新: 如果你有空的话做备份,重新格式化并重新安装。与移位方法相同的精确时间,但数据安全性提高 100%。如果您不删除备份副本,您将免费获得更新备份映像。

第一步:调整大小ext4 文件系统,使其缩短一整个磁盘柱面。从分区表中获取柱面大小hdparm,好吧,只是不存在(fdisk 会告诉您扇区总数,而不是它们的组织方式)。在某些外部 USB 驱动程序上,您可能需要尝试读取磁盘品牌和型号,并使用它在 Internet 上搜索信息。 SATA 驱动程序应该没问题。

现在您知道了多少,您可以调整文件系统的大小并将整个分区“向右”移动到磁盘的末尾,从而在开始时释放一个柱面,这是分区表和开始空白空间的位置去(我不太清楚为什么在 LBA 磁盘上 sdX1 应该在分区表之后启动一个柱面 - 或一个磁道,但我从未发现值得尝试)。

要移动分区,您可以使用极其危险的方法缓冲策略或者撤销选项dd_rescue(我似乎看到了一些错误报告,其中据说该选项不起作用)。

您可能想尝试一个较大的文件(例如 1 GB),看看这两个选项是否有效;移动内容,以便将数据从文件开头移动 16 兆字节,使文件大小保持不变;然后检查内容以验证是否发生了这种情况。然后,重复/dev/sdb适当的偏移量。

之后,使用fdisk重新创建分区表。

祝你好运!

答案2

如果您在实际的块设备上创建了文件系统(正如您所看到的那样),fdisk则在您的数据被移动到其他地方之前,该文件系统将不再是您的朋友。您必须挂载文件系统,复制数据,然后卸载它。然后,您可以使用fdisk正确的方式对块设备进行分区,mkfs在分区上使用,安装它,然后将数据移回:

$ sudo -s
# mkdir -p /mnt/export
# mount /dev/sdb /mnt/export
# exit
$ rsync -a /mnt/export/ /path/to/backup/
$ sudo -s
# umount /mnt/export
# fdisk /dev/sdb  # create your partitions
# mount /dev/sdb1 /mnt/export
# exit
$ rsync -za /path/to/backup/ /mnt/export/

答案3

对于虚拟机来说,您已经拥有的配置并不是不合理的。它允许轻松地将更多磁盘添加到您的系统中。

如果您有分区表,请考虑该方法:

  • 管理员增加虚拟机的磁盘分配
  • 您重新扫描虚拟磁盘或重新启动虚拟机
  • 您删除分区条目并以新的较大大小重新创建它
  • 您调整文件系统的大小

如果您的文件系统直接位于没有分区表的磁盘中,则第三步 - 繁琐的一步 - 可以省略。

相关内容