Intel Edison の Ubilinux をシングルユーザモードで起動する方法

Intel EdisonをUbilinuxに入れ替えて遊んでいたら、起動スクリプトの書き方を間違えたせいでEdisonが起動しなくなってしまいました。

Intel Edison Kit for Arduino

Intel Edison Kit for Arduino


正確には、途中までは起動するのですが起動途中でブロックしてしまうようになり、しばらく経つとWatchdogが発動してリセットされてしまうようになりました。

ログインプロンプトも出てこないしsshdが起動する前にブロックしてしまっているようなのでログインすることができません。なので修復もできない・・・!
こういうときは焦らずにシングルユーザモードですね。

しかし、ubootでシングルユーザモードってどうやるんだろう・・・(汗)

以下の手順は、試行錯誤のすえに見つけ出したシングルユーザモードに到達する手順です。



まず、シリアルポートを接続したEdisonに電源を投入し、カウントダウンが始まったら何かキーを押してubootのプロンプトに入ります。

Hit any key to stop autoboot:  0 
boot > 

普通のuboot的感覚では、bootargsを編集するときっとカーネルに起動オプションを渡せるはずです。
しかし、bootargsという変数は存在しないようです。

boot > printenv bootargs
## Error: "bootargs" not defined

そこで、

boot > printenv bootcmd

でbootcmd変数の中身を表示させて、そこからboot時にカーネルに渡される変数をたどっていくと、mmc-bootargsの中にbootargs_debugという変数がありました。これが使えそうですね。

boot > printenv bootargs_debug
bootargs_debug=loglevel=4

という感じでデフォルト値が設定されています。

ここに single init=/bin/sh を追加します。

boot > setenv bootargs_debug "loglevel=4 single init=/bin/sh"
boot > saveenv
boot > boot


これでLinuxがシングルユーザモードで起動するはずです。

起動したら早速修復作業に入ります。

が、その前にWatchdogを無効にしないと作業中に勝手にリブートするので、以下のコマンドを手早く入力し、Watchdogをdisableします。

# mount -t sysfs sysfs /sys
# echo 1 >/sys/devices/virtual/misc/watchdog/disable


私の場合は/etc以下のファイルを書き換えたかったので、/をrwでリマウントする必要がありました。(デフォルトではシングルユーザモードの時は/がroでマウントされます)

# mount -o remount /

これでようやく修復作業が開始できますね。

修復作業が終わったら、Edisonを再起動してubootのプロンプトに再び入り、bootargs_debugを元に戻してsaveenv、最後にbootします。

boot > setenv bootargs_debug loglevel=4
boot > saveenv
boot > boot


この手順はUbilinuxの場合でしたが、デフォルトのYocto Linuxの場合でも似たような手順になるのではないかと思います。

Embedded Linux Development With Yocto Project: Develop Fascinating Linux-based Projects Using the Groundbreaking Yocto Project Tools

Embedded Linux Development With Yocto Project: Develop Fascinating Linux-based Projects Using the Groundbreaking Yocto Project Tools