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-data
とnetwork-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=lzo
かcompress=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スクリプトを作っています。
やり方は上記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
に入れるとします。
属性をミスるとエラーになりやすいので、
rsync
のオプションには注意しましょう$ 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する場合、前回ログアウトし忘れている場合は、ブラウザのクッキーを除去しないとちゃんと入れないので注意すること
これをそのまま外(LANの外)に出して正式運用するのはおすすめしません
cloudflareを挟むなど、正式運用するにはより多くの設定が必要になります。
また、ufwで不必要なポートをブロック、dockerのvolume設定なども考えたほうがいいでしょう。