Перемещение папок Linux на другой диск

Опубликовано: 15.12.2020
Автор: Виталий Бочкарев
Поддержать автора статьи по этой ссылке

В этой заметке я расскажу, как переместить системные папки Linux, такие как var и opt, а так же swap на отдельные диски. Такой подход к организации дискового пространства сервера поможет в будущем избежать проблем при росте проекта и выделении дополнительного пространства под разные ресурсы.

Внимание! Если сервер уже используется в работе, то перенос папок во время работы приложений может вызвать сбой в работе сервера. То есть перед процедурой переноса папок нужно остановить все приложения, использующие в эти служебные папки. Перенос папок в только что установленном сервере проблем не вызывает.

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

Move Linux system folders - 01

Перемещение swap

Файл подкачки (swap) является средством виртуализации памяти, позволяя использовать больше оперативной памяти, чем есть на сервере. Использование swap-файла позволяет предотвратить замедление или даже остановку работы сервера при исчерпании физической оперативной памяти. Когда оперативная память заканчивается, операционная система "сбрасывает" неиспользуемую в данный момент информацию в файл-подкачки на жестком диске, очищая физическую память для текущих процессов. Рекомендуемые размеры файла подкачки в зависимости от физической памяти показаны в таблице ниже:

Объем оперативной памяти сервера, ГБ 1 2 4 8 16 32 64
Размер файла подкачки, ГБ 1 1 2 3 4 6 8

Примечание. Полную таблицу с рекомендациями можно найти на странице Ubuntu Swap FAQ.

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

Ниже показан порядок команд, которые надо выполнить, чтобы создать swap-файл на отдельном диске.

# Переключиться в профиль root
sudo su -

# Получить информацию о дисках и разделах на них
lsblk

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0         7:0    0   18M  1 loop /snap/amazon-ssm-agent/1566
loop1         7:1    0 93.9M  1 loop /snap/core/9066
loop2         7:2    0   69M  1 loop /snap/lxd/14804
loop3         7:3    0   55M  1 loop /snap/core18/1705
nvme1n1     259:0    0    8G  0 disk
nvme2n1     259:1    0   60G  0 disk
nvme0n1     259:2    0   20G  0 disk
└─nvme0n1p1 259:3    0   20G  0 part /

# Из полученной таблицы определить имя диска, куда поместить файл подкачки

# Создание файла подкачки на выбранном диске
mkswap /dev/nvme1n1

Setting up swapspace version 1, size = 8 GiB (8589926400 bytes)
no label, UUID=c1532bd5-a91f-4d68-a302-f2bfae60903c

# Записать UUID диска, на котором создан файл подкачки

# Добавление строки о монтировании нужного раздела в папку 

sudo vi /etc/fstab

UUID=c1532bd5-a91f-4d68-a302-f2bfae60903c       swap    swap    defaults                0       0

# Активировать использование нового swap-файла
sudo swapon /dev/nvme1n1

# Проверить использование нового файла подкачки
swapon -s

Filename                                Type            Size    Used    Priority
/dev/nvme1n1                            partition       8388600 0       -2

# Просмотр всех разделов и определение, что swap-раздел существует
blkid

/dev/nvme0n1p1: LABEL="cloudimg-rootfs" UUID="fdd49fba-0340-4ed1-b0fc-8da187913fec" TYPE="ext4" PARTUUID="093eb684-01"
/dev/loop0: TYPE="squashfs"
/dev/loop1: TYPE="squashfs"
/dev/loop2: TYPE="squashfs"
/dev/loop3: TYPE="squashfs"
/dev/nvme1n1: UUID="c1532bd5-a91f-4d68-a302-f2bfae60903c" TYPE="swap"

Перемещение папки /var

Папка /var используется для хранения изменяемых данных приложений, таких как кэш, базы данных, страницы веб-сервера, метаданные, журналы (логи), почтовые ящики, очереди (печати, почты и т.д.), временные файлы и прочие. Ожидается, что в процессе работы сервера размер этой папки будет расти.

Список команд, которые надо выполнить, чтобы корректно перенести папку:

# Переключиться в профиль root
sudo su -

# Получить информацию о дисках и разделах на них
lsblk

NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1     259:3    0  10G  0 disk
+-nvme0n1p1 259:4    0   1M  0 part
L-nvme0n1p2 259:5    0  10G  0 part /
nvme1n1     259:0    0  16G  0 disk
nvme2n1     259:1    0   8G  0 disk [SWAP]
nvme3n1     259:2    0  32G  0 disk

# Из полученной таблицы определить имя диска, куда необходимо смонтировать системную папку /var

# Создать файловую систему на выбранном диске
mkfs -t xfs /dev/nvme1n1

# На системном разделе создать новую папку для монтирования в нее нового диска
mkdir /mntvar

# Смонтировать новый диск в папку на системном разделе
mount /dev/nvme1n1 /mntvar

# Изменить параметры оболочки bash, чтобы включать в список файлов файлы, начинающиеся с точки
shopt -s dotglob

# Синхронизировать текущую папку /var и новую папку /mntvar
rsync -aulvXpogtr /var/* /mntvar

# Показать настройки безопасности текущей папки /var
ls -Zd /var

drwxr-xr-x. root root system_u:object_r:var_t:s0       /var

# Показать настройки безопасности новой папки /mntvar
ls -Zd /mntvar

drwxr-xr-x. root root system_u:object_r:unlabeled_t:s0 /mntvar

# Как видно, настройки новой папки отличаются от оригинальной

# Корректировка настроек безопасности новой папки
chcon -t var_t /mntvar

# Показать настройки безопасности новой папки /mntvar после корректировки
ls -Zd /mntvar

drwxr-xr-x. root root system_u:object_r:var_t:s0       /mntvar

# Размонтирование диска из папки /mntvar
umount /mntvar

# Вывод UUID разделов
blkid

/dev/nvme1n1: UUID="f8661e65-7b10-42bc-a452-2da273bd3a1c" TYPE="xfs"
/dev/nvme2n1: UUID="13f331a5-313c-4e00-8a27-9e4c0c0cae15" TYPE="swap"
/dev/nvme3n1: UUID="15c868e8-0aae-40cf-b8b4-d8ec3a1c3a0e" TYPE="xfs"
/dev/nvme0n1p2: UUID="c5d55c65-e612-4912-b9d7-8721481beff6" TYPE="xfs" PARTUUID="8efa7c00-a326-4b79-9018-f7be7907af38"
/dev/nvme0n1: PTTYPE="gpt"
/dev/nvme0n1p1: PARTUUID="fe88a8a6-2b4b-4423-8650-8ea3e1fae3e9"

# Добавление строки о монтировании нужного раздела в папку /var в файл /etc/fstab
vi /etc/fstab

UUID=f8661e65-7b10-42bc-a452-2da273bd3a1c       /var    xfs     defaults,noatime,nofail 0 2

# Переименование текущей папки /var в /var.old
mv /var/ /var.old

# Создание пустой папки /var
mkdir /var

# Принудительное перемонтирование разделов, указанных в файле fstab
mount -av

# Просмотр папки /var, чтобы убедиться, что все работает
ls /var

# Перезагрузка сервера
reboot

# удаление ненужной папки /mntvar
sudo rmdir /mntvar

Перемещение папки /opt

Папка /opt хранит в себе пакеты установленных драйверов, программ и игр. Эта папка по своему назначению очень похожа на папку Program Files в операционной системе Windows - в нее по умолчанию ставятся все программы, а каждая программа имеет свой каталог. В процессе работы сервера эта папка растет не сильно, но если компьютер используется как рабочая станция, то лучше вынести папку на отдельный диск.

Список команд, которые надо выполнить, чтобы корректно перенести папку:

sudo su -

lsblk

NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1     259:3    0  10G  0 disk
+-nvme0n1p1 259:4    0   1M  0 part
L-nvme0n1p2 259:5    0  10G  0 part /
nvme1n1     259:0    0  16G  0 disk /var
nvme2n1     259:1    0   8G  0 disk [SWAP]
nvme3n1     259:2    0  32G  0 disk

mkfs -t xfs /dev/nvme3n1

mkdir /mntopt

mount /dev/nvme3n1 /mntopt

shopt -s dotglob

rsync -aulvXpogtr /opt/* /mntopt

ls -Zd /opt

drwxr-xr-x. root root system_u:object_r:usr_t:s0       /opt

ls -Zd /mntopt

drwxr-xr-x. root root system_u:object_r:unlabeled_t:s0 /mntopt

chcon -t usr_t /mntopt

ls -Zd /mntopt

drwxr-xr-x. root root system_u:object_r:usr_t:s0       /mntopt

umount /mntopt

blkid

/dev/nvme1n1: UUID="f8661e65-7b10-42bc-a452-2da273bd3a1c" TYPE="xfs"
/dev/nvme2n1: UUID="13f331a5-313c-4e00-8a27-9e4c0c0cae15" TYPE="swap"
/dev/nvme3n1: UUID="15c868e8-0aae-40cf-b8b4-d8ec3a1c3a0e" TYPE="xfs"
/dev/nvme0n1p2: UUID="c5d55c65-e612-4912-b9d7-8721481beff6" TYPE="xfs" PARTUUID="8efa7c00-a326-4b79-9018-f7be7907af38"
/dev/nvme0n1: PTTYPE="gpt"
/dev/nvme0n1p1: PARTUUID="fe88a8a6-2b4b-4423-8650-8ea3e1fae3e9"

vi /etc/fstab

UUID=15c868e8-0aae-40cf-b8b4-d8ec3a1c3a0e       /opt    xfs     defaults,noatime,nofail 0 2

mv /opt/ /opt.old

mkdir /opt

mount -av

ls /opt

reboot

sudo rmdir /mntopt