PT3によるTV録画や、WakeOnLANサーバ、KVMサーバ等をセットアップする際に、今回初めてLinuxのソフトウェアRAIDを使ってみたのですが、ハズレのHDDを引いてしまった為、片方のHDDが死にかけただけで、データこそ保全出来たものの、アクセス速度が極端に遅くなったり、KVM上のOSが1時間かかっても起動しきれない等の問題に直面し、復旧に苦労しました。
それで、今までハードウェアRAIDカード(3ware、areca、lsi logic等)を2年~3年おきに新調していた経験から、ハードウェアRAIDカードの導入を検討しましたが、1枚10万円もするRAIDカードを購入するのも勿体無いので、vmware ESXiのUSBメモリにインストールしての運用を見習って、Linuxでも同じようなことがしたいと考え、チャレンジしてみました。
USBメモリにLinux(今回はUbuntu13.10)をインストールして、運用状態にまで設定し終わったらUSB丸ごとバックアップし、万が一USBメモリが壊れたとしても、バックアップしたUSBメモリで起動すれば、すぐに復旧できる環境の作成を目指します。HDDは、LinuxのソフトウェアRAIDで良いですね。OS部分に対してRAID設定するとOSのVUPでGRUBの設定がどう扱われるか等が心配ですが、USBBOOTのLinuxであれば、その辺も心配ないし、事前テストももう1本のUSBにバックアップしてからであれば、気楽にできます。
本記事では、USBメモリにUbuntu13.10をインストールし、初期設定を行い、消費電力のチューニングも行った状態にします。HDDのRAID設定については、別の記事に分けます。
USBブート化&消費電力チューニング前後の比較 | ||
---|---|---|
機種名 | TX100 S3(ノーマル) | TX100 S3(チューニング後) |
CPU | Pentirum G 620 | Pentirum G 620 |
HDD | 2.5inch×2台 | USBメモリ×1本、2.5inch×2台 |
Memory | 4G | 4G |
拡張デバイス | PT3×1台 | PT3×1台 |
消費電力 | 34w | 25w |
消費電力削減率 | – | 約28% |
事前準備する物
- 8Gbyte以上のUSBメモリ(USBメモリであれば何でもいいです。ブートローダさえ書き込んでしまえばUSBブート可能です。
- 適当なPC。評価用で良いが、HDDが付いる場合は事前に抜いておくとインストール先を間違えるような事故を予防できるかも。
USBメモリにインストールするからと言って、インストール手順が特殊になるわけではないので、『Ubuntu13.10 serverのインストールと初期設定(スクリーンショット有り)』を参考にして、インストールを行ってください。インストール中にSWAP領域は無しでインストールをします。
インストール後、まずはパッケージの更新を行います。
sudo apt-get update sudo apt-get upgrade
IPv6の無効化
sudo su - echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
NTPの設定
# 事前にNTPサーバと時間を合わせておく。 sudo ntpdate ntp.ubuntu.com sudo apt-get install ntp
SSHでのログイン時に名前解決をするとログイン時に無駄にタイムアウトまで待たされるので、名前解決を無効にします。
sudo su - echo "UseDNS no" >> /etc/ssh/sshd_config
サーバー用途で利用したいため、固定IPにします。
vi /etc/network/interfaces # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address 172.20.1.31 netmask 255.255.255.0 network 172.20.1.0 broadcast 172.20.1.255 gateway 172.20.1.1 dns-nameservers 172.20.1.1
一旦再起動
sudo reboot
HDDのアクセス時にタイムスタンプを記録しないようにする。
/etc/fstabの内容を下記のように変更します。
noatime、relatimeについては、kosakiさんがまとめて下さっている記事が詳しいです。
sudo vi /etc/fstab
UUID=e9ba7772-f22b-4f8b-b006-************* / ext4 relatime,errors=remount-ro 0 1 /dev/sr0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0
#マウントしなおす mount -o remount / #マウント結果確認 cat /proc/mounts rootfs / rootfs rw 0 0 sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0 proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0 udev /dev devtmpfs rw,relatime,size=2001232k,nr_inodes=500308,mode=755 0 0 devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0 tmpfs /run tmpfs rw,nosuid,noexec,relatime,size=402264k,mode=755 0 0 /dev/disk/by-uuid/e9ba7772-f22b-4f8b-b006-b4b2a5a6416e / ext4 rw,relatime,errors=remount-ro,data=ordered 0 0 none /sys/fs/cgroup tmpfs rw,relatime,size=4k,mode=755 0 0 none /sys/fs/fuse/connections fusectl rw,relatime 0 0 none /sys/kernel/debug debugfs rw,relatime 0 0 none /sys/kernel/security securityfs rw,relatime 0 0 /dev/shm /tmp tmpfs rw,relatime,size=1048576k 0 0 none /run/lock tmpfs rw,nosuid,nodev,noexec,relatime,size=5120k 0 0 none /run/shm tmpfs rw,nosuid,nodev,relatime 0 0 none /run/user tmpfs rw,nosuid,nodev,noexec,relatime,size=102400k,mode=755 0 0 none /sys/fs/pstore pstore rw,relatime 0 0 systemd /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,name=systemd 0 0
RAMDISKを作成する。
一時ファイル置き場などはRAMDISKで十分。BOOTするごとに初期化されてしまうので、例えばPT3とepgrecで運用している際のチャンネルスキャンに使うとか。必要なければ作成しなくていいです。
# /etc/fstabに下記を追加 /dev/shm /tmp tmpfs size=1024m 0 0
/varをRAMDISCに移す。
SSDの寿命を延ばすのと同じ要領で、ログが書き出される/varもRAMDISC上に配置します。
事前に/var以下をきれいにしておきたいので、
# aptのキャッシュを削除する sudo apt-get clean # /var 以下をコピーする mkdir -p /tmpfs/var/ cp -a -f /var/* /tmpfs/var/
/etc/fstabにtmpfsの設定をする
# /etc/fstabに下記を追加 /dev/shm /var tmpfs size=512m 0 0
起動時に/varのディレクトリ構成を復元させる
cp -a -f /tmpfs/var/* /var/
USBメモリの転送速度を参考程度にはかっておく
速度を測定してみて、『やけに速いな・・・USB3.0だからか?』と言う感想。
hdparm -tT /dev/sda /dev/sda: Timing cached reads: 9790 MB in 2.00 seconds = 4897.41 MB/sec Timing buffered disk reads: 108 MB in 3.04 seconds = 35.51 MB/sec
消費電力を削減するためのカーネルパラメータのチューニング
消費電力を削減する為にカーネルパラメータをチューニングします。主にチューニングするのはCPUのクロックやUSBを含む各デバイスの消費電力設定です。設定前後での消費電力の差は、冒頭に記載したとおりで、2割~3割程度の消費電力削減に貢献しています。
下準備として、物理的、もしくはBIOS設定で下記を実施します。
- IEEE1394
- USB3.0専用チップ(OFFにしただけで2w~3w削減できることもあり)
- オンボードサウンド
- ビデオカード(別途ビデオカードを載せている場合、セットアップ後に除去し、SSH経由のみにする)
- CPU内臓GPU(HD Graphics等。intelの方はLinuxのドライバがVGAが接続されていなければOFFにしてくれる。3w~削減可能)
- シリアル、パラレルポート(数mwの削減が出来ているかもしれないが、ON/OFFしても実測では変化が無かった。使っていなければOFFで良い)
次に、Linuxのprocファイルシステムを用いたチューニングを実施します。
事前に値を変更する対象が存在していることを確認します。もしも、ファイルが無いなどのエラーが見つかった場合には、その項目の設定を外します。この記事を書く際に使っていたのはTX100 S3なので、同じマシンを購入しておけば変に悩まなくてもいいかもしれません。特にAMD系やCeleronの場合には多少異なっているかもしれません。
# 事前に対象のファイルがある事を確認する。 cat /proc/sys/vm/laptop_mode cat /proc/sys/kernel/nmi_watchdog cat /proc/sys/vm/dirty_writeback_centisecs for i in /sys/bus/usb/devices/*/power/autosuspend; do ls $i && cat $i; done for i in /sys/bus/usb/devices/*/power/level; do ls $i && cat $i; done for i in /sys/class/scsi_host/host*/link_power_management_policy; do ls $i && cat $i; done for i in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do ls $i && cat $i; done for i in /sys/bus/{pci,i2c}/devices/*/power/control; do ls $i && cat $i; done
対象のファイルが存在する事が確認できたら下記のコマンドを実行してみます。ワットチェッカー等で消費電力の推移を見ながら実施すると良いかもしれません。本当に2割近く削減できるので。
# ラップトップモードを有効にして消費電力を下げる。 echo 5 > /proc/sys/vm/laptop_mode # nmi watchdog を無効にする echo 0 > /proc/sys/kernel/nmi_watchdog # ディスクへのフラッシュ時間を500から1500にする。 echo 1500 > /proc/sys/vm/dirty_writeback_centisecs # USB 自動サスペンド。設定しても問題ないと思うが、USB周りで問題が出たらコメントアウトして。 for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 1 > $i; done # USBの電力レベルを自動にする。 for i in /sys/bus/usb/devices/*/power/level; do echo auto > $i; done # Aggressive Link Power Management (ALPM) を利用して、アイドル時にディスクへの SATA リンクを低電力に設定する # min_power ディスクに I/O がない時に最小電力状態 (SLUMBER) へのリンクを設定します # medium_power このモードは、ディスク上に I/O がない時に 2 番目に電力が低い状態へのリンクを設定します # max_performance ALPM無効 for i in /sys/class/scsi_host/host*/link_power_management_policy; do echo "min_power" > $i; done # デバイス毎の消費電力の設定をautoに切り替える for i in /sys/bus/{pci,i2c}/devices/*/power/control; do echo auto > $i; done # CPUの動作はデフォルトでondemandだと思われるが、MAX等になっていると常に最高クロックなので、念のためondemandに設定し直す for i in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do echo "ondemand" > $i; done
上記のコマンドが全てエラーなく実行できた場合、/etc/rc.localに消費電力設定を記載しておきます。この後、再起動を行って、再度、設定が出来ている事を確認する為に、下記のコマンドを実行します。
# 事前に対象のファイルがある事を確認する。 cat /proc/sys/vm/laptop_mode cat /proc/sys/kernel/nmi_watchdog cat /proc/sys/vm/dirty_writeback_centisecs for i in /sys/bus/usb/devices/*/power/autosuspend; do ls $i && cat $i; done for i in /sys/bus/usb/devices/*/power/level; do ls $i && cat $i; done for i in /sys/class/scsi_host/host*/link_power_management_policy; do ls $i && cat $i; done for i in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do ls $i && cat $i; done # 下記設定は、rc.localに書いただけだと、起動の順番なのか一部設定できていなかった。他の場所に置くかな for i in /sys/bus/{pci,i2c}/devices/*/power/control; do ls $i && cat $i; done
開発パッケージのインストール
開発パッケージのインストール不要なら飛ばしてOKですが、たいていの場合使うので予めインストールしておきます。
sudo apt-get install git unzip pkg-config automake build-essential sudo apt-get install automake omake autopoint libtool libboost-all-dev cd /tmp wget http://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.bz2 tar -jxvf ruby-2.0.0-p247.tar.bz2 cd ruby-2.0.0-p247 ./configure && make && make install gem update
まとめ
以上で、USBブートするLinuxの最低限の設定が完了です。この後、運用に入るのですが、一点注意事項があり『USBメモリに出来る限り書き込みをしないようにする』必要があります。もしも、MySQL等をインストールして、epgrec等を運用した場合、USBメモリ故障率が異常に高くなります(事実、2か月ほどで壊れた)。ログの出力方法等も考え直した方が良さそうです。/var/log以下をRAMDISKに置いて、起動時に読み込み、1時間おきと、終了時に書き出す方式を検討中です。
参考
下記のドキュメントを参考にさせていただきました。
- Red Hat Enterprise Linux 6 電力管理ガイド
- Installing Linux (Debian) on USB hard drive and USB flash/jump drive
- How to reduce power consumption
最後に
この内容は実運用に伴って更新をしていく予定です。もしも、間違っている個所や、もっと良いやり方等がありましたら、コメント頂くかcontactフォームからご指摘いただければ幸いです。