2012秋のファイルサーバ復旧 05 データ領域用HDDの設定など

今まで使っていたデータをsambaで見られるようにする前にやることがあります。
いっぱいになってしまっているデータの分散です。
今のドライブの状態は

  • A - システム領域用のUSBメモリ
  • B - 100%
  • C - 98%くらい - Aのミラーリング用
  • D - 98%くらい
  • E - 98%くらい - Cのミラーリング用
  • F - 0% - 新しく買ってきたドライブ
  • G - 0% - Eのミラーリング用

となってます。

で、Bは実際は100%じゃないのにファイルを削っても残量が0のままの謎のドライブです。
メモ: 2012秋のファイルサーバ復旧 01 ディスクフル発覚→シングルユーザで起動してみる


怪しいので一度フォーマットしたほうがいいと思うので下記の手順で進めます。
なお、コピーしたファイルのチェックサムとかでの比較をしてないのはrsync自体がチェックサム機能を使ってファイルの差分をチェックしているから。
転送時にもチャンクごとにチェックサムを計算して比較していて2度rsync使ってチェックするようなことも不要です。

rsync - Wikipedia

↑間違ってました。オプション指定が必要
2013年春のファイルサーバHDD障害発生

  1. Bの不要ディレクトリを削除(/var/log, /var/tmp, /tmp のシンボリックリンク先にしていたもの)
  2. yumでrsyncをインストール
  3. B→Cでrsyncで同期。サーバが止まる前の状態の差分反映をしていないため。
  4. B,Cドライブ(パーティション)にLABELを設定してfstabの記述をLABEL指定に変更
  5. D→Eも同様に同期。
  6. D,Eドライブ(パーティション)にLABELを設定してfstabの記述をLABEL指定に変更
  7. F,Gドライブにパーティション作成、フォーマット、LABEL設定
  8. BのデータをFにrsyncでコピー。実際のデータは100%じゃないのでFにコピーした時には98%位になるはず。
  9. FのデータをGにrsyncでミラーリング。
  10. B,Cをフォーマット
  11. FからBに移動する必要のあるデータだけをディレクトリ単位でrsyncでコピー
  12. BからCへrsyncでコピー
  13. Bに移動したデータをFから削除
  14. FからGへrsyncで削除した分を反映
  15. B→Cへの反映rsyncをcronに登録
  16. D→Eも同様
  17. F→Gも同様

でもCとDは今後は同期する必要なんか無さそうですな。データの増減がなさそうだし。

途中でLABELを設定してますが、それぞれのドライブは指している場所で順番にsdb,sdc,sdd,sdeと順番に振られているため、途中1つが認識されない状態で起動してしまうと今までsdeだったものがsddになってしまったり、と恐ろしいことが起きてしまうのでドライブ固定で認識するように設定する必要があるということです。

どうやるのかというとfstabにsdbとかじゃなくてLABELを指定するだけ。
今はそれぞれのドライブというかパーティションにLABELをつけてずに、

/dev/sdb /var/storage/00/main

とやってました。これだと上記の理由でおっかないことになるわけです。

下記のように割り当てます。

  • B - 00main
  • C - 00mirror
  • D - 01main
  • E - 01mirror
  • F - 02main
  • G - 02mirror

ではまずB,Cのドライブだけ接続して起動します。
ドライブが接続されているか確認。

# ls /dev
MAKEDEV          network_latency     ramdisk   tty17  tty44    usbdev1.1_ep81
X0R              network_throughput  random    tty18  tty45    usbdev1.2_ep00
bus              null                rawctl    tty19  tty46    usbdev1.2_ep02
console          nvram               root      tty2   tty47    usbdev1.2_ep81
core             oldmem              rtc       tty20  tty48    usbdev2.1_ep00
cpu              parport0            sda       tty21  tty49    usbdev2.1_ep81
cpu_dma_latency  parport1            sda1      tty22  tty5     usbdev3.1_ep00
disk             parport2            sda2      tty23  tty50    usbdev3.1_ep81
fd               parport3            sda3      tty24  tty51    usbdev4.1_ep00
full             port                sdb       tty25  tty52    usbdev4.1_ep81
hidraw0          ppp                 sdc       tty26  tty53    usbdev5.1_ep00
hidraw1          ptmx                sg0       tty27  tty54    usbdev5.1_ep81
hpet             pts                 sg1       tty28  tty55    usbdev5.2_ep00
initctl          ram                 sg2       tty29  tty56    usbdev5.2_ep81
input            ram0                shm       tty3   tty57    usbdev5.2_ep82
kmsg             ram1                snapshot  tty30  tty58    vcs
log              ram10               stderr    tty31  tty59    vcs2
loop0            ram11               stdin     tty32  tty6     vcs3
loop1            ram12               stdout    tty33  tty60    vcs4
loop2            ram13               systty    tty34  tty61    vcs5
loop3            ram14               tty       tty35  tty62    vcs6
loop4            ram15               tty0      tty36  tty63    vcsa
loop5            ram2                tty1      tty37  tty7     vcsa2
loop6            ram3                tty10     tty38  tty8     vcsa3
loop7            ram4                tty11     tty39  tty9     vcsa4
mapper           ram5                tty12     tty4   ttyS0    vcsa5
mcelog           ram6                tty13     tty40  ttyS1    vcsa6
md0              ram7                tty14     tty41  ttyS2    zero
mem              ram8                tty15     tty42  ttyS3
net              ram9                tty16     tty43  urandom

sdb, sdc が出ていることを確認できたのでマウント先を作成してマウントします。

# mkdir -p /var/storage/00/main
# mount /dev/sdb /var/storage/00/main/
# mkdir -p /var/storage/00/mirror
# mount /dev/sdc /var/storage/00/mirror/

マウントが済んだら中身が見えるので確認します。

# ls /var/storage/00/main/
data  lost+found  svn  this_is_main  tmp  var.log
# ls /var/storage/00/mirror/
data  lost+found  svn  this_is_mirror

メイン側にはthis_is_mainのファイル、ミラー側にはthis_is_mirrorのファイルがあるので正常にマウントされました。

Bの不要なファイルを消します。

# cd /var/storage/00/main/
# ls
data  lost+found  svn  this_is_main  tmp  var.log
# cd var.log/
# ls
anaconda.log     btmp     maillog     messages.4  secure     spooler.4
anaconda.syslog  cron     maillog.1   pm          secure.1   svndumpall
anaconda.xlog    cron.1   maillog.2   prelink     secure.2   sync_storage
boot.log         cron.2   maillog.3   rpmpkgs     secure.3   tallylog
boot.log.1       cron.3   maillog.4   rpmpkgs.1   secure.4   wtmp
boot.log.2       cron.4   messages    rpmpkgs.2   spooler    yum.log
boot.log.3       dmesg    messages.1  rpmpkgs.3   spooler.1  yum.log.1
boot.log.4       faillog  messages.2  rpmpkgs.4   spooler.2
brcm-iscsi.log   lastlog  messages.3  samba       spooler.3
# rm -rf *
# ls
# cd ../
# cd tmp/
# ls
tmp  var.tmp
# rm -rf *
# ls
# cd ../
# ls
data  lost+found  svn  this_is_main  tmp  var.log
# rmdir tmp
# rmdir var.log
# ls
data  lost+found  svn  this_is_main

無事消し去りました。
では続いてB→Cのrsync。

# rsync -av --delete /var/storage/00/main/data /var/storage/00/mirror
(略)
sent 379593776382 bytes  received 33989 bytes  41226588.15 bytes/sec
total size is 2860450281344  speedup is 7.54

直前に空き容量確保のために色々移動させたからすごい量です。
ではdfしてみます。

# df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sda3             14729016   1280256  12688484  10% /
/dev/sda1               101086     12180     83687  13% /boot
tmpfs                  1020812         0   1020812   0% /dev/shm
/dev/sdb             2884285104 2750092700         0 100% /var/storage/00/main
/dev/sdc             2884285104 2797531524         0 100% /var/storage/00/mirror

一致していない!!!!
使用量が一致しないのはなぜ…?
もういちどrsyncしてみます。

# rsync -av --delete /var/storage/00/main/data /var/storage/00/mirror
sending incremental file list

sent 6092860 bytes  received 14782 bytes  67487.76 bytes/sec
total size is 2860450281344  speedup is 468339.55
[root@localhost main]# df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sda3             14729016   1280256  12688484  10% /
/dev/sda1               101086     12180     83687  13% /boot
tmpfs                  1020812         0   1020812   0% /dev/shm
/dev/sdb             2884285104 2750092700         0 100% /var/storage/00/main
/dev/sdc             2884285104 2797531524         0 100% /var/storage/00/mirror

同じです。当然ですが…。

du で見てみてもやはりサイズが違います。

# du -shm /var/storage/00/main/
2685437 /var/storage/00/main/
# du -shm /var/storage/00/mirror/
2731768 /var/storage/00/mirror/

diffってみます。

# diff -r /var/storage/00/main/ /var/storage/00/mirror/

いつになっても終わりません。
USBメモリのtmpでがりがり書き込まれて寿命が減っていっているような不安にかられるので途中で停止。
Ctrl+Cです。

仕方ないのでいつものlsでの比較をやります。
HDDいっぱいで書き出せない気がするし、USBメモリにはなるべき書き出したくないのでputtyのログを保存することでファイル書き出ししときます。

メモ: ファイルサーバHDD障害対応2

の投稿にある通り、

# ls -laR /var/storage/00/main/
# ls -laR /var/storage/00/mirror/

で出力します。
ファイルに出さいないのでリダイレクトはナシです。

出力されたログファイルから上記投稿通りに余計な行を削除して保存。
Winmergeで比較します。

結果、ファイルは完全に一致してました。
きっとまたディレクトリサイズが違うだけなんだろうなあ、なんでだろうなあ、でもまあ、ディレクトリサイズが違うだけだから大丈夫でしょ、と放置しておいた謎をググってみました。
すぐに出てきました。すごく納得。
Linuxでlsコマンドを実行したときに参照できる「ディレクトリの.. - 人力検索はてな

これでは仕方ないですな!!!

では次にすすみます。LABELの設定です。
LABELが設定されてないことを確認、設定、とやってます。

# e2label /dev/sdb

# e2label /dev/sdb 00main
# e2label /dev/sdb
00main
# e2label /dev/sdc

# e2label /dev/sdc 00mirror
# e2label /dev/sdc
00mirror

なお、システム領域を確認してみるとこんな感じです。

# e2label /dev/sda1
/boot1

設定がおわったのでfstabに設定します。
メモ: 3TBのドライブはfdiskじゃだめらしいにあるのと同じですが、LABEL指定なのでちょっと違います。
追記するのは下記の内容です。

LABEL=00main            /var/storage/00/main    ext3    defaults        0 0
LABEL=00mirror          /var/storage/00/mirror  ext3    defaults        0 0

ところでパーティションが/dev/sdb1とかにならず/dev/sdbだけになっているのは上記投稿にある通りの理由からで、記述ミスではありません。

保存し終わったらリブートしてみます。
そう思ってputtyではなく実機のモニタを見てみるとなんか警告がでてました。
後で調べてみます。

再起動が終わったのでディレクトリを確認します。

# cd /var/storage/00/main/
# ls
data  lost+found  svn  this_is_main
# cd /var/storage/00/mirror/
# ls
data  lost+found  svn  this_is_mirror
# df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sda3             14729016   1280296  12688444  10% /
/dev/sda1               101086     12180     83687  13% /boot
tmpfs                  1020812         0   1020812   0% /dev/shm
/dev/sdb             2884285104 2750092700         0 100% /var/storage/00/main
/dev/sdc             2884285104 2797531524         0 100% /var/storage/00/mirror

OKでした。

さて、先程の警告です。

コンソールに出ていた警告

EXT3-fs warning: checktime reached, running e2fsck is recommended.

です。チェック時間が来ましたよ。e2fsckをやりなさいとのことです。
やってみます。

# fsck -n /dev/sdb
fsck 1.39 (29-May-2006)
e2fsck 1.39 (29-May-2006)
Warning!  /dev/sdb is mounted.
Warning: skipping journal recovery because doing a read-only filesystem check.
00main has gone 245 days without being checked, check forced.
Pass 1: Checking inodes, blocks, and sizes

ここから先が全然すすまない。
このまま放置して仕事行きます。
続きは次回

コメント