DollsKit

一日でなれる人形遣い

用意(購入)するもの

Optional でないものは必須です。

本体

その他

参考資料

Raspberry Pi Documentation: https://www.raspberrypi.org/documentation/

Getting Started https://www.raspberrypi.com/documentation/computers/getting-started.html

Headless Setup (GUI なしセットアップ) https://www.raspberrypi.com/documentation/computers/configuration.html#set-up-a-headless-raspberry-pi

ドキュメントが一新され、Raspberry Pi Imager を使ったセットアップ方法となった。 SD card に焼くイメージのセレクタ/ダウンローダとイメージライタが一緒になって いい感じになったセットアップ用ソフト。

最新確認環境

RPi5

Raspberry Pi OS Lite (64-bit) 2025-12-04 (Trixie)

RPi4

Raspberry Pi OS Lite (32-bit) 2021-05-07 (Buster)

準備

https://www.raspberrypi.com/documentation/computers/getting-started.html

初期設定

$sudo raspi-config

バージョンアップで少しずつパワーアップしている気がする。 Raspberry Pi Imager の時点で設定可能なものも増えてきている気がする。

ifconfig で wlan の MAC addr を見てルータに DHCP 固定割り当てを設定する。 (そのような機能がある場合) または普通の Linux のやり方で固定アドレスを設定する。 Windows で ipconfig.exe /all を実行した結果を参考にするとよい。

# /etc/dhcpcd.conf
interface <eth0|wlan0>
static ip_address=192.168.XXX.YYY/NN
static routers=192.168.0.1
static domain_name_servers=XXX.YYY.ZZZ.WWW

初期設定 (cloud-init)

最近はブートイメージの作成時点で設定可能な項目が増えたが、これはどうやら cloud-init というソフトを使っているらしい。 元々は AWS EC2 のインスタンスを簡単に初期設定するために開発されたらしい。 クラウドなんて使ってないのに、と混乱するが、確かに RasPi の初期設定にも便利である。

設定ファイルは /boot/firmware/user-data にある。 /etc/cloud/ にあるのはニセモノなので注意! ブートパーティションにテキストの設定ファイルとして置かれている。 幸い root なら書き換え可能。

ブートイメージ作成時に間違えた or 後から変えたくなった場合、このファイルを編集する。 さもないと再起動時に毎回このファイルの内容が適用され、 他の手段による設定変更が上書きされてしまう。 例えば、ホストネームを修正したい場合は raspi-config でも hostnamectl でもダメで、 このファイルを編集しなければならない(一敗)。

アップデート

日本のミラーサイト

※これをやらなくても tsukuba.wide.ad.jp につながった。 謎の力で近くのミラーが使われるようになったのかもしれない。

/etc/apt/sources.list に書かれているサーバは遠くて遅いので 以下のうちどれかに差し替える。

http://raspbian.org/RaspbianMirrors

パッケージの更新

パッケージの削除

sudo apt remove --purge <PKGNAME> or sudo apt purge <PKGNAME>

設定ファイルを後から消す

dpkg --purge `dpkg --get-selections | grep deinstall | cut -f1`

Debian-Backports

主にgit や cmake が古い場合。気にならないならスキップで OK。 最新を追いかけるなら公式のリポジトリを sources.list に登録するのが確実だが、 こちらで十分なら設定は一回で済む。

以下を /etc/apt/sources.list に追加。

deb http://ftp.jp.debian.org/debian buster-backports main contrib non-free

その後 sudo apt update。 おそらく鍵エラーが出るので、NO_PUBKEY と言われた鍵(16進)を控えて、

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <PUBKEY>
...

apt show で backports に別バージョンがあるなら -a ですべて表示できると注意が出る。 backports は -t で明示的に指定しなければ使われることはない。

apt show -a <pkg>
apt install -t <version>-backports <pkg>

自動補完の Beep 音がうるさい

$ sudo nano /etc/inputrc
# uncomment
set bell-style none

Bash のタブ補完

デフォルトで入ってるのか入ってないのかはっきりしない。

apt install bash-completion

root でタブ補完が効かない

一般ユーザの .bashrc では以下のコードで有効化されていて、 全員共通の /etc/bashrc ではコメントアウトされている??? よくわかんないけど共通設定ファイルをコメントアウト解除するか /root/.bashrc の最後にコピペする。

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

DNS の設定追加

家の DNS の様子が怪しい場合。

/etc/resolv.conf は NetworkManager によって管理されており、 書き換えても再起動時に上書きされてしまう。 NetworkManager の管理ツールで設定を追加する必要がある。

# 名前を取得
nmcli device
nmcli connection modify [CONN] +ipv4.dns 8.8.8.8

systemctl restart NetworkManager
cat /etc/resolv.conf

自動アップデート

  1. sudo apt install unattended-upgrades
  2. sudo dpkg-reconfigure -plow unattended-upgrades
  3. /etc/apt/apt.conf.d/50unattended-upgrades を編集

初期設定は以下のようになっているが、Raspberry Pi では origin が “Raspbian” や “Raspberry Pi Foundation” になっているのでこのままではマッチせず 何もアップデートされない。

"origin=Debian,codename=${distro_codename},label=Debian";
"origin=Debian,codename=${distro_codename},label=Debian-Security";

origin, label, suite 等の情報は /var/lib/apt/lists/ 以下にあるファイルに 書かれているが、いつも apt update apt upgrade だけしているなら 以下のようにすればとりあえず全部アップデートできる。

"o=*";

このあたりを運用に合わせて設定する。

// Do automatic removal of new unused dependencies after the upgrade
// (equivalent to apt-get autoremove)
Unattended-Upgrade::Remove-Unused-Dependencies "true";

// Automatically reboot *WITHOUT CONFIRMATION* if
//  the file /var/run/reboot-required is found after the upgrade
Unattended-Upgrade::Automatic-Reboot "true";

以下で空実行できる。

sudo unattended-upgrade --debug --dry-run

screen

ssh をまともにする

カメラモジュール

カメラハードウェア

RPi5 からケーブルが細くなった。 しかし、AI Camera には細いケーブルも同梱されているので ケーブルを別に買う必要はない(一敗)。

ケーブルのソケットの仕様が分かりにくいが、プラスチックのパーツを差し込み方向と平行に 引くことができる。その状態だと緩んでいるのでケーブルを差し込み、再度パーツを押せば ロックされる。

カメラソフトウェア

旧情報

I2C

HTTP Server

sudo apt install lighttpd

lighttpd.md

Docker

https://docs.docker.com/engine/install/debian/

なんかデフォルトの apt にあるやつは unofficial 呼ばわりされている。 この辺は全部消さないと競合して壊れるらしい。 apt show で Maintainer や APT-Sources を見て Debian のものは無視して Docker 公式のもののみを入れるよう気を付ける。 非互換な変更入れすぎでは。

信用する keyrings に公式の鍵を追加して、apt source を追加する。

apt install docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin
systemctl status docker
systemctl start docker

docker というグループができるので、それに追加したユーザが使えるようになるらしい。

docker run hello-world

docker-compose はプラグイン化して docker のサブコマンドになったらしい?

docker compose version

Docker Daemon の設定

本体からのヘルプは dockerd --help。 設定ファイルの場所は /etc/docker/daemon.json

Docker の保存する色々なデータは /var/lib/docker に置かれる。 これは data-root オプションで変更可能。

Docker Engine 29.0 以降をクリーンインストールした場合はイメージや コンテナスナップショットは /var/lib/containerd に置かれる。 ボリュームや設定等の他のデータは /var/lib/docker のまま。 overlay2 のような昔のストレージドライバ (アップグレードインストールのデフォルト) の場合はすべて /var/lib/docker に置かれる。

unionfs により du すると本来より大幅に大量のディスクを食っているように見えるが そんなことはない。 しかしユーザランドにそのように見せているということは rsync 等のバックアップコピーが いい感じに動くとは到底言い難い。 というか Dockerfilecompose.yml から作り直せるデータであり、 バックアップの必要はない。 バックアップ対象の /var ではない場所に設定を変えるのが無難と思われる。 Volume は別途バックアップが必要。

// /etc/docker/daemon.json
{
  "data-root": "/mnt/docker/data"
}
# /etc/containerd/config.toml
# 以下をコメント解除して書き換え
# root = "/var/lib/containerd"
root = "/mnt/docker/containerd"
service containerd restart
service docker restart

GROWI

TODO

MySQL (MariaDB)

セキュリティ初期設定

以下 10.11.4-MariaDB の情報。

sudo mariadb-secure-installation (mysql_secure_installation)

推奨やデフォルトが変わってトラブルを起こしている気がする。。

# root ログイン確認
sudo mysql

sudo mysql [-u USER] [-p]

-u は省略すると '現在のログインユーザ'@'localhost' が使われる。 パスワードを入力したい場合は -p を指定するが、管理が大変なのであまり使いたくないことも 多いかもしれない。

WordPress - MariaDB

Prerequirements

apt に wordpress というのがあるが、apache に依存があり、インストールすると そちらも同時にインストールされてしまう(一敗)。 それとちょっと古い。

以下から最新版をダウンロードする。

https://ja.wordpress.org/support/article/how-to-install-wordpress/

  1. zip をダウンロードして展開する。そのまま web から見えるどこかに配置する。
  2. index.php にアクセスしてみる。
  3. 動かない→シンプルな PHP ファイルで動作を再確認。
  4. 画面が出たがデータベースライブラリがないと言われる→php-mysql(nd) をインストール してサーバを再起動。
  5. 画面が出た→データベース名とユーザ/パスワードを入力。
    データベース名: wordpress とかにする。
    ユーザー名: サーバの動作ユーザ (www-data) と同じにすると unix_socket 認証が効く。
    パスワード: unix_socket 認証ならば空で OK。
    データベースのホスト名: localhost で。
    テーブル接頭辞: データベースの root がないけど wp を複数動かしたい人向け。 デフォルトで。
  6. wp-config.php を作ろうとするが、パーミッションエラーとなった場合は 表示された内容を自前でコピペして作成する。 wp-config.php は最終的には 400 (r–/—/—) 推奨

これでとりあえずボタンを押すとデータベース接続エラーになるので、 必要なユーザや権限をエラーが出なくなるまで作っていく。

MariaDB ユーザの作成

まずログインエラーを直せるか確認しつつ行う。

-- パスワードなしで誰でも入れる。危険。
CREATE USER 'www-data'@'localhost';
-- パスワードを指定して作成。コマンドログに残るし色々と何とも言えないところがある。
CREATE USER 'www-data'@'localhost' IDENTIFIED BY 'password';
-- unix_socket による認証。www-data ユーザならパスワードなしでログインできる。
CREATE USER 'www-data'@'localhost' IDENTIFIED VIA unix_socket;
# sudo は実は root で実行する、ではなく switch user して実行する、なので
# www-data ユーザとして実行できる
# 'www-data'@'localhost' としてログイン確認
sudo -u www-data mysql

ここまで確認できたら WordPress からユーザ名: www-data, パスワード: 空で データベースログインまで通ることを確認する。

文字コードデフォルト設定

SHOW VARIABLES LIKE 'char%';
SHOW VARIABLES LIKE "col%";

/etc/mysql/my.cnf がルート設定ファイルだが、ディレクトリの中身を全部 インクルードしているだけなので、/conf.d/mysql.cnf を編集する。

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin

[client]
default-character-set=utf8mb4
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8mb3                    |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

+----------------------------------+--------------------+
| Variable_name                    | Value              |
+----------------------------------+--------------------+
| collation_connection             | utf8mb4_general_ci |
| collation_database               | utf8mb4_general_ci |
| collation_server                 | utf8mb4_general_ci |
| column_compression_threshold     | 100                |
| column_compression_zlib_level    | 6                  |
| column_compression_zlib_strategy | DEFAULT_STRATEGY   |
| column_compression_zlib_wrap     | OFF                |
+----------------------------------+--------------------+

character_set_system は utf8(mb3) のままで OK。

なぜか collation-server のデフォルト設定が効かない気がする。 とはいえデフォルト設定に頼るのは移行時の事故の元なので、 CREATE DATABASE 時に明示的に設定するようにする。

-- データベース設定情報の取得
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA;
*************************** 5. row ***************************
              CATALOG_NAME: def
               SCHEMA_NAME: wordpress
DEFAULT_CHARACTER_SET_NAME: utf8mb4
    DEFAULT_COLLATION_NAME: utf8mb4_bin
                  SQL_PATH: NULL
            SCHEMA_COMMENT:

スロークエリ

WordPress 運用ではそこまで要らないかもしれないけど、一応。

[mariadb]
slow_query_log
long_query_time=1.0
# default=/var/lib/mysql/{host}-slow.log
slow_query_log_file=slow.log

WordPress - 本体

パーミッションと自動更新

データベースだけでなく、WordPress のインストール先自体を書き換えることがある。 とりあえず読み取りさえできれば動きはするが、FTP の設定を求められたりする。

本体の自動更新をするには PHP プログラム (= web サーバ = www-data ユーザ) から 自分自身を書き換えられるようにする必要がある。

理想

しかし、更新作業が面倒とか、忘れているとかでセキュリティパッチの適用なしで インターネット上に放置されるのはあまりにも危険。

現実的には

こんなところかもしれない。 自分自身を任意のプログラムに置き換えられる可能性は頭にちらつくが、 セキュリティアップデートなしで放置するよりはマシな気がする。 (S)FTP or SSH を設定するというのも、もっと権限の高い権限へのログイン情報を WordPress に持たせる感があって何とも言えない。

chown -R www-data:www-data .
find . -type f | xargs chmod 644
find . -type d | xargs chmod 755
chmod 400 wp-config.php

自動更新設定

初期設定ではなかなか激しいことになっている。。(ver 6.4.3)

このサイトは WordPress の新しいバージョンごとに自動的に最新の状態に保たれます。
メンテナンスリリースとセキュリティリリースのみの自動更新に切り替えます。

プラグインを入れたりしていると、普通に破壊されると思われる。 そういうまともな使い方を始めるまでは常時最新アップデート設定で、 というメッセージなのかもしれないけど。。

下のリンクをクリックするとマイナー/セキュリティリリースのみの自動更新になる。

このサイトは WordPress のメンテナンスリリースとセキュリティリリースのみで自動的に最新の状態に保たれます。

ただ、固定したバージョンも永久に使い続けられる訳ではないので、 データベースも含めたバックアップ/リストア手順と共に、 メジャーバージョンアップの手順確立と習慣化も考えるべきだと思われる。 また、PHP や MySQL (MariaDB) も数年でサポートが切れる。

一応 10 年前までのリリースにもセキュリティパッチは出ているようだけど、 10 年分の全部のリリースブランチにパッチを当ててリリース作業を行う担当者の 悲痛な叫び声が聞こえる。。

https://ja.wordpress.org/download/releases/

積極的に保守されている6.4系統の最新版以外の以下のバージョンは、安全に使用することはできません。

サイトヘルス

警告 オプションのモジュール curl がインストールされていないか、無効化されています。
警告 オプションのモジュール dom がインストールされていないか、無効化されています。
警告 オプションのモジュール imagick がインストールされていないか、無効化されています。
警告 オプションのモジュール zip がインストールされていないか、無効化されています。
エラー 必須モジュール gd がインストールされていないか、無効化されています。
警告 オプションのモジュール intl がインストールされていないか、無効化されています。
apt install php-gd
apt install php-curl php-dom php-imagick php-zip php-intl
service lighttpd restart
REST API で予期しない結果が発生しました

パーマリンク設定のところが %postname% を含むもの (デフォルトもそう) になっていると REST API が 404 になるらしい。

サイトのパーマリンク構造を選択してください。%postname% タグを含めるとリンクが理解しやすくなり、投稿が検索エンジンで上位に表示されるのに役立つ可能性があります。

バグのような気もするし、そのうち直るのかもしれない…。

pCloud

買い切りのクラウドストレージ。 生涯 (会社が潰れるまで) 使い続けられるらしい。

rclone

https://rclone.org/

クラウドストレージ全般に対応したコマンドラインツール。 Go 製。 暗号化した状態で保存もできるらしい。

インストール

https://rclone.org/downloads/
https://rclone.org/install/

sudo -v ; curl https://rclone.org/install.sh | sudo bash

例によってシェルスクリプトの実行がどうかと思う場合はマニュアル操作で行う。 CPU に合わせて AMD64 (PC) or ARM64 (RasPi) を選択。 Debian/Raspbian なら *.deb パッケージを選ぶと管理が楽。 sudo apt install ./xxx.deb のように ./ で始まるパスを書けば apt からインストールできる。

remote の追加

rclone config
  1. New remote
  2. Enter name for new remote. リモート設定に名前を付ける。 設定完了後にコマンドライン上で毎回指定することになる。
  3. Pcloud
  4. Leave blank normally. と言われたら空のままで。
  5. Say Y if the machine running rclone has a web browser you can use. 多分ウェブブラウザの使えるマシン上で認証して、設定をコピーするのが楽。 GUI 環境のある PC でここに Y と答える。
  6. WSL だとブラウザが開けず http://127.0.0.1:53682/... へアクセスしろと 言われるので、ブラウザで開く。
  7. ブラウザから pcloud にログインしたことがあれば認証通るはず。
  8. ここまで行う、または GUI 環境がない場合は ~/.config/rclone/rclone.conf の 内容を認証できているマシンからコピーしてくる。

OAuth とかの認証のため、ウェブブラウザがないとしんどい。 GUI のある PC にも rclone をインストールし、ウェブブラウザから認証して アクセストークンを入手する。 設定ファイル ~/.config/rclone/rclone.conf にアクセストークンが書かれているので、 CUI 環境での設定ファイルにコピーするのが多分楽。

rclone 使い方

リモートのパスは <remote>:<path/to/file_or_dir> のように、 設定でつけた名前をコロンの前に指定する。 パスは / で始めないことを推奨。 ルートを指定したい場合は空文字列で OK。 ごく一部のサービス相手では最初を / で始めるか始めないかで、 ルートからのパスかホームディレクトリからのパスかを使い分けられる。

# ls (--max-depth 1 をつけないと再帰的に全エントリを列挙する)
rclone ls remote:
# ls -l っぽいもの (同上)
rclone lsl remote:
# ディレクトリのみ列挙する (-R で再帰的に列挙)
rclone lsd remote:
# ファイルのみ列挙する (同上)
rclone lsf remote:
# JSON フォーマットで出力する (同上)
rclone lsjson remote: