不知何故,我在 /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
对于虚拟机来说,您已经拥有的配置并不是不合理的。它允许轻松地将更多磁盘添加到您的系统中。
如果您有分区表,请考虑该方法:
- 管理员增加虚拟机的磁盘分配
- 您重新扫描虚拟磁盘或重新启动虚拟机
- 您删除分区条目并以新的较大大小重新创建它
- 您调整文件系统的大小
如果您的文件系统直接位于没有分区表的磁盘中,则第三步 - 繁琐的一步 - 可以省略。