yocto core-image-minimalなどで自動ログイン

core-image-minimalなどのコンソール環境で自動ログインする。

昔はIMAGE_FEATURESにautologinとか入れれば、実現できたらしいが 機能の実現に使用していたパッケージがメンテナンスされてなかったらしく、 この機能が削除されてしまったらしい。

基本的には、tty1のgettyのパラメータを変更することで実現できるが、sysvinitとsystemdで修正するファイルが異なる。

sysvinitでの自動ログイン

sysvinitでは/etc/inittabを変更することで、自動ログインを実行する。 sysvinitではデフォルトでbusyboxのgettyが使用されるので、autologinが使用できないので、 agettyやmingettyを入れる必要がある。

local.confを修正して、agettyを入れる。

IMAGE_INSTALL_append = " util-linux-agetty"

その後、core-image-minimalのイメージにログインして、次のコマンドを実行する。

sed -i 's|/sbin/getty|/sbin/agetty -a root --noclear|' /etc/inittab

再起動後、自動的にrootでログインされるようになる。

systemdでの自動ログイン

ドロップインファイルを作成し、agettyのパラメータを変更する。

$ mkdir /etc/systemd/system/getty@tty1.service.d
$ cat << 'EOF' > /etc/systemd/system/getty@tty1.service.d/autologin.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty -a root --noclear %I $TERM
EOF

yoctoへの組み込み

meta-autologinの作成

$ yocto-layer create autologin 10
$ mkdir -p meta-autologin/classes
$ mv ./meta-autologin ../poky
$ bitbake-layers add-layer ../poky/meta-autologin

autologin.bbclassの作成

bbclassを使用してROOTFS_POSTPROCESS_COMMAND、イメージ作成時に処理をフックする。

meta-autologin/classes/autologin.bbclassを作成

$ emacs ../poky/meta-autologin/classes/autologin.bbclass

次の内容を記述

auto_login_sysvinit() {
    sed -i 's|/sbin/getty|/sbin/agetty -a root --noclear|' \
        ${IMAGE_ROOTFS}/etc/inittab
}

auto_login_systemd() {
    mkdir ${IMAGE_ROOTFS}/etc/systemd/system/getty@tty1.service.d
    cat << 'EOF' > ${IMAGE_ROOTFS}/etc/systemd/system/getty@tty1.service.d/autologin.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty -a root --noclear %I $TERM
EOF
}

ROOTFS_POSTPROCESS_COMMAND += "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'auto_login_systemd;', 'auto_login_sysvinit;', d)}"
RRECOMMENDS_base-files_append = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '', ' util-linux-agetty', d)}"

local.confの修正

local.confに次の行を追加

INHERIT += "autologin"

ビルド

$ bitbake core-image-minimal

ラズベリーパイなら

$ bitbake rpi-basic-image

これで、rootとして自動ログインされるようになる。