重新分区两个磁盘而不会丢失数据

gra*_*ind 4 scripting linux partition bash hard-drive

我正在一家软件公司实习,但我遇到了一些困难。这是交易:

问题:我们这里有一些盒子被错误地分区为 2 x 500 GB 驱动器。实际驱动器是 2 x 1 TB 驱动器。这些基本上是只使用了一半可用磁盘空间的机器。我的任务是编写一个脚本来重新分区这些驱动器。

迄今为止的解决方案:我有一个脚本可以禁用所有进程并重新启动,然后是另一个修复分区的脚本。问题是数据丢失。

我在寻找什么:我需要一个解决方案来执行此操作但保存所有数据。我的第一个虽然是将分区增加到适当的大小,但我不确定这是否可行。另一种解决方案是将所有数据复制到 Disk2 上,对 Disk1 进行分区,然后将数据移回 Disk1,最后对 Disk2 进行分区。问题是我对 Linux 还很陌生,我真的不知道该怎么做。我可以访问 fdisk 实用程序和 parted 实用程序。

它们都是 ext3 类型。

编辑:11/3/11

好的。所以我在两个磁盘上都有大约 1GB 未使用的未分配空间。我想做如下:

  • SDB上新建一个1GB大小的扩展分区,命名为sdb99,参考这里
  • sda5 sda6 sda7复制到新的SDB分区sdb99
    • 我可以将“/”从每个文件夹复制到这个新分区中的某个文件夹吗?
    • 我需要在这个新分区上放置一个文件系统来复制那里的任何文件吗?
    • 如果我只是复制“/”,会保留整个目录结构吗?
    • 像这样在磁盘之间移动文件是一项简单的任务吗?
  • 删除sda5 sda6 sda7然后用两倍大小重新创建它们
    • 我真的需要删除这些吗?我不认为我可以增长 3 个连续的分区,即使我可以,文件系统也不会增长......对吗?
  • 将数据从sdb99复制回新的sda5 sda6 sda7分区
    • 这应该像将包含所有“/”的那些目录的内容移回一样简单,对吗?
  • sdb5 sdb6 sdb7复制到新的sda5 sda6 sda7到单独的文件夹中。
    • 应该有足够的空间,因为现在可用空间翻了一番……我希望
  • 删除并重新分区SDB
  • 将文件从sdb5 sdb6 sdb7 移SDB

有没有人看到任何明显的问题,有任何指示、警告、建议等?

谢谢大家。同样,这需要编写脚本。谢谢。

编辑 2 这是实际的脚本...

#!/bin/bash

LOG=./repartition.log 

date > $LOG 2>&1

echo "Ok, let's get started." >> $LOG 2>&1

# Resize logical partitons
parted -s /dev/sda resize 4 45GB 2000GB >> $LOG 2>&1
parted -s /dev/sdb resize 4 90GB 2000GB >> $LOG 2>&1

# Create the temporary file systems on disk 2
mke2fs -j /dev/sdb8 >> $LOG 2>&1

# Copy sda6 sda7 sda8 to sdb8
cp -r -L -p /dev/sda6 /dev/sdb8/home/sda6 >> $LOG 2>&1
cp -r -L -p /dev/sda7 /dev/sdb8/home/sda7 >> $LOG 2>&1
cp -r -L -p /dev/sda8 /dev/sdb8/home/sda8 >> $LOG 2>&1

# Remove NBD partitions on disk 1
parted -s /dev/sda rm 8 >> $LOG 2>&1
parted -s /dev/sda rm 7 >> $LOG 2>&1
parted -s /dev/sda rm 6 >> $LOG 2>&1

# Create NBD partitons on disk 1
parted -s /dev/sda mkpart logical 70GB 713GB >> $LOG 2>&1
parted -s /dev/sda mkpart logical 713GB 1356GB >> $LOG 2>&1
parted -s /dev/sda mkpart logical 1356GB 2000GB >> $LOG 2>&1

# Create the file systems on disk 1
mke2fs -j /dev/sda6 >> $LOG 2>&1
mke2fs -j /dev/sda7 >> $LOG 2>&1
mke2fs -j /dev/sda8 >> $LOG 2>&1

# Copy sda6 sda7 sda8 back to sda
cp -r -L -p /dev/sdb8/home/sda6 /dev/sda6 >> $LOG 2>&1
cp -r -L -p /dev/sdb8/home/sda7 /dev/sda7 >> $LOG 2>&1
cp -r -L -p /dev/sdb8/home/sda8 /dev/sda8 >> $LOG 2>&1

# Copy sdb5 sdb6 sdb7 to sda6 sda7 sda8
cp -r -L -p /dev/sdb5 /dev/sda6/home/sdb5 >> $LOG 2>&1
cp -r -L -p /dev/sdb6 /dev/sda7/home/sdb6 >> $LOG 2>&1
cp -r -L -p /dev/sdb7 /dev/sda8/home/sdb7 >> $LOG 2>&1

# Remove NBD partitions on disk 2
parted -s /dev/sdb rm 8 >> $LOG 2>&1
parted -s /dev/sdb rm 7 >> $LOG 2>&1
parted -s /dev/sdb rm 6 >> $LOG 2>&1
parted -s /dev/sdb rm 5 >> $LOG 2>&1

# Create NBD partitons on disk 2
parted -s /dev/sdb mkpart logical 90GB 726GB >> $LOG 2>&1
parted -s /dev/sdb mkpart logical 726GB 1362GB >> $LOG 2>&1
parted -s /dev/sdb mkpart logical 1362GB 2000GB >> $LOG 2>&1

# Create the file systems on disk 2
mke2fs -j /dev/sdb5 >> $LOG 2>&1
mke2fs -j /dev/sdb6 >> $LOG 2>&1
mke2fs -j /dev/sdb7 >> $LOG 2>&1

# Copy sdb5 sdb6 sdb7 back to sdb
cp -r -L -p /dev/sda8/home/sdb7 /dev/sdb7 >> $LOG 2>&1
cp -r -L -p /dev/sda7/home/sdb6 /dev/sdb6 >> $LOG 2>&1
cp -r -L -p /dev/sda6/home/sdb5 /dev/sdb5 >> $LOG 2>&1


rm /etc/init.d/fix_partitions >> $LOG 2>&1
rm /etc/init.d/local/99fix_partitions >> $LOG 2>&1
mv /etc/init.d/local/gca_init.off /etc/init.d/local/99gca_init >> $LOG 2>&1

echo "All set.  Please reboot.  Have a nice day." >> $LOG 2>&1

date >> $LOG 2>&1
reboot >> $LOG 2>&1
Run Code Online (Sandbox Code Playgroud)

Bar*_*rim 6

为什么一定要脚本化?我会用像 RIP(救援是可能的)Linux in X 之类的引导盘重新启动,运行 gparted(一个图形实用程序),然后从那里调整分区大小。Gparted 能够在不损坏的情况下调整分区大小(至少我对 NTFS 没有问题;对 Linux 分区根本不需要这样做)

你应该有数据的备份

如果这是重要的数据而没有备份和使用分区,那就太愚蠢了。或者彻头彻尾的愚蠢,取决于数据的重要性。