Как изменить размер раздела ext4 из командной строки?

Как изменить размер раздела ext4 из командной строки?

Какой самый простой способ изменить размер раздела ext4 (или раздела любого типа в зависимости от метода) из командной строки (потенциально с наименьшим количеством команд, но и самый простой для понимания)?

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

Под разделом я подразумеваю простой раздел на одном диске персонального компьютера (например, на ноутбуке). Например, я хочу изменить размер /dev/sda4. Никаких RAID, нет больше одного диска, ничего сложного здесь нет. Просто простой раздел на одном диске (/dev/sdaX на /dev/sda).

решение1

Вы можете использовать fdiskдля изменения таблицы разделов во время работы. См.Изменение размера файловой системы ext4 в реальном времени в Linux (наМолчание кодаблог):

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

...

Во-первых: увеличьте размер диска.

В ESXi это просто, просто увеличьте размер виртуального диска. Теперь у вас есть больший жесткий диск, но вам все еще нужно а) увеличить размер раздела и б) изменить размер файловой системы.

Во-вторых: увеличьте размер раздела.

Вы можете использовать fdiskдля изменения таблицы разделов во время работы. Стандартная установка Ubuntu создала 3 раздела: один основной (sda1), один расширенный (sda2) с одним логическим разделом (sda5) в нем. Расширенный раздел просто используется для подкачки, поэтому я мог легко переместить его без потери данных.

  1. Удалить основной раздел

  2. Удалить расширенный раздел

  3. Создайте новый основной раздел, начинающийся с того же сектора, что и исходный, только большего размера (оставьте часть для подкачки)

  4. Создайте новый расширенный раздел с логическим разделом внутри для хранения пространства подкачки.

    me@ubuntu:~$ sudo fdisk /dev/sda
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 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 identifier: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048   192940031    96468992   83  Linux
    /dev/sda2       192942078   209713151     8385537    5  Extended
    /dev/sda5       192942080   209713151     8385536   82  Linux swap / Solaris
    
    Command (m for help): d
    Partition number (1-5): 1
    
    Command (m for help): d
    Partition number (1-5): 2
    
    Command (m for help): n
    Partition type:
       p   primary (0 primary, 0 extended, 4 free)
       e   extended
    Select (default p): p
    Partition number (1-4, default 1):
    Using default value 1
    First sector (2048-524287999, default 2048):
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-524287999, default 524287999): 507516925
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 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 identifier: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1            2048   507516925   253757439   83  Linux
    
    Command (m for help): n
    Partition type:
       p   primary (1 primary, 0 extended, 3 free)
       e   extended
    Select (default p): e
    Partition number (1-4, default 2): 2
    First sector (507516926-524287999, default 507516926):
    Using default value 507516926
    Last sector, +sectors or +size{K,M,G} (507516926-524287999, default 524287999):
    Using default value 524287999
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 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 identifier: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1            2048   507516925   253757439   83  Linux
    /dev/sda2       507516926   524287999     8385537    5  Extended
    
    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 (507518974-524287999, default 507518974):
    Using default value 507518974
    Last sector, +sectors or +size{K,M,G} (507518974-524287999, default 524287999):
    Using default value 524287999
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 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 identifier: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1            2048   507516925   253757439   83  Linux
    /dev/sda2       507516926   524287999     8385537    5  Extended
    /dev/sda5       507518974   524287999     8384513   83  Linux
    
    Command (m for help): t
    Partition number (1-5): 5
    
    Hex code (type L to list codes): 82
    Changed system type of partition 5 to 82 (Linux swap / Solaris)
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 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 identifier: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1            2048   507516925   253757439   83  Linux
    /dev/sda2       507516926   524287999     8385537    5  Extended
    /dev/sda5       507518974   524287999     8384513   82  Linux swap / Solaris
    
    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.
    
    me@ubuntu:~$ sudo reboot 
    

Я потом заметил, что не установил флаг загрузки, но, видимо,тебе это на самом деле не нужно.

Третье: Расширьте файловую систему.

Это можно сделать в resize2fsрежиме онлайн на смонтированном разделе.

me@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        91G   86G   12M 100% /
udev            3.9G  4.0K  3.9G   1% /dev
tmpfs           1.6G  696K  1.6G   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            3.9G  144K  3.9G   1% /run/shm
none            100M   16K  100M   1% /run/user

me@ubuntu:~$ sudo resize2fs /dev/sda1
resize2fs 1.42.5 (29-Jul-2012)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 6, new_desc_blocks = 16
The filesystem on /dev/sda1 is now 63439359 blocks long.

me@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       239G   86G  142G  38% /
udev            3.9G   12K  3.9G   1% /dev
tmpfs           1.6G  696K  1.6G   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            3.9G  152K  3.9G   1% /run/shm
none            100M   36K  100M   1% /run/user

Небольшая загвоздка: После перезагрузки пространство подкачки не было активным. Оказалось, что нужно запустить mkswap, настроить /etc/fstabновый UUID и включить подкачку

me@ubuntu:~$ sudo mkswap /dev/sda5 
Setting up swapspace version 1, size = 8384508 KiB
no label, UUID=141d401a-b49d-4a96-9b85-c130cb0de40a

me@ubuntu:~$ sudo swapon --all --verbose
swapon on /dev/sda5
swapon: /dev/sda5: found swap signature: version 1, page-size 4, same byte order
swapon: /dev/sda5: pagesize=4096, swapsize=8585740288, devsize=8585741312

Отредактируйте /etc/fstab, чтобы заменить UUID старого раздела подкачки на новый из mkswap.

решение2

Я отвечаю на этот вопрос на случай, если у вас ситуация, похожая на мою. Мне пришлось изменить размер FileSystem (Ext4) на динамическом диске, работающем под управлением Ubuntu 18.0.4 LTS в качестве гостя. Мне удалось изменить размер диска с хоста, а затем изменить размер FileSystem.

Выполнение обычных команд было невозможно. Например:

$ resize2fs /dev/sda2
resize2fs 1.44.1 (24-Mar-2018)
The filesystem is already 13180160 (4k) blocks long.  Nothing to do!

и fdiskбыло довольно сложным, также, вероятно, мне пришлось запустить LiveCD, чтобы работать с размонтированным диском.

Эти две команды решили мою проблему легко и быстро:

$ growpart /dev/sda 2
CHANGED: partition=2 start=4096 old: size=105441280 end=105445376 new: size=409595871,end=409599967

$ resize2fs /dev/sda2
resize2fs 1.44.1 (24-Mar-2018)
Filesystem at /dev/sda2 is mounted on /; on-line resizing required
old_desc_blocks = 7, new_desc_blocks = 25
The filesystem on /dev/sda2 is now 51199483 (4k) blocks long.

Примечание: 2в первой команде указывается номер раздела на устройстве /dev/sda.

решение3

Если вы собираетесь увеличить размер и раздела, и файловой системы, то сначала выполните команду fdiskувеличения размера раздела, а затем команду resize2fsувеличения размера файловой системы.

Если вы собираетесь уменьшить размер обоих, resize2fsсначала запустите , а затем запустите fdisk.

решение4

Решение ноалоочевидно, лучший из всех; гораздо проще остальных:

эхо "- +" | sfdisk -N<partnum>/dev/sdИкс

Краткое объяснение того, как это работает: -Nозначает, sfdiskчто будет работать на одном разделе. При таком запуске sfdiskбудет интерактивным и будет ждать начальной позиции, размера и, опционально, типа раздела. " -" означает, что начальная позиция не изменяется, " +" означает, что конечная позиция будет использовать как можно больше места. После этого вам придется использовать команды printи write. Ведущий echo "- +" |делает это в одной строке.

Его ограничение в том, что должно быть свободное пространствосразу после. Если после раздела для изменения размера есть раздел подкачки (что означает отсутствие реальных данных внутри), это можно решить так же просто с помощью sfdisk. Используя приведенный выше синтаксис, предположим, что раздел для изменения находится на sda1и подкачка на sda2, у нас есть диск объемом 128 ГБ, и мы хотим 6 ГБ подкачки: Первый шаг — переместить раздел подкачки в конец:

echo "122G +" | sfdisk -N2 /dev/sda

Теперь расширьте первый раздел:

echo "- +"    | sfdisk -N1 /dev/sda

и измените его размер с помощью resize2fs. Возможно, вам придется убедиться, что ваш новый своп распознается. См. swapoff, mkswap, swaponи fstabфайл. Это выходит за рамки этого вопроса.

О команде для sda2: НЕЛЬЗЯ перемещать раздел с данными таким образом!!!  Вы потеряете все свои данные. Эта команда не перемещает данные; только границы разделов. Нет никакой опасности с командой, используемой для sda1 ( - +), поскольку начальная позиция раздела не изменяется; это значение " -", когда используется для одного раздела.

Спасибо @noalo

Связанный контент