- キット各種完売。
- msBerryDAC改造情報
2020/07/05(日)NILFS使用時にLinux Kernelエラーが起こる問題の解決策
最近の新しいLinux KernelでNILFS(NILFS2)を使用すると、最初の書き込み時に
BUG: unable to handle kernel NULL pointer dereference at 00000000000000a8
となるエラーの解決方法(対処療法)。
NILFSとは
ログ構造化ファイルシステムと言われる、ファイルを変更するたびに常にスナップショットを自動的に保存できるLinux標準サポートのファイルシステムです。
/home 以下などをNILFSにしておくと、間違えてファイルを書き換えたときや、間違えてファイルを削除したときに、1時間前や1週間前の状態に遡ってファイルを復元することができます。
間違ってファイルを削除(上書き)してまうこと、ファイルを直接変更してしまってから元に戻したいことは誰しもあると思いますが、NILFSならいつでも元に戻せるため人為的にミスにとても強く重宝しています。
新しいカーネルで動作不安定に
このNILFSですが、最近の(ここ1年ぐらいの)カーネルで動作不安定になる不具合があります。Debian 10.4をインストールした際にこの問題に当たってしまいました……。
調べるとカーネルのファイルキャッシュに対するちょっとした変更(パッチ)が原因となっているようです。解決策はLinux系のMLにありました(そしておそらく投稿者の記事)。
要約すると「NILFSをマウントする前に、ダミー書き込みをすれば良い」とのことです。
簡単な解決策
/etc/fstab では自動マウントせずに(noautoオプションをつける)、rc.localでマウントするように変更します。
dd if=/dev/sda6 of=/dev/sda6 count=1 mount /home
/dev/sda6 やマウント場所は該当のパーティション等に合わせてください。ddコマンドで512バイトほどダミー書き込みをしてからマウントします。たったこれだけで問題は解決します。
やや複雑な解決策
rc.local でマウントする方法では、NILFSパティーション以下にDBデータ等サービスで使用するデータを置く場合や/varがNILFSパーティションだった場合に問題があります。rc.local のタイミングでマウントするのでは遅すぎるからです。
ですので、理想としてはfstabでマウントする直前にダミー書き込みを実行したいのです。
Debian系のsystemd環境では以下のような設定ファイルを置くことで、fstab実行直前にダミー書き込みを実現できます。
# /etc/systemd/system/nilfs2-dummy-write.service [Unit] Description=NILFS2 dummy write DefaultDependencies=no After=local-fs-pre.target Before=local-fs.target [Service] ExecStart=/bin/dd if=/dev/sda6 of=/dev/sda6 count=1 Type=oneshot [Install] WantedBy=sysinit.target
ファイル作成後、サービスとして認識されたか確認します。
# systemctl list-unit-files --type=service | grep dummy nilfs2-dummy-write.service disabled
認識されているようなら、サービスを有効にします。
# systemctl enable nilfs2-dummy-write # systemctl list-unit-files --type=service | grep dummy nilfs2-dummy-write.service enabled
参考文献
まとめ
- NILFS/NILFS2はとても便利なのに利用者が少ない。
- パッチが出てるので、近々修正されるとは思う。
- systemdの勉強になった。
2015/04/07(火)Linux の iptables で IPポート 転送の設定
メモ代わり。
HOST="192.168.0.1" PORT="80" sysctl -w net.ipv4.ip_forward=1 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport "100$PORT" -j DNAT --to $HOST:$PORT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -A FORWARD -p tcp --dport $PORT -d $HOST -j ACCEPT iptables -A FORWARD -p tcp --sport $PORT -s $HOST -j ACCEPT
2011/06/24(金)Linuxブートシーケンスまとめ。GRUBと起動トラブルのメモ
mdadmで作ったソフトウェアRAIDに障害があってRAIDを組みなおしてたのですが、まともに起動しないトラブルに見舞われて格闘してました。
その時に調べたGRUB2と起動の仕組みについてのメモ。
環境
- Ubuntu 10.04 / Debian 6
- ブートローダー GRUB2 (Ver1.98)
- 起動ディスク RAID1(ミラー)
- ファイルシステム構成 / から起動(/bootは / ファイルシステム内)*1
ここで説明するGRUBはGRUB2です。GRUB(Ver0.98)とは異なりますのでご注意ください。
2011/02/24(木)これぐらいやっとけ ~Linuxサーバのセキュリティ設定~
管理中のサーバで行っているセキュリティ設定を公開します。本当はこういうことを公開するのはよろしくないのですが、脆弱サーバが氾濫している現状そこが踏み台となってsshアタックされるのも迷惑極まりないので、最低限やっとけという内容でまとめました。*1
2010/04/05(月)Linuxなリモートサーバを自動バックアップ
LinuxやFreeBSDのリモートサーバを自動的にバックアップする仕組みを構築したときのメモ。
基本戦略
- リモートサーバ上の特定ディレクトリを1日1回程度自動バックアップする。
- バックアップには tar を使う。
- 定期実行には crontab を使う。
- 手元のサーバにも、バックアップのコピーを自動で送り込む。
最初sftpを使おうと思ったのですが(参考資料)、ftpのようにputのみの許可にできないのでやめました。ftpでも良いのですが、今更(この時代に)ftpのサービスなんて起動したくない。
色々考えた結果。
- 手元サーバにWebDavを入れて、PUTメソッドでファイルを送り込む。
- 転送ファイルの秘匿が必要なときは暗号化する。
使用ツールの選定
WebDav(HTTP PUT)を実行できるツールを探すのにひと苦労しました。cadaverというツールが有名なのですが、対話的プログラムなので自動化全く向かない。色々探していると、ndという小粒なツールを発見。ありがたいことです。*1
ファイルの暗号化には openssl コマンド。
リモートサーバ内にもバックアップを保存するので、古いバックアップを削除するためのツールとして tmpreaper(tmpwatchの代わり)を使用しました。
# apt-get install tmpreaper # apt-get install nd
手元サーバ
Apache に mod_dav と mod_dav_fs を入れました。
リモートサーバへの仕込み
まず次のスクリプトを仕込み ~/bin/backup.sh として保存しました。
#!/bin/sh #------------------------------------------------------------------- # Automation backup script #------------------------------------------------------------------- TMPREAPER=/usr/sbin/tmpreaper DIR=~/backup DATE=`date '+%Y%m%d'` FILE=$DATE-public_html.tar.gz # 30日経過したファイルを削除 $TMPREAPER -m 30d $DIR cd ~/ tar zcf $DIR/$FILE.tmp public_html/ # OpenSSLを使用してファイル暗号化 openssl enc -e -AES256 -k 'PASSWORD' -in $DIR/$FILE.tmp -out $DIR/$FILE rm $DIR/$FILE.tmp # 手元サーバに送り込む nd -p $DIR/$FILE http://(local-server)/davput/$FILE
~/backup は chmod 700 としておきます。
自動実行させるため、crontab -e として組み込みます。
# m h dom mon dow command 0 4 * * * ~/bin/backup.sh
手元サーバの設定
Debian系(Ubuntu)を前提として話しますが、他サーバの時は適当に読み替えてください。
- 保存場所 /home/dav/davput
まずWebDavを有効にします。
# cd /etc/apache2/mod-enable/ # ln -s ../mods-available/dav.load # ln -s ../mods-available/dav_fs.load # ln -s ../mods-available/dav_fs.conf
続いて dav_fs.conf を編集します。
Alias /davput /home/dav/davput <Directory "/home/dav/davput"> DAV on AllowOverride None Options None order deny,allow deny from all <Limit PUT> order deny,allow deny from all allow from 127.0.0.1 allow from (リモートサーバのIP) </Limit> </Directory>
リモートサーバのIPに対してPUTのみを許可します。GETなどを許可するといらぬデータ盗用を招きかねないので注意。より強固にするならパスワードもかけると良いでしょう。
保存場所である /home/dav/davput を www 権限で書き込みできるようにしておきます。
# chmod 700 /home/dav/davput # chown www-data:www-data /home/dav/davput
テスト
リモートサーバに入り、backup.sh を手動で叩きます。エラーがでず、手元サーバおよびバックアップディレクトリにアーカイブがおかれていれば成功です。
まとめ
手元サーバにはバックアップファイルがたまり続けるので、定期的に削除するか、tmpreaperをcrontabに仕込むと良いでしょう。
tmpreaperのメモ
tmpwatchを使おうとしたらそんなパッケージは無いと怒られたので。
debian系だと /usr/sbin/tmpreaper にたぶん入る。
# 最終更新日時で10秒経過したものを削除 $ /usr/sbin/tmpreaper -m 10s ~/dir # 最終更新日時で10分経過したものを削除 $ usr/sbin/tmpreaper -m 10m ~/dir # 最終更新日時で10時間経過したものを削除 $ usr/sbin/tmpreaper -m 10h ~/dir # 最終更新日時で10日経過したものを削除 $ usr/sbin/tmpreaper -m 10d ~/dir
VirtualHost対応のため curl を使う
ndコマンドは VirtualHost に対応していない(Hostヘッダを送信しない)ので、curlに変更しました。
curl -s -X PUT -H "Host: example.com" -T $DIR/$FILE http://example.com/davput/$FILE >/dev/null