UMGUM.COM 

Расширение раздела и файловой системы NTFS ( Увеличение объёма раздела виртуального диска и размещённой на нём файловой системы NTFS до произвольного размера. )

7 ноября 2012  (обновлено 31 января 2015)

OS: Linux Debian Lenny/Squeeze/Wheezy.

Задача: расширение до произвольного допустимого размера существующего раздела виртуального диска, с размещённой на разделе файловой системой (в примере: NTFS) и последующим расширением на увеличившийся раздел файловой системы, как таковой. Особое условие: всё это требуется проделать не выходя из операционной системы Linux Debian, используемой в качестве среды для виртуализации.

В предыдущей заметке я описывал способ увеличения размера виртуального "жёсткого диска" формата RAW ("сырой", полностью соответствующий формату отображения данных на физическом дисковом носителе) до требуемого произвольного. Ничего сложного - требуется лишь особая аккуратность в обозначении границы, с которой производится наращение объёма (важно не затереть данные на исходном диске). Теперь пройдём следующие два этапа, каждый из которых требует всё большей и большей сосредоточенности.

Первый этап:

Удалим данные разметки исходного раздела;
Создадим новый раздел, начинающийся с того же места, что исходный, а заканчивающийся там, где нам будет угодно;
Вернём вновь созданному разделу сопутствующие метки: идентификатор файловой системы и флаг раздела поддерживающего загрузку с него операционной системы.

Второй этап:

Смонтируем целевой раздел виртуального диска как виртуальное блочное устройство (промежуточный шаг, дополняющий недостающую функциональность утилит пакета ntfsprogs);
Расширим файловую систему NTFS, имеющуюся на целевом разделе, до максимально возможного размера.

Итак, далее поэтапно.


Подключим в виде "loopback"-устройства целевой виртуальный диск:

# losetup /dev/loop0 ./target.raw

Проверим, успешно ли отработана команда:

# losetup /dev/loop0

/dev/loop0: .... (./target.raw)

Запустим утилиту разметки дисковых устройств, указав в качестве целевого наше "loopback"-устройство:

# fdisk -u /dev/loop0

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c').

Disk /dev/loop0: 300.7 GB, 300651811840 bytes
255 heads, 63 sectors/track, 36552 cylinders, total 587210570 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

      Device Boot  Start        End     Blocks   Id  System
/dev/loop0p1   *      63  377495369  188747653+   7  HPFS/NTFS

Особое внимание обращаю на управляющие ключи, с которыми запущена утилита fdisk. Мы видим, что при запуске таковой нас первым делом предупреждают о желательности отключения устаревшего формата разметки "DOS-compatible", который подразумевает начало разметки с сектора #63. В наше время принято (не будем здесь о причинах) начинать разметку с сектора номером не ниже #2048. Сейчас мы не вольны выбирать, с какого сектора начинать разметку, нам необходимо сдвинуть конец раздела, а не его начало (что невозможно без перемещения данных, записанных в начале диска). Потому, если целевой виртуальный диск размечен "по старому", то запускаем fdisk в режиме совместимости с DOS-разметкой (используя лишь ключ "-u", указывающий на выбор единицы измерения объёма в виде "сектора"), а если целевой диск размечен "по новому", то добавляем желаемый разработчиками утилиты ключик "-c", отключающий режим совместимости с DOS-разметкой. К чему я всё это так подробно излагаю? Да к тому, что если вы удалите раздел, начинающийся с сектора #63, в утилите fdisk, запущенной в режиме отключенной совместимости с DOS-разметкой, то вы не сможете воссоздать в ней раздел, начинающийся с сектора, номером ниже чем #2048. Это не трагедия - можно перезапустить утилиту с новыми параметрами, но лучше нервы себе зазря не трепать, зная причины и методы.

Нам необходимо растянуть раздел на всё доступное дисковое пространство. Думаю, что лучше не использовать буквально всё доступное пространство, а оставить один или два сектора для реализации "права на ошибку". Мы имеем раздел, начинающийся с сектора #63 и заканчивающийся сектором #377495369, на диске, последний сектор которого #587210570. Не особо мудрствуя, можно удалить исходный раздел и создать новый, начинающийся там же, а заканчивающийся сектором #587210569.

Удаляем раздел за номером "1":

Command: d
Selected partition 1

Создаём новый раздел с заданными параметрами:

Command: n
Command action
  e  extended
  p  primary partition (1-4)
p
Partition number (1-4): 1
First sector (63-587210569, default 63):
Using default value 63
Last sector, +sectors or +size{K,M,G} (63-587210569, default 587210569):
Using default value 587210569

Просматриваем результат наших действий:

Command: p
Disk /dev/loop0: 300.7 GB, 300651811840 bytes
....

      Device Boot  Start        End     Blocks   Id  System
/dev/loop0p1          63  587210569  293605253+  83  Linux

Если разметили не так, как задумывалось (ошиблись, бывает) - просто удаляем раздел и размечаем заново. Процедуры разметки никак не влияют на данные, размещённые на диске как таковом. Таблица разметки хранится отдельно от данных, и "раздел" - не более чем запись в этой таблице о блоке данных, условно ограниченном адресами начала и конца таковых, в единицах измерения устройства хранения данных. В общем, переразмечать диск можно сколько угодно, не опасаясь потерять данные - главное, не потерять связь с их реальным расположением и не допустить записи данных в область хранения таковых после завершения некорректной разметки.

Для каждого вновь создаваемого средствами fdisk раздела (первичного или логического) по умолчанию устанавливается идентификатор типа предположительно размещённой на нём файловой системы "Linux native" (83 в шестнадцатеричном исчислении). Кроме того, на вновь созданном разделе отсутствует "загрузочная" метка. Это нужно исправить.

Делается это командой "t", после чего запрашивается номер раздела, тип которого должен быть изменен, а затем — идентификатор желаемого типа. Полный список поддерживаемых типов файловых систем (и их идентификаторов) можно вывести командой "l". Напомню, что идентификатор типа файловой системы раздела практически никак не связан с файловой системой, которая там размещается - это лишь подсказка разного рода утилитам, о том, что искать на разделе. Например, на разделе "Linux native", как это подчеркивает название, можно создать любую файловую систему из числа тех, которые поддерживаются Linux (ext2/ext3/ext4, XFS, ReiserFS, JFS, btrfs, NILFS2, ....):

Command: l
....
5  Extended
6  FAT16
7  HPFS/NTFS
8  AIX
9  AIX bootable
....
Command: t
Selected partition 1
Hex code (type L to list codes): 7
Changed system type of partition 1 to 7 (HPFS/NTFS)

Ставим на раздел "загрузочную" метку:

Command: a
Partition number (1-4): 1

Перепроверяем результат и сохраняем разметку:

Command: p
Disk /dev/loop0: 300.7 GB, 300651811840 bytes
....

      Device Boot  Start        End     Blocks   Id  System
/dev/loop0p1   *      63  587210569  293605253+   7  HPFS/NTFS

Command:  w
The partition table has been altered!

Syncing disks.

Отключаем наше "loopback"-устройство, высвобождая целевой виртуальный диск:

# losetup --detach /dev/loop0

Даём системе указания записать на диски всё, что ждёт своего времени в буферах (на всякий случай):

# sync; sync

Вторым этапом нам предстоит расширить имеющуюся на целевом разделе файловую систему NTFS на всё доступное пространство.

Чудесно, что в Linux можно работать с самыми разными файловыми системами. NTFS - не исключение. Установим соответствующий пакет приложений:

# aptitude install ntfsprogs

Утилиты пакета ntfsprogs, как и утилита fdisk не умеют пока работать с файлами, используемыми в роли блочных устройств (в отличии от утилиты parted, например). Потому подключим целевой раздел в виде "loopback"-устройства. Важно правильно определить начало и конец раздела, чтобы не зацепить лишнего и не уничтожить данных других разделов.

В нашем случае раздел начинается с сектора за номером #63, а заканчивается сектором за номером #587210569. Единицы измерения утилиты losetup - байты, значит следует пересчитать "секторы" в "байты". Размер сектора нашего устройства равен 512-ти байтам. Считаем:

offset: 63 * 512 = 32256
sizelimit: 587210569 - 63 + 1 = 587210507 * 512 = 300651779584 (один сектор прибавляем с учётом того, что начало и конец раздела указаны в секторах включительно)

Подключаем целевой раздел в виде "loopback"-устройства, указывая смещение от начала диска и объём данных раздела:

# losetup --offset 32256 --sizelimit 300651779584 /dev/loop0 ./target.raw

Проверим, успешно ли отработана команда:

# losetup /dev/loop0

/dev/loop0: .... (./target.raw), offset 32256, sizelimit 300651779584

Прежде всего удостоверимся, что целевая файловая система корректно распознаётся:

# ntfsresize --info /dev/loop0

....
Device name        : /dev/loop0
NTFS volume version: 3.1
Cluster size       : 4096 bytes
Current volume size: 193273491968 bytes (193274 MB)
Current device size: 300651779584 bytes (300652 MB)
Checking filesystem consistency ...
100.00 percent completed
Accounting clusters ...
Space in use       : 122056 MB (63.2%)
Collecting resizing constraints ...
You might resize at 122055872512 bytes or 122056 MB (freeing 71218 MB).
Please make a test run using both the -n and -s options before real resizing!

Судя по выводу утилиты ntfsresize всё отлично распозналось. Мы видим, что на данный момент файловая система занимает 63.2% от общего объёма раздела. Наша задача растянуть файловую систему на всё доступное пространство устройства - на 300651779584 байт. Даём соответствующую команду, пока запуская её в тестовом режиме:

# ntfsresize --size 300651779584 --no-action /dev/loop0

....
Current volume size: 193273491968 bytes (193274 MB)
Current device size: 300651779584 bytes (300652 MB)
New volume size    : 300651774464 bytes (300652 MB)
....
Collecting resizing constraints ...
Schedule chkdsk for NTFS consistency check at Windows boot time ...
Resetting $LogFile ... (this might take a while)
Updating $BadClust file ...
Updating $Bitmap file ...
Updating Boot record ...
The read-only test run ended successfully.

Тест успешно пройден, теперь непосредственно преобразование:

# ntfsresize --size 300651779584 /dev/loop0

....
Current volume size: 193273491968 bytes (193274 MB)
Current device size: 300651779584 bytes (300652 MB)
New volume size    : 300651774464 bytes (300652 MB)
....
WARNING: Every sanity check passed and only the dangerous operations left.
Make sure that important data has been backed up! Power outage or computer
crash may result major data loss!
Are you sure you want to proceed (y/[n])? y
Schedule chkdsk for NTFS consistency check at Windows boot time ...
Resetting $LogFile ... (this might take a while)
Updating $BadClust file ...
Updating $Bitmap file ...
Updating Boot record ...
Syncing device ...
Successfully resized NTFS on device '/dev/loop0'.

Отключаем наше "loopback"-устройство, высвобождая целевой виртуальный диск:

# losetup --detach /dev/loop0

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

# sync; sync

На этом всё. Во время первого запуска операционная система обнаружит метку о необходимости провести проверку целостности (установленную утилитой ntfsresize) и займётся таковой. Не препятствуйте ей в этом. На эту тему единственная в заметке картинка:

размер: 320 400 640 800 1024 1280
Этап проверки целостности файловой системы при запуске ОС "MS Windows Server 2003".
Этап проверки целостности файловой системы при запуске ОС "MS Windows Server 2003".


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )