自動マウントするためのrc-local.serviceが異常終了する
エラーの発生
Kaliのバージョンが上がったことで『ハッキング・ラボのつくりかた』(P.156-161)の方法ではうまくいかないので、『ハッキング・ラボの構築で困ったら読む本』(P.46-50)にて解説をアップデートしました[1]方法は変わりましたが、マウントポイントやコマンドを理解するうえでは『ハッキング・ラボのつくりかた』の解説は無駄にはなりません。。
ところが、2021年5月の時点でこの方法もうまくいかないことが判明しました。
P.50のステップ6にて、rc-local.serviceの状態を確認すると、"/sbin/mount.vboxsf: mounting failed with the error: No such file or directory"というログが出ており、正常に起動できないという現象が起こります。
原因
結論からいうと、"/etc/rc.local"ファイル内にはmountコマンドを記述していますが、rc-local.serviceから呼び出されると「/sbin/mount.vboxsf」コマンドが呼び出されることが原因です(いつからこのような仕様になったのかは不明)。
通常のmountコマンドでは-tオプションが使えますが、「/sbin/mount.vboxsf」コマンドは-tオプションはいりません。よって、「/sbin/mount.vboxsf」コマンドの実行でエラーが起きて、rc-local.serviceが異常終了していたのです。
「/sbin/mount.vboxsf」コマンドのフォーマット
「/sbin/mount.vboxsf [マウントポイント] [マウントするディレクトリ]」という書式で、VirtualBoxの仮想マシンから見て外にあるフォルダーをマウントできます。
┌──(kali㉿kali)-[~]
└─$ sudo /sbin/mount.vboxsf
[sudo] password for kali:
Usage: /sbin/mount.vboxsf [OPTIONS] NAME MOUNTPOINT
Mount the VirtualBox shared folder NAME from the host system to MOUNTPOINT.
-w mount the shared folder writable (the default)
-r mount the shared folder read-only
-n do not create an mtab entry
-s sloppy parsing, ignore unrecognized mount options
-o OPTION[,OPTION...] use the mount options specified
Available mount options are:
rw mount writable (the default)
ro mount read only
uid=UID set the default file owner user id to UID
gid=GID set the default file owner group id to GID
ttl=MILLIESECSONDS set the "time to live" for both the directory cache
and inode info. -1 for kernel default, 0 disables it.
dcachettl=MILLIES set the "time to live" for the directory cache,
overriding the 'ttl' option. Ignored if negative.
inodettl=MILLIES set the "time to live" for the inode information,
overriding the 'ttl' option. Ignored if negative.
maxiopages=PAGES set the max host I/O buffers size in pages. Uses
default if zero.
dirbuf=BYTES set the directory enumeration buffer size in bytes.
Uses default size if zero.
cache=MODE set the caching mode for the mount. Allowed values:
default: use the kernel default (strict)
none: no caching; may experience guest side
coherence issues between mmap and read.
strict: no caching, except for writably mapped
files (for guest side coherence)
read: read via the page cache; host changes
may be completely ignored
readwrite: read and write via the page cache; host
changes may be completely ignored and
guest changes takes a while to reach the host
dmode=MODE override the mode of all directories to (octal) MODE
fmode=MODE override the mode of all regular files to (octal) MODE
umask=UMASK set the umask to (octal) UMASK
dmask=UMASK set the umask applied to directories only
fmask=UMASK set the umask applied to regular files only
iocharset CHARSET use the character set CHARSET for I/O operations
(default set is utf8)
convertcp CHARSET convert the folder name from CHARSET to utf8
Less common used options:
noexec,exec,nodev,dev,nosuid,suid
対応方法
対応アプローチ
対応策として次の2つのアプローチが考えられます。
- ①強制的にmountコマンドを呼び出すようにする。
- ②"/etc/rc.local"ファイルにて、「/sbin/mount.vboxsf」コマンドを実行するように修正する。
ここではアプローチ②を採用します。
対応を考慮した手順
1:ホストOSに"C:\share"フォルダーを作成します。ここが共有フォルダーになります。
2:Kaliの仮想マシンのメニューから「設定」>「共有フォルダー」を選びます。
[+]ボタンで次の共有フォルダーを追加します。
3:shareというマウントポインタを作り、/shareと対応付けてマウントします。
$ sudo mkdir /share ←マウントポインタを作る。
$ sudo mount -t vboxsf share /share ←これが通常のmountコマンドを使った、仮想マシン外のフォルダーに対するマウント方法。
$ ls /share
(共有フォルダー名が見える)
$ sudo /sbin/mount.vboxsf share /share ←「mount.vboxsf」コマンドを使う方法(一応フルパスにしておいた)。2行目のコマンドと同等の動き。このコマンドをステップ3で使う。
(エラーが起きないことをチェック)
3:マウント用の自動起動スクリプトである"/etc/rc.local"ファイルを作成します。
#!/bin/sh
/sbin/mount.vboxsf share /share
4:ファイルに実行権限を与えます。
$ sudo chmod 755 /etc/rc.local
5:マウント用の自動起動スクリプトを呼び出す、"/etc/systemd/system/rc-local.service"ファイルを作成します[2]パスに注意。systemdの後にsystemがあります。。
[Unit]
Description=/etc/rc.local
[Service]
ExecStart=/etc/rc.local
Restart=no
Type=simple
[Install]
WantedBy=multi-user.target
6:サービスの自動起動を設定します。
$ sudo systemctl enable rc-local.service
シンボリックの作成のメッセージが出るはずです。出なければ、rc-local.serviceファイル内が間違っているか、パスが間違っています。エラーメッセージをよく見てください。
7:次のコマンドを実行してサービスを起動してから、状態を確認します。
$ sudo systemctl restart rc-local.service ←サービスの再起動。
$ sudo systemctl status rc-local.service ←状態を確認。
正常に起動
8:Kaliを再起動して、自動でマウントできていることとサービスが正常に稼働していることを確認します。
正常
おわりに
今回の問題については『ハッキング・ラボの構築で困ったら読む本』の固定ページにも反映しました。