私たちの本番サーバーには、ルートマウントポイント/
用の小さなドライブがあり、/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
またはiノードを引き続き使用することを知っています。
適切な設計
LVMを使用したり、間違ったファイルシステムタイプを使用したりしないため、問題のファイルシステムを(lvextend && ext2online
を使用して)単純に拡張することはできないと思います。
あなたのアプローチ
SIGHUP(kill -1 pid)でデーモンにシグナルを送ると、提案したものmightが機能します。もちろん、後で「mount -o bind// somewhere」を実行して、マウントされた/ var/logの下に残っているものをクリーンアップする必要があります。しかし、それは私にとって、特に生産にとっては悪臭を放ちます。
ダウンタイムを回避し、クリーンな結果を得る(ただし、実行は複雑)
「mount -o bind」の考え方を忘れて、新しいLV /パーティションを作成しますが、まだマウントしないでください。
lsof | grep /var/log # lists open files in /var/log
開いているファイルがある各デーモン(少なくともsyslog、inetd、sshdが必要です):
kill -1
または/etc/init.d/script reload
)lsof | grep /var/log
で確認します/ var/logにマウントします。古い構成を復元し、SIGHUP /再読み込みデーモンを再度実行します。
簡単な方法(ダウンタイム)
新しいLV /パーティションを作成し、/ varまたは/ var/logのいずれかに適切にマウントします。簡単な方法は、サーバーをメンテナンスモード(シングルユーザーモード)にして、操作に実際のコンソール(sshではない)を使用することです。
他の皆の答えは素晴らしくて正しいです、そしてあなたは間違いなく最初にそれらを読むべきです。
あなたのケースが私のような非常に単純なケースであることが判明した場合、それは簡単なコピーと貼り付けを可能にするので、私はこれを共有したいと思いました:
Syslogを停止し、現在のログをコピーします。
service rsyslog stop
mkdir -p /tmp/varlog
cp -r /var/log/* /tmp/varlog
次に、/var/log
に新しい場所をマウントします。 /dev/sdb
という新しいデバイスだとしましょう
mount /dev/sdb /var/log
これで、ファイルをコピーして、syslogを再起動できます。
cp -r /tmp/varlog/* /var/log
rm -rf /tmp/varlog
service rsyslog start
これがあなたのマシンの寿命のかなり早い段階で起こると仮定すると、rsyslog
が実行されている唯一のデーモンである可能性があります。 YMMV!
PS-おそらくあなたのfstab
にも追加したいと思うでしょう。これを行う1つの方法を、非常に単純なマウントを想定します。
cat /etc/mtab |grep /var/log >>/etc/fstab
(cf https://serverfault.com/a/267610/80606 mtabをfstabに接続することについて)
あなたができる別のことは:
/var/log
でファイルを開いているプロセスを停止します/var/log
でファイルを開いているプロセスがないことを確認します(kubanskamacが示唆するようにlsof
を使用)/var/log
を十分な空き容量のある別のパーティションに移動します(例に従って、それは/home/log
になります)ln -s /home/log /var/log
)これは、私が良い習慣だとは思っていません。これは単なる回避策であり、サーバーをシャットダウンする必要はありません。正しい解決策は、十分なスペースを持つ新しい/var
または/var/log
パーティションを作成する(または現在のパーティションを拡張する)ことです。
@hwjpに基づく別のソリューションでは、別のドライブボリュームを使用してそれらを移動できない場合は、仮想ドライブボリュームを、より多くの空き容量がある別のボリュームに作成できます(私の場合)。
仮想ボリュームの作成:
A)する:Sudo dd if=/dev/zero of=VHD-log.img bs=1M count=1200
B)する:Sudo mkfs -t ext4 /thevolumeofyourchoice/VHD-log.img
mkfsユーティリティを使用して、VHDログイメージファイルのEXT4ファイルシステムタイプをフォーマットします。
C)do:Sudo mkdir /thevolumeofyourchoice/vlog
VHDログをディレクトリにマウント(マウントポイント)
D)する: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 = mode、ownership、timestampsと同じ)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
to/var/log内の開いているファイルをリストし、それらが/ var/log-oldではなく/ var/logを指していることを確認します
すべてが問題なければ、/ var/log-oldをmv、バックアップ、または削除できます。