ラズパイを買ったので
RaspberryPi 3 にUSBの外付けHDD(NTFSフォーマット)を接続する - min117の日記を参考に、外付けHDDをマウントしたところ、ntfs-3gをインストール後rebootしたらラズパイの起動ができなくなりました。
ファイルシステムに明るくないため、手こずりましたが、無事復旧したのでログを残します。
環境情報
Raspberry Pi 3 Model b+
pi@raspberrypi:~ $ lsb_release -a No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 9.6 (stretch) Release: 9.6 Codename: stretch
発生事象
etc/fstabに以下を追記後、再起動したら起動できなくなりました。
# etc/fstab UUID="<MY UUID>" /volumes/ ntfs-3g defaults,iocharset=utf8,umask=000 0 0
より具体的な事象は、raspi 3 が起動しなくなった。 - Raspberry Pi Forums
と同じで、起動後、以下メッセージが出るもののctrl + DやEnterを押しても同メッセージが出続け、先に進めなくなりました。
You are in emergency mode, After loging in, type "jounalctl -xb"to view system logs, "systemctl reboot" to rebott, "systemctl default" or ^D to try again to boot into defalult mode. Cannot open access to console, the root account is locked. See sulongin(8) man page for more details. Press Enter to continue.
完全に/etc/fstabでファイルシステムの指定を間違えてしまい、起動できなくなってしまったパターンです。やらかしです。
/etc/fstabを戻そうにも起動すらできないので、Macで復旧します。
復旧
方針
幸い所有しているMacBook ProにSDカードスロットがあったので、VirtualBox上のUbuntuにSDカードを認識させる · Yoshi's Notesを参考にVirtualBoxでUbuntuを立ち上げて、/etc/fstabを編集できるようにします。
環境情報
# VirtualBox バージョン 5.2.26 r128414 (Qt5.6.3)
SDカードを認識させるのにExtension Packが必要なので、Download VirtualBox (Old Builds)から自身のVirtualBoxのバージョンに合ったExtension Packをインストールします。 なお、バージョンが異なるとインストールに失敗します。
UbuntuのOS情報は以下の通りです。
vagrant@vagrant-ubuntu-trusty-64:~$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"
復旧手順
Mac側
SDカードをMacに挿入します(MicroSDなので変換アダプタ使いました)。
Macからdiskutilを確認します。
以下のように当環境では、SDカードは/dev/disk2で認識されていることが確認できます。
# Mac ❯ diskutil list (中略) /dev/disk2 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *31.9 GB disk2 1: Windows_FAT_16 RECOVERY 1.7 GB disk2s1 2: Linux 33.6 MB disk2s5 3: Windows_FAT_32 boot 72.4 MB disk2s6 4: Linux 30.1 GB disk2s7
mountコマンドでも確認したところ、/dev/disk2に関連するパーティションは以下の2つ(RECOVERYとboot)でした。
# Mac ❯ mount (中略) /dev/disk2s1 on /Volumes/RECOVERY (msdos, local, nodev, nosuid, noowners) /dev/disk2s6 on /Volumes/boot (msdos, local, nodev, nosuid, noowners)
ディスクユーティリティからも以下のように確認できます。

次にディスクユーティリティからRECOVERY/bootをマウント解除します。
(スクショを残し忘れましたが、上記2画面RECOVERY/bootの画面上部にマウント解除のボタンがあります)
続いて、VirtualBox vmdkファイルを作成し、権限を変更します。
(本当は777にしたくないですが、元記事と変えてハマるのも嫌なので、777で。。。)
# Mac ❯ sudo VBoxManage internalcommands createrawvmdk -filename ./sd-card.vmdk -rawdisk /dev/disk2 ❯ sudo chmod 777 sd-card.vmdk ❯ sudo chmod 777 /dev/disk2
作成したvmdkファイルについて、VirtualBox上でハードディスクの追加を行います。

既存のディスクを選択します。

先ほど作成したsd-card.vmdkを開きます。

ちなみにマウント解除したはずなんですが、少し時間を開けたら再度マウントされてしまっていて、以下のように失敗しました。

慌てず、ディスクユーティリティから再度マウント解除すればOKです。
成功すると以下のようにsd-card.vmdkが認識されます。

Ubuntu側
無事追加できたので、vagrant upしましょう。
参考までですが、一度以下のように起動に失敗しました。
❯ vagrant up (中略) ==> default: Booting VM... There was an error while executing `VBoxManage`, a CLI used by Vagrant for controlling VirtualBox. The command and stderr is shown below. Command: ["startvm", "84b91ede-c9fc-45bb-a45a-1f2dfbddee39", "--type", "headless"] Stderr: VBoxManage: error: VD: error VERR_RESOURCE_BUSY opening image file '/Users/xxx/sd-card.vmdk' (VERR_RESOURCE_BUSY). VBoxManage: error: Failed to open image '/Users/xxx/sd-card.vmdk' in read-write mode (VERR_RESOURCE_BUSY). VBoxManage: error: AHCI: Failed to attach drive to Port1 (VERR_RESOURCE_BUSY) VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component ConsoleWrap, interface IConsole
こちらもRECOVERY/bootがMacにマウントされてしまっていることが原因なので、ディスクユーティリティから再度マウント解除すればOKです。
さて、vagrant sshしてからlsblkを実行し、Ubuntu上でSDカードが認識できたことを確認します。
vagrant@vagrant-ubuntu-trusty-64:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 40G 0 disk └─sda1 8:1 0 40G 0 part / sdb 8:16 0 29.7G 0 disk ├─sdb1 8:17 0 1.6G 0 part ├─sdb2 8:18 0 1K 0 part ├─sdb5 8:21 0 32M 0 part ├─sdb6 8:22 0 69M 0 part └─sdb7 8:23 0 28.1G 0 part
sdbとして認識できていますね。これをマウントしていきます。
ラズパイ上では何も考えずにntfs-3gにマウントしようとして失敗したので、今回はちゃんとファイルシステムのTYPEを確認します。
vagrant@vagrant-ubuntu-trusty-64:/volumes$ sudo blkid /dev/sda1: LABEL="cloudimg-rootfs" UUID="xxx" TYPE="ext4" /dev/sdb1: LABEL="RECOVERY" UUID="xxx" TYPE="vfat" /dev/sdb5: LABEL="SETTINGS" UUID="xxx" TYPE="ext4" /dev/sdb6: LABEL="boot" UUID="xxx" TYPE="vfat" /dev/sdb7: LABEL="root" UUID="xxx" TYPE="ext4"
今回のゴールは「/etc/fstabを編集すること」なので、LABELがrootになっている/dev/sdb7を見ます。
TYPEはext4なので、ext4として/volumes/sdcard7にマウントします。
(/volumes/sdcard7が存在しないと思うので、事前にmkdirしておいてください)
vagrant@vagrant-ubuntu-trusty-64:/volumes$ sudo mount -t ext4 /dev/sdb7 /volumes/sdcard7
無事マウントできました。
今回のゴールであるetc/fstabが編集できます。以下記述を削除しましょう。
UUID="<MY UUID>" /volumes/ ntfs-3g defaults,iocharset=utf8,umask=000 0 0
この状態でSDカードをラズパイに挿し、起動したら復旧しました。
etc/fstabを正しく設定する
復旧できたので正しい設定をしましょう。
先ほど同じようにラズパイ上でsudo blkidしてファイルシステムのTYPEを確認します。
$ sudo blkid /dev/sda1: UUID="<MY UUID>" TYPE="vfat" PARTUUID="xxx"
vfatなので、ntfs-3gではなくvfatでマウントします。
# etc/fstab UUID="<MY UUID>" /volumes/ vfat defaults,iocharset=utf8,umask=000 0 0
これで再起動すれば、途中で止まることなく起動でき、/volumes/BTC/に外付けHDDがマウントされているはずです。