ファイルサーバー(CentOS5.9 samba3.6)のデータを新しいハードディスクに移行する作業中に「No space left on device」(空いとらんバイ)というメッセージが表示され、作業を正常にすすめることができませんでした。

対処策を忘れないうちにメモっておきます。

<前提条件>移行作業はSystemrescueCDからブートし、旧HDD(250GB)から新HDD(400GB)にパーティション内のすべてのデータを cp -a でコピーする。

パーティション数は5個、これをマウントしてディレクトリとしてコピーすることになります。1個のパーティション内のデータ容量は、平均約17GBでした。したがって、マウント後のディレクトリのサイズも17GBとなります。

(パーティションは事前に適正なサイズに切っています。1パーティションあたり約80GB弱。基本パーティション3個、論理パーティション2個。)

「No space left on device」は次の2つの状況で発生しました。それぞれの対処方法を紹介します。

  1. コピーしているとき
  2. システムを起動している途中

1.コピーしているとき

(1)マウント

旧HDDがsdb、新HDDがsdc

# mount /dev/sdb1 /mnt/b1
# mount /dev/sdb2 /mnt/b2

中略…

# mount /dev/sdb6 /mnt/b6

# mount /dev/sdc1 /mnt/c1

# mount /dev/sdc2 /mnt/c2

中略…

# mount /dev/sddc6 /mnt/c6

(2)コピー

# cd /mnt/b1
# cp -a ./ mnt/c1

正常にコピーが終わりました。

# cd /mnt/b2
# cp -a ./ mnt/c2

このとき、「No space left on device」が表示され、コピーに失敗しました。

「No space left on device」は、i-nodeが枯渇すると表示されるそうです。

そして、そのパーティションのサイズを大きくするか、不要ファイルを削除するとi-nodeの使用を減らせるようです。

そもそも、i-nodeって何?==ウィキペディアより

「inode(あいのーど)は、ext2などのUnix系ファイルシステムで古くから使われているデータ構造である。inode にはファイル、ディレクトリなどのファイルシステム上のオブジェクトに関する基本情報が格納される。」

う〜ん、ようわからんバイ。ファイルシステムに関連するもので、ファイルやディレクトリの情報を格納するデータベースかなぁ?おそらく、ファイル容量とは直接は関係していないようですね。実際に、df -hで見ると、容量には十分余裕があっても、i-nodeが満タンになっている場合もありました。

さっそく、チェックしてみます。

# df -ih

としてみると

「/livemnt/squashfs」のi-nodeの使用率が100%になっています。

中身を見てみると、/booや/sbinなどSystemrescueCDのシステムに関連したものが詰まっています。

他のディレクトリは数%台でした。

そもそも、CDなので、容量は増やせませんし、不要ファイルが何なのかも明確でないので削除できません。

おそらく、今回は、コピー、しかも-aなので元のファイルやディレクトリのデータ以外にもそれらのパーミッションやユーザ・グループ情報や階層構造などなど多くの情報を取ってくるので、通常のコピーより半端なくコピー量が増えていると思われました。

そこで、連続的にマウントし、そのディレクトリをコピーするのをやめて、1度に1つのパーティションしかコピーせず、しかも、コピー後は、アンマウントして解放することにしました。

(3)対処策

(先ほどのマウントポイントはすべてアンマウントして解除し、再度やり直します。)

①マウント(1組だけマウント)
# mount /dev/sdb1 /mnt/b1
# mount /dev/sdc1 /mnt/c1
②コピー(1つのディレクトリをコピー)
# cd /mnt/b1
# cp -a ./ /mnt/c1
③アンマウント(マウント解除)
# umount /mnt/b1
# umount /mnt/c1
④ ①〜③を/mnt/b6、/mnt/c6まで繰り返す。

少し面倒ですが、これで「No space left on device」の表示なしに、無事にコピーが終わりました。

2.システムを起動している途中

旧ハードディスクを取り外し、新ハードディスクを装着し、システムを起動させました。

(システムはデータ用のハードディスクとは別のディスクにインストールされています。今回は、データの移行だったので、システム自体はなにも変更されていません。)

(1)起動途中「No space left on device」が多発

sshdなどメインシステムが正常に起動できませんでした。

(2) i-nodeを確認

# df -ih

 

図1:i-nodeを確認

図1:i-nodeを確認

i-nodeの使用率はすべて数%でした。これではよくわからないので、実際にサイズの大きいファイルやディレクトリを表示させます。

(3)対処策

① 容量を無駄遣いしているファイルやディレクトリを探す

容量の大きい順に上位20を表示

# du -k / | sort -n | tail -20
② なぜか、/mnt/c5が存在し、容量が約16GB消費していた
③ 削除
# rm -rf /mnt/c5
# reboot  <==再起動

「No space on left device」が消え、正常に起動しました。

本来は存在しないはずの/mnt/c5がなぜ存在していたのかは、最初、SystemrescueCDを使わず、直接システムを起動してコピーしていたので、そのとき、間違えて、システム内にマウントしたことが原因だと思います。

システム用のハードディスクの容量は20GBなので、/mnt/c5の約16GBは、かなり容量を食っていたはずです。