web-dev-qa-db-ja.com

/ 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またはiノードを引き続き使用することを知っています。

16
Razique

適切な設計

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が必要です):

  • / var/logに記録するようにデーモンnoを再構成します
  • デーモンを更新します(kill -1または/etc/init.d/script reload
  • デーモンがファイルを閉じたことをlsof | grep /var/logで確認します

/ var/logにマウントします。古い構成を復元し、SIGHUP /再読み込みデーモンを再度実行します。

簡単な方法(ダウンタイム)

新しいLV /パーティションを作成し、/ varまたは/ var/logのいずれかに適切にマウントします。簡単な方法は、サーバーをメンテナンスモード(シングルユーザーモード)にして、操作に実際のコンソール(sshではない)を使用することです。

26
kubanczyk

他の皆の答えは素晴らしくて正しいです、そしてあなたは間違いなく最初にそれらを読むべきです。

あなたのケースが私のような非常に単純なケースであることが判明した場合、それは簡単なコピーと貼り付けを可能にするので、私はこれを共有したいと思いました:

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に接続することについて)

8
hwjp

あなたができる別のことは:

  • /var/logでファイルを開いているプロセスを停止します
  • /var/logでファイルを開いているプロセスがないことを確認します(kubanskamacが示唆するようにlsofを使用)
  • /var/logを十分な空き容量のある別のパーティションに移動します(例に従って、それは/home/logになります)
  • / var/logから/ home/logへのシンボリックリンクを作成します(ln -s /home/log /var/log
  • 最初のステップで停止したプロセスを再起動します

これは、私が良い習慣だとは思っていません。これは単なる回避策であり、サーバーをシャットダウンする必要はありません。正しい解決策は、十分なスペースを持つ新しい/varまたは/var/logパーティションを作成する(または現在のパーティションを拡張する)ことです。

2
mfriedman

@hwjpに基づく別のソリューションでは、別のドライブボリュームを使用してそれらを移動できない場合は、仮想ドライブボリュームを、より多くの空き容量がある別のボリュームに作成できます(私の場合)。

仮想ボリュームの作成:

A)する: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(1GB)入力ブロックのみをコピーします

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、バックアップ、または削除できます。

0