それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

raspi でホスト名(マシン名)が変更できない

hostname を変更しても無駄なときがある。

よくある記事の「hostnamectl を使えば良い。」という記事を信じてやってみたが。

sudo hostnamectl  set-hostname my-server --static
sudo reboot 

変わらない。

hostnamectl
 Static hostname: raspberrypi
       Icon name: computer
      Machine ID: 4331286d1cd4be5f9603f87863e361bd
         Boot ID: 44a08433aff242e0bb39cd2a1bf45ce1
Operating System: Ubuntu 22.04.1 LTS
          Kernel: Linux 5.15.0-1023-raspi
    Architecture: arm64

なぜだ。

以下のファイルを変えても無駄。

ホスト名を変えられる手段を試したがだめだった。

hostname myhost
hostnamectl set-hostname myhost
vim /etc/hostname
vim /etc/hosts

これらのファイルは、systemdの制御下に置かれている。

ホスト名は、systemdが管理している。

かといっても、systemdで設定を書き換えても、再起動で元に戻る。詰んだ。

原因は cloud-init

systemd はinit時に cloud-initを尊重するように設計されている。これ原因らしい。

raspberry pi の場合は、cloud-initを使うように構成されている。

mount /dev/sdb1 /mnt
cat /mnt/user-data

user-data を書き換えるか削除すると改善する。

sudo rm /var/lib/cloud/data/set-hostname

cloud-initにはキャッシュがある。

設定済みのコンフィグは最後に起動した設定を再現するようにキャッシュされている。

そのため user-data だけを消してもまたもとに戻ることがある。

だったら、cloud-initを無効化するとか

sudo touch /etc/cloud/cloud-init.disabled

キャッシュ消してもいいけど。。。

sudo rm -rf /etc/cloud/*
sudo rm -rf /var/lib/cloud/*

中途半端に消したり無効化すると、ネットワークに繋がらなくなったりするのであまりおすすめできないんですよね。

netplanを使ってる場合は netplanをきちんと書くか、/etc/systemd/network に記述しないとネットワークが繋がらなくなります。

Raspberry Pi Imager が原因

Raspberry Pi Imager では cloud-init を用いて設定を流し込んでいる。

Imagerの各種設定で初期設定した場合

D:\user-data のファイルが作られる。このuser-dataファイルに初期設定が書かれる。cloud-initとしては正しい運用だ。 ただ、cloud-initで再起動時に常に上書きされるのは、気づかないとハマります。

Pi Imager は入門者がサクッと触るにはいいけど、Linux初心者向けとは言い難い気がする。

cloud-init で 残り続けるパスワード

先述の通り、Raspberry pi Imager で作成するとUser Data が作られる。このデータは初期化終了後もVFAT ディスクに残り続ける。

そのため、SDカードを抜き取れば誰でも読めてしまう。たとえば、私のRaspberry Ubuntu には、以下のデータが残っていた。

root@raspi-ubuntu:/# cat /boot/firmware/user-data
#cloud-config
hostname: raspi-ubuntu
manage_etc_hosts: true
packages:
- avahi-daemon
apt:
  conf: |
    Acquire {
      Check-Date "false";
    };

users:
- name: takuya
  groups: users,adm,dialout,audio,netdev,video,plugdev,cdrom,games,input,gpio,spi,i2c,render,sudo
  shell: /bin/bash
  lock_passwd: false
  passwd: $5$ZQ3aRCLP8q/

ssh_pwauth: true

timezone: Asia/Tokyo
runcmd:
- sed -i 's/^s*REGDOMAIN=S*/REGDOMAIN=JP/' /etc/default/crda || true
- localectl set-x11-keymap "us" pc105
- setupcon -k --force || true

User Dataのファイルは残ってるので再利用可能なのだが、暗号化ディスクの場合、流石に消さないと不味いんじゃないかと思った。