FreeBSD だと最近は度々目にする .xz ファイル。
圧縮ファイル形式なのだけれども、そのものずばり、 xz
コマンドでいろいろ扱える。
今回はファイルの破損チェックのために
$ xz -t hoge.tar.xz
壊れてると、なんかメッセージが出てくる。
今回はただの備忘録。
FreeBSD だと最近は度々目にする .xz ファイル。
圧縮ファイル形式なのだけれども、そのものずばり、 xz
コマンドでいろいろ扱える。
今回はファイルの破損チェックのために
$ xz -t hoge.tar.xz
壊れてると、なんかメッセージが出てくる。
今回はただの備忘録。
まず、受け側は ipfw
のポートを開けます。
$ sudo ipfw add 10060 pass tcp from any to xxx.xxx.xxx.xxx 8080 setup keep-state
で、 nc
で LISTEN しますが、引数がポイント。
$ nc -l -N -d 8080
送る側からも nc
で送ります。
$ echo "ABC" | nc xxx.xxx.xxx.xxx 8080
ポイントになるのは受け側の nc
の引数で、
受けるのみなら -d
で stdin を捨てて、 -N
で終了後にソケットを shutdown
をします。
これがないと、データを送り終わっても TCP コネクションを終了できずに、
nc
もずっと走り続けます。
なんで……
UNIX シェルでテキストファイルをばばーっと処理してる時に、
データ数となりがちな行数を数えるコマンドは良く知られてると思います。
$ wc -l file.txt
さて、これで表示されるのはあくまで行数なので、
データ数がこれより多いことはあり得ませんが、少ない可能性はあります。
そう、データが重複しているケースです。
そこで必要になるのが重複行のチェック。ここで以下のコマンド。
$ cat file.txt | sort | uniq -c | grep -v "^ 1 " | wc -l 0
一旦ソートしてから uniq -c で同一の行の数を数えます。
そして、1 行しかない=重複がない行を除外すると、
重複している行のみ残るので、wc -l で数えます。
コマンドを組み合わせただけですが、意外と便利っぽいので備忘録に。
最近お世話になることがあったので。
FreeBSD は、cron から起動される periodic で、
いくつかシステムにとって重要なデータがバックアップされています。
/var/backups にいろいろ置いてあって、aliases だとか、
起動パーティションのデータとか、gpart の結果とか。
master.passwd とか、pkg のデータベースなどもあります。
それぞれ、periodic の daily で走るスクリプトによってバックアップが行われていて、
現在の状態が最新のバックアップと異なっていれば、
コピーして圧縮を行う感じでやってるみたいです。
その中でも最近お世話になったのが pkg のデータベース。
pkg のインストール済み一覧とかは、/var/db/pkg/local.sqlite にあるのですが、
ディスクのエラーで破損してしまいました。
そんなときの復旧手順です。
ネットで検索すると、pkg backup を使うみたいな話があったりしますが、
/var/backups に置いてあるのは SQLite の生データなので、これでは復元できません。
具体的には以下のコマンドで復旧します。
$ sudo mv /var/db/pkg/local.sqlite{,.bak} $ xzcat var/backups/pkg.sql.xz.7 | sudo pkg shell ".read /dev/stdin"
1行目は元の SQLite ファイルをリネームして保存してます。
破損していることが分かっているなら別に削除でもいいのですがなんとなく。
2行目が復元のコマンドです。
xz で圧縮されているので、xzcat で伸張したデータを stdout に流します。
そして、pkg shell は SQLite の対話環境を起動するサブコマンドです。
パイプで流し込んだデータは stdin から読み込めるので、/dev/stdin をファイルとして開いて、
そこからデータを読み込みます。.read は読み込んだ SQL を実行する命令です。
なお、当然ながら SQLite 対話環境は sudo 権限で起動する必要があります。
ポイントとしては、パイプで流し込んだデータは /dev/stdin をファイルとして開くと、
そのまま読み込める。というのは意外と汎用性が高そう?と思ったりしました。
大抵のコマンドは入力ファイル名に - を指定すると stdin から読んでくれたりしますが。
たまにそういう気が利かないツールでも、/dev/stdin を読めば OK なのは便利です。
ただし、/dev/stdin はシークができないので、1pass で読み込めるツール限定ですが。
という訳で、たまにシステムアップデートして再起動すると、
なんか起動時のログで fdc0
がエラーを吐いている訳です。
fdc0: <Enhanced floppy controller> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0 fdc0: non-PNP ISA device will be removed from GENERIC in FreeBSD 14. fdc0: cmd 08 failed at in byte 1 of 1 fdc0: sense intr err reading stat reg 0 fdc0: cmd 08 failed at in byte 1 of 1 fdc0: sense intr err reading stat reg 0 fdc0: cmd 08 failed at in byte 1 of 1 fdc0: sense intr err reading stat reg 0 fdc0: cmd 08 failed at in byte 1 of 1 fdc0: sense intr err reading stat reg 0
うーん?フロッピーのコントローラですか……しかも ISA の……? いや、このマシンにフロッピーディスクドライブなんてついてないが???
という訳で、そんなときはこれ。 /boot/loader.conf
に以下の一行を追加。
hint.fdc.0.disabled="1"
はい、消えたー。
てか、いつのバージョンからこれ出るようになったんだろう?ちなみに今は 13.1-R。
普通に Buffalo とか NEC の民生用ルータを使ってたんだけれども、 いい加減いろいろ嫌気がさしてきたので。
まぁ、おうちサーバのメンテをするとインターネットに繋がらなくなる問題があるので、 今まで妥協して民生用ルータを使っていたけれども、最近は IPv6 だけでもだいぶ生きていけるし、 いざとなればスマフォがあるので大丈夫かな?と思って。
いつの間にか、ppp デーモンが PPPoE に対応してたのですね。 なんと便利な時代になったことでしょう。 インストール直後状態の FreeBSD でも設定を書くだけで PPPoE 接続できるだなんて。
などとうわ言のように繰り返しながら設定を書きます。
# /etc/ppp/ppp.conf default: set device PPPoE:em0 set mru 1454 set mtu 1454 disable ipv6cp prov: set authname <PPPoE_LOGIN_ID> set authkey <PPPoE_PASSWORD>
末尾2行をプロバイダから提供の文字列に置き換えて使います。あと NIC のデバイス名が1か所。
なお、パスワードをベタで書いてあることから分かる通り、
/etc/ppp/ppp.conf
はパーミッションを 600 にするのを忘れないこと。
# /etc/rc.conf ppp_enable="YES" ppp_mode="ddial" ppp_profile="prov" ppp_nat="NO"
これで普通に立ち上がるようになります。
$ sudo /etc/rc.d/ppp start $ ifconfig tun0 tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1454 options=80000<LINKSTATE> inet XXX.XXX.XXX.XXX --> YYY.YYY.YYY.YYY netmask 0xffffffff groups: tun nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL> Opened by PID 735
すばらしい。ただ設定ファイルを書いただけで動くのである。 これが本来 OS のあるべき姿なのかもしれない。 もう昔とは違うということを思い知るのである。
まぁ、こっちは MAP-E の時に散々実験したので省略。
基本的に同じことを tun0
に対してやるだけ。
うーん、ひねりがないな。まぁ備忘録として。
ああ、 tun0
のデバイス名は ppp.conf
で固定できる気がするからそのうちやる。
あとなんか起動時に warning が出てるのでそのうち調べる。 なんか知らんけど動いてるから気にしなくてもいいのかも知れないけど。