
Во время установки моей ОС Centos Stream 8 я указал размер /var в 10 ГБ, думая, что этого будет более чем достаточно, но после того, как я начал использовать Docker, я обнаружил, что он занимает слишком много места на разделе /var, как показывает команда df:
[root@compute-07 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 28G 0 28G 0% /dev
tmpfs 28G 0 28G 0% /dev/shm
tmpfs 28G 179M 28G 1% /run
tmpfs 28G 0 28G 0% /sys/fs/cgroup
/dev/mapper/cs-root 371G 8.2G 363G 3% /
/dev/mapper/cs-home 100G 2.0G 98G 2% /home
/dev/mapper/cs-var 10G 9.0G 1.1G 90% /var
/dev/sda2 2.0G 412M 1.6G 21% /boot
/dev/sda1 2.0G 7.3M 2.0G 1% /boot/efi
/dev/mapper/cs-tmp 10G 105M 9.9G 2% /tmp
tmpfs 5.5G 16K 5.5G 1% /run/user/42
overlay 10G 9.0G 1.1G 90%
/var/lib/docker/overlay2/77f74478297ca61595f0003d35c7323ec627adb44d94cef92c2b4a3c97319a66/merged
overlay 10G 9.0G 1.1G 90% /var/lib/docker/overlay2/5eeb399ce4a3c0d8065d63123985269a359fa66f4d20a8486326e466a48a0128/merged
overlay 10G 9.0G 1.1G 90% /var/lib/docker/overlay2/08d42ca66e3a5974bc305b502bca2aa4d22aa7ddcab6ea14c6af300b3abb3a70/merged
overlay 10G 9.0G 1.1G 90% /var/lib/docker/overlay2/1a45cb32b127fdf8f5c1483385139a865fdc69260ec20f3dcd4c56ad6890f909/merged
overlay 10G 9.0G 1.1G 90% /var/lib/docker/overlay2/ebb9af8edee824a4013dcd526e33e22272283bdee508fd43208fade557def728/merged
overlay 10G 9.0G 1.1G 90% /var/lib/docker/overlay2/41d55822108d04c85f348dc134fe6929b0e67f6b3bd7e0af147633bfd3a252c1/merged
overlay 10G 9.0G 1.1G 90% /var/lib/docker/overlay2/5cf3e8e06e9b4c2e6ed65164d91aed19f63d55e91524d6563e9f16b6709d29be/merged
overlay 10G 9.0G 1.1G 90% /var/lib/docker/overlay2/1d1eda94e68596b00d0cabcc75a7c91999a1c845ebd02c733bb9f00ac66a26f0/merged
overlay 10G 9.0G 1.1G 90% /var/lib/docker/overlay2/bc9e9a28c6761ad89a9457110642156ebd2b4d77de841f2a3ac9ffbaa90e4b63/merged
tmpfs 5.5G 0 5.5G 0% /run/user/0
Это вывод команды lsblk, так как /var находится в отдельном разделе, а / и /home — в другом, я не смог найти способ изменить его размер или создать другой раздел, а затем связать его с /var.
[root@compute-07 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 558.4G 0 disk
├─sda1 8:1 0 2G 0 part /boot/efi
├─sda2 8:2 0 2G 0 part /boot
└─sda3 8:3 0 554.4G 0 part
├─cs-root 253:0 0 370.4G 0 lvm /
├─cs-swap 253:1 0 64G 0 lvm [SWAP]
├─cs-tmp 253:2 0 10G 0 lvm /tmp
├─cs-home 253:3 0 100G 0 lvm /home
└─cs-var 253:4 0 10G 0 lvm /var
sr0 11:0 1 1024M 0 rom
Есть ли способ изменить размер этого раздела без потери данных?
решение1
Нет. На самом деле, большая часть пространства в системе всегда используется там, /var
где обычноварiable данные живут — базы данных, Docker, журналы и т. д., в то время как Linux /
,редкозанимает более 10 ГиБ пространства при правильном управлении системой.
Не только ваш LVM неоптимален: я бы поместил всю установку Debian с некоторыми службами в пространство, которое вы тратите впустую в вашем ESP и /boot
. (У меня была привычка создавать виртуальные машины с 4 ГБ, выделенными для системы. Более чем достаточно.)
Итак, лучшим решением было бы уменьшить размер вашей слишком большой корневой файловой системы, но это невозможно сделать онлайн. Вам нужно загрузить какой-нибудь спасательный носитель, активировать вашу VG, а затем уменьшить файловую систему и логический том, и это может занять значительное время, учитывая размер раздела. Также можно все испортить. Если вы торопитесь, вы можете сделать хитрость: создать какой-нибудь каталог в корне, переместить в него данные Docker и смонтировать его обратно туда, где находятся данные Docker в var. Вам нужно остановить Docker и все контейнеры на некоторое время. Что-то вроде этого:
systemctl stop docker.service
mkdir /var-lib-docker
mv /var/lib/docker/* /var-lib-docker
mount --bind /var-lib-docker /var/lib/docker
systemctl start docker.service
Таким образом, Docker будет использовать пространство в слишком большой корневой файловой системе, оставаясь доступным в обычном месте. В вам /etc/fstab
нужно добавить следующую запись, чтобы эта конфигурация пережила перезагрузку:
/var-lib-docker /var/lib/docker none bind 0 0
Но помните, что это довольно некрасивый хак, который может выиграть вам немного времени, но также и создать некоторые проблемы, поэтому ищите возможность освободить место в корне и распределить его /var
правильно.
И пусть это будет уроком: никогда не выделяйте все доступное пространство с самого начала. Оставляйте часть (большую его часть) нераспределенной. Вы всегда можете легко добавить пространство и сделать это онлайн, в то время как его возвращение очень сложно, требует много времени и подвержено ошибкам, и это требует простоя. Лучше всего управлять пространством так, чтобы вам никогда не пришлось его возвращать.
решение2
В качестве альтернативыэтот ответ
Ваша система использует логические тома LVM.
В группе томов может остаться неиспользуемое пространство, которое можно назначить для расширения var.
В случае, если неиспользованного места не осталось или его слишком мало, вы можетеуменьшить или удалить подкачку LVMи освободившееся при этом место использовать для расширения /var.
Это оставит вашу систему нетронутой и, как правило, может быть выполнено даже в режиме онлайн.
Подход к этому будет примерно таким (команды не проверены, поэтому не копируйте их полностью, но принцип должен быть верным)
Создайте временный или постоянный файл подкачки в вашей слишком большой корневой файловой системе в качестве замены, пока вы переводите раздел подкачки в автономный режим.
dd if=/dev/zero of=/swap-file count=65536 bs=1M
mkswap /swap-file
swapon /swap-file
swapoff /dev/mapper/cs-swap
чтобы отключить раздел подкачкиlvreduce
cs-swap с последующим повторным форматированием оставшегося раздела подкачки LVMmkswap
и повторной активацией меньшего пространства подкачки с помощьюswapon
или удалить его прямо с
lvremove
Используйте только что созданное свободное пространство LVM для расширения тома /var LVM и расширения файловой системы.
lvextend -l +100%FREE --resizefs /dev/mapper/cs-var
решение3
Ваш df
и lsblk
не говорите нам, какие у них файловые системы. Чтобы уменьшить том (раздел или LV), файловая система на нем должна быть сначала уменьшена. Обычный выбор для rootfs, ext4, может быть уменьшен в автономном режиме. Однако выбор файловой системы по умолчанию для CentOS (и RHEL-подобных дистрибутивов) — XFS, и в настоящее время ее уменьшение невозможно.
Как уже отмечали другие в своих ответах, ваш rootfs use 8.2 GB несложно сделать резервную копию. Поэтому в зависимости от типа вашей файловой системы rootfs у вас есть следующие варианты:
Если это ext4, вы можете сжать его на месте:
Перезагрузите другую систему, например ArchISO, поскольку ext4 можно сжать только в автономном режиме.
Убедитесь,
lvs
что отображается ваш раздел, затемe2fsck -f /dev/mapper/cs-root
resize2fs -M -p /dev/mapper/cs-root
В качестве альтернативы, если вы знаете желаемый размер rootfs, вы можете указать его вместо использования
-M
:resize2fs -p /dev/mapper/cs-root 15G
Обратите внимание, что лучше оставить немного места для уменьшения базового тома.
Освободите место у РН
lvreduce -L 16G cs/root
Измените размер файловой системы обратно до размера тома:
resize2fs -p /dev/mapper/cs-root
Теперь свободное место можно раздать
/var
:lvextend -l +100%FREE cs/var
Однако если это XFS, лучшим вариантом будет сделать резервную копию rootfs и создать ее заново:
- Загрузите ArchISO, как описано выше.
rsync -avHAXx /your-rootfs /somewhere
(Убедитесь,/somewhere
что он находится на другом томе — легко найти 8,2 ГБ свободного места — ваш раздел подкачки, скорее всего, слишком большой)lvremove
корневой том и пересоздайте его с соответствующим размером. На этот раз рекомендую отформатировать в ext4.rsync -avHAXx /somewhere /your-rootfs
чтобы скопировать все обратно.- При необходимости обновите конфигурацию GRUB — насколько мне известно, идентификатор LV часто записывается
grub.cfg
в качестве подсказки, но я не знаком с CentOS (в Debian это было бы простоupdate-grub
). - Распределите свободное пространство в VG, как указано выше.
Другие замечания, на которые я хотел бы обратить внимание:
- Ваш системный раздел EFI (ESP) слишком большой. Для типичного сервера Linux 256 МБ будет более чем достаточно (я использую 128 МБ на своем сервере Ubuntu). Он должен содержать только двоичный файл GRUB и очень простую версию
grub.cfg
. /boot
не обязательно должен находиться на своем собственном томе. GRUB может прекрасно читать LVM и вашу файловую систему rootfs.- В зависимости от конструкции вашего сервера, он,
/root
скорее всего, также будет слишком большим (я использую 16 ГБ для своего сервера Proxmox VE — я не планирую размещать данные на хосте). - Вам действительно нужно 64 ГБ подкачки? Обычно мне хватает 8 ГБ.