btrfsでNASを組む

前記事のつづき。といっても内容は素直な話だが… Arch Linuxなマシンにつないだところ、/dev/sdc, /dev/sddとして認識された。まずはGPTで初期化して、パーティションを1つずつ作る。

$ sudo gdisk /dev/sdc
o // create a new empty GUID partition table (GPT)
n // create a new parition
w // write table to disk and exit
$ sudo gdisk /dev/sdd
// オペレーションはsdc同様


$ lsblk //sdc, sdbのみ抜粋
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc 8:32 0 5.5T 0 disk
└─sdc1 8:33 0 5.5T 0 part
sdd 8:48 0 5.5T 0 disk
└─sdd1 8:49 0 5.5T 0 part

必要パッケージのインストール

$ sudo pacman -S btrfs-progs

さあmkfs

$ sudo mkfs.btrfs -L house -d raid1 /dev/sdc1 /dev/sdd1
btrfs-progs v5.7
See http://btrfs.wiki.kernel.org for more information.

/dev/sdc1 appears to contain an existing filesystem (ext4).
ERROR: use the -f option to force overwrite of /dev/sdc1

怒られた、sdc1にはもうファイルシステムいるみたいなので、-fオプションつけてリベンジ(今回はディスク丸々ではなく、パーティションを切った上にbtrfsを作りたかったのだけど、上記gdiskのオペレーションじゃあ何か過剰だったのか…?よくわからん…)

$ sudo mkfs.btrfs -L house -d raid1 /dev/sdc1 /dev/sdd1 -f
btrfs-progs v5.7
See http://btrfs.wiki.kernel.org for more information.

Label: house
UUID: 略
Node size: 16384
Sector size: 4096
Filesystem size: 10.92TiB
Block group profiles:
Data: RAID1 1.00GiB
Metadata: RAID1 1.00GiB
System: RAID1 8.00MiB
SSD detected: no
Incompat features: extref, skinny-metadata
Runtime features:
Checksum: crc32c
Number of devices: 2
Devices:
ID SIZE PATH
1 5.46TiB /dev/sdc1
2 5.46TiB /dev/sdd1

うまくいってそうなのでマウントして、サブボリュームを切る。

$ sudo mkdir /tank
$ sudo mount /dev/sdc1 /tank
$ mount | grep btrfs
/dev/sdc1 on /tank type btrfs (rw,relatime,space_cache,subvolid=5,subvol=/)
$ sudo btrfs subvolume create /tank/nas
$ sudo chmod 777 /tank/nas

sambaの設定をして、データを書き込んで見る。

$ sudo vim /etc/samba/smb.conf
$ sudo systemctl restart smb nmb

どうでも良いが、ユニット名がsmbd.service, nmbd.serviceからsmb.service, nmb.serviceに変わっていてびびった。 取り敢えず手持ちの500GBくらいのデータを投げ込んでみたら、当初は快調に100MB/s前後で書き込めていたものの、すぐに200KB/sくらいに落ちたりした。平均するとだいたい40MB/sくらいをうろうろしていたかな?
後で旧来のNASから3.5TB程データを書き込んでみたところ、丸2日程度かかったから、平均すれば毎秒20MB/sくらいか。
SMRにbtrfsでRAIDしたのがまずかったか? ダメになり次第ストレージは気軽に交換していく運用にしようと思っているので、まぁあんまり気にせず使っていこう(暫くは様子見だが)
それと、近日中に定期scrub設定とか、S.M.A.R.T.監視とかそういうのはやっておきたい。まぁまた別記事で。 しかし、Wordpressのエディタ、なんだかんだ使いにくいなー、マウス操作沢山しないといけないのがめんどい。
エディタだけ変更するのもなんだかだし、どうせ大したコメントも来ないしという事で、Wordpressやめてjekyllとかで作り直しても良いかもね。コンテンツの移行がくっっっそめんどくさそうと思ったけど、ちょろっとぐぐっただけでそれっぽいのが出てくるし、やってみても良いかもね!

ConoHaのメールサーバで証明書エラーが出るのをどうにかする

参考サイトそのままなのだが、こういうのは残ってくれているのか不安だったりするので、ここでもメモ。
ちなみに、iPhoneメーラでSMTPするのは結果的にはできませんでした。かなしい。 参考サイト:
ConoHa のメールサーバーを使おうとしたら SSL 証明書で難儀した話 (序説) – Compnet
ConoHa のメールサーバーを使おうとしたら SSL 証明書で難儀した話 (実装編) – Compnet ConoHaのメールサーバには証明書に問題があって、証明書では「*.tyo1.conoha.io」とあるのに、実際に利用するのは{smtp, imap}.hogehoge.conoha.ioを指示されるのだ。
Thunderbirdの場合は例外承認すれば済むけど、今回はiPhoneのメールアプリで、そもそも通信してくれなさそうだった。SSLをオフにすれば良いのだが、それでは時代に逆行し過ぎでしょう。
という訳で、ConoHaのメールサーバとのやり取りが問題なので、ConoHaの証明書を受け入れるプロキシを設置し、クライアントからはこのプロキシに通信を申し入れれば良い。 では設定。
今回の環境は、Ubuntu 20.04 LTS(SMTPはdovecotの2.3.0以上が必要なので、それが用意できる必要がある)
また、SSL証明書が必要なので、適宜用意しておく。今回もLet’s encryptにお世話になりました。 必要パッケージのインストール。

$ sudo apt-get update
$ sudo apt-get install dovecot-imapd dovecot-submissiond

コンフィグの書き換え。 /etc/dovecot/conf.d/10-auth.conf
・auth_mechanismsにplain login cram-md5
・「!include auth-system.conf.ext」行をコメントアウト
・「!include auth-static.conf.ext」行をアンコメント /etc/dovecot/conf.d/auth-static.conf.ext
・末尾に以下を追記

passdb {
  driver = static
  args = proxy=y nopassword=y
  default_fields = destuser=%u nologin=y starttls=any-cert
}
userdb {
  driver = static
  args = uid=mail gid=mail /home=/dev/null
}

/etc/dovecot/conf.d/10-ssl.conf
・ssl = noをyesに変更
・ssl_cert, ssl_keyをLet’s encryptで取得したfullchain.pemとprivkey.pemに設定する /etc/dovecot/conf.d/20-imap.con
・protocol imap {}の中に以下を追記

login_greeting = IMAP ready.
passdb {
  driver = static
  args = proxy=y host=imap.hogehoge.conoha.io nopassword=y
}

/etc/dovecot/conf.d/20-submission.conf
・submission_client_workaroundsにwhitespace-before-path mailbox-for-pathを記述
・protocol submission {}の中に以下を追記

passdb {
  driver = static
  args = proxy=y host=smtp.hogehoge.conoha.io nopassword=y
}

以上でコンフィグは完了。あとは必要なポートを開けて、dovecotを起動するだけ。 Thunderbirdから送受信した感じ、何もエラーは生じなかったのだが、iPhoneのメーラで送信しようとすると思いっきり弾かれるのでこまった。Thunderbirdのログを眺めると問題なくSTARTTLSしてそうなのだけど、iPhoneのメーラってSTARTTLSサポートしてないとかそういうことないよね?

$ NSPR_LOG_MODULES=timestamp,append,SMTP:4 NSPR_LOG_FILE=./log thunderbird
$ cat ./log
2020-08-04 15:28:49.506598 UTC - [(null) 2885857: Main Thread]: I/SMTP SMTP Connecting to: hogehoge.com:587
2020-08-04 15:28:49.612342 UTC - [(null) 2885857: Main Thread]: I/SMTP SMTP entering state: 0       
2020-08-04 15:28:49.612352 UTC - [(null) 2885857: Main Thread]: I/SMTP SMTP Response: 220 133-130-115-187 Dovecot (Ubuntu) ready.
(中略)
2020-08-04 15:28:49.642992 UTC - [(null) 2885857: Main Thread]: I/SMTP SMTP Send: STARTTLS    
2020-08-04 15:28:49.672845 UTC - [(null) 2885857: Main Thread]: I/SMTP SMTP entering state: 0                         
2020-08-04 15:28:49.672855 UTC - [(null) 2885857: Main Thread]: I/SMTP SMTP Response: 220 2.0.0 Begin TLS negotiation now.
(略)

この後特にエラーも出ず最後までいっているので、普通にSTARTTLSできていると判断。 後日、STARTTLSじゃなくてSSL/TLSな感じに設定してみて、リベンジしてみよう。

pdftkでPDFのパスワードを外したい

会社の給与や賞与の明細がパスワード付きPDFで投下されるのだけど、開くたびにパスワード入力するのめんどい。というわけで、パスワードを外したい。 pdftkならパスワードも外せるので、やりましょう。

$ pdftk MEISAI.pdf input_pw PASSWORD output OUTPUT.pdf                                                                                                                                                              [Ret:0 23:02:31]
Error: Unexpected Exception in open_reader()
java.lang.NoClassDefFoundError: org/bouncycastle/crypto/BlockCipher     
        at pdftk.com.lowagie.text.pdf.StandardDecryption.update(StandardDecryption.java:94)
        at pdftk.com.lowagie.text.pdf.PdfEncryption.decryptByteArray(PdfEncryption.java:568)
        at pdftk.com.lowagie.text.pdf.PdfString.decrypt(PdfString.java:273)                                                                                                                                                                    
        at pdftk.com.lowagie.text.pdf.PdfReader.readDecryptedDocObj(PdfReader.java:723)
        at pdftk.com.lowagie.text.pdf.PdfReader.readDocObj(PdfReader.java:1109)
        at pdftk.com.lowagie.text.pdf.PdfReader.readPdf(PdfReader.java:508)
        at pdftk.com.lowagie.text.pdf.PdfReader.<init>(PdfReader.java:172)
        at com.gitlab.pdftk_java.InputPdf.add_reader(InputPdf.java:100)
        at com.gitlab.pdftk_java.TK_Session.add_reader(TK_Session.java:94)
        at com.gitlab.pdftk_java.TK_Session.open_input_pdf_readers(TK_Session.java:111)
        at com.gitlab.pdftk_java.TK_Session.<init>(TK_Session.java:1086)
        at com.gitlab.pdftk_java.pdftk.main_noexit(pdftk.java:152)
        at com.gitlab.pdftk_java.pdftk.main(pdftk.java:130) 
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.crypto.BlockCipher
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 13 more
Error: Failed to open PDF file: 
   202006_0127.pdf
Errors encountered.  No output created.
Done.  Input errors, so no output created.

ダメじゃん。org.bouncycastle.crypto.BlockCipherとかいうクラスが見つからないらしい。
パッケージ足らんのかなと思ってpdftk – aur見てたら、Dependenciesにbcprov (optional) - support for signed PDF documentsだそうで。bcprovはUpstream URLがhttps://www.bouncycastle.org/java.htmlらしいので、bouncycastleってこれドンピシャじゃん。

$ sudo pacman -S bcprov
$ pdftk MEISAI.pdf input_pw PASSWORD output OUTPUT.pdf
WARNING: The creator of the input PDF:
   MEISAI.pdf
   has set an owner password (which is not required to handle this PDF).
   You did not supply this password. Please respect any copyright.

問題なし。owner password設定あるのにお前が入れたのちゃうやんけ、著作権大事にせえや、って書いてあるけど著作権保護のつもりのパスワードじゃないからどうでもいいのさ。

ArchLinuxの上のQtアプリケーションでfcitx-mozcが有効にならんやつ

~/.xprofileでは以下3行は記述済み。

export QTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

fcitx-diagnoseを実行すると、Qt IM モジュールファイルのところで、Qt5のFcitx入力メソッドモジュールが見つかりません。の文字が。(Qt4も出てる) Fcitx – ArchWikiの「インプットメソッドモジュール」のところを見ながら入れてみる(ここまででIMモジュールだったり入力メソッドモジュールだったりインプットメソッドモジュールだったり色々表現があるが、どれも同じだろう)

$ sudo pacman -S fcitx-im

再度fcitx-diagnoseを実行すると、Qt5についての表記は消えて、目的のQtアプリケーションでも日本語が入力できるようになった。Qt4についてはaurから拾えというような感じだが、Qt4製アプリケーションを今使う予定は無いので入れないでおこう。

Raspberry pi 3 B+でPXEブート

大変今更だが、Raspberry pi 3 B+でPXEブートをしたい気がした。
我が家の構成は、DHCPはEdge Router X(192.168.0.1)がその役割を果たし、TFTPとNFSは自宅サーバ(192.168.0.4)にやらせる。 てきとうにいじっていたので、設定の記述は要らんやつとかもあるかも。 まずはDHCPでTFTPの情報を渡させる必要がある。EdgeRouter XのConfig Treeから、service -> dhcp-server -> shared-network-name -> LAN -> subnet -> 使うサブネットを選び、以下設定を行う。
tftp-server-name: 192.168.0.4 dnsmasqの設定。

dhcp-range=192.168.0.0,proxy
dhcp-boot=pxelinux.0
pxe-service=0,"Raspberry Pi Boot",pxelinux,192.168.0.4
enable-tftp
tftp-root=/srv/tftp/pxe-boot

nfsの設定。

sudo pacman -S nfs-utils
sudo vim /etc/exports
/srv/nfs/pi3/rpi-netboot 192.168.0.0/24(rw,no_root_squash)
sudo systemctl start nfs-server

データの配置。事前にCPUのシリアル番号をcat /proc/cpuinfo | grep Serialで調べておく。今回は12345678だった想定。

$ sudo mkdir -p /srv/tftp/pxe-boot/12345678
// Raspbianインストールイメージのboot領域を/mntにmountした前提で
$ sudo cp -r /mnt/* /srv/tftp/pxe-boot/12345678/
$ sudo mv /srv/tftp/pxe-boot/12345678/bootcode.bin /srv/tftp/pxe-boot/
$ cat /srv/tftp/pxe-boot/12345678/cmdline.txt
root=/dev/nfs nfsroot=192.168.0.4:/srv/nfs/pi3/rpi-netboot,vers=4,proto=tcp rw ip=dhcp rootwait elevator=deadline
// Raspbianインストールイメージのroot領域を/mntにmountした前提で
$ sudo mkdir -p /srv/nfs/pi3/rpi-netboot
$ sudo rsync -xa /mnt/ /srv/nfs/pi3/rpi-netboot

最後に、/srv/nfs/pi3/rpi-netboot/etc/fstabからmmcblk0の記述行を消しておく。
あとはRaspberry piからSDカードを抜いたまま電源を入れれば、起動できるはず。 つまずきポイント。 その1、dnsmasqのログに何も出ない(Raspberry piから何も取得しようとしない)。これはEdge Router Xの設定を間違えていただけ。Edge Router「を」PXEで起動するための設定を眺めていたのが間違いで、tftpのサーバがどこにあるのか教えてあげればそれで十分でした。 その2、カーネルの起動までは通っても、rootファイルシステムがマウントできなくてKernel panicになる。
散々困ったのだけど、nfsのログを眺めていたところ(# sysctl -w sunrp.rpc_debug=1023 && sysctl -w sunrpc.nfsd_debug=1023してから、journalctlで見れる)unknown version (2 for prog 100003, nfsd)とか出ていて、あーこれまさかプロトコルバージョン2で接続してないかね?ということで…cmdline.txtにvers=4を追加したところ無事通過。よかったよかった。

Raspbianのインストールイメージをmountする

SDカードとかUSBスティックにddして使うつもりのインストールイメージの中身を見たいとき、mountしたいが、ひと手間が必要。
インストールイメージという事はbootできるように作られているわけで、つまり複数のパーティションを持っているのだ。
これをmountするためには、offsetオプションをつける必要がある。素直に実行すると以下のような感じでエラーが出る。

$ sudo mount 2020-02-13-raspbian-buster.img /mnt
mount: /mnt: wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other error.

offsetの値を調べるため、fdisk -l -u

$ fdisk -l -u 2020-02-13-raspbian-buster.img
Disk 2020-02-13-raspbian-buster.img: 3.54 GiB, 3787456512 bytes, 7397376 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xea7d04d6

Device                          Boot  Start     End Sectors Size Id Type
2020-02-13-raspbian-buster.img1        8192  532479  524288 256M  c W95 FAT32 (LBA)
2020-02-13-raspbian-buster.img2      532480 7397375 6864896 3.3G 83 Linux

Sector sizeStartの積をoffsetに指定すれば良い。

// 第1パーティション
$ sudo mount -o loop,offset=`expr 8192 \* 512` 2020-02-13-raspbian-buster.img /mnt
// 第2パーティション
$ sudo mount -o loop,offset=`expr 532480  \* 512` 2020-02-13-raspbian-buster.img /mnt

お名前.comのIPアドレス更新を自動化する

Windowsだと公式の更新クライアントが使えるんだけど、Linuxではダメなので、expectを使う。
参考サイト:お名前.com DDNS – scientia est potentia expectの導入は何も考えずpacmanで良い。IPアドレスはcurl inet-ip.infoで得られる。以下ではtea-soak.orgとblog.tea-soak.orgを更新してみている。

export IP=`curl inet-ip.info`
expect -c "
spawn env LANG=C openssl s_client -connect ddnsclient.onamae.com:65010 -quiet

send \"LOGIN\n\"
send \"USERID:お名前.comのユーザ名\n\"
send \"PASSWORD:お名前.comのパスワード\n\"
send \".\n\"

expect \"000 COMMAND SUCCESSFUL\" {
  send \"MODIP\n\"
  send \"DOMNAME:tea-soak.org\n\"
  send \"IPV4:${IP}\n\"
  send \".\n\"
  expect \"000 COMMAND SUCCESSFUL\" {
    send \"MODIP\n\"
    send \"HOSTNAME:blog\n\"
    send \"DOMNAME:tea-soak.org\n\"
    send \"IPV4:${IP}\n\"
    send \".\n\"
    expect \"000 COMMAND SUCCESSFUL\" {
      send \"LOGOUT\n\"
      send \".\n\"
      exit 0
    }
  }
  exit 0
}
"

異常系の処理とかはてきとう。

ArchLinux+btrfsでストレージを組む練習

NASていうかbtrfsを使う練習。 今は自宅内NASとして2TB*4で作ったRAID10なストレージをそのまま使っているのだけど、容量を大きくしたいというのと、組んだまま6年も使い続けているので、組み直したいという話。
同じようにRAID10で組み直すのも芸がないし、容量の変更に対応できるような構成にしたい。当初はZFSを検討していたのだけど、ライセンス的に面倒だし、Linuxのファイルシステム「Btrfs」を5年間使用した記録 – GIGAZINEとかによると、構成の変更が視野に入っているならbtrfsのほうが良さそう。 というわけでbtrfsを使う練習をしてみる。 取り敢えず4本一挙に買うお金が無いので、2本で構成→後からお金があるタイミングで4本に増やす、みたいなのを想定。
ただし、システムのパーティションは素直に組んで、NAS用ストレージだけbtrfsにする。
・ストレージ1本で構成
・1本追加してRAID1にする(メタデータもRAID1)
・1本壊れた想定で、差し替える
・2本追加して、4本で構成する
・1本壊れた想定で、差し替える
・1本を大容量のものに差し替える

ArchLinuxセットアップ

何はともあれ実験環境のセットアップ。物理マシン(物理ストレージ)を用意するのは面倒なので、仮想マシンで。
2020.04.01なISOを読ませて起動して、以下つらつらと構成。

// それっぽくパーティショニング
# fdisk /dev/sda
// マウントとpacstrap
# mount /dev/sda2 /mnt
# mkdir /mnt/boot
# mount /dev/sda1 /mnt/boot
# pacstrap /mnt base base-devel linux linux-firmware
// fstab生成とchroot
# genfstab -U /mnt >> /mnt/etc/fstab
# arch-chroot /mnt
// タイムゾーン、ロケール、ホスト名、パスワード
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# vi /etc/locale.gen
# locale-gen
# cat hostname > /etc/hostname
# pacman -S vim
# vim /etc/hosts
# passwd
// ネットワーク
# pacman -S dhcpcd
# systemctl enable dhcpcd.service
// ブートローダ
# pacman -S grub
# grub-install --target=i386-pc --recheck /dev/sda
# grub-mkconfig -o /boot/grub/grub.cfg
// 再起動
# exit
# umount -R /mnt
# reboot

お次は一般ユーザの作成。

// 一般ユーザの作成
# useradd -m tea
# passwd tea
# ln -s /usr/bin/vim /usr/bin/vi
# visudo
# su tea
$ sudo whoami

ストレージ1本で構成

デフォルトで入ってるストレージは/dev/sdaとして認識されている。ここにストレージを追加したところ、/dev/sdbとして認識されたので、これ1本で構成してみよう。

$ sudo pacman -S btrfs-progs
$ sudo mkfs.btrfs -L tank /dev/sdb
$ sudo sh -c "echo UUID=`ls -l /dev/disk/by-uuid/ | grep sdb | awk '{print $9}'` /mnt btrfs rw,relatime 0 0 >>/etc/fstab"
$ sudo mount -a
$ btrfs filesystem df /mnt
Data, single: total=8.00MiB, used=0.00B
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=51.19MiB, used=112.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B

取り敢えずの作成とマウントはできたっぽい。snapshotはsubvolume単位で作成するので、subvolumeも触ってみる。

$ sudo btrfs subvolume create /mnt/sv1
$ sudo chown tea:tea /mnt/sv1
$ cd /mnt/sv1
// てきとうにファイルを作成
$ dd if=/dev/zero of=/mnt/sv1/data bs=10M count=1
$ ls -l
-rw-r--r-- 1 tea tea 10485760 Apr 28 03:56 data
$ btrfs filesystem df /mnt
Data, single: total=100.62MiB, used=10.06MiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=51.19MiB, used=128.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
// snapshotを作成する
$ sudo btrfs subvolume snapshot /mnt/sv1 /mnt/sv1.snap
$ btrfs filesystem df /mnt
Data, single: total=100.62MiB, used=10.06MiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=51.19MiB, used=144.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
// subvolume内をいじる
$ rm data
// snapshotは残っている
$ ls /mnt/sv1.snap/
data
$ btrfs filesystem df /mnt
Data, single: total=100.62MiB, used=10.06MiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=51.19MiB, used=144.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
// 弄ったsubvolumeにsnapshotを差し替える
$ sudo btrfs subvolume delete /mnt/sv1
$ sudo btrfs subvolume snapshot /mnt/sv1.snap /mnt/sv1
$ ls /mnt/sv1/
data

subvolumeのsnapshotをとって、それからまるっと書き戻す、みたいなことができるようになった。

1本追加してRAID1にする(メタデータもRAID1)


$ sudo btrfs device add /mnt/sdc /mnt
$ sudo btrfs filesystem show /mnt
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.20MiB
        devid    1 size 1.00GiB used 238.38MiB path /dev/sdb
        devid    2 size 1.00GiB used 0.00B path /dev/sdc
// まずbalance
$ sudo btrfs balance start /mnt
// metadataがDUPなのでRAID0に変更ついでにbalance
$ sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt
$ btrfs filesystem df /mnt
Data, RAID1: total=416.00MiB, used=10.12MiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=208.00MiB, used=160.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
$ sudo btrfs filesystem show /mnt
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.30MiB
        devid    1 size 1.00GiB used 656.00MiB path /dev/sdb
        devid    2 size 1.00GiB used 656.00MiB path /dev/sdc

usedが増えすぎてる気がしてならない…が、dconvertmconvertを外してbalanceしても240.00MiBと448.00MiBなので、似たようなものか?raid1指定して再度balanceすると使用量が同じになったので間違っていなさそう(ふんいき)

1本壊れた想定で、差し替える

仮想マシンの設定でHDDを1本取り除いておく(そのままだと起動できないので、fstabから自動マウントしないようにしておくか、マウントオプションにdegradedを追加しておく)

$ sudo btrfs filesystem show
warning, device 1 is missing
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.30MiB
        devid    2 size 1.00GiB used 656.00MiB path /dev/sdc
        *** Some devices missing
// 強引にmount
$ sudo mount -o degraded /dev/sdb /mnt
// デバイスを取り除く
$ sudo btrfs device delete missing /mnt
ERROR: error removing device 'missing': unable to go below two devices on raid1

RAIDを組んでいる時に、必要台数を下回ることはできないエラー。RAID1なら2台を下回ってはいけない。Using Btrfs with Multiple Devices – btrfs Wikiによると、とにかく1台追加してからdeleteしろとのこと。

$ sudo btrfs device add /dev/sdb /mnt
$ sudo btrfs device delete missing /mnt
$ sudo btrfs balance start /mnt
$ sudo btrfs filesystem show
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.27MiB
        devid    2 size 1.00GiB used 416.00MiB path /dev/sdc
        devid    3 size 1.00GiB used 416.00MiB path /dev/sdb

2本追加して、4本で構成する

あとはもう同じようにやるだけ。

$ sudo btrfs filesystem show
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.27MiB
        devid    2 size 1.00GiB used 416.00MiB path /dev/sdc
        devid    3 size 1.00GiB used 416.00MiB path /dev/sdb
$ sudo btrfs device add /dev/sdd /dev/sde /mnt
$ sudo btrfs balance start /mnt
$ sudo btrfs filesystem show
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.27MiB
        devid    2 size 1.00GiB used 288.00MiB path /dev/sdc
        devid    3 size 1.00GiB used 288.00MiB path /dev/sdb
        devid    4 size 1.00GiB used 416.00MiB path /dev/sdd
        devid    5 size 1.00GiB used 416.00MiB path /dev/sde

同じ使用量のセットが2つあるのでうまくいってそう。

1本壊れた想定で、差し替える

今や4台あるので、btrfs device delete missingして、差し替えのストレージをbtrfs device addするだけ。

1本を大容量のものに差し替える


$ btrfs filesystem usage /mnt
WARNING: cannot read detailed chunk info, per-device usage will not be show, run as root
Overall:
    Device size:                   4.00GiB
    Device allocated:              1.38GiB
    Device unallocated:            2.62GiB
    Device missing:                4.00GiB
    Used:                         20.66MiB
    Free (estimated):              1.71GiB      (min: 1.71GiB)
~以下略~
$ btrfs device delete /dev/sdc /mnt
$ btrfs device add /dev/sdf /mnt
$ btrfs filesystem usage /mnt
WARNING: cannot read detailed chunk info, per-device usage will not be show, run as root
Overall:
    Device size:                  11.00GiB
    Device allocated:              1.69GiB
    Device unallocated:            9.31GiB
    Device missing:               11.00GiB
    Used:                         20.78MiB
    Free (estimated):              5.21GiB      (min: 5.21GiB)
~以下略~

Device missingは何を表しているのだろうかな~ 取り敢えず使うぶんにはこんくらいあればいいんだろうかな、実際に使うときには、定期的にsnapshotとるとか、色々とメンテが必要なんだろうなとは思いつつ、今回はおしまい どうでも良いが、モニタの液晶とパネルの間に、小さい虫が入ってしまったようで、ず~~~っと画面中でうろうろ動き回っていてつらい。分解するのもしんどいしなぁ。どうするかなぁ

mirakurun-serverのCPUが100%で止まる

PX-Q3PE4で録画機の新調 – お茶漬けぶろぐで組んだ録画鯖なのだけど、最近録画ミスが増えてて、データが作られないまま、録画中リストに残り続けるという感じ。以前もたまにあったのだけど、再起動で直っていた。ところが、ここ数日は、再起動では直らず、リアルタイム視聴も数分で止まってしまう。chinachuのWebフロントも、まともに操作できない(応答が返ってこない)。 なんだろーと思って、録画機でpm2 statusを見ると、どうもmirakurun-serverのCPU使用率がぐんぐん上がっていって、100%になったときに死んでいるみたいだ。 ぐぐるとまず見つかったのがこちら。mirakurun-serverがおかしい – yotayota diary
契機はともかく、IPv6を殺せという事のようだ。mirakurun-serverのログ(/usr/local/var/log/mirakurun.stderr.logとか/usr/local/var/log/mirakurun.stdout.log)を見ていても、同じようなログが出ているわけではないのだけど、ダメ元で入れてみた…が直らず(違う現象だろうし、そりゃそうだろ感しかない) 次に見つかったのはこちら。Liuxでテレビ総合スレ 避難所 2 – 5ちゃんねる
違う構成だけど、ログにとくに怪しいものが出てこないというのも、ブラウザも繋がらないってのも共通。
同スレの>>287-288を見ながら、/usr/local/lib/node_modules/mirakurun/node_modules/aribts/lib/char.jsをてきとうに書き換えてみると、取り敢えずCPUの使用率がぐんぐん上がっていくことはなくなった。 rndomhack/node-aribtsにあるchar.jsを見に行くと、全く同じ修正が入っていたっぽい事がわかる。
確かに、システム組み上げた後、一切触っていなかったしなぁ。一旦動き始めたシステムでも、それなりに更新する必要性を感じた一件でした。