無題の備忘録

IT技術について調べたことや学んだこと、試したこと記録するブログです。Erlang、ネットワーク、 セキュリティ、Linux関係のものが多いです。

systemdを使ってUbuntu起動時にユーザに何かを入力させたい

systemdとは

Linuxの起動処理やサービスの管理をする仕組みです。 今回はOS起動時に、ユーザに何か入力させて、処理をしたいことがあったので、やり方を調べました。 やりたいことのほとんどは下記に書いてありました。

Execute an interactive script at boot with systemd

すぐに試せる手順

(1) 登録したいサービス用のファイルを配置する場所を作成する

# mkdir /usr/lib/systemd/system
# cd /usr/lib/systemd/system

(2)simple-window-dialog.serviceを書く

# vi /usr/lib/systemd/system/simple-window-dialog.service
[Unit]
Description=Simple interactive dialog window
After=getty@tty2.service

[Service]
Type=oneshot
ExecStart=/usr/bin/dialog-hello.sh
StandardInput=tty
TTYPath=/dev/tty2
TTYReset=yes
TTYVHangup=yes

[Install]
WantedBy=default.target

(3)起動スクリプトを書く

dialogというツールを使います。

# apt install dialog
# vi /usr/bin/dialog-hello.sh
#!/bin/sh

sleep 5    # このスクリプトが実行される前に他に実行される処理が終わるのを待つ

chvt 2  # tty2に変更する

dialog  --title "Who are you?" --inputbox "Please enter your name:" 19 73 2>name.txt

S_NUM=$(cat name.txt)

if [ "$S_NUM" = "John Doe" ]
then
        dialog --msgbox "Enjoy your Computer !" 12 30
        chvt 1
        exit 0
else
        dialog --msgbox "Sorry, I d'not know about you. See you." 12 30
        shutdown -h now
        sleep 10
fi

(4) 起動スクリプトを実行できるようにする

# chmod 755 /usr/bin/dialog-hello.sh 

(5)ブート可能なイメージを作成する。

シンボリックリンクで、有効化することができる /usr/lib/systemd/system/default.target.wants/はあらかじめ作成しておく

 # mkdir /usr/lib/systemd/system/default.target.wants/
 # ln -sf /usr/lib/systemd/system/simple-window-dialog.service /usr/lib/systemd/system/default.target.wants/simple-window-dialog.service

(6)サービスを有効化する

# systemctl enable simple-window-dialog.service

(7)マシンをリブートして、試す

# reboot

すると次のような画面が表示されて、名前の入力を求められます。 「John Doe」を入力すると、そのまま使える画面に変更されます。 それ以外を入力すると、マシンは終了します。 f:id:storkibis:20160919093449p:plain

もし、起動スクリプトを間違っている場合などは、正常に起動できなくなるので、リカバリブートをして 「root Drop to root shell prompt」を選択し、スクリプトを修正します。