Если вы готовы внести деструктивные изменения, я бы порекомендовал использовать диспетчер логических томов Linux (LVM2).
Это позволяет объединять несколько дисков разных размеров вместе, и вы можете добавлять диски, чтобы увеличить видимый размер логического "диска" без перезагрузки. Если вы используете файловую систему по умолчанию (ext4
наши дни), она также может выполнить онлайн-изменение размера файловой системы, поэтому снова не нужно перезагружаться.
Позвольте мне продемонстрировать это с использованием RAM-дисков (/dev/ram0
/dev/ram15
). Сначала давайте рассмотрим разделы в моей системе:
# lvmdiskscan
/dev/ram0 [ 64.00 MiB]
/dev/ram1 [ 64.00 MiB]
/dev/sda1 [ 87.16 GiB]
/dev/ram2 [ 64.00 MiB]
/dev/ram3 [ 64.00 MiB]
/dev/ram4 [ 64.00 MiB]
/dev/ram5 [ 64.00 MiB]
/dev/sda5 [ 6.00 GiB]
/dev/ram6 [ 64.00 MiB]
/dev/ram7 [ 64.00 MiB]
/dev/ram8 [ 64.00 MiB]
/dev/ram9 [ 64.00 MiB]
/dev/ram10 [ 64.00 MiB]
/dev/ram11 [ 64.00 MiB]
/dev/ram12 [ 64.00 MiB]
/dev/ram13 [ 64.00 MiB]
/dev/ram14 [ 64.00 MiB]
/dev/ram15 [ 64.00 MiB]
/dev/sdb1 [ 294.09 GiB]
/dev/sdb5 [ 4.00 GiB]
0 disks
20 partitions
0 LVM physical volume whole disks
0 LVM physical volumes
Итак, давайте создадим установку на 2 диска, а позже я расширю ее до 3 дисков. Во-первых, отформатируйте мои "диски" для использования LVM. На этом этапе pv
обозначает физический том, то есть реальное устройство, которое хранит данные:
# pvcreate /dev/ram0
Physical volume "/dev/ram0" successfully created
# pvcreate /dev/ram1
Physical volume "/dev/ram1" successfully created
# pvs
PV VG Fmt Attr PSize PFree
/dev/ram0 vg_main lvm2 a- 60.00m 60.00m
/dev/ram1 vg_main lvm2 a- 60.00m 60.00m
затем создайте группу томов, которая по существу объединяет их в один неразмеченный "диск":
# vgcreate vg_main /dev/ram0 /dev/ram1
Volume group "vg_main" successfully created
# vgs
VG #PV #LV #SN Attr VSize VFree
vg_main 2 0 0 wz--n- 120.00m 120.00m
а теперь "разделить" этот присоединенный диск, создав логический том. Я собираюсь использовать все доступное пространство:
# lvcreate --extents 100%VG --name lv_main vg_main
Logical volume "lv_main" created
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv_main vg_main -wi-a- 120.00m
Теперь у меня есть виртуальный раздел размером 120 МБ, на котором я могу хранить свои вещи. Узел устройства можно найти с помощью более подробной команды lvdisplay
:
# lvdisplay
--- Logical volume ---
LV Name /dev/vg_main/lv_main
VG Name vg_main
LV UUID tsKWeD-tjpB-yh32-Ong3-Jp7C-erT8-LRVlTg
LV Write Access read/write
LV Status available
# open 0
LV Size 120.00 MiB
Current LE 30
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0
Поэтому я должен поместить свою файловую систему в /dev/vg_main/lv_main
. Это может означать копирование существующего с использованием такого инструмента, как dd
, или в этой демонстрации создание нового:
# mkfs.ext4 -L fs_main /dev/vg_main/lv_main
mke2fs 1.42 (29-Nov-2011)
Discarding device blocks: done
Filesystem label=fs_main
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
30720 inodes, 122880 blocks
6144 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
15 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
Теперь я могу смонтировать эту (пустую) файловую систему и заполнить ее некоторыми тестовыми данными:
# mkdir /tmp/demo
# mount /dev/vg_main/lv_main /tmp/demo
# df -h /tmp/demo
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_main-lv_main 117M 5.6M 105M 6% /tmp/demo
# ls /tmp/demo
lost+found
# dd if=/dev/zero of=/tmp/demo/bigfile
dd: writing to `/tmp/demo/bigfile': No space left on device
226701+0 records in
226700+0 records out
116070400 bytes (116 MB) copied, 0.982532 s, 118 MB/s
# ls -lh /tmp/demo
total 111M
-rw-r--r-- 1 root root 111M Mar 10 18:50 bigfile
drwx------ 2 root root 12K Mar 10 18:47 lost+found
Моя файловая система теперь полностью заполнена! Это можно проверить на уровне файловой системы, используя df
и уровень объединенного диска, используя vgdisplay
и проверив Free PE (Physical Extents) / Size (bytes):
# df -h /tmp/demo
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_main-lv_main 117M 117M 0 100% /tmp/demo
# vgdisplay
--- Volume group ---
VG Name vg_main
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 120.00 MiB
PE Size 4.00 MiB
Total PE 30
Alloc PE / Size 30 / 120.00 MiB
Free PE / Size 0 / 0
VG UUID zWxBml-xdZU-8wgh-IK1w-ij1N-Z3eo-sRtri3
Так что теперь давайте сделаем это больше! Давайте представим, что /dev/ram2
- это прекрасный новый диск SATA, который я только что подключил к своей работающей системе, и я хочу использовать его для увеличения размера моей полной файловой системы.
Как и раньше, используйте pvcreate
чтобы подготовить "диск" для использования с LVM:
# pvcreate /dev/ram2
Physical volume "/dev/ram2" successfully created
Теперь мы расширяем наш присоединенный диск (группа томов) и проверяем, что у vg_main
есть свободное место:
# vgextend vg_main /dev/ram2
Volume group "vg_main" successfully extended
# vgdisplay
--- Volume group ---
VG Name vg_main
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 3
Act PV 3
VG Size 180.00 MiB
PE Size 4.00 MiB
Total PE 45
Alloc PE / Size 30 / 120.00 MiB
Free PE / Size 15 / 60.00 MiB
VG UUID zWxBml-xdZU-8wgh-IK1w-ij1N-Z3eo-sRtri3
Это еще не освобождает пространство в нашей файловой системе, поскольку размер раздела (логического тома) такой же, как и до того, как мы добавили наш новый диск:
# df -h /tmp/demo
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_main-lv_main 117M 117M 0 100% /tmp/demo
# lvdisplay
--- Logical volume ---
LV Name /dev/vg_main/lv_main
VG Name vg_main
LV UUID tsKWeD-tjpB-yh32-Ong3-Jp7C-erT8-LRVlTg
LV Write Access read/write
LV Status available
# open 1
LV Size 120.00 MiB
Current LE 30
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0
Здесь приходит волшебство - мы изменяем размер логического тома и сообщаем LVM2 изменить размер файловой системы внутри:
# lvresize --extents 100%VG --resizefs /dev/vg_main/lv_main
fsck from util-linux 2.20.1
e2fsck 1.42 (29-Nov-2011)
/dev/mapper/vg_main-lv_main is mounted.
WARNING!!! The filesystem is mounted. If you continue you ***WILL***
cause ***SEVERE*** filesystem damage.
Do you really want to continue<n>?
Это страшное предупреждение на самом деле не связано с изменением размера файловой системы, а с тем, что fsck
перед полетом, который LVM2 хочет сделать с смонтированной файловой системой. Очевидно, мы отклоняем эту страшную подсказку и отвечаем "нет":
Do you really want to continue<n>? no
check aborted.
Extending logical volume lv_main to 180.00 MiB
Logical volume lv_main successfully resized
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/dm-0 is mounted on /tmp/demo; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/dm-0 to 184320 (1k) blocks.
The filesystem on /dev/dm-0 is now 184320 blocks long.
Затем LVM2 приступает к онлайн-изменению размера файловой системы, которую мы запросили. Вуаля!
# df -h /tmp/demo
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_main-lv_main 175M 117M 49M 71% /tmp/demo
Теперь я могу создать еще файлы:
# dd if=/dev/zero of=/tmp/demo/another_file
dd: writing to `/tmp/demo/another_file': No space left on device
118751+0 records in
118750+0 records out
60800000 bytes (61 MB) copied, 0.556078 s, 109 MB/s
# ls -lh /tmp/demo
total 169M
-rw-r--r-- 1 root root 58M Mar 10 19:04 another_file
-rw-r--r-- 1 root root 111M Mar 10 18:52 bigfile
drwx------ 2 root root 12K Mar 10 18:47 lost+found