1. 想定する構成#
Raspberry Piのような小型機器にARM版Ubuntu Server 20.04をインストールし、専用ソフトウェアとクラウドサービスを連携させる構成を考えます。ストレージを暗号化しておけば、電源が切れている状態でTFカードを取り出されても、データをそのまま読み取られにくくなります。
一方、利用者が基本操作を行えるように、低権限のuserアカウントを作成します。通常のUbuntu Serverは起動後にユーザー名とパスワードを求めますが、組み込み用途では、起動後にuserをTTYへ自動ログインさせ、続けてスクリプトを実行したいことがあります。
2. ユーザーを作成する#
sudo adduser user対話形式の質問に答えてユーザーを作成します。パスワードを空欄にできない場合は、いったん一時的なパスワードを設定し、作成後に削除します。
sudo passwd -d userこのコマンドはパスワードハッシュを削除します。ログイン方法によっては空パスワードが拒否されるため、必ず対象サービスの認証設定も確認してください。
3. tty1へ自動ログインさせる#
gettyは、仮想端末でログインプロンプトを提供するサービスです。systemd環境では、getty@tty1.serviceの設定を変更して自動ログインを指定できます。
まず、直接生成されたユニットファイルを編集する代わりに、overrideを作成します。
sudo systemctl edit getty@tty1.serviceエディターが開いたら、次の内容を記述します。
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin user --noclear %I $TERMExecStart=を空にする行は、元の起動コマンドをクリアしてから新しいコマンドを設定するために必要です。ディストリビューションによってagettyのパスや引数が異なる場合があるので、systemctl cat getty@tty1.serviceで元の設定を確認してください。
4. 設定を反映する#
sudo systemctl daemon-reload
sudo systemctl restart getty@tty1.service再起動して確認する場合は、次のコマンドを実行します。
sudo reboot5. 起動後にスクリプトを実行する#
ログイン後のシェルからスクリプトを起動する方法もありますが、実運用ではsystemdサービスを作る方が管理しやすくなります。たとえば、/etc/systemd/system/my-device.serviceを作成します。
[Unit]
Description=Start device application
After=network-online.target
Wants=network-online.target
[Service]
User=user
ExecStart=/opt/my-device/start.sh
Restart=on-failure
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now my-device.service
systemctl status my-device.serviceまとめ#
agetty --autologin userを使うと、Ubuntu Serverのtty1へ専用ユーザーを自動ログインさせられます。ただし、これは「認証を強化する設定」ではありません。物理アクセスが可能な環境では、誰でもそのユーザーの権限で操作できるため、低権限アカウント、暗号化ストレージ、systemdサービスの権限分離、SSH公開鍵認証などと組み合わせて利用してください。

