Как «растянуть» файловую систему VDS после смены тарифа без потери данных?
Вы сменили тарифный план SSD VDS, а размер файловой системы остался прежним? Попробуем решить эту задачу, изменить таблицу разделов и увеличить размер доступного дискового пространства — конечно, с сохранением всех данных и настроек.
Вначале давайте разберемся, почему так происходит. Наши SSD VDS используют технологию полной виртуализации KVM. Это означает, что VDS представляет собой полноценный сервер — со своим BIOS, видеоадаптером, клавиатурой и, конечно, «жестким диском». Как и любой жесткий диск в представлении компьютера, он имеет свои технические параметры — количество дорожек, головок для считывания данных и т.п. Конечно, в случае с виртуальной машиной эти параметры также виртуальные, но совершенно необходимые для работы операционной системы.
Когда увеличивается размер такого диска, изменяются его параметры — грубо говоря, увеличивается количество доступных секторов для хранения данных. Представьте, что в настоящий HDD-накопитель будет добавлена еще одна «пластина» — металлический диск для хранения данных и после перезагрузки операционная система получит доступ к дополнительному пространству. Однако на таком накопителе операционная система при инсталляции уже создала «разделы» — специальную таблицу, которая хранит информацию о начальном и конечном блоке для хранения данных по каждой файловой системе (для загрузочного /boot, для виртуальной памяти swap, для корневой системы / и проч.). При смене тарифа сам размер диска увеличивается, но параметры разделов остаются прежними. По аналогии с «настоящими» дисками — представьте, что при установке ОС ей выделили только половину диска — вторая часть накопителя останется в неиспользуемом состоянии (т.н. «неразмеченной»). Теперь следует изменить таблицу разделов, а затем сделать изменение размера файловой системы — «растянуть» ее.
Внимание: несмотря на простоту операции, следует действовать внимательно. Указание неправильных значений приведет к ошибке загрузки операционной системы или к повреждению данных. Мы рекомендуем перед проведением изменений сделать резервную копию данных, а ключевые параметры таблицы разделов обязательно сохранить отдельно (например — в текстовом файле на рабочем компьютере) и хранить эти данные до успешного завершения всех манипуляций с диском.
В зависимости от типа дистрибутива могут быть небольшие различия, поэтому мы рассмотрим два варианта. Первый — это Debian, Ubuntu и подобные системы. Особенности для таких ОС — корневая файловая система расположена на extended-разделе, а для корневой файловой системы используется ext4. Запускаем fdisk, указываем наш «жесткий диск» в качестве параметра и выполняем команду print для просмотра текущей таблицы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
root@debian8:~# fdisk /dev/vda Welcome to fdisk (util-linux 2.25.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): print Disk /dev/vda: 19.5 GiB, 20971520000 bytes, 40960000 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: 0x4c9700d5 Device Boot Start End Sectors Size Id Type /dev/vda1 * 2048 194559 192512 94M 83 Linux /dev/vda2 194560 30719999 30525440 14.6G 5 Extended /dev/vda5 196608 30719999 30523392 14.6G 83 Linux Command (m for help): |
Обратите внимание — размер диска 19.5Gb, а суммарно используется 15Gb. Наведем порядок 🙂 Повторяем — скопируйте в отдельный файл или запишите значения Start и End по каждому разделу. Удаляем последовательно разделы 5 и 2:
1 2 3 4 5 6 7 8 9 |
Command (m for help): d Partition number (1,2,5, default 5): 5 Partition 5 has been deleted. Command (m for help): d Partition number (1,2, default 2): 2 Partition 2 has been deleted. |
Не переживайте — данные не будут затронуты. Теперь создаем новый extended раздел и новый linux-раздел:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): e Partition number (2-4, default 2): First sector (194560-40959999, default 194560): Last sector, +sectors or +size{K,M,G,T,P} (194560-40959999, default 40959999): Created a new partition 2 of type 'Extended' and of size 19.4 GiB. Command (m for help): n Partition type p primary (1 primary, 1 extended, 2 free) l logical (numbered from 5) Select (default p): l Adding logical partition 5 First sector (196608-40959999, default 196608): Last sector, +sectors or +size{K,M,G,T,P} (196608-40959999, default 40959999): Created a new partition 5 of type 'Linux' and of size 19.4 GiB. |
Небольшое пояснение — начало раздела и его последний сектор fdisk предлагает автоматически, соглашаемся с предложенными значениями. В ряде случаев начало Linux-раздела fdisk может предлагать с небольшими отличиями стартового сектора. Такое бывает, поэтому прежде, чем сохранить новую таблицу, выполним команду print и посмотрим, как она будет выглядеть:
1 2 3 4 5 6 7 8 9 10 11 12 |
Command (m for help): print Disk /dev/vda: 19.5 GiB, 20971520000 bytes, 40960000 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: 0x4c9700d5 Device Boot Start End Sectors Size Id Type /dev/vda1 * 2048 194559 192512 94M 83 Linux /dev/vda2 194560 40959999 40765440 19.4G 5 Extended /dev/vda5 196608 40959999 40763392 19.4G 83 Linux |
Обратите внимание на начало (Start) разделов vda2 и vda5 — они должны совпадать с теми данными, которые были до корректировки таблицы разделов. Если все в порядке — записываем новые данные с помощью write:
1 2 3 4 5 6 |
Command (m for help): write The partition table has been altered. Calling ioctl() to re-read partition table. Re-reading the partition table failed.: Device or resource busy The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8). |
Мы закончили работу с fdisk. Теперь перезагрузим операционную систему командой reboot и перейдем к «растягиванию» файловой системы ext4. После перезапуска уточним, какая у нас используется файловая система для корневого раздела:
1 2 |
root@debian8:~# mount -v |grep vda5 /dev/vda5 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered) |
Для ext4 используем утилиту resize2fs:
1 2 3 4 5 |
root@debian8:~# resize2fs /dev/vda5 resize2fs 1.42.12 (29-Aug-2014) Filesystem at /dev/vda5 is mounted on /; on-line resizing required old_desc_blocks = 1, new_desc_blocks = 2 The filesystem on /dev/vda5 is now 5095424 (4k) blocks long. |
Готово, наша файловая система теперь использует все доступное дисковое пространство:
1 2 3 |
root@debian8:~# df -h / Filesystem Size Used Avail Use% Mounted on /dev/vda5 20G 1.1G 18G 6% / |
Теперь обратим внимание на второй вариант, который обычно используется в Centos 7 — более простой. По-умолчанию в шаблонах Centos для SSD VDS используется разметка с всего двумя разделами, поэтому удалить и создать нужно только vda2. Ниже — пример изменения размера раздела с 10Gb до 15Gb:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
[root@centos7 ~]# fdisk /dev/vda Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk /dev/vda: 15.7 GB, 15728640000 bytes, 30720000 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 Disk label type: dos Disk identifier: 0x000ada41 Device Boot Start End Blocks Id System /dev/vda1 * 2048 526335 262144 83 Linux /dev/vda2 526336 20479999 9976832 83 Linux Command (m for help): d Partition number (1,2, default 2): 2 Partition 2 is deleted Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p Partition number (2-4, default 2): First sector (526336-30719999, default 526336): Using default value 526336 Last sector, +sectors or +size{K,M,G} (526336-30719999, default 30719999): Using default value 30719999 Partition 2 of type Linux and of size 14.4 GiB is set Command (m for help): p Disk /dev/vda: 15.7 GB, 15728640000 bytes, 30720000 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 Disk label type: dos Disk identifier: 0x000ada41 Device Boot Start End Blocks Id System /dev/vda1 * 2048 526335 262144 83 Linux /dev/vda2 526336 30719999 15096832 83 Linux 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 or after you run partprobe(8) or kpartx(8) Syncing disks. |
Перезагружаем операционную систему с помощью команды reboot. Обратите внимание — Centos 7 использует по-умолчанию xfs в качестве файловой системы:
1 2 |
[root@centos7 ~]# mount -v |grep vda2 /dev/vda2 on / type xfs (rw,relatime,attr2,inode64,noquota) |
Вместо resize2fs используем другую утилиту, xfs_growfs:
1 2 3 4 5 6 7 8 9 10 11 |
[root@centos7 ~]# xfs_growfs / meta-data=/dev/vda2 isize=512 agcount=4, agsize=623552 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=2494208, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 2494208 to 3774208 |
Готово:
1 2 3 |
[root@centos7 ~]# df -h / Filesystem Size Used Avail Use% Mounted on /dev/vda2 15G 1.1G 14G 8% / |
В некоторых случаях fdisk может предложить удалить существующую метку файловой системы (в частности, такое бывает на Debian-подобных системах):
1 2 |
Partition #5 contains a ext4 signature. Do you want to remove the signature? [Y] Yes/[N] No: |
В таком случае удалять сигнатуру не следует. Ответьте no на такой запрос.
Если у вас возникли какие-то вопросы при изменении размера разделов после смены тарифного плана — не спешите записывать изменения и обратитесь в поддержку, мы поможем.
Приятной работы!