Software

【AI3M 制御基板換装】Part5:BTT CB1のOS最新化

はじめに

突如 CB1 の sd ガードのデータが破損して起動できなくなった.

また過去には BTT から提供されている OS イメージがプリント中にフリーズする事象も報告されており,実際に私も CB1 導入当初は稀にフリーズする事象に遭遇していた.

Complete system freeze during print, happening randomly · Issue #203 · bigtreetech/CB1
Hi, I have the CB1 on a Manta M8P board. Sometimes I can print perfectly fine, but sometimes during longer prints the pr...

せっかくなので最新の Armbian をベースに CB1 上で Klipper をビルドし直す.

Armbianインストール

Armbian のページから最新のイメージを確認すると Armbian 26.2.1 Minimal (Feb 4,2026) で,Debian13 ベースの OS になっている.ちなみにもともと使っていた BTT 純正イメージは Debian12(Bookwarm) がベース,最近のアップデートV3.1.0では Debian13(Trixie) がベースになっているらしい.

BigTreeTech CB1 — Armbian
Download Armbian for BigTreeTech CB1 by Bigtreetech. Standard support, 10 images available including Noble, Trixie, Reso...

ここでイメージをダウンロードして自分で dd コマンドなどで sd カードに焼くか,Armbian 公式ツール ArmbianImager を使うか,お好みでどうぞ.初期設定などの一部も Imager で設定できるので,ArmbianImager が使えるのであれば使ったほうが簡単.画面にしたがって設定するだけなので細かい説明は省略.ただし,まだ Wayland との相性は最悪で,ウィンドウ内のフラッシュというか描画ラグがひどく使い物にならない可能性がある点に注意...

Armbian Imager: Flash Armbian OS to SD & USB Drives
Armbian Imager is a free, open-source tool to flash Armbian OS images to SD cards and USB drives. Supports Windows, macO...

Armbian初期設定

何はともあれパッケージの最新化をする.ユーザ名は user,ホスト名は cb1 と仮称する.

~$ ssh user@xxx.xxx.xxx.xxx
user@cb1:~$ sudo apt update
user@cb1:~$ sudo apt upgrade
user@cb1:~$ sudo apt install vim git dnsutils

OS インストール時に locale の設定は以下の設定ファイルにも反映されている.この設定のせいで armbian-config の locale の設定が反映されないので当該箇所を削除する.

user@cb1:~$ vim .bashrc
user@cb1:~$ vim .xsessionrc

続いて IP アドレスを設定する.Armbian では NetPlan という仕組みでアドレスの管理がされている.わざわざラッパーを作らなくても,素の systemd-networkd で十分だったような.アドレス,SSID,パスワードは自身の環境に合わせて設定すること.

user@cb1:~$ cat <<EOF | sudo tee /etc/netplan/30-wifi.yaml
network:
  wifis:
    ${SSID}:
      dhcp4: false
      addresses:
        - xxx.xxx.xxx.xxx/xx
      routes:
        - to: default
          via: xxx.xxx.xxx.xxx
      nameservers:
        addresses:
          - xxx.xxx.xxx.xxx
      dhcp6: true
      access-points:
        "${SSID}":
        password: "${PASSWD}$"
EOF
user@cb1:~$ sudo chmod 600 /etc/netplan/30-wifi.yaml
user@cb1:~$ sudo netplan try
user@cb1:~$ sudo netplan apply

Klipper for M5P MCU

kiauh 使わなくても直接 make することもできるけれど,mainsail とか他のコンポーネントとセットで kiauh で管理させたいので,メインの klipper は kiauh を使ってインストールすることにする.

user@cb1:~$ cd ~ && git clone https://github.com/dw-0/kiauh.git
user@cb1:~$ ./kiauh/kiauh.sh

1) Install → 1) Klipper → 1) Build

    ※左の画像は Klipper/Moonraker/Mainsail をインストールしちゃったあとのキャプチャ

    Klipper ビルド設定は以下の通り.

    • [*] Enable extra low-level configuration options
    • Micro-controller Architecture = STMicroelectronics STM32
    • Prosessor model = TSM32G0B1
    • Bootloader offset = 8KiB bootloader
    • Clock Reference = 8 MHz crystal
    • Communication interface = USB (on PA11/PA12)
    • [*] Optimize stepper code for ‘step on both edges’

    Klipper for Linux MCU

    一方で kiauh だと linux mcu のインストールが出来ない.仕方ないので kiauh を使わないでビルドとインストールを行う.

    user@cb1:~$ cd klipper
    user@cb1:~/klipper$ make clean
    user@cb1:~/klipper$ make menuconfig

    Klipperビルド設定は以下の通り.

    • [ ] Enable extra low-level configuration options
    • Micro-controller Architecture = Linux process

    make flash でバイナリをインストールしたら systemd のデーモンを設定.OS 起動時に linux mcu も自動的に起動するようにする.

    user@cb1:~/klipper$ make flash
    user@cb1:~/klipper$ sudo cp ./scripts/klipper-mcu.service /etc/systemd/system/
    user@cb1:~/klipper$ sudo systemctl daemon-reload
    user@cb1:~/klipper$ sudo systemctl enable klipper-mcu.service
    user@cb1:~/klipper$ sudo systemctl start klipper-mcu.service
    user@cb1:~/klipper$ sudo setcap cap_sys_nice+ep /usr/local/bin/klipper_mcu
    user@cb1:~/klipper$ echo "kernel.sched_rt_runtime_us = -1" | sudo tee /etc/sysctl.d/99-klipper-host-mcu.conf

    この設定をしておくことで,設定ファイルのサンプルにあるような CB1 の GPIO を指定した設定が可能になる.

    [mcu CB1]
    serial: /tmp/klipper_host_mcu
    
    [heater_fan SoC_fan]
    pin: CB1: gpio79

    Klipper 設定

    Klipper の設定自体はこれまでと変わりないので,制御基板換装シリーズを参照.

    設定自動バックアップ

    mainsail 上で Klipper の設定ファイルを変更する際,直前の設定ファイルを残しておきたい.

    CB1 公式 OS ではどういう仕組みか自動バックアップ機能が実装されている.以前調べた気がするものの,OS が吹き飛んでしまって改めて調べるのも面倒.inotify を使えば SAVE-CONFIG 時のイベントは簡単にキャッチできるので,SAVE-CONFIG 時と同じ内容のファイルをバックアップとして取っておくよう実装しておく.

    ただし,ここで実装するのは SAVE-CONFIG 時に編集前のファイルをバックアップするのではない点に注意.${UserName} は自分の環境に合わせて設定すること.

    user@cb1:~$ sudo apt install -y inotify-tools
    user@cb1:~$ mkdir ~/printer_data/config/backups
    user@cb1:~$ mkdir ~/printer_data/scripts
    user@cb1:~$ cat <<'EOF' > ~/printer_data/scripts/klipper-config-backup.sh
    #!/bin/bash
    WATCH_DIR="/home/${UserName}/printer_data/config"
    BACKUP_DIR="$WATCH_DIR/backups"
    
    mkdir -p "$BACKUP_DIR"
    inotifywait -m -r -e close_write,moved_to --format '%w%f' "$WATCH_DIR" |
    while read -r file; do
      [[ "$file" == $BACKUP_DIR/* ]] && continue
      [[ "$file" != *.cfg ]] && continue
      [[ ! -f "$file" ]] && continue
    
      base=$(basename "$file")
      latest="$BACKUP_DIR/.${base}.latest"
      if [[ -e "$latest" ]] && cmp -s "$file" "$latest"; then
        continue
      fi
    
      ts=$(date +%Y%m%d-%H%M%S)
      backup="${base}.${ts}.bak"
    
      cp "$file" "$BACKUP_DIR/$backup"
      ln -sf "$backup" "$latest"
      echo "[$(date '+%F %T')] Backed up: $base -> $backup"
      # find "$BACKUP_DIR" -type f -name '*.bak' -mtime +30 -delete
    done
    EOF
    user@cb1:~$ chmod 755 ~/printer_data/scripts/klipper-config-backup.sh
    user@cb1:~$ cat <<EOF | sudo tee /etc/systemd/system/klipper-config-backup.service
    [Unit]
    Description=Auto backup Klipper config files on save
    After=klipper.service
    
    [Service]
    Type=simple
    User=${UserName}
    ExecStart=/home/${UserName}/printer_data/scripts/klipper-config-backup.sh
    Restart=always
    RestartSec=2
    
    [Install]
    WantedBy=multi-user.target
    EOF
    user@cb1:~$ sudo systemctl daemon-reload
    user@cb1:~$ sudo systemctl enable klipper-config-backup.service

    おわりに

    ペンプロッタでほぼ同じことをしていたので,やることは結構簡単だね.

    多くの人が BTT 純正のビルド済み OS イメージを使っているのではと思われるが,Armbian をベースに自分でビルドする参考としてどうぞ.

    コメント

    タイトルとURLをコピーしました