RaspberryPiに限らずLinuxを使っていて、OSの起動時に特定のコマンドを自動実行したいことが出てきました。
いくつかある中でcronを使ったやり方を試してみたのでご報告です。
必要になった経緯
RaspberryPiを使っていてバックアップを共有フォルダに取得している環境があります。例えばファイルのバックアップとかddでOSのイメージバックアップの取得を共有フォルダに取得するというものです。
このとき、別のコンピュータの共有フォルダを参照し保管先とするために、mountコマンドを実行して共有フォルダを使えるようにするのですが、mountコマンドで接続した共有フォルダはOS再起動時にマウント解除されてしまいます。
そこで、mountコマンドを起動時に自動実行してOS起動時に共有フォルダを常にマウントするようにしたいと考えました。
昔はこういう起動時の自動実行というのは、/etc/init.dとか/etc/rc.dを使ってやっていたことがあるのですが、最近はどうやっている?
OS起動時にコマンド自動実行
OS起動時のコマンド自動実行はいくつか方法があるものの、今回はcronを使って自動実行する方法を試してみることにしました。
まずはcrontab -lで何も登録されていないことを確認します。
ここに、「@reboot」で始まる行を記述すると、"起動時に指定したコマンドを自動実行できる"ようになります。
※書式:
@reboot %実行したいコマンドやシェル%
例えば、</home/testuser/mnt-backup.sh>を実行したい場合には、crontabに
@reboot /home/testuser/mnt-backup.sh
と記述します。
このシェルの中にmountコマンドを記述していきます。
シェルに記載するmountコマンド書式
ファイル<mnt-backup.sh>には、以下のように記載しました。
--------------------------------------------------------------
sudo mount -t cifs -o username=%USEARNAME%,password='%PASSWORD%' //FileSVR/MyBKF/LinuxTest /mnt/linuxtest
--------------------------------------------------------------
「username=」に続く"%USEARNAME%"には、共有フォルダにアクセス可能なユーザ名を記述します。
「password=」に続く"%PASSWORD%"は上記ユーザのパスワードです。ただ一定の記号を含むパスワードを使ったとき、「bash: event not found」というメッセージが表示されコマンドの実行が正常終了しなかったため、「'%PASSWORD%'」のように「'」(シングルコーテーション)でパスワード文字列を囲んでコマンドが実行されることを確認しました。
共有フォルダの指定は「//FileSVR/MyBKF/LinuxTest」にて実施しています。サーバ名<FileSVR>の共有フォルダ<MyBKF>配下のフォルダ名「LinuxTest」を、ローカルの</mnt/linuxtest>にマウントします。
動作確認には、このシェル<mnt-backup.sh>を単体で実行してmountコマンドが実行されることで、仕掛ける前に動作確認しておきます。
動作確認:OS再起動で確認
ここまで仕掛けたところでOSの再起動を実施し、実際にOS起動時にマウント動作が自動実行されるかを確認します。
(※実際は何回か試行錯誤したのですが、最終的に成功した状態の確認内容です。)
OS起動時にcronログを確認すると、以下のように「@reboot」で指定した行が実行されたことがsyslogに記録されます。(コマンド:sudo cat /var/log/syslog | grep cron | less で確認)

ログ中の「cron[000]: (CRON) INFO (Running @reboot jobs)」がOS再起動時にcrontabに指定した@reboot行が実行された履歴です。
実行された後には、Linux側のGUIでもマウントされた共有フォルダをローカルのマウント先にて確認することができます。

今回は</mnt/linuxtest>に共有フォルダをマウントしたので、上記の表示が共有フォルダと同じファイル状態であることが確認できています。
※Windowsエクスプローラから参照した共有フォルダ

Windowsエクスプローラでも同じファイルが確認できます。
この状態で
この状態ができたところで、マウント先である共有フォルダをローカルディレクトリのように使うことができるので、ddバックアップの保存先やファイルバックアップのコピー先として指定することで、共有フォルダにバックアップを作成することができます。
いままで、OS再起動の際には手動でmountコマンドを実行していたのですが、これで不測の事態があってOSダウンがあったとしても、復電時には自動的に共有フォルダがマウントされてバックアップが取得されるようになりました。ちょっとしたことですが、良い感じです。