Со временем потребности человека меняются, а вместе с ними меняется и содержимое жесткого диска. Когда-то давно установленный Windows впоследствии был удален, а на его месте создан раздел для Linux. Установленные «на посмотреть» Linux-дистрибутивы исчезли, освободив место под новые данные. Осталась только похожая на кашу таблица разделов, которую придется исправлять, чтобы окончательно не запутаться в именах разделов и точках монтирования.

В этой статье мы рассмотрим способы решения некоторых дисковых проблем, с которыми рано или поздно сталкивается каждый линуксоид. Прочитав ее, ты узнаешь, как изменять размер разделов, пользуясь только стандартными Linux-утилитами, как объединить несколько разделов в один без переноса или потери информации, как скопировать операционку на другой жесткий диск и подготовить Linux к работе с дисками, размер секторов которых равен 4 Кб.

 

Изменение размера разделов

Представим себе такую ситуацию: на диске имеется два расширенных раздела, каждый из которых разбит на три подраздела: swap, раздел, содержащий Linux, и раздел /home. Это два Linux-дистрибутива, установленные рядом друг с другом. Сразу за ними идет раздел для данных. Однажды ты понимаешь, что второй Linux-дистрибутив тебе не нужен, и решаешь удалить второй расширенный раздел. На его месте остается свободное пространство, и теперь у тебя есть две возможности его утилизировать: создать дополнительный раздел для данных, что будет совсем не красиво, потому как один такой раздел уже есть, или же изменить размер /home-раздела первого дистрибутива так, чтобы он занял освободившееся пространство и таким образом сохранить простоту и очевидность разметки диска. О том, как это сделать, мы поговорим ниже.

Есть как минимум три способа изменить размер раздела: воспользоваться графической утилитой gparted, консольной утилитой parted, либо сделать все руками. Первый способ слишком прост, чтобы рассматривать его подробно, а вот вторые два заслуживают особого внимания. Для начала рассмотрим вариант с parted. Перво-наперво установим утилиту:

$ sudo apt-get install parted

Далее переходим в однопользовательский режим и размонтируем раздел /home:

$ sudo telinit 1
# umount /home

Если вместо /home ты собираешься изменять размер корневого раздела Linux или какого-либо другого системного раздела, то тебе придется загрузиться с LiveCD с предустановленным parted. SystemRescueCD (www.sysresccd.org, периодически мы выкладываем его на DVD) хорошо подойдет на эту роль. Далее запускаем parted от имени администратора:

$ sudo parted /dev/sda

Набираем команду print, которая должна вывести список имеющихся разделов. Находим среди них нужный и запоминаем его номер (первый столбец), а также адрес начала раздела, расположенного сразу после освобожденного раздела (в нашем случае это раздел с данными, адрес записан в гигабайтах, например, 62,9GB). Далее вводим команду «resize номер_раздела». На вопрос «Start» отвечаем нажатием <Enter>, на вопрос «End» вводим адрес, чуть меньший адреса раздела с данными (например, 62,8GB). После окончания процедуры набираем «quit» и перезагружаем машину.

Все то же самое можно проделать вручную. Это может быть полезным, когда требуется изменить размер системного раздела, а под рукой есть только обычный LiveCD без утилиты parted на борту. В этом случае сойдут стандартные утилиты fdisk и resize2fs из пакета e2fsprogs (для файловых систем Ext2, Ext3 и Ext4). Загружаемся с LiveCD, смотрим таблицу разделов:

# fdisk -l

Запоминаем номер первого цилиндра раздела /home. Чтобы изменение размера ФС прошло успешно, она не должна содержать ошибок, поэтому запускаем fsck на разделе /home (здесь и далее его имя будет /dev/sda7)

# fsck -n /dev/sda7

Теперь нам надо удалить раздел /dev/sda7 и создать на его месте раздел большего размера, который будет занимать также и освобожденную ранее область. Для этого запускаем fdisk:

# fdisk /dev/sda

В ответ на приглашение к вводу пишем команду 'd' (удаление раздела) и вводим номер раздела (/dev/sda7 = номер 7). Далее создаем новый логический раздел с помощью команды 'n', вслед за которой пишем 'l' (логический раздел). В ответ на приглашение к вводу первого цилиндра указываем номер, полученный ранее с помощью команды «fdisk -l». В ответ на приглашение к вводу последнего цилиндра жмем <Enter> (по умолчанию fdisk делает новый раздел максимально возможного размера, так что он займет и освобожденную ранее область). Вводим команду 'p', чтобы проверить правильность новой таблицы разделов, и записываем изменения с помощью команды 'w'. Перезагружаем комп и вновь грузимся с LiveCD. Производим проверку файловой системы:

# fsck -f /dev/sda7

Запускаем утилиту resize2fs без аргументов, чтобы она автоматически сделала размер файловой системы равным размеру нового раздела:

# resize2fs /dev/sda7

Запускаем контрольную проверку ФС и перезагружаемся:

# fsck -n /dev/sda7
# reboot

 

Объединение разделов

Прием с изменением размера раздела хорошо подходит для объединения двух соседних разделов в один. Если файловые системы разделов заняты менее чем наполовину, мы можем просто перенести информацию из одного раздела в другой, удалить освобожденный раздел и расширить оставшийся так, чтобы он занял пространство освобожденного. Однако такой прием не пройдет, если оба раздела заполнены под завязку, а возможности перенести данные на другой диск или носитель нет. В этом случае тебя спасут специальные оверлейные файловые системы, позволяющие виртуально объединять файловые системы и монтировать их обе к одному каталогу.

Всего для Linux существует как минимум три подобные ФС: unionfs, aufs2 и mhddfs. Первые две включены в ядро и, по сути, являются разными реализациями одного и того же механизма, причем aufs2 в силу своей продвинутости и стабильности считается более предпочтительным вариантом. ФС mhddfs (Multi-HDD FileSystem, mhddfs.uvw.ru) – fuse-реализация той же идеи, обладающая приятной вкусностью в виде автоматического перемещения растущего файла во второй раздел в случае, если место на первом заканчивается.
Какую из них использовать – решать тебе, я же просто покажу, как пользоваться каждой из них. Предположим, у тебя есть три раздела и большая коллекция музыки, которую необходимо распределить между ними (не влазит она в один или два раздела). Разделы примонтированы к каталогам /mnt/disk1, /mnt/disk2 и /mnt/disk3, в каждом из них заблаговременно создан каталог Music.

Задача: объединить все три каталога и смонтировать их к каталогу /home/vasya/Music. С помощью unionfs эта задача решается так:

$ sudo mount -t unionfs -o dirs=/mnt/disk1/Music=rw:/mnt/disk2/Music=rw:/mnt/disk3/Music unionfs /home/vasya/Music

С помощью aufs2 – так:

$ sudo mount -t aufs none /home/vasya/Music -o br:/mnt/disk1/Music=rw:/mnt/disk2/Music=rw:/mnt/disk3/Music=rw,create=mfs,sum

А с помощью mhddfs – вот так:

$ sudo apt-get install mhddfs
$ sudo mhddfs /mnt/disk1/Music,/mnt/disk2/Music,/mnt/disk3/Music /home/vasya/Music -o mlimit=10G

В первом случае новые данные будут записываться в первую очередь в раздел, каталог которого указан первым, и только после заполнения раздела начнут писаться в следующий. Во втором (благодаря опции mfs) для записи будет всегда выбираться каталог, расположенный в разделе с наибольшим свободным пространством. В третьем случае сначала будет выбран каталог, расположенный на разделе с более чем 10 Гб свободного пространства, и если таковой найден не будет, запись пойдет на раздел с наибольшим свободным пространством. Чтобы не набирать все это руками после каждой загрузки, можно добавить запись в /etc/fstab:

none /home/vasya/Music aufs br:/mnt/disk1/Music=rw:/mnt/disk2/Music=rw:/mnt/disk3/Music,create=mfs,sum 0 0

 

Клонирование и перенос данных

С изменениями и объединениями разделов разобрались, но что делать, если ты купил новый хард и хочешь перенести имеющиеся ОС и данные на него? На самом деле все просто, Linux – гибкая ОС, которую достаточно легко перенести на другой диск. И способов сделать это есть как минимум два: вручную перенести файлы ОС на другой диск, либо скопировать весь жесткий диск/раздел (что удобно при клонировании одной инсталляции на множество машин).

Рассмотрим первый способ, взяв за основу дистрибутив Ubuntu 10.10. Чтобы скопировать его на другой диск, не нужно ничего, кроме диска и набора стандартных утилит командной строки. Вот пошаговое описание всей операции:

1. Подцепляем второй жесткий диск к компу и загружаемся с LiveCD.

2. Определяемся с разделами, которые следует перенести. Обычно Ubuntu установлен либо в один раздел (плюс swap), либо в два: корень и раздел /home. Создаем на новом диске те же разделы (с помощью cfdisk или gparted это сделать легко) и swap. Не забываем сделать корневой раздел загрузочным.

3. Создаем точки монтирования и подключаем к ним разделы старого и нового дисков (/dev/sda – старый диск, /dev/sdb – новый):

# mkdir /mnt/{root1,root2,home1,home2}
# mount /dev/sda1 /mnt/root1
# mount /dev/sdb1 /mnt/root2
# mount /dev/sda2 /mnt/home1
# mount /dev/sdb2 /mnt/home2

В командах монтирования подставляем нужные номера разделов.

4. Копируем файлы на новый диск:

# cp -ax /mnt/root1/* /mnt/root2
# cp -ax /mnt/home1/* /mnt/home2

5. Далее выполняем chroot в каталог /mnt/root2, исправляем /mnt/root2/etc/fstab и устанавливаем grub. Но чтобы сделать это, следует смонтировать каталоги /dev и /proc к /mnt/root2:

# mount --bind /dev /mnt/root2/dev
# mount --bind /proc /mnt/root2/proc

6. Переходим в песочницу (chroot /mnt/root2) и редактируем /etc/fstab:

# vi /etc/fstab

/dev/sda1 / ext4 errors=remount-ro 0 1
/dev/sda2 /home ext4 defaults 0 2
/dev/sda3 none swap sw 0 0

Указываем нужные имена разделов вместо /dev/sda1, /dev/sda2 и /dev/sda3. Не забываем, что если мы собираемся поставить новый диск на место старого, то его имя будет /dev/sda (а не /dev/sdb, как сейчас).

7. Устанавливаем grub (все описанное актуально только для grub2):

# grub-mkdevicemap
# grub-mkconfig > /boot/grub/grub.cfg
# sudo grub-install /dev/sdb

8. Командой exit выходим из chroot, выключаем машину, вынимаем старый диск, ставим на его место новый, включаем машину.

Так называемое клонирование диска, когда вместо отдельных файлов на новый диск переносится образ всего диска или раздела, сделать гораздо проще. Для этого можно использовать штатную утилиту dd:

# dd if=/dev/sda of=/dev/sdb bs=4k

Однако проблема этого подхода в том, что если размер нового диска будет больше старого, все дополнительные гигабайты пространства окажутся потерянными, и тогда придется либо увеличивать размер последнего раздела диска, либо создавать на свободном пространстве новый раздел. Тем не менее, dd очень удобна при клонировании установок ОС на множество машин.

 

Проблема 2010

В начале года на рынках нашей страны появились первые жесткие диски компании Western Digital, размер сектора которых был увеличен с привычных 512 байт до 4 Кб (так называемая технология Advanced Format). По заявлению компании, новые диски обладают более высокой скоростью работы, большей емкостью при меньших затратах на производство и полностью совместимы со старыми компами. Однако оказалось, что, будучи отформатированными в Linux, BSD или WinXP/Win2k3, новые диски оказывались не только совсем не шустрыми, но и поразительно медленными (при записи наблюдалась 3-х/4-х кратная потеря скорости).

Сама WD предлагает два решения этой проблемы: либо воспользоваться Windows-утилитой WD Align, которая сдвинет начало первого раздела на один 512 байтный сектор (чтобы адрес начала ФС совпадал с адресом начала девятого сектора) и заодно выполнит выравнивание всех остальных имеющихся разделов; либо установить перемычку на седьмой и восьмой конты диска, что приведет к виртуальному сдвигу всех 512-байтных секторов на один вперед, что решит проблему с первым разделом, но оставит ее нерешенной для всех остальных.

Нам, пользователям Linux, ни тот, ни другой вариант не подходит, поэтому придется обходиться своими силами. К счастью, ничего сложного в процессе выравнивания разделов нет, и ниже я покажу, как это правильно сделать с помощью стандартного cfdisk.
Начало первого основного раздела довольно просто расположить в 64 секторе. Для этого запускаем fdisk с опцией '-u':

# fdisk -u /dev/sdb

Вводим команду 'n' (новый раздел), далее 'p' (основной раздел), затем '1' (первый раздел), на вопрос о начале первого сектора вводим 64, в качестве последнего сектора вводим желаемый размер раздела в секторах (его можно вычислить, разделив размер раздела в байтах на 512). Записываем таблицу разделов с помощью команды 'w'. Далее раздел можно отформатировать и подключить:

# mkfs.ext4 /dev/sdb1
# mount /dev/sdb1 /mnt

Все остальные основные разделы диска также необходимо выравнивать с помощью выбора начального сектора так, чтобы его номер был кратен восьми. Задачу можно упростить, если при создании каждого раздела высчитывать номер его последнего сектора так, чтобы его номер был кратен восьми, и вычитать единицу. Тогда следующий раздел по умолчанию получит правильный номер начального сектора.

С расширенными разделами все намного сложнее. Каждый расширенный раздел может содержать до четырех подразделов, начало первого из которых также по умолчанию располагается в 63 секторе (здесь дело не в оптимизации, введенной в обращение более 20 лет назад, а в том, что расширенный раздел был придуман для эмуляции физического диска). Поэтому сначала придется создать расширенный раздел с начальным сектором, кратным восьми, а затем создавать все его внутренние разделы с начальным сектором также кратным восьми. Здесь низкоуровневый cfdisk становится слишком опасным инструментом, поэтому лучше воспользоваться программой parted с опцией "--align optimal", благодаря которой все создаваемые разделы будут располагаться в правильных секторах.

 

Выводы

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

 

Изменение размера NTFS-раздела

1. Устанавливаем ntfsprogs:

$ sudo apt-get install ntfsprogs

2. Размонтируем NTFS-раздел:

$ sudo umount /dev/sda1

3. Изменяем размер:

$ sudo ntfsresize -s 10000M /dev/sda1

4. С помощью fdisk удаляем NTFS-раздел и создаем новый размером 10000 Мб;

5. Перезагружаемся в Windows и даем ей возможность выполнить проверку ФС.

 

Клонирование диска на другую машину подручными средствами

На машине-источнике выполняем:

# dd if=/dev/sda bs=4k | netcat < IP-машины-приемника > 1234

На машине-приемнике:

# netcat -l -p 1234 | dd of=/dev/sdb bs=4k

 

Уменьшаем размер образа dd

Ты можешь существенно уменьшить размер архива с образом раздела, сделанным dd, если предварительно забьешь его нулями (вторая команда должна привести к исчерпанию пространства на ФС, это нормально):

# mount /dev/sda1 /mnt
# dd if=/dev/zero of=/mnt/zero bs=4k
# rm -f /mnt/zero

 

INFO

Во время переноса ФС на другой диск вместо имен разделов в fstab можно указать и принятые в Ubuntu UUID, которые можно узнать с помощью команды blkid:

$ sudo blkid /dev/sda1

Прогресс копирования dd можно узнать, набрав в соседнем терминале команду:

$ sudo watch -n60 killall -SIGUSR1 dd

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии