■概要■
下記ページに記したように通常にBOINCをインストールしただけでは、ワークディレクトリはSDカード上に設けられる。
【Raspberry pi 4 / Raspbian】分散コンピューティングRosetta@homeに参加してタンパク質の立体構造解析に貢献する【Raspbian】
しかし、24時間365日稼働させるとなると、Raspberry Pi のメインSDカードの劣化が心配である。
そこで、USB HDD(もしくはUSB SSD)に設けたパーティションをBOINCが作業領域として使用するように設定したい。
連続稼動を考えるなら、ひょっとしたらSSDの方が良いのかも知れない。
Raspberry Pi 4であれば、USB 3.0ポートを備えているので、
USB 3.0 SuperSpeedに対応したUSB HDDであれば、高速な動作を期待できる。
下記ページには、Raspberry Pi 4 に、外付けのUSB HDDを接続し、システム起動時に自動的にマウントするように設定する手順を記した。
Raspberry PiのUSBポートの電源不足を回避する方法についても記載している。
【Raspberry pi 4 B / Raspbian 】USB 3.0対応のUSB HDDを自動的にマウントするように設定する手順
以下では、上記ページの方法で、Raspberry Pi 4にUSB HDDが利用できるようになっているものとして、(ただし、まだマウントまでする必要はない。)
BOINCのワークディレクトリを、USB HDD上のディレクトリに変更する手順を記した。
以下手順では、USB HDDは、全てデータが消去されてしまうので不要なものを使うこと。
以下の作業では、rootユーザーで行っている。
$ sudo su
■BOINCのワーキングディレクトリを移すためのUSB接続のHDD(もしくはSSD)の準備
(注意)
以下手順では、USB HDDは、全てデータが消去されてしまうので不要なものを使うこと。
以下に登場する、"sdX"という表記は、操作ミスを防ぐために"sda"を置き換えたものである。
お使いの環境に応じて、変更するようにしてください。
〇適切な大きさの第一パーティションの作成を行った。
ここで使用したディスクは、USB 3.0接続の2.5インチHDDで、500GBの容量がある。
BOINCのワーキングディレクトリの移設用として、約32GB分のパーティションを作成した。
この確保容量は、Rosetta@homeプロジェクトのコンピューティングのみを想定している。
後で示すように、4.5 GB程度しか使用されない。
しかし、複数のプロジェクトに同一マシンで参加させる場合、
プロジェクトの扱うデータにも関係して、容量はずっと大きくなるのではないかと思う。(これは試してない。)
USB HDDは、/dev/sdXとして認識されたとする。(接続直後、dmesgコマンドで確認可能)
これを引数にとって、partedコマンドを実行した。
root@raspberrypi:/home/pi#
parted /dev/sdX
GNU Parted 3.2
Using /dev/sdX
Welcome to GNU Parted! Type 'help' to view a list of commands.
・表示をバイト単位に切り替えた。
(parted)
unit B
・現在のパーティションテーブルを表示させた。
(parted)
p
Model: JMicron Generic (scsi)
Disk /dev/sdX: 500107862016B
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1048576B 500107837439B 500106788864B primary ext4
上記のように、全ての領域がパーティションに確保されている。
・このパーティションを削除した。
(parted)
rm 1
(parted)
p
Model: JMicron Generic (scsi)
Disk /dev/sdX: 500107862016B
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
上記のように、全てのパーティションは無くなった。
また、このHDDディスクが4Kバイトセクタであることに注意した。
・第一パーティションをBOINCワーキングディレクトリ用として作成した。
(parted)
mkpart
Partition type? primary/extended? primary ←基本パーティションとして作成する。
File system type? [ext2]? ext4 ←ext4ファイルシステムを利用する。
Start? 1048576 ←(重要)4096の256倍になるように指定した。アライメントを考慮した。
End? 32GB ←パーティションの容量はBOINC作業領域専用のため32GBとした。
(parted)
p
Model: JMicron Generic (scsi)
Disk /dev/sdX: 500107862016B
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags 1 1048576B 32000442367B 31999393792B primary ext4 lba
以上のようにパーティションが作成された。
・念の為、このパーティションについてアライメントできているか確認を行った。
(parted)
align-check
alignment type(min/opt) [optimal]/minimal?
Partition number? 1
1 aligned
・コマンドを終了した。
(parted)
q
Information: You may need to update /etc/fstab.
〇作成したパーティションが認識されているか確認した。
root@raspberrypi:/home/pi#
cat /proc/partitions
major minor #blocks name
1 0 4096 ram0
1 1 4096 ram1
1 2 4096 ram2
1 3 4096 ram3
1 4 4096 ram4
1 5 4096 ram5
1 6 4096 ram6
1 7 4096 ram7
1 8 4096 ram8
1 9 4096 ram9
1 10 4096 ram10
1 11 4096 ram11
1 12 4096 ram12
1 13 4096 ram13
1 14 4096 ram14
1 15 4096 ram15
179 0 15212544 mmcblk0
179 1 262144 mmcblk0p1
179 2 14946304 mmcblk0p2
8 0 488386584 sdX
8 1 31249408 sdX1
〇ext4ファイルシステムの作成(フォーマット)
root@raspberrypi:/home/pi#
mkfs -t ext4 /dev/sdX1
mke2fs 1.44.5 (15-Dec-2018)
Creating filesystem with 7812352 4k blocks and 1954064 inodes
Filesystem UUID: 8*******-4***-4***-8***-a***********
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
■上記の手順で作成したUSB HDDのパーティションに現在動作しているBOINCの作業ディレクトリの「内容」をコピーする。
一時的にマウントしたUSB HDDのパーティションに、BOINCの作業ディレクトリの内容をコピーする。
〇USB HDDのパーティションは適当なディレクトリに一時的にマウントした。
マウントポイントとなるディレクトリの作成を行い、一時的にマウントを行った。
root@raspberrypi:/home/pi#
mkdir /mnt/disk1
root@raspberrypi:/home/pi# mount -t ext4 /dev/sdX1 /mnt/disk1
マウントされたかどうか確認した。
root@raspberrypi:/home/pi# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 15G 1.3G 13G 10% /
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.5M 1.9G 1% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mmcblk0p1 253M 53M 200M 21% /boot
tmpfs 381M 0 381M 0% /run/user/1000
/dev/sdX1 30G 45M 28G 1% /mnt/disk1
〇boinc-clientを停止させた。
・boinc-clientの停止
root@raspberrypi:/home/pi#
systemctl stop boinc-client
・サービスの状態を表示
root@raspberrypi:/home/pi# systemctl status boinc-client
● boinc-client.service - Berkeley Open Infrastructure Network Computing Client
Loaded: loaded (/lib/systemd/system/boinc-client.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Fri 2020-04-24 14:06:52 BST; 4s ago
Docs: man:boinc(1)
Process: 1208 ExecStart=/usr/bin/boinc (code=exited, status=0/SUCCESS)
Process: 1287 ExecStop=/usr/bin/boinccmd --quit (code=exited, status=0/SUCCESS)
Process: 1289 ExecStopPost=/bin/rm -f lockfile (code=exited, status=0/SUCCESS)
Main PID: 1208 (code=exited, status=0/SUCCESS)
〇データをUSB HDDをマウントしているディレクトリにコピーした。
コピー対象は、boinc-client作業ディレクトリ自体でなく、その中にあるファイルとディレクトリのみである。
ポイントは、これら作業ディレクトリの中身だけをUSB HDDのパーティションのマウントポイントのルートディレクトリにコピーすることである。
下記コマンドはそれを実行する。
オプションの「a」はアーカイブの意味で、所有者、グループ、権限をオリジナルのままにする。
オプションの「R」はリカーシブの意味で、ディレクトリがあればそのサブディレクトリに至って再帰的に辿りコピーする。
即ち、全て複製を作成するということになる。
root@raspberrypi:/home/pi#
cp /var/lib/boinc-client/* /mnt/disk1/ -aR
■USB HDDのパーティションをboinc-clientのデフォルトディレクトリにシステム起動時に自動マウントする設定を行う。
上記手順で、USB HDDのパーティションには、boinc-client作業ディレクトリの内容が全てコピーされている。
これを、元々の作業ディレクトリ(/var/lib/boinc-client)にシステム起動時に自動マウントする。
これにより、boinc-clientサービスは、USB HDDの領域を作業場として利用することになる。
〇USB HDDのパーティション(データコピー済み)のPARTUUIDを調べた。
PARTUUIDの情報は自動マウント設定のために必要である。
root@raspberrypi:/home/pi#
blkid
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="4***-D***" TYPE="vfat" PARTUUID="7*******-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="4*******-7***-4***-a***-0***********" TYPE="ext4" PARTUUID="7*******-02"
/dev/sdX1: UUID="8*******-4***-4***-8***-a***********" TYPE="ext4" PARTUUID="0*******-01"
/dev/mmcblk0: PTUUID="7*******" PTTYPE="dos"
〇USB HDDのパーティションをboinc-clientデフォルトディレクトリに自動マウントする設定を行った。
下記のように、USB HDDのBOINC用パーティションを自動マウントするための設定を加えて保存した。
root@raspberrypi:/home/pi#
nano /etc/fstab
proc /proc proc defaults 0 0
PARTUUID=738a4d67-01 /boot vfat defaults 0 2
PARTUUID=738a4d67-02 / ext4 defaults,noatime 0 1
PARTUUID=0*******-01 /var/lib/boinc-client ext4 defaults,auto,rw,nofail 0 2
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
/var/lib/boinc-clientは、既存のディレクトリでありオリジナルのboinc作業ディレクトリである。
ここに、USB HDDのパーティションを自動マウントすることによって、オリジナルのデータは隠されて、
USB HDDパーティションにコピー済みのデータにアクセスされることになる。
(注意)
マウントオプションに、「user」を入れてしまうとnoexecでマウントされてしまうので絶対にダメである。
これによって、ワークがRUNされずDONEERRとなった。(boinctuiでの表示の場合)
この問題解決に非常に時間がかかった。
タスクのダウンロードはなされるものの、いざタスクを実行する段階になれば、
即座にタスクが終了して、DONEERRとなってしまうのだった。
その場合、次のような権限エラーがログに記載されていた。
# grep failed /var/lib/boinc-client/client_state.xml
<stderr_out>
<![CDATA[
<message>
process exited with code 13 (0xd, -243)
</message>
<stderr_txt>
Process creation (../../projects/boinc.bakerlab.org_rosetta/rosetta_4.15_aarch64-unknown-linux-gnu) failed: Error -1, errno=13
execv: Permission denied
</stderr_txt>
]]>
</stderr_out>
# grep project /var/log/syslog | less
Apr 24 14:00:53 raspberrypi boinc[1208]: dir_open:
Could not open directory 'projects/boinc.bakerlab.org_rosetta' from '/var/lib/boinc-client'.
しかし、/etc/fstabに記載するマウントオプションから、userオプションを外すことによって、問題が解決した。
そして、順を追って述べるように、正常にタスクがRUNの状態になった。
〇システムの再起動
・まず、boinc-clientが自動起動しないように設定しておく。
この段階では、まだboinc-clientはシステム起動時に正常に起動しない。
そのため、disableをしておく。(全て準備が整ってからenable指定に戻す。)
root@raspberrypi:/home/pi#
systemctl disable boinc-client
・そして、システムの再起動
root@raspberrypi:/home/pi#
reboot
システムの再起動後には、
/var/lib/boinc-clientディレクトリに、HDD USBの第一パーティションがマウントされる。
〇自動的にマウントされることを確認した。
root@raspberrypi:/home/pi# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 15G 1.3G 13G 10% /
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 17M 1.9G 1% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sdX1 30G 54M 28G 1% /var/lib/boinc-client
/dev/mmcblk0p1 253M 53M 200M 21% /boot
tmpfs 381M 0 381M 0% /run/user/1000
/etc/fstabの設定例のように、「
defaults,auto,rw,nofail」のみ設定した結果、
再起動後には次のオプション(noexecなし)でマウントされていることが確認できた。
# mount
/dev/sdX1 on /var/lib/boinc-client type ext4 (rw,relatime)
■boinc-clientサービス起動のための微調整
〇USB HDDパーティションのマウント先ディレクトリの所有者:グループの変更を行った。
上記手順で、自動マウントできるようになっても、マウントポイントである「/var/lib/boinc-client」の所有者とグループは「boinc以外」になっていた。
そこで、所有者:グループを、boinc:boincに変更した。
・所有者:グループの変更を行った。(boinc:boincにする。)
root@raspberrypi:/home/pi#
chown boinc:boinc /var/lib/boinc-client
(さらに、chmodで、775にしてもよいかもしれない。ここではせずとも動作した。)
root@raspberrypi:/home/pi# ls
/var/lib/boinc-client -al
total 236
drwxr-xr-x 5 boinc boinc 4096 Apr 24 14:10 . ←カレントディレクトリ
drwxr-xr-x 28 root root 4096 Apr 24 13:52 ..
-rw-r--r-- 1 boinc boinc 1382 Apr 24 14:01 account_boinc.bakerlab.org_rosetta.xml
-rw-r--r-- 1 boinc boinc 53556 Apr 24 13:52 all_projects_list.xml
lrwxrwxrwx 1 root root 34 Apr 24 13:52 ca-bundle.crt -> /etc/ssl/certs/ca-certificates.crt
lrwxrwxrwx 1 root root 31 Apr 24 13:52 cc_config.xml -> /etc/boinc-client/cc_config.xml
-rw-r--r-- 1 boinc boinc 32225 Apr 24 14:01 client_state_prev.xml
-rw-r--r-- 1 boinc boinc 35831 Apr 24 14:06 client_state.xml
-rw-r--r-- 1 boinc boinc 325 Apr 24 13:59 coproc_info.xml
-rw-r--r-- 1 boinc boinc 118 Apr 24 14:06 daily_xfer_history.xml
lrwxrwxrwx 1 root root 43 Apr 24 13:52 global_prefs_override.xml -> /etc/boinc-client/global_prefs_override.xml
lrwxrwxrwx 1 root root 34 Apr 24 13:52 gui_rpc_auth.cfg -> /etc/boinc-client/gui_rpc_auth.cfg
-rw-r--r-- 1 boinc boinc 138 Apr 24 14:00 lookup_account.xml
drwx------ 2 root root 16384 Apr 24 13:47 lost+found
-rw-r--r-- 1 boinc boinc 23708 Apr 24 14:01 master_boinc.bakerlab.org_rosetta.xml
drwxrwx--x 2 boinc boinc 4096 Apr 24 14:01 notices
drwxrwx--x 3 boinc boinc 4096 Apr 24 14:00 projects
lrwxrwxrwx 1 root root 34 Apr 24 13:52 remote_hosts.cfg -> /etc/boinc-client/remote_hosts.cfg
-rw-r--r-- 1 boinc boinc 22184 Apr 24 14:01 sched_reply_boinc.bakerlab.org_rosetta.xml
-rw-r--r-- 1 boinc boinc 6472 Apr 24 14:01 sched_request_boinc.bakerlab.org_rosetta.xml
-rw-r--r-- 1 boinc boinc 425 Apr 24 14:01 statistics_boinc.bakerlab.org_rosetta.xml
-rw-r--r-- 1 boinc boinc 0 Apr 24 13:52 stderrgpudetect.txt
-rw-r--r-- 1 boinc boinc 0 Apr 24 13:52 stdoutgpudetect.txt
-rw-r--r-- 1 boinc boinc 343 Apr 24 14:06 time_stats_log
これらのファイルは全て、USB HDDの第一パーティション内に存在している。
〇boinc-clientサービスがマウント完了以降のタイミングで起動するように設定を編集した。
これも大切な設定である。
boinc-clientのワーキングディレクトリは、SDカード上ではなく、USB HDDのパーティション上に存在することになる。
だから、
boinc-clientサービスの始動前に、マウントが完了していなければならないのだ。
この設定をしなければ、エラーが発生して、boinc-clientを自動起動できなかった。
次のように、サービスファイルを編集し、mnt-wibble.mount の後でboinc-clientサービスは起動するようにする。
編集箇所は、下記のようにアンダーラインを引いた一行のみである。
root@raspberrypi:/home/pi#
nano /lib/systemd/system/boinc-client.service
[Unit]
Description=Berkeley Open Infrastructure Network Computing Client
Documentation=man:boinc(1)
After=network-online.target mnt-wibble.mount
[Service]
ProtectHome=true
Type=simple
Nice=10
User=boinc
WorkingDirectory=/var/lib/boinc
ExecStart=/usr/bin/boinc
ExecStop=/usr/bin/boinccmd --quit
ExecReload=/usr/bin/boinccmd --read_cc_config
ExecStopPost=/bin/rm -f lockfile
IOSchedulingClass=idle
[Install]
WantedBy=multi-user.target
■以上の手順を全て完了後に、boinc-clientサービスの起動を行う。
〇サービスの自動起動の再設定、そして起動を行った。
・boinc-clientサービスを自動起動するように再設定した。
root@raspberrypi:/home/pi#
systemctl enable boinc-client
・boinc-clientサービスの起動を行った。
root@raspberrypi:/home/pi#
systemctl start boinc-client
・boinc-clientサービスの起動状態を確認した。
root@raspberrypi:/home/pi# systemctl status boinc-client
● boinc-client.service - Berkeley Open Infrastructure Network Computing Client
Loaded: loaded (/lib/systemd/system/boinc-client.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-04-24 14:26:56 BST; 28s ago
Docs: man:boinc(1)
Main PID: 349 (boinc)
Tasks: 2 (limit: 4260)
Memory: 18.1M
CGroup: /system.slice/boinc-client.service
└─349 /usr/bin/boinc
〇boinctuiもしくは、boincマネージャーで動作確認を行った。
root@raspberrypi:/home/pi# boinctui
/var/lib/boinc-client にマウントしたUSB HDDのパーティション1の容量(32GB)がストレージとして認識されている。
また、Rosetta@homeプロジェクトの場合、タスクが600MB程度ダウンロードされた後に、
無事にそれらのタスクが実行され始めた。
外付けのハードディスクがアクセスランプを明滅させカリカリと音を立てた。
〇数日ほど動かしてから、ディスクの使用状態を確認した。
Rosetta@homeプロジェクトの分散コンピューティングだけでは、下記のように、4.5 GB程度しか使用されていない。
root@raspberrypi:/home/pi# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 15G 1.3G 13G 10% /
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.5M 1.9G 1% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sda1 30G 4.5G 24G 17% /var/lib/boinc-client
/dev/mmcblk0p1 253M 53M 200M 21% /boot
tmpfs 381M 0 381M 0% /run/user/1000
以上
<参考>
・Set systemd service to execute after fstab mount
< https://unix.stackexchange.com/questions/246935/set-systemd-service-to-execute-after-fstab-mount > 2020年4月24日