Raspberry PiにUbuntu Desktopをインストールし、デスクトップ環境を構築する際のメモ。

本文章での前提条件・考慮事項は次のとおり。

インストール準備

Raspberry Pi ImagerでUbuntu Server 26.04を書き込む。

user-data

user-data
#cloud-config
hostname: rpi5-resolute-desktop
fqdn: rpi5-resolute-desktop.smdn.internal
locale: ja_JP.UTF-8
timezone: Asia/Tokyo
keyboard:
  layout: "jp"
  model: pc105

users:
- name: smdn
  primary_group: smdn
  groups: [adm, cdrom, sudo, dip, plugdev, users, audio, video]
  sudo: ["ALL=(ALL) ALL"] # sudoでのパスワード入力を必須とする
  shell: /bin/bash
  passwd: "$6$xxxxxxxx$xxxxxxxxxxxxxxxxxxxxxxxxxx" # `openssl passwd -6`で生成したパスワードのハッシュ文字列を指定する
  ssh_authorized_keys:
    - ssh-ed25519 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx smdn

system_info:
  default_user:
    # インストール時に用いられるデフォルトユーザーubuntuを、
    # インストール完了後に無効化する
    lock_passwd: true

packages:
  # ここではUbuntu Server 26.04をベースのインストールイメージとして使用し、
  # そこにubuntu-desktop-minimalを追加することでデスクトップを構成するものとする
  - ubuntu-desktop-minimal
  # それ以外の初期必須パッケージ
  - curl
  - git
  - openssh-server
  - rsync
  - tree
  - ufw
  - vim

# ubuntu-desktop-minimalのインストールによってChronyがインストールされるため、
# この設定はインストール中のみ有効で、その後上書きされる
ntp:
  enabled: true
  ntp_client: systemd-timesyncd
  servers:
    - ntp.nict.jp
    - ntp.jst.mfeed.ad.jp

# 設定ファイルなどを書き込む
write_files:
  # systemdのssh.socketの設定を変えて待受ポートを変更する
  - path: /etc/systemd/system/ssh.socket.d/addresses.conf
    owner: root:root
    permissions: '0644'
    content: |
      [Socket]
      ListenStream= # 設定を上書きするため、既存の設定を空にする
      ListenStream=0.0.0.0:50022 # IPv4アドレスにバインドする場合は`0.0.0.0`とする必要がある

  # sshdの設定を書き込む
  - path: /etc/ssh/sshd_config.d/10-sshd.conf
    owner: root:root
    permissions: '0600'
    content: |
      Port 50022
      AddressFamily inet
      ListenAddress 192.168.0.26
      PermitRootLogin no
      PubkeyAuthentication yes
      AllowUsers smdn@192.168.0.10
      AuthorizedKeysFile %h/.ssh/authorized_keys

  # ChronyのNTPソースを記述したファイルを作成する
  # (ubuntu-desktop-minimalのインストールでNTP設定(上記の`ntp:`)は無効化されるため、
  # ここで設定ファイルを作成する必要がある)
  - path: /etc/chrony/sources.d/custom-ntp.sources
    owner: root:root
    permissions: '0644'
    content: |
      server ntp.nict.jp iburst
      server ntp.jst.mfeed.ad.jp iburst

runcmd:
  # スワップ領域を無効にする
  - [ swapoff, -a ] # 動作しているスワップを即座に停止する
  - [ rm, -f, /swapfile ] # 不要になるスワップファイルを削除する
  - [ sed, -i, -e, '/\/swapfile/s/^/#/', /etc/fstab ]  # /etc/fstabからスワップファイルを無効化して、再起動後にスワップが有効にならないようにする

  # /tmpをtmpfsに割り当てる
  - [ sh, -c, 'echo "tmpfs /tmp tmpfs defaults,noatime,nosuid,nodev,size=2G 0 0" >> /etc/fstab' ]

  # UFWを設定する
  - [ ufw, default, deny, incoming ]
  - [ ufw, default, allow, outgoing ]
  - [ ufw, --force, enable ]

  # デフォルトエディタをvimにする
  - [ update-alternatives, --set, editor, /usr/bin/vim.basic ]

  # Chronyを設定する
  # (ubuntu-desktop-minimalのインストールでNTP設定(`ntp:`)は無効化されるため、ここで再設定する)
  - [ sed, -i, 's/^pool/#pool/', /etc/chrony/sources.d/ubuntu-ntp-pools.sources ] # デフォルトのpoolを無効化
  - [ chronyc, reload, sources ]

  # CUPSを無効化・削除する
  - [ systemctl, stop, cups.service, cups-browsed.service, cups.path ]
  - [ systemctl, disable, cups.service, cups-browsed.service, cups.path ]
  - [ snap, remove, cups ]
  - [ sh, -c, 'DEBIAN_FRONTEND=noninteractive apt-get purge -y cups cups-browsed cups-daemon cups-core-drivers cups-server-common' ]

  # その他不要なsystemd timerユニットを停止する
  - [ systemctl, stop, apt-daily.timer]
  - [ systemctl, disable, apt-daily.timer]
  - [ systemctl, stop, apt-daily-upgrade.timer]
  - [ systemctl, disable, apt-daily-upgrade.timer]
  - [ systemctl, stop, motd-news.timer]
  - [ systemctl, disable, motd-news.timer]
  - [ systemctl, stop, man-db.timer]
  - [ systemctl, disable, man-db.timer]
  - [ systemctl, stop, update-notifier-motd.timer]
  - [ systemctl, disable, update-notifier-motd.timer]

  # インストール時点でのデフォルトユーザーubuntuを削除
  - [ userdel, -r, ubuntu ] # -r: ホームディレクトリも含めて削除する

  # systemdの設定をリロード・再起動
  - [ systemctl, daemon-reload ]
  - [ systemctl, restart, ssh.socket ]

  # 必要なパッケージをインストールする
  - >
    DEBIAN_FRONTEND=noninteractive
    apt-get install -y
    fonts-noto-core
    fonts-noto-cjk
    fonts-noto-cjk-extra
    fonts-noto-mono
    gedit
    gedit-plugin-draw-spaces
    gnome-user-docs-ja
    gir1.2-gtop-2.0
    iputils-ping
    language-pack-gnome-ja
    language-pack-ja
    language-pack-ja-base
    lm-sensors
    ibus-mozc
    firefox-locale-ja

# cloud-initによる初期設定が完了したら再起動する
power_state:
  mode: reboot
  message: "Rebooting to graphical interface"
  timeout: 5
  condition: true

起動時にGDMのログイン画面を表示せずに、パスワード入力なしでデスクトップに自動ログインする場合の設定。

user-data
write_files:
  # デスクトップへの自動ログインを有効にする
  - path: /etc/gdm3/custom.conf
    owner: root:root
    permissions: '0644'
    content: |
      [daemon]
      AutomaticLoginEnable=true
      AutomaticLogin=user

起動時のGDMのログイン画面から特定ユーザーを非表示にする場合の設定。

user-data
runcmd:
  # GDM3のユーザー一覧から非表示にする
  - |
    mkdir -p /var/lib/AccountsService/users
    printf "[User]\nSystemAccount=true\n" > /var/lib/AccountsService/users/user
    systemctl restart accounts-daemon

packagesなどでのaptパッケージのインストールで失敗した場合でもリトライさせる場合の設定。

user-data
write_files:
  # packagesでのインストールでネットワーク未確立などの理由により失敗した場合に
  # リトライを行うように構成する
  # このファイルは後のruncmdで削除されるようにする
  - path: /etc/apt/apt.conf.d/99-install-packages.conf
    content: |
      Acquire::Retries "5";
      DPkg::Lock::Timeout "60";

runcmd:
  # 一時的に構成したリトライ・タイムアウトの設定を削除する
  - [ rm, -f, /etc/apt/apt.conf.d/99-install-packages.conf ]

network-config

(省略)

インストール

SDカードに書き込んだイメージに、作成したuser-datanetwork-configをコピーして上書きする。

本体にSDカードを挿入してインストールを開始する。

初期設定

以下はインストール後に行う初期設定。

dotfiles

これはごく個人的な設定をまとめたものであるため、そのまま使用することは推奨しない。

dotfilesを展開する
$git clone --depth 1 https://github.com/smdn/smdn.git smdn-dotfiles
$smdn-dotfiles/etc/home/smdn/deploy-dotfiles.sh

不要なaptパッケージの削除

以下のコマンドで一括して削除する。 削除理由等については省略。

不要なaptパッケージの削除
sudo apt purge \
  aspell aspell-en \
  '^avahi-.*' \
  bolt \
  bluez bluez-cups bluez-obexd \
  brltty \
  cups-bsd cups-client cups-common cups-filters* cups-ipp-utils cups-pk-helper foomatic-db-compressed-ppds ipp-usb \
  enchant-2 \
  espeak-ng-data \
  ftp tnftp \
  gamemode gamemode-daemon \
  gnome-text-editor \
  hplip hplip-data \
  modemmanager \
  nano \
  network-manager \
  ntfs-3g '^libntfs-.*' \
  openprinting-ppds \
  ppp pptp-linux \
  printer-driver-* \
  rygel \
  sane-utils sane-airscan libsane-hpaio \
  speech-dispatcher speech-dispatcher-audio-plugins \
  system-config-printer-common system-config-printer-udev \
  wamerican

ここで削除する各パッケージの概要は次のとおり。

削除するパッケージと概要
パッケージ名 概要
aspell GNU Aspell spell-checker
aspell-en English dictionary for GNU Aspell
'^avahi-.*' Avahi mDNS/DNS-SD daemon
bolt system daemon to manage thunderbolt 3 devices
bluez Bluetooth tools and daemons
bluez-cups Bluetooth printer driver for CUPS
bluez-obexd bluez obex daemon
brltty Access software for a blind person using a braille display
cups-bsd Common UNIX Printing System(tm) - BSD commands
cups-client Common UNIX Printing System(tm) - client programs (SysV)
cups-common Common UNIX Printing System(tm) - common files
cups-filters* OpenPrinting CUPS Filters - Main Package
cups-ipp-utils Common UNIX Printing System(tm) - IPP developer/admin utilities
cups-pk-helper PolicyKit helper to configure cups with fine-grained privileges
foomatic-db-compressed-ppds OpenPrinting printer support - Compressed PPDs derived from the database
ipp-usb Daemon for IPP over USB printer support
enchant-2 Wrapper for various spell checker engines (binary programs)
espeak-ng-data speech data files
ftp dummy transitional package for tnftp
tnftp enhanced ftp client
gamemode Optimise Linux system performance on demand
gamemode-daemon Optimise Linux system performance on demand (daemon)
gnome-text-editor simple text editor for GNOME
hplip HP Linux Printing and Imaging System (HPLIP)
hplip-data HP Linux Printing and Imaging - data files
modemmanager D-Bus service for managing modems
nano small, friendly text editor inspired by Pico
network-manager network management framework (daemon and userspace tools)
ntfs-3g read/write NTFS driver for FUSE
'^libntfs-.*' read/write NTFS driver for FUSE (runtime library)
openprinting-ppds OpenPrinting printer support - PostScript PPD files
ppp Point-to-Point Protocol (PPP) - daemon
pptp-linux Point-to-Point Tunneling Protocol (PPTP) Client
printer-driver-* printer driver for HP-GDI printers
rygel GNOME UPnP/DLNA services
sane-utils API library for scanners -- utilities
sane-airscan SANE backend for AirScan (eSCL) and WSD document scanner
libsane-hpaio HP SANE backend for multi-function peripherals
speech-dispatcher Common interface to speech synthesizers
speech-dispatcher-audio-plugins Audio output plugins
system-config-printer-common backend and the translation files for system-config-printer
system-config-printer-udev Utilities to detect and configure printers automatically
wamerican American English dictionary words for /usr/share/dict
パッケージ名 概要

削除が完了したら、クリーンアップする。

aptパッケージのクリーンアップを行う
$sudo apt autoremove --purge
$sudo apt autoclean -y

デスクトップ設定

システムモニタアプレット(system-monitor-next)のインストール

事前にgir1.2-gtop-2.0をインストールしておく。

gir1.2-gtop-2.0のインストール
$sudo apt install gir1.2-gtop-2.0

system-monitor-nextを開いて、ZIPファイルをダウンロードする。

以下のコマンドでインストールする。

system-monitor-nextのインストール
zipファイルを使ってインストールする
$gnome-extensions install system-monitor-nextparadoxxx.zero.gmail.com.v86.shell-extension.zip

インストールされたかどうか確認する
$gnome-extensions list

インストールした拡張を有効にする
$gnome-extensions enable system-monitor-next@paradoxxx.zero.gmail.com

一旦ログアウト・再ログインする。 トップバーにアプレットが表示されたら、設定を開いて表示内容の取捨選択・更新間隔の調整を行う。

Firefoxのホイール速度調整

マウスホイールの回転によるスクロールやスライダー調整の速度を調整する。

user.jsを作成して以下の内容を記述しておく。 あるいはabout:configで以下の設定項目を変更する。

~/snap/firefox/common/.mozilla/firefox/(ユーザープロファイルディレクトリ)/user.js
// マウスホイールによるスクロール・スライド速度を75%にする
user_pref("mousewheel.default.delta_multiplier_y", 75);
user_pref("mousewheel.default.delta_multiplier_x", 75);