140文字以上

140文字では伝わらないことを書いています。禁無断転載

twitter(@chromarock), github, bluesky, Mastodon(japanet), misskey, ほしいものリスト, 本人証明, その他プロフィール

Raspberry PI 4 ubuntu 22.04(Server) 設定メモ

Raspberry PI 4BにUbnutu 22.04 LTSを入れるときのメモです。
自分は普段からUbuntuを使っているのでラズパイもUbuntuしか考えられません

Raspberry PIにはGUIを入れずに各種検証用サーバにしたいので、以下はUbuntuServerでの内容です

なお、環境はこのような感じです。(8GBモデル+SSD 1TBを使用しています)

 $ screenfetch
                          ./+o+-       xxx@xxxxxx
                  yyyyy- -yyyyyy+      OS: Ubuntu 22.04 jammy
               ://+//////-yyyyyyo      Kernel: aarch64 Linux 5.15.0-1025-raspi
           .++ .:/++++++/-.+sss/`      Uptime: 0m
         .:++o:  /++++++++/:--:/-      Packages: 924
        o:+o+:++.`..```.-/oo+++++/     Shell: bash 5.1.16
       .:+o:+o/.          `+sssoo+/    Disk: 4.3G / 954G (1%)
  .++/+:+oo+o:`             /sssooo.   CPU: BCM2835 @ 4x 1.8GHz
 /+++//+:`oo+o               /::--:.   RAM: 501MiB / 7807MiB
 \+/+o+++`o++o               ++////.  
  .++.o+++oo+:`             /dddhhh.  
       .+.o+oo:.          `oddhhhh+   
        \+.++o+o``-````.:ohdhhhhh+    
         `:o+++ `ohhhhhhhhyo++os:     
           .o:`.syhhhhhhh/.oo++o`     
               /osyyyyyyo++ooo+++/    
                   ````` +oo+++o\:    
                          `oo++.  

インストールイメージを作る

前は公式HPからOSイメージをダウンロードして、ddとかで書くみたいな感じでしたが、現在ではRaspberry Pi Imagerを使ったほうが圧倒的に楽です。
良い時代になりました。
Windowsな人はここからImagerを落とすのが吉。
公式HP

Ubuntuの人はいつものapt get install でも入れられなくはないけど、Flathubにもあるので、Flathubから入れたほうが良いと思います(バージョンはこちらのほうが新しい場合が多い)

[OSを選ぶ]を選んで、[Other general-puropose OS]を選ぶと、Ubuntu他色々なOSが出てくるのでUbuntuを選択してからいろんなUbuntuをインストールできるという親切設計。。
またユーザ名などもここで設定が出来たりします。もうちょっと凝ったことがしたければ次に説明するcloud-initを編集していくのが吉。

UbuntuのOSイメージコピー後、初回電源投入前にするべきこと

Raspberry Pi Imagerはどうやってユーザ設定をしているのかな?みたいなことを思うでしょうが、現在はcloud-initという仕組みを使って初回電源投入前の初期設定が行えます。
本当に良い時代になりました。(何度目だ)
cloud-initはその名の通り、最初の電源投入の後に一回だけ実行されるスクリプトのようなものです。よって再起動時に再び動くことはない…という感じです
(もともとは似たようなインスタンスを作りまくるクラウド環境で「毎回毎回手で初期設定するのも面倒だしこれなんとかならんか?」みたいな感じで作られていったそうです)

実は、Raspberry Pi Imagerもこの仕組みを使ってログインユーザなどの設定をしています。
実機でもこの仕組みが使えるのは素晴らしいですね。

実は最初のユーザとユーザグループもこの仕組みで作っています。
初回起動時にファイルシステムをうまい感じにリサイズするのもこいつが内部的に行っています(resize2fs)。
またDHCPで好きなIPアドレスを振るのが出来ない環境で、最初から固定IPを設定したいとかそういうことが出来たりします。

ubuntuでのraspberry piはsystem-bootパーティションにuser-datanetwork-configが入っています。

このうち、user-dataは設定したいユーザとパスワードなどの設定、sshdの設定、初期のロケール設定などなど…他色々細かいことが出来ます。network-configはLANやWifiの初期設定です。
よって、パソコンでsystem-bootをマウントし、これらのファイルを編集していけばよく、同じようなUbuntu-Raspberryを複数台用意しなければならない場合はこの設定の「決定版」を作ってこれだけを保管しておけば展開も楽!ということになります。
なんかdockerのDockerfileみたいですね。

話を戻して、パスワード指定で入る場合のuser-dataはこうなっていると思います

#cloud-config
users:
- name: xxx
  groups: users,adm,dialout,audio,netdev,video,plugdev,cdrom,games,input,gpio,spi,i2c,render,sudo
  shell: /bin/bash
  lock_passwd: false
  passwd: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

ssh_pwauth: true

timezone: Asia/Tokyo
runcmd:
- localectl set-x11-keymap "jp" pc105
- setupcon -k --force || true

いきなり公開鍵でsshログインする場合は次のようにします

users:
- name: xxx
  groups: users,adm,dialout,audio,netdev,video,plugdev,cdrom,games,input,gpio,spi,i2c,render,sudo
  shell: /bin/bash
  ssh_authorized_keys:
    - ssh-ed25519 AAAABBBBCCCCDDDD...

ssh_pwauth: false

こうやっておくとsshd周りの少し面倒な設定も良い感じにcloud-initがやってくれます
なお、公開鍵は事前に用意しておく必要はあります。公開鍵はrsaではなく、ed25519で作成したほうが良いでしょう

ロケールの設定はimagerでやると甘いので、これも追加もやっておいたほうが良いですね

locale: ja_JP.UTF-8

なお、ロケール変更をするとrebootしたほうが良いので、runcmdの最後にrebootを入れておいたほうが良いと思います

runcmd:
- localectl set-x11-keymap "jp" pc105
- setupcon -k --force || true
- reboot

この辺はお好みでですが、いきなりインターネットからパッケージを更新したい場合は次のエントリを加えると良いです

package_update: true
package_upgrade: true

packagesエントリを使うと、インターネットからパッケージを入れてくれます。

packages:
- vim

ボクはルータのDHCPでMACアドレスをみて固定IPを振るので変更していませんが、IPを固定させたい場合などはnetwork-configを変更します。以下は固定IP例です

(略)
# Some additional examples are commented out below

network:
  version: 2

  ethernets:
    eth0:
    addresses:
      - 192.168.1.10/24
    gateway4: 192.168.1.1
    nameservers:
      addresses: [192.168.1.1]
    optional: true

(略)

なお、user-dataは奥深く、詰めてゆくと/tmpやらいろんなものをtmpfsとしてRAMに割り振ることも出来ます。
ubuntuは/tmpのRAMディスク化はデフォルトではやってくれないので、/tmpくらいはここでやっても良いかもしれません。

最初にSSHで入る前にやるべきこと

cloud-initを触らずにパスワードログインの場合は、Raspberry PI側の.ssh/sshd_configが公開鍵オンリーになっていないので、ホストの.ssh/configに以下エントリーを入れておくと良いです。
こうやってRaspberry PI用のを書くと後々楽
IPアドレスはルータを調べるなりcloud-initで固定するなりして調べておきましょう。

Host raspi_ub2204
	User XXX
	HostName IPアドレス
	port 22
	IdentitiesOnly yes
	PreferredAuthentications password

こうしておくと ssh raspi_ub2204 で入れる
これで一応PasswdでログインOK

なお、いきなり公開鍵の人はこうします

Host raspi_ub2204
	User XXX
	HostName IPアドレス
	port 22
	Identityfile ~/.ssh/(作った秘密鍵)
	IdentitiesOnly yes
	PreferredAuthentications publickey

ルートディレクトリをext4→btrfsに切り替えるのとfstabsの設定

インストール時にルートディレクトリ/をbtrfsにするのはなかなかキツイので、一度インストールして起動させてからbtrfsに切り替えるという手段を取ったほうが良いです
SDだけで運用やってる人にbtrfsは微妙(寿命的な問題で適切に設定しないとデフォルトのext4より厳しい)だけど、SSDからブートさせて運用している人はbtrfsにしたほうが障害にもある程度強いし各種メリットあるかな…というやつです。あとスナップショットが取れたりするのもデカイですね。

Raspberry pi(Ubuntu)の場合、初回起動時はcloud-initの作用によってresize2fsによってめいいっぱい拡張するので考えをちょっとひねる必要があります。

なお、一般的にはext3や4などのファイルシステムはbtrfs-convertを使うとbtrfsに変換出来ることが知られています。
これを利用した簡単な手段としては一応別のLinuxマシンか、もしくはSSD運用の人はSDにRaspberry Ubuntuをまた入れて、Ubuntuを起動させ、変換対象のデバイスに対してbtrfs-convertをすると良い…ということです。

btrfs-convertはこんな感じで使います

host$ sudo btrfs-convert /dev/partition

変換には多少時間がかかりますが、これ一発で済んでしまうので一見すると簡単そうです。
しかしArchWikiには破壊されたみたいな報告があったともされているため、やる前に重要なデータがある場合はどこかに退避させておいたほうがいいかもしれませんね。
自分は問題ありませんでしたが。。。

もしくは、Ubuntuインストールして初回起動して一旦電源を切り、その次のタイミングで実施したほうがいい…かもしれません。

変換に成功したら何らかの方法でBtrfsにしたパーティションをマウント
そして以下でsubvolumeを消して、その後rebalanceしておきます

host$ cd マウント先
host$ sudo btrfs subvolume delete ./ext2_saved
host$ sudo btrfs balance ./

終わったら、/etc/fstabのLABEL=writableエントリをbtrfsを読ますようにを変更。自分はnoatimeだけを付けて運用していますが、透過圧縮オプションを付けることもできます。
するならcompress=lzocompress=zstd:1かなと。そのへんはお好みで。

最終的に/etc/fstabはこんな感じになるかなと思います

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system>     <mount point>   <type>  <options>                            <dump>  <pass>
LABEL=writable      /               btrfs   defaults,noatrime                    0 1
LABEL=system-boot   /boot/firmware  vfat    defaults                             0 1
tmpfs               /tmp            tmpfs   defaults,size=256m,noatime,mode=1777 0 0

このタイミングで/tmpも/tmpfsに切り替えをしてRAM化しておいたほうが良いですね。
神経質な人は/var/logなんかもそうしますが、logはあとから読みたいときがあるので。。。
サイズは256M取ってますが適当です。あまり使ってる様子がないのですが、この辺の適切な値が今ひとつわかりません

system-bootも何らかの方法でマウントして、その中にあるcmdline.txtもext4に指定しているのでbtrfsに変更

console=serial0,115200 dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=btrfs rootwait fixrtc quiet splash

ちょっと手数はかかりますが、以上でルートファイルシステムがbtrfsになって、/tmpがRAM化します。

インストール後の基本セット

インストール後にまずこれをしてとりあえず必要なものをインストールしています

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install build-essential cmake git gitk ssh samba vim ffmpeg flex bison screenfetch htop apt-transport-https gnupg2 btop raspi-config python3-gpiozero

img2sixel (ターミナルからおおよその画像表示)もあったほうが良さそう。わざわざscpしてクライアントから見なくて済む。
これを使って画像を見る場合は、sshを使用しているホストの端末はsixelに対応したmltermなどが良い。

$ sudo apt install libsixel1 libsixel-bin
$ img2sixel ./nanika_gasou.jpg

flatpakはまぁええかなというところ
サーバ運用するときに欠かせないtmuxはデフォルトで入っているようなので指定しなくてよし

次は使わなさそうなサービスを切っておきます。
avahi-daemonは使わない(〜.localで検索出来るようになるけど、.localドメインは問題が出やすい)ので、以下はやっておいたほうが良いかも

$ sudo systemctl stop avahi-daemon.socket
$ sudo systemctl disable avahi-daemon.socket
$ sudo systemctl stop avahi-daemon
$ sudo systemctl disable avahi-daemon

bluetoothは多分使わないことが多いハズなので以下やっておきます

$ sudo systemctl stop hciuart.service
$ sudo systemctl stop bluetooth.service
$ sudo systemctl disable hciuart.service
$ sudo systemctl disable bluetooth.service

完全を喫するならbootにあるconfig.txtに以下も書き加えるのもアリです

dtoverlay=dtoverlay=disable-bt

wifiを使う人には関係ないですが、使わない人はこうしておいて電源を落としたほうが良いですね

$ sudo apt install wireless-tools
$ sudo iwconfig wlan0 txpower off
$ sudo systemctl stop wpa_supplicant
$ sudo systemctl disable wpa_supplicant

完全を喫するならbootにあるconfig.txtに以下も書き加えるのもアリです

dtoverlay=disable-wifi

ちなみにサービスの起動確認は以下のようにします。

$ systemctl list-units -t service

これを見て自分は使わなさそうなサービスがあればsystemctl stop systemctl disableで切っていく感じですね。

GeekwormのX735を持ってる人向けの各種設定

X735にくっついてるファンはPWMファンで負荷に応じて風量調整ができます。これはRaspberryPIのGPIOで制御できるわけですが、ありがたいことにGeekworm公式がPythonスクリプトを作っています。

X735 Software

やり方は上記Wikiを見ればいいわけですが、Ubuntu 22.04だと上記方法では色々行儀悪いので自分で作りなおしました。
x735-v2.5_ubuntu_fancon
以下、これを使った方法を紹介します

1.[インストール後の基本セット]を行った上で、必要なツールををまとめて入れる

$ sudo apt install python-setuptools python3-distutils python3-rpi.gpio

2.どこか適当なディレクトリを作ってスクリプト類をダウンロード、インストールする

$ mkdir /home/xxx/x735_software
$ cd /home/xxx/x735_software
$ git clone https://github.com/chromabox/x735-v2.5_ubuntu_fancon
$ cd x735-v2.5_ubuntu_fancon
$ sudo chmod +x *.sh
$ sudo bash ./install.sh

3.動いているか確認。

$ sudo systemctl status x735fan.service 
● x735fan.service - x735 fan service
     Loaded: loaded (/etc/systemd/system/x735fan.service; enabled; vendor prese>
     Active: active (running) since Thu 2023-03-16 23:40:07 JST; 11s ago
   Main PID: 1369 (python3)
      Tasks: 2 (limit: 9237)
     Memory: 4.1M
        CPU: 318ms
     CGroup: /system.slice/x735fan.service
             └─1369 /usr/bin/python3 /usr/local/bin/pwm_fan_control.py

 3月 16 23:40:07 xxxxxx.xxx systemd[1]: Started x735 fan service.

このように出ればOK。

4.ここまでの作業が終わったら一旦シャットダウン

$ sudo shutdown -h now

しばらく待って電源ボタンを8秒ほど押して完全に電源を止めてから、ジャンパのFanFSを付属のジャンパピンで埋める
(注意:基板ウラ面にFanFSとAutoOnと書かれているので、それをみて、表面のFanFSのところのジャンパを埋めること)

次にRaspberry PI の電源を入れるとPWMでファン制御が有効になります
X735はもともと静かめのファンがついているのでフルでもそんなに気にならないのですが、PWM制御させると何もしていないときは大体3000回転くらいに収まるようなので、静かですね

ただ、geekwormオリジナルのスクリプト類とは違って、電源スイッチ類は無効にしており、やっぱり完全に電源落とせたほうが気持ちが良いので、ちょっと挙動調べてなんかまた作ろうと思っています。

ホスト名の変更

気が変わってホスト名を変えたいときはhostnamectlを利用すると楽
昔は/etc/hostnameを変更すればよかったけど、最近はそれだけだと足りない場合が多い

$ sudo hostnamectl set-hostname rpi4test.lan

LAN内でつかうドメイン名は.lanや.private、.intranet、.internalにしておくと吉
.localはApple製品や昔のMS製品が使っていたりする(mDNS関連)のでトラブルになりやすいですはい。

他のホストから見たい場合は素直に見たいPCの/etc/hostsファイルにエントリーを追加するか、dnsmasqをどこかに建てて、ルータかPCからDNSでそっちを見に行って名前解決しておくのが有効と思われます。

後から固定IPにしたい場合

初回起動前はcloud-initの仕組みを使ったほうが圧倒的に楽ですが、途中から変えたい場合は/etc/netplan/50-cloud-init.yamlを以下のように変えます

# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        eth0:
            addresses:
            - 192.168.xx.x/24
            dhcp4: false
            gateway4: 192.168.xx.xxx
            nameservers:
                addresses:
                - 192.168.xx.xxx
    version: 2

変更したあとでリブートするか

sudo netplan apply

とすると反映されます。

なお、DHCPに戻す場合は以下

# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        eth0:
            dhcp4: true
            optional: true
    version: 2

日本語ロケールの追加設定(端末メッセージ類の日本語表示)

日本語ロケール追加/設定を忘れた場合は、以下やっていきます

$ sudo apt install language-pack-ja 
$ sudo localectl set-locale LANG=ja_JP.UTF-8

なお、変更したらリブートしたほうが良いです。

Codecをまとめてインストール

動画のコーデック関連の話。Ubuntu18でもありましたね。
Ubuntuのデフォルトでは権利関係が微妙な(微妙にライセンスがオープンじゃなかったり)怪しいものは除外される運命だけど、これをすることによってインストール出来るというアレ。

但し、libavcodecが消えてしまう(その代り権利怪しいアレなバージョンが入る)

$ sudo apt install ubuntu-restricted-extras

あれとか言ってるけど、動作的には問題ないので心配しないでほしい。どう違うか?は以下の通り。

libavcodec - 権利がしっかりしたもの
libavcodec-extra - ubuntu-restricted-extrasで勝手に入る。権利怪しいもの

ffmpegでRaspberry piのCPUにあるハードウェアエンコーダで動画をH.264にエンコードする

Raspberry pi のubuntu 20.04やその時代のRaspberry pi OSだとffmpegのビルドからしないと駄目でしたが、Ubuntu 22.04だとそんなことをしなくても大丈夫になりました。

ただし、64BitOSの場合は昔の32Bit版で使用できていたh264_omxは使えなくてh264_v4l2m2mといって、カーネルにraspberry piのハードウェアエンコーダのv4l2ドライバが入っているのでそれ経由で使うことになります。(今後はこれ推奨とのこと)

というわけで、以下のようにすればraspberry pi4のCPUに入っているH.264ハードウェアエンコーダでエンコードをやってくれます。

ビットレートを1Mとして変換する場合
$ ffmpeg -i in.mov -c:v h264_v4l2m2m -b:v 1M -y out.mp4

出力ファイルのリサイズを指定したいときは以下

アスペクト比を維持したまま、横を1024として、縦は自動リサイズとしたい場合
$ ffmpeg -i in.mov -vf scale=1024:-1 -c:v h264_v4l2m2m -b:v 1M -y out.mp4

アスペクト比を維持したまま、縦を1080として、横は自動リサイズとしたい場合
$ ffmpeg -i in.mov -vf scale=-1:1080 -c:v h264_v4l2m2m -b:v 1M -y out.mp4

解像度を指定する場合(1280x720)
$ ffmpeg -i in.mov -s 1280x720 -c:v h264_v4l2m2m -b:v 1M -y out.mp4

scale のときは割り切れないとエラーになります。

変換速度はScaleとかを指定しない場合は大体1/3(変換終了時間=動画時間/3)くらいです。
かなり早いですね。これだとリアルタイムエンコードもできそうな雰囲気

Scaleを指定したりすると少し遅くなって、1/2〜1/2.5倍になります。
Scale程度ならこれくらいで済むのはなかなか良いですね。ソフトウェアエンコードするよりかはだいぶ早いですね。
(ソフトウェアエンコードだと大体8〜10倍くらいの時間がかかります)

オプションに関してはあまり細かい指定はできないようで、調べた限りではCBR(固定ビットレート)は指定できるものの動かないそうで、VBR(可変ビットレート)のみで、ビットレート数以外はあまり指定できなさそうな雰囲気

CPU負荷は1コアだけは大体100%行きますが、他コアは50%だったりするのでだいぶ良好
入力動画にも関係しそうですが、Load Avg は2〜4みたいな感じです
電力消費的にも良さそうですね

本当に細かい指定はあまりできませんが、出力動画も悪くはない出来なので動画溜まってて空いているRaspberryPIにエンコードやらせたいというのなら現状でなんら問題ないみたいな感じでした。

もうちょい詳しい説明

v4l2-ctl --list-ctrls-menu -d 11とすると以下のように出てきます。
(11は/dev/video11のことです。11にエンコーダが割り振られています)

$ v4l2-ctl --list-ctrls-menu -d 11

Codec Controls

             video_bitrate_mode 0x009909ce (menu)   : min=0 max=1 default=0 value=0 (Variable Bitrate) flags=update
				0: Variable Bitrate
				1: Constant Bitrate
                  video_bitrate 0x009909cf (int)    : min=25000 max=25000000 step=25000 default=10000000 value=10000000
           sequence_header_mode 0x009909d8 (menu)   : min=0 max=1 default=1 value=1 (Joined With 1st Frame)
				0: Separate Buffer
				1: Joined With 1st Frame
         repeat_sequence_header 0x009909e2 (bool)   : default=0 value=0
                force_key_frame 0x009909e5 (button) : value=0 flags=write-only, execute-on-write
          h264_minimum_qp_value 0x00990a61 (int)    : min=0 max=51 step=1 default=20 value=20
          h264_maximum_qp_value 0x00990a62 (int)    : min=0 max=51 step=1 default=51 value=51
            h264_i_frame_period 0x00990a66 (int)    : min=0 max=2147483647 step=1 default=60 value=60
                     h264_level 0x00990a67 (menu)   : min=0 max=13 default=11 value=11 (4)
				0: 1
				1: 1b
				2: 1.1
				3: 1.2
				4: 1.3
				5: 2
				6: 2.1
				7: 2.2
				8: 3
				9: 3.1
				10: 3.2
				11: 4
				12: 4.1
				13: 4.2
                   h264_profile 0x00990a6b (menu)   : min=0 max=4 default=4 value=4 (High)
				0: Baseline
				1: Constrained Baseline
				2: Main
				4: High

このコマンドでどのオプションが使えそうかとか、デフォルト設定はどうなってるかとか見られますが、デフォルトでもそんなに変な設定にはなってなさそうです。

Dockerのインストール

実験用とはいえ、Dockerは非常に便利なので入れておきます

以下のコマンドを打てばOK
現在はCompose V2もこれで入るので楽

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

無事完了したら以下で確認

sudo docker run hello-world

dockerコマンドをsudoなしにしたい場合は以下すると良いです

$ sudo usermod -aG docker $USER

これをした後で一旦ログアウトをして再度入り直したあと

$ docker run hello-world

でDockerが動くことを確認します

Dockerのイメージ場所変更

raspberry piではDockerイメージのディレクトリを変える意味ってあまりないかもしれませんが一応…

デフォルトのイメージは/var/lib/dockerに置かれています。以下コマンドでも確認できるはず

$ docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.10.2
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.16.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

(略)

 Kernel Version: 5.15.0-1025-raspi
 Operating System: Ubuntu 22.04.2 LTS
 OSType: linux
 Architecture: aarch64
 CPUs: 4
 Total Memory: 7.624GiB
 Name: xxxxxxx.xxx
 ID: xxxxxxxxxxxxxxxxxxxxxxxxxx
 Docker Root Dir: /var/lib/docker    ←これ
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

確認したら一旦Dockerのサービスを完全停止させます

$ sudo service docker stop
Warning: Stopping docker.service, but it can still be activated by:
  docker.socket
$ sudo systemctl stop docker.socket
# 以下でdockerサービスが本当にいないか確認
$ ps aux | grep docker

docker_imageというディレクトリを作ってその中をdockerルートディレクトリにするにはまずrsyncを使ってコピーします。
例では/dockerdataに入れるとします。

$ sudo mkdir /dockerdata
$ sudo rsync -aHAXS --info=progress2 /var/lib/docker/. /dockerdata/

rsyncのオプションの意味は以下の通り。
なおこのオプションはファイルシステムの属性などをできるだけ変えずに完璧にそのままバックアップするときにも使えます

-a: アーカイブ モード。-rlptgoD に等しい (-H、-A、-X なし)  
-H: ハードリンクを保持
-A: ACLを保持
-X: 拡張属性を保持
-S: スパースファイルを効率的に処理する。特にDockerの場合はスパースファイルを作ってることがままあるので必要。
--info=progress2: 通常-vだとファイル名が流れるけど、進捗と転送速度を表示する

ラズパイでやるとさすがに時間がちょっとかかりますが、終わったら/etc/docker/daemon.jsonを作ります。

$ sudo touch /etc/docker/daemon.json  
$ sudo vim /etc/docker/daemon.json  

中身はこんな感じでやっておきます

{
  "data-root": "/dockerdata"
} 

(graphでも良いのですがv17.05.0以降は廃止されているそうなので、data-rootにしておきましょう)
編集終わったら以下でサービス再起動

$ sudo systemctl daemon-reload
$ sudo service docker start

特にエラーもでずに以下で再確認して問題なければOK

$ docker info 
(略)
 Docker Root Dir: /dockerdata ←変わっている
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

$ docker images
(今まで作ったイメージがあればOK)

問題なさそうであれば/var/lib/dockerは使わないので削除

$ sudo rm -rf /var/lib/docker

sshd設定

この辺は通常のUbuntu2204と同じ。

ホスト側(もしあれば)で、ed25519な鍵生成

host: $ ssh-keygen -t ed25519

何処に出力するか聞いてくるので、設定して鍵ファイルを作る

インストール先に公開鍵を転送

host: $ scp (作った公開鍵).pub (転送先サーバ名):/home/xxx/

転送先で鍵設定

ub2204_raspi:$ cp (作った公開鍵).pub .ssh/authorized_keys
ub2204_raspi:$ chmod 600 .ssh/authorized_keys

セキュリティを高めるために、転送先のsshd_configを触って鍵オンリーにしてパスワードログインは禁止。
/etc/ssh/sshd_configを以下のように変更

PubkeyAuthentication yes
PasswordAuthentication no

最後に、sshdリスタート

ub2204_raspi:$ systemctl restart sshd

ホスト側で.ssh/configを変更

Host raspi_ub2204
	User XXX
	HostName IPアドレス
	port 22
	Identityfile ~/.ssh/(作った秘密鍵)

これでパスなしで ssh raspi_ub2204 で入れればOK

Samba設定

まず、Sambaをインストール

$ sudo apt install samba

次に/etc/samba/smb.confに追記

[ユーザ名]
        path = /home/ユーザ名
        writeable = yes
        browseable = no
        valid users = ユーザ名

browseableは必要に応じて変える

sambaのパスワードをセットする

$ sudo smbpasswd -a ユーザ名

(-a を入れないとエラーになる)

最後にsmbdリスタート

$ sudo systemctl restart smbd

無事に入れたことを確認したら、/etc/samba/smb.confを触って、ログファイルを出さないようにしても良いと思います

#   log file = /var/log/samba/log.%m
   log file = /dev/null

sambaを使わないヒトは以下で切っておきます

sudo systemctl stop smbd
sudo systemctl stop nmbd
sudo systemctl disable smbd
sudo systemctl disable nmbd

ディスクの完全消去

Ubuntuに限らずLinuxにはcoreutilsにshredというコマンドがある。
NSA方式(3度ランダムデータ書く)でディスクを完全消去ができる

$ sudo shred -uvz <ファイルシステム名>

実施の際はファイルシステムを間違えないこと。
全領域に対して3回ランダムデータを書いて最後に0で埋めるそうなので、かなり時間がかかる。
完全消去は大変時間がかかる(500GBで大凡3〜4時間)ので廃棄するようなHDDを Raspberry PIに接続してこれをすると終わるまで放置出来て良い感じ。

ストレステストをする

linuxにはもともとstressというシステムに負荷を掛けるテストツールがあります
システムの安定性を測る上で欠かせません。

さらにRaspberryではstressberryというのがあり、これはstressを走らせつつRaspberryのクロックと温度も同時に取ってくれるという有用ツールで、これ使うと非常に有効です。

$ sudo apt install stress python3-pip
$ sudo pip3 install stressberry

以下を実行すると、ストレステストを行いながらグラフデータを作ってくれます。テストは大体5分くらいで終わります

$ stressberry-run out.dat

グラフとして画像化するには以下

$ stressberry-plot out.dat -o out.png

ボクの環境で実施してみたところ室温19度では最高で大体50度くらいでした。
(X735+ヒートシンク、オーバークロックなしの最大1.8GHz動作です)

Raspberry PI 4Bは85度を超えるとスロットリングが働くので良くないのですが、かなり余裕そう。
夏に計測するとまた変わってくるかもしれないので時々確認したほうが良いかもしれませんが、これはX735のファンの効果が非常に効いているのか、少々オーバークロックしても大丈夫そうです

参考:
「Raspberry Pi」をオーバークロックしてみた

misskeyを試す(Dockerで同一LANなどインターネットの外に出さない場合の設定とビルド)

とりあえずで良ければ簡単に出来ます。
ローカルで3rdパーティアプリとかの動作確認、BOTを作ったときの動作確認したいときに使えると思います。
本格的に外に出すにはこの設定では不十分なので注意。

misskeyソースのクローン(とりあえず最新マスター)

$ git clone -b master https://github.com/misskey-dev/misskey.git
$ cd misskey

終わったらとりあえずDockerでのデフォルト設定のコピー

cd .config
cp docker_example.yml default.yml
cp docker_example.env docker.env
cd ..
cp docker-compose.yml.example docker-compose.yml

.config/default.ymlを編集
例えば以下のようにURLを変更。
URLは同じRaspberry PIの中で見るだけならlocalhost:3000で構わないけど、同一LANの他から観たい場合はhttp://ラズパイに割り振ったipアドレス:3000としないと画像がでてこなかったりします。
(つまりこのURLはWebページに埋め込まれるので他マシンのブラウザからも参照が引ける名前を入れないとだめ。本番を建てる場合は気をつけましょう)

# Final accessible URL seen by a user.
# url: https://example.tld/
url: http://192.168.x.xxx:3000

Misskeyのビルド気長に待ちます。。。(redisやポスグレのイメージがない場合は30〜40分くらいかかりました@raspi4B 8GB)

$ cd [Misskeyのソースツリー]
$ docker compose build
$ docker compose run --rm web pnpm run init

問題なければ以下で実行

$ cd [Misskeyのソースツリー]
$ docker compose up -d

完全に立ち上がるのに時間がかかるので、ちょっと待ってからブラウザでアクセスすればOK
こんなかんじで管理者として入れます


一通り遊び終わってサーバを終了するには以下

$ cd [Misskeyのソースツリー]
$ docker compose down

結構あっさりできてびびりました。

余談:最初からやり直す
なんかもう一度本当の最初からやり直したい場合は、以下で消さないと残っています。

$ cd [Misskeyのソースツリー]
$ sudo rm -rf db redis files
$ docker rmi misskey-web

データベースなどを飛ばして再度composeする場合、前回ログアウトし忘れている場合は、ブラウザのクッキーを除去しないとちゃんと入れないので注意すること

共有する 共有用にコピー