Назад | Перейти на главную страницу

Как переместить каталог / var / log

На нашем производственном сервере есть небольшой диск для корневой точки монтирования. /, /var/log занимает слишком много места, и мне приходится вручную удалять некоторые файлы. Как я могу переехать /var/log/ сказать /home/log БЕЗ ПЕРЕЗАГРУЗКИ?

Вот что я подумал:

$ mkdir /home/log
$ rsync -a /var/log /home/log
$ mount --bind /home/log /var/log
$ /etc/init.d/rsyslof restart

Но я знаю, что некоторые службы используют файловые дескрипторы, поэтому они будут продолжать использовать /var/log или inodes.

Правильный дизайн

Я предполагаю, что вы не можете просто расширить рассматриваемую файловую систему (используя lvextend && ext2online), потому что вы не используете LVM или используете неправильный тип файловой системы.

Ваш подход

Что вы предложили мощь работают, если вы сигнализируете демонам SIGHUP (kill -1 pid). Очевидно, что позже вам нужно будет выполнить команду «mount -o bind / / где-нибудь» и очистить то, что осталось под смонтированным / var / log. Но для меня это неприятный запах, особенно для производства.

Избегайте простоев, получите чистый результат (но сложно сделать)

Забудьте об идее "mount -o bind", создайте новый LV / раздел, но пока не монтируйте его.

lsof | grep /var/log             # lists open files in /var/log

Для каждого демона, у которого есть открытый файл (я бы ожидал, по крайней мере, syslog, inetd, sshd):

  • перенастройте демон no для входа в / var / log
  • обновить демон (kill -1 или /etc/init.d/script reload)
  • подтвердить с помощью lsof | grep /var/log этот демон закрыл свои файлы

Смонтировать поверх / var / log. Восстановите старые конфигурации, снова SIGHUP / перезагрузите демонов.

Легкий способ (время простоя)

Создайте новый раздел LV / и правильно смонтируйте его в / var или / var / log. Самый простой способ - перевести сервер в режим обслуживания (однопользовательский режим) и использовать фактическую консоль (а не ssh) для работы.

Все остальные ответы отличные и правильные, и вам обязательно стоит сначала их прочитать.

Я просто подумал, что поделюсь этим, потому что это упрощает копирование и вставку, если ваш случай окажется довольно простым, как мой:

Остановите системный журнал и скопируйте текущие журналы:

service rsyslog stop
mkdir -p /tmp/varlog
cp -r /var/log/* /tmp/varlog

затем смонтируйте новое местоположение над /var/log. Скажите, что это новое устройство под названием /dev/sdb

mount /dev/sdb /var/log

теперь вы можете скопировать файлы обратно и перезапустить системный журнал:

cp -r /tmp/varlog/* /var/log
rm -rf /tmp/varlog
service rsyslog start

Предполагая, что все это происходит довольно рано в жизни вашей машины, rsyslog скорее всего, будет единственным запущенным демоном. YMMV!

PS - вы захотите добавить его в свой fstab а также наверное. Вот один из способов сделать это, опять же при условии очень простого монтирования:

cat /etc/mtab |grep /var/log >>/etc/fstab

(ср https://serverfault.com/a/267610/80606 по поводу катания mtab в fstab)

Еще вы могли бы сделать следующее:

  • Остановите процессы, у которых есть открытые файлы /var/log
  • Убедитесь, что нет процессов с открытыми файлами на /var/log (с помощью lsof как предложил kubanskamac)
  • Переместите свой /var/log на другой раздел с достаточным свободным пространством (в соответствии с вашим примером это будет /home/log)
  • Создайте символическую ссылку из / var / log в / home / log (ln -s /home/log /var/log)
  • Перезапустите процессы, которые вы остановили на первом шаге

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

Другое решение, основанное на @hwjp, если вы не можете использовать другой том диска для их перемещения, вы можете создать том виртуального диска в другом томе, у которого есть больше свободного места (это мой случай):

Создать виртуальный том:

А) делать: sudo dd if=/dev/zero of=VHD-log.img bs=1M count=1200

  • if = / dev / zero: входной файл для предоставления символьного потока для инициализации хранилища данных
  • of = VHD.img: файл образа, который будет создан как том для хранения на / thevolumeofyourchoice
  • bs = 1M: чтение и запись до 1M за раз
  • count = 1200: копирует только 1200M (1 ГБ) входных блоков

Б) делать: sudo mkfs -t ext4 /thevolumeofyourchoice/VHD-log.img Отформатируйте тип файловой системы EXT4 в файле образа VHD-журнала с помощью утилиты mkfs.

В) делать: sudo mkdir /thevolumeofyourchoice/vlog Смонтировать VHD-журнал в каталог (точку монтирования)

Г) делать: sudo mount -t auto -o loop /thevolumeofyourchoice/VHD-log.img /thevolumeofyourchoice/vlog

D1) Чтобы смонтировать VHD-журнал при загрузке системы в последний каталог, добавьте эту запись в файл / etc / fstab.

/thevolumeofyourchoice/VHD-log.img  /var/log/  ext4    defaults        0  0

Переместите старые файлы журнала:

E) делать:

  • service rsyslog stop
  • lsof | grep /var/log для перечисления открытых файлов в / var / log и отключения необходимого демона (apach2, freshclam в моем случае)
  • cp -rp /var/log/* /thevolumeofyourchoice/vlog (cp -p то же, что и --preserve = режим, право собственности, временные метки)

F) делать:

  • sudo umount /thevolumeofyourchoice/vlog
  • sudo mv /var/log /var/log-old
  • sudo mkdir /var/log
  • sudo chgrp syslog /var/log
  • sudo mount -t auto -o loop /thevolumeofyourchoice/VHD-log.img /var/log

G) делать: service rsyslog start и перезапустите другие службы, которые вы остановили

Наконец, дважды проверьте:

Вы можете сделать - lsof | grep /var/log чтобы перечислить открытые файлы в / var / log и убедиться, что они указывают на / var / log, а не на / var / log-old

Вы можете mv, сделать резервную копию или удалить / var / log-old, в конце концов, все в порядке.

Я бы просто:

apt install lsyncd
mv /var/log /varlog.root
mkdir /var/log /home/log
mount --bind /home/log /var/log

# set up lsyncd appropriately to sync real-time between /varlog.root & /var/log
service lsyncd start
sleep 3m

service rsyslog restart
# Proceed with all the other daemons
# to switch them over to the new /var/log and release /varlog.root
sleep 3m

# Then do this a few times until no processes use the old dir
lsof +D /varlog.root && rm -rf /varlog.root