先日、古いPCのHDD内に残っているデータをサルベージするために、Ubuntu Server にUSBケーブルでHDDをつないだところ、自動的にマウントしてくれなかったのでその時の覚書です。

・・というのも、その件でググって出てきたQiitaの内容があまりにひどい内容だったので、それに対する丁寧な説明として書き残します。

 

 

検証した Ubuntu Server の環境

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"

$ uname -a
Linux xxxx 5.4.0-86-generic #97-Ubuntu SMP Fri Sep 17 19:19:40 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

 

fdisk コマンドで USB デバイスを特定する

sudo fdisk -l

ずらずらと出てくるので、該当するデバイスを特定します。

以下はその抜粋ですが、/dev/sda は、Ubuntu Server 本体側のストレージで、/dev/sdb が、今回 USB ケーブルで接続しているハードディスクです。

数多くのストレージがマウントされている場合は、容量やストレージの型式などから推測する必要があるかも知れません。

    :
    :
Disk /dev/sda: 557.77 GiB, 598879502336 bytes, 1169686528 sectors
Disk model: PERC 6/i Adapter
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Device       Start        End    Sectors   Size Type
/dev/sda1     2048    1050623    1048576   512M EFI System
/dev/sda2  1050624    3147775    2097152     1G Linux filesystem
/dev/sda3  3147776 1169684479 1166536704 556.3G Linux filesystem

    :
    :

Disk /dev/sdb: 37.27 GiB, 40007761920 bytes, 78140160 sectors
Disk model: MHT2040AH
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: xxxxxxxxxx

Device     Boot    Start      End  Sectors   Size Id Type
/dev/sdb1             63   128519   128457  62.7M de Dell Utility
/dev/sdb2  *      128520 39664484 39535965  18.9G  7 HPFS/NTFS/exFAT
/dev/sdb4       39664485 78140159 38475675  18.4G  f W95 Ext'd (LBA)
/dev/sdb5       39664548 40451669   787122 384.3M  b W95 FAT32
/dev/sdb6       40451736 78140159 37688424    18G  7 HPFS/NTFS/exFAT

 

この例で言えば、

Disk /dev/sdb: 37.27 GiB, 40007761920 bytes, 78140160 sectors
Disk model: MHT2040AH

 

や、Disklabel typegpt1dos2 等の表記で推測できました。

 

USBメモリ・ストレージをマウントする

マウントポイントの作成

USBメモリをマウントする、マウントポイントを作成します。

マウントポイントは、/media 直下に作成します。

sudo mkdir /media/external

 

マウントする

今回は、Windows の Cドライブにあたる /dev/sdb2 をマウントしました。

sudo mount -t ntfs /dev/sdb2 /media/external -o uid=1000,gid=1000,utf8

 

上記のコマンドでは、オプションでファイルやディレクトリのオーナー(uid)とグループ(gid)を 1000(現在のユーザーのUID、GID) にしています。

また、utf8 は、ファイル名を変換する時に UTF-8 に変換するように指示しています。

ちなみに私の環境では、上記では次のようなエラーが出ました。

Windows is hibernated, refused to mount.
Falling back to read-only mount because the NTFS partition is in an
unsafe state. Please resume and shutdown Windows fully (no hibernation
or fast restarting.)
Could not mount read-write, trying read-only

 

どうやら、このディスクは Windows が休止状態のまま取り出したディスクみたいで、そのまま(読み書き用)ではマウントできないみたいですね。3

なので以下のように、読み取り専用でマウントしました。

sudo mount -t ntfs /dev/sdb2 /media/external -o ro,uid=1000,gid=1000,utf8

 

また、ディスクタイプが vfat な場合は、次のようにします。

sudo mount -t vfat /dev/sdb1 /media/external -o uid=1000,gid=1000,utf8,dmask=027,fmask=137

 

mount オプションの umask、dmask、fmask

ここで、dmask=027,fmask=137 ってなんぞや?

と思ったので調べてみました。

通常の chmod などで扱うファイルパーミッションとは少し見え方が違いますが、考え方は簡単でした。

それぞれ通常の8進数として扱われますが、単純に7を引いただけ なのです。

例えば、すべてのユーザーが読み書き実行を可能にしたい場合、chmod コマンドでは、777 になると思いますが、ここからそれぞれの桁から7を差し引いた値で、umask 等を設定すれば、読み書き実行が可能な状態でマウントされるということになります。

よって、dmask=027,fmask=137 は逆に考えれば、

ディレクトリは、027750 で、オーナーは読み書き実行可(= ディレクトリを開ける)、グループは読み取りと実行が可能、他は全て不可、

137640 で、オーナーは読み書き可、グループは読み取り可、他はすべて不可、

という意味になります。

 

まとめ

Qiita には、有用な情報もありますが、結構いい加減な情報もおおいので、複数のソースにあたって必ず検証しよう、というお話でした4

 

 


  1. Guid Partition Table 

  2. おそらく、MBR (Master Boot Record) の事。 

  3. 道理で、Windows にマウントしても読めないわけだ・・ 

  4. プラス、自分自身のブログがそういったいい加減な情報を配信してしまわないように、という磁性の念も込めています。。 


 

 
Share this...

zaturendo

中小企業社内SE。

0件のコメント

コメントを残す

Avatar placeholder

メールアドレスが公開されることはありません。