изменение раздела ext3 без потери данных


Что нужно, если мы хотим изменить имеющийся раздел, отформатированный в ext3? Ну, во-первых — желание, во-вторых — время, в-третьих — live-cd/dvd с любым Linux.

Для начала, загрузимся в уже имеющуюся систему, на всякий, можно сделать резервную копию самых важных данных. Поднимем привилегии до root.

su -

Все дальнейшие команды мы будем выполнять от «рута». Вот как выглядит список разделов до манипуляций:

df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.5G  4.1G  4.9G  46% /
varrun                 94M  132K   94M   1% /var/run
varlock                94M     0   94M   0% /var/lock
udev                   10M   52K   10M   1% /dev
devshm                 94M     0   94M   0% /dev/shm
lrm                    94M   18M   77M  19% /lib/modules/2.6.17-10-generic/volatile

Раздел, с которым мы будем работать (/dev/sda1) должен быть отмонтирован, поэтому в случае, если это один из системосодержащих разделов, нам потребуется live-cd со следующими интсрументами: fdisk, umount, fsck, tune2fs, e2fsck, resize2fs.

Приступим: В данном примере мы будем уменьшать раздел /dev/sda1, хотя подобным образом его можно и увеличить. Соберем некоторую статистическую информацию о нашем разделе.

df

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1              9859036   4234908   5123304  46% /
varrun                   95480       132     95348   1% /var/run
varlock                  95480         0     95480   0% /var/lock
udev                     10240        52     10188   1% /dev
devshm                   95480         0     95480   0% /dev/shm
lrm                      95480     17580     77900  19% /lib/modules/2.6.17-10-generic/volatile

df -B 4k

Filesystem           4K-blocks      Used Available Use% Mounted on
/dev/sda1              2464759   1058727   1280826  46% /
varrun                   23870        33     23837   1% /var/run
varlock                  23870         0     23870   0% /var/lock
udev                      2560        13      2547   1% /dev
devshm                   23870         0     23870   0% /dev/shm
lrm                      23870      4395     19475  19% /lib/modules/2.6.17-10-generic/volatile

df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.5G  4.1G  4.9G  46% /
varrun                 94M  132K   94M   1% /var/run
varlock                94M     0   94M   0% /var/lock
udev                   10M   52K   10M   1% /dev
devshm                 94M     0   94M   0% /dev/shm
lrm                    94M   18M   77M  19% /lib/modules/2.6.17-10-generic/volatile

fdisk -l


Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        1247    10016496   83  Linux
/dev/sda2            1248        1305      465885    5  Extended
/dev/sda5            1248        1305      465853+  82  Linux swap / Solaris

fdisk -s /dev/sda1

10016496

Перезагрузимся в live-cd и зайдем там под «рутом». Отмонтируем наш раздел, если он оказался смонтированным.

umount /dev/sda1

Проверим его:

fsck -n /dev/sda1

Опция -n позволяет делать проверку без автоисправления найденных ошибок, вместо исправления проверка выведет ошибки на stdout.

Если вывод команды выглядит подобным образом,

fsck 1.38 (30-Jun-2005)
e2fsck 1.38 (30-Jun-2005)
/dev/sda1: clean, 159037/1254176 files, 1095299/2504124 blocks

то все нормально, в противном случае, сделайте проверку без опции -n, а даже лучше с опцией -a.

Отключим журналирование, превратив наш раздел в ext2.

tune2fs -O ^has_journal /dev/sda1

Теперь выполним еще олну проверку. В зависимости от размера раздела, она может занять значительное время, например на разделе в 200ГБ она занимает минут 10-25.

e2fsck -f /dev/sda1

e2fsck 1.38 (30-Jun-2005)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sda1: 164178/1254176 files (0.6% non-contiguous), 1051617/2504124 blocks

На данном этапе мы уменьшим размер раздела. Т.к. resize2fs не поддерживает уменьшение раздела ext3, то мы его преобразовали в ext2. Исходя из df, у нас было использовано около 4ГБ, поэтому уменьшим раздел /dev/sda1 до 6ГБ, чтоб осталось еще свободное место.

resize2fs /dev/sda1 6000M

resize2fs 1.38 (30-Jun-2005)
Resizing the filesystem on /dev/sda1 to 1536000 (4k) blocks.
The filesystem on /dev/sda1 is now 1536000 blocks long.

Пожалуйста обратите внимание на кол-во блоков — 1536000 и их размер — 4k. Эти цифры нам потом пригодятся.

Теперь мы удалим /dev/sda1, не бойтесь, данные останутся нетронутыми. Для удаления воспользуемся утилитой fdisk.

fdisk /dev/sda

#Да, /dev/sda, а не /dev/sda1

The number of cylinders for this disk is set to 1305.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

#Наберем, m, чтобы увидеть список возможных команд:

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partitions system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Удалим раздел номер 1 (/dev/sda1). Если у вас есть список из разделов наподобие (/dev/sda1, /dev/sda2, /dev/sda5, /dev/sda10), то номер соответствует номеру раздела, не смущайтесь тому, что пропущен порядок, номер /dev/sda10 в данном примере равен 10.

Command (m for help): d
Partition number (1-5): 1

Воссоздадим только что удаленный раздел, но уже с другим рамером. Если номер раздела был от 1го до 5ти, то это был первичный раздел, если номер выше 5ти, то это логический раздел. У нас был первичный, поэтому логически будет выбрать опцию p для его создания и номер 1:

Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
p
Partition number (1-4): 1

Вот нам и понадобилась та информация, которую надо было запомнить ранее, чтоб подсчитать номер поледнего цилиндра для новосозданного уменьшенного раздела.

Чтоб получить необходимое значение, мы умножаем кол-во блоков, число, полученное при выводе resize2fs на кол-во размера блока и на 3% для предосторожности. 1536000 * 4k * 1.03 = 6328320k Преобразовав букву k в K и добавив + в начало, на запрос fdisk мы введем:

Last cylinder or +size or +sizeM or +sizeK (1-1247, default 1247): +6328320K

Наш подопытный раздел имел загрузочный флаг, поэтому зададим и его:

Command (m for help): a
Partition number (1-5): 1
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.

Мы записали изменения в таблицу разделов, но чтоб они вступили в силу, нужна перезагрузка, загрузимся опять в live-cd.

reboot

Отмонтируем /dev/sda1 и проверим, чтоб все было нормально:

umount /dev/sda1
umount: /dev/sda1: not mounted

fsck -n /dev/sda1
fsck 1.38 (30-Jun-2005)
e2fsck 1.38 (30-Jun-2005)
/dev/sda1: clean, 159036/765536 files, 1047239/1536000 blocks

Всё прошло без ошибок, как и должно быть. Активируем журналирование и перезагрузимся:

tune2fs -j /dev/sda1

tune2fs 1.38 (30-Jun-2005)
Creating journal inode: done
This filesystem will be automatically checked every 30 mounts or
0 days, whichever comes first. Use tune2fs -c or -i to override.

reboot

В загруженной системе выполним последние проверки и убедимся, что никакие данные не потерялись:

df

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1              6047868   4224140   1639408  73% /
varrun                   95480       132     95348   1% /var/run
varlock                  95480         0     95480   0% /var/lock
udev                     10240        52     10188   1% /dev
devshm                   95480         0     95480   0% /dev/shm
lrm                      95480     17580     77900  19% /lib/modules/2.6.17-10-generic/volatile

df -B 4k

Filesystem           4K-blocks      Used Available Use% Mounted on
/dev/sda1              1511967   1056035    409852  73% /
varrun                   23870        33     23837   1% /var/run
varlock                  23870         0     23870   0% /var/lock
udev                      2560        13      2547   1% /dev
devshm                   23870         0     23870   0% /dev/shm
lrm                      23870      4395     19475  19% /lib/modules/2.6.17-10-generic/volatile

df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             5.8G  4.1G  1.6G  73% /
varrun                 94M  132K   94M   1% /var/run
varlock                94M     0   94M   0% /var/lock
udev                   10M   52K   10M   1% /dev
devshm                 94M     0   94M   0% /dev/shm
lrm                    94M   18M   77M  19% /lib/modules/2.6.17-10-generic/volatile

fdisk -l


Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         789     6337611   83  Linux
/dev/sda2            1248        1305      465885    5  Extended
/dev/sda5            1248        1305      465853+  82  Linux swap / Solaris

fdisk -s /dev/sda1

6337611

По материалам: http://www.howtoforge.com/linux_resizing_ext3_partitions

comments powered by Disqus