今回はラズパイでNAS(ファイルサーバー)を構築するために外付けHDDを購入したので、ラズパイで外付けHDDが使用できるようにする方法について解説します。(外付けSSDの接続方法も外付けHDDと同じです。)
目次
必要なもの
- ラズパイ
私は家に余っていたラズパイ3Bを使用しましたが、通信速度の関係上ラズパイ4の方がいいと思います。速度を気にしないのであれば3Bで十分です。
※初めてラズパイを使用する方は、ラズパイ用の電源、SDカードが必要です。
- 外付けHDD(または外付けSSD)
後述しますが、2TBを超える容量だと追加の設定(パーティションの管理情報のフォーマットをGPTに変更)が必要になります。
また、外付けHDDは稼働中の消費電力が意外と高く、USB給電式のものだとラズパイが電源不足になってしまう可能性があるため下記のような外部電源を使用したものの方がいいと思います。
今回行ったこと
4TBの外付けHDDを使用し、パーティションを2つに分けWindows用のNTFSのパーティションと、Mac・LINUX 用にext4のパーティションを作成しました。
NTFSはクラッシュなどの耐久性に優れているので、1つのパーティションにして4TB全てをNTFSにしても良かったのですが、NTFSはWindows用のファイルシステムなのでLINUX のアクセス権の設定はできません。そのため、LINUXやMac、androidスマホのデータをNTFSに保存するとアクセス権が保持されずに保存されてしまいます。そこまで問題にはなりませんが個人的にちょっときになるので、LINUX 系のデータ保存用のパーティションとしてext4のパーティションも作成しました。
今回はこのように2つのパーティションを作成しましたが、この記事ではパーティションを1つだけ作成する方法についても解説します。
設定の流れ・用語解説
- ラズパイの初期設定
- 外付けHDDをラズパイに接続
- HDDのフォーマット(ファイルシステム設定・パーティション作成)
- パーティションのフォーマット
- HDDをラズパイへマウント
所要時間:約20分
HDDを使用するにはまず、HDDの中にパーティションというものを作成する必要があります。このパーティションの中にデータを保存していくのですが、データの保存の仕方(ファイルシステム)は何種類もあるため、どのファイルシステムを使用するかを決める必要があります。今回はパーティションを2つ作成し、各パーティションにNTFSとext4というファイルシステムを適用させます。
また、HDDにはこれらの設定(パーティションの管理情報)を保存する部分があり、その設定の保存方法がMBRとGPTの2種類あります。MBRでは2TB分の情報しか管理できないため、2TBを超える容量のHDDを使用する場合は2TB以上の管理情報も扱えるGPTでフォーマットする必要があります。
HDDをフォーマットするコマンドにはfdiskやpartedなどがありますが、このうちGPTでフォーマットできるのはpartedだけなので今回はこちらを使用します。
※partedではGPTだけでなく、MBRでもフォーマット可能です。
実行手順
ラズパイの初期設定
Rasbian OS のインストール
まず、ラズパイの初期セットアップ(Rasbian OS のインストール)を行います。ラズパイを扱うのが初めての方は以下の記事を参考にして、ラズパイが起動できる状態にしてください。
※もうすでにOSのインストールが完了している方は次に進んでください。
必要なパッケージのインストール
ラズパイの起動までできたら、SSHやVNCでラズパイにアクセスしコマンドプロンプトを開き、以下のコマンドを実行してntfs-3gパッケージをインストールしてください。
sudo apt update
sudo apt upgrade
sudo apt install ntfs-3g
ntfs-3gパッケージはLinuxからNTFSを扱えるようにする(書き込むことができるようにする)ドライバーです。デフォルトではLinuxからNTFSのデータを読み込むことは可能ですが、書き込むことができません。
以下のコマンドで正しくインストールできたか確認します。
sudo apt list | grep ntfs-3g
外付けHDDをラズパイに接続
まず、ラズパイ側でHDDを認識できるようにするためにパソコン等を使用して、使用する外付けHDDをフォーマットしてください。
後でラズパイからフォーマットし直すのでファイルシステムなどは適当で大丈夫です。
※フォーマットをしなくてもラズパイ側で認識できる場合もあります。その場合はこのフォーマットは行わなくても大丈夫です。
フォーマットしたらラズパイに差し込みます。
※ラズパイ4の場合は、通信速度が速い青いUSB端子(USB3.0)の方に差し込むことをお勧めします。
差し込んだら、以下のコマンドを実行して、表示される容量などを参考に正しく認識されているか確認します。
sudo fdisk -l
以下のように表示されるので、差し込んだHDDのパス( /dev/sda と書かれている部分)を確認します。私の場合は/dev/sdaでしたが、この名前は環境によって異なる場合があります。
・
・
・
Disk /dev/sda: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: HDCZ-UT
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: B15DED0B-9FF8-4CD4-A64E-D36CBE380E3E
Device Start End Sectors Size Type
/dev/sda1 34 262177 262144 128M Microsoft reserved
/dev/sda2 264192 7814036063 7813771872 3.7T Microsoft basic data
(/dev/sdaがHDD本体で、/dev/sda1や/dev/sda2がパーティションです。)
HDDのフォーマット(GPTへの変更・ファイルシステムの設定)
まず、以下のコマンドでpartedを起動します。
※/dev/sda の部分はご自身の環境に合わせて編集してください。
sudo parted /dev/sda
実行すると以下のようなことが表示されます。
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)
表示されたら、(parted)の後ろにpと入力しHDDの情報を表示させます。
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: I-O DATA HDCZ-UT (scsi)
Disk /dev/sda: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: loop
Disk Flags:
Number Start End Size File system Name Flags
1 17.4kB 16.8MB 16.8MB Microsoft reserved partition msftres
2 16.8MB 4001GB 4001GB Basic data partition msftdata
出力結果の Partition Table の部分がGPT以外になっていたら以下のコマンドでGPTに変更します。
(parted) mklabel gpt
もしこの時以下のようなエラーが表示された場合、パーティションに対してpartedコマンドを実行している可能性が高いので、パスをもう一度確認してやり直してください。
(※例:sudo parted /dev/sda2 というようにして実行している。解決法:sudo parted /dev/sda というようにして実行し直す。)
(parted) mklabel gpt
Warning: The existing disk label on /dev/sda2 will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Yes
Error: Partition(s) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64 on /dev/sda2 have been written, but we have been
unable to inform the kernel of the change, probably because it/they are in use. As a result, the old partition(s) will remain in use. You should reboot now
before making further changes.
Ignore/Cancel?
もう一度pと入力してgptに変わっているか確認します。
(parted) p
Model: I-O DATA HDCZ-UT (scsi)
Disk /dev/sda: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 17.4kB 16.8MB 16.8MB Microsoft reserved partition msftres
2 16.8MB 4001GB 4001GB Basic data partition msftdata
gptになっていることができたら、以下のコマンドで、今存在するパーティションを削除します。
(parted) rm 1
(parted) rm 2
(parted) pの出力結果を見てみると、私の場合2つパーティションが存在していたので、この2つのパーティションを削除しました。
もう一度(parted) pと実行し、削除されたか確認します。
(parted) p
Model: I-O DATA HDCZ-UT (scsi)
Disk /dev/sda: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
(parted)
削除できていることが確認出来たら、(parted)quitと実行し、partedを終了します。
次に、以下のコマンドを実行してパーティションを作成します。
※/dev/sda の部分はご自身の環境に合わせて編集してください。
sudo parted -a optimal /dev/sda mkpart primary ntfs 0% 50%
このコマンドは、/dev/sdaのHDDのHDD容量が0%から50%の部分(0~2TBの部分)を1つのパーティションとし、そのパーティションをntfsというファイルシステムでフォーマットするという意味です。
※パーティションを1つだけ作成したい場合は、50%の部分を100%に変えて実行してください。
私は2つパーティションを作成するため、以下のコマンドを実行し、2つ目のパーティションも作成しました。
sudo parted -a optimal /dev/sda mkpart primary ext4 50% 100%
パーティションを作成したら、正しくパーティションが作成できているか確認します。
sudo fdisk -l
出力結果↓
pi@raspberrypi:~ $ sudo fdisk -l
・
・
・
Disk /dev/sda: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: HDCZ-UT
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 19D518C3-1F4D-45F1-A299-A6ACC31F8B5B
Device Start End Sectors Size Type
/dev/sda1 2048 3907018751 3907016704 1.8T
Microsoft basic data
/dev/sda2 3907018752 7814035455 3907016704 1.8T Linux filesystem
pi@raspberrypi:~ $
NTFSでフォーマットした場合、Typeというところが Microsoft basic data と表記されていれば成功です。
パーティション内のフォーマット
続いて、以下のコマンドでパーティション内のフォーマットを実行します。
sudo mkfs -t ntfs -Q -L NAS-ntfs /dev/sda1
-t の後にファイルシステムを、-L の後にパーティションのラベルを(パソコンに接続したときに表示されたりする名前です。省略することもできます。)、最後にパーティションのパスを入力します。ちなみに、NTFSでフォーマットする場合、-Q オプションを指定するとクイックフォーマットでフォーマットされます。
パーティションを2つ作成した場合は2つ目も同様にフォーマットします。
sudo mkfs -t ext4 -L NAS-ext4 /dev/sda2
私の場合は2つ目のパーティションはext4にしたので、上記のようにext4を指定して実行しました。ext4の場合は-Q オプションは使用できません。
HDDをラズパイへマウント
続いて、HDDをラズパイにマウントし、HDDをラズパイ上のディレクトリと紐づけます。
まずは紐づけ先のディレクトリを作成します。
sudo mkdir /mnt/NAS
sudo mkdir /mnt/NAS/ntfs-win
sudo mkdir /mnt/NAS/ext4-lin
今回は作成した2つのパーティションを別々のディレクトリにマウントしたいため、/mnt/NAS/ntfs-win と /mnt/NAS/ext4-lin というディレクトリを作成しました。1つだけしかパーティションを作成していない場合は1つだけディレクトリを作成してください。
次に、最初の方に行った以下のコマンドでパーティションのパスを確認します。
sudo fdisk -l
確認したら、以下のコマンドでマウントします。
sudo mount /dev/sda1 /mnt/NAS/ntfs-win
sudo mount /dev/sda2 /mnt/NAS/ext4-lin
mount の1番目の引数(/dev/sda1の部分)には先ほど確認したパーティションのパスを、2番目の引数(/mnt/NAS/ntfs-winの部分)には先ほど作成したディレクトリのパスを入力して実行してください。
こちらも同様に、1つだけしかパーティションを作成していない場合は1つだけマウントしてください。
正しくマウントできたか以下のコマンドで確認します。
df -Th
出力結果↓
ファイルシス タイプ サイズ 使用 残り 使用% マウント位置
/dev/root ext4 15G 4.9G 8.9G 36% /
devtmpfs devtmpfs 431M 0 431M 0% /dev
/dev/mmcblk0p1 vfat 253M 53M 200M 21% /boot
tmpfs tmpfs 93M 0 93M 0% /run/user/1000
/dev/sda1 fuseblk 1.9T 123M 1.9T 1% /mnt/NAS/ntfs-win
/dev/sda2 ext4 1.8T 77M 1.7T 1% /mnt/NAS/ext4-lin
マウントはラズパイをシャットダウンすると解除されてしまうので、ラズパイが起動するたびにマウントを行うように設定ファイルに記述します。
その設定に必要な UUID を以下のコマンドで確認します。
sudo blkid
出力結果↓
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="9341-C7E5" TYPE="vfat" PARTUUID="ed04d6-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="801af6-21c9-48a0-9df5-cffb60cf79af" TYPE="ext4" PARTUUID="ea04d6-02"
/dev/sda1: LABEL="NAS-ntfs" UUID="54H72B027FC" TYPE="ntfs" PTTYPE="dos" PARTLABEL="primary" PARTUUID="a56759-2730-4d19-a1bc-8e84ce3"
/dev/sda2: LABEL="NAS-ext4" UUID="r50e4-e715-4de2-b5c9-371b50" TYPE="ext4" PARTLABEL="primary" PARTUUID="8dde-527e-4bcd-ac49-fcbae8"
/dev/mmcblk0: PTUUID="ed0557d6" PTTYPE="dos"
UUID を確認したら以下のコマンドで設定ファイルを編集します。
sudo nano /etc/fstab
roc /proc proc defaults 0 0
PARTUUID=ed04d6-01 /boot vfat defaults 0 2
PARTUUID=ea04d6-02 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
UUID="54H72B027FC" /mnt/NAS/ntfs-win ntfs-3g defaults,nofail 0 0
UUID="r50e4-e715-4de2-b5c9-371b50" /mnt/NAS/ext4-lin ext4 defaults,nofail 0 0
上記のように、スクリプトの最終行に、
UUID マウント位置 ファイルシステム defaults,nofail 0 0
というように記載してください。
ファイルシステムは、ntfs の場合は ntfs-3g と入力してください。
defaults,nofail の部分ではオプション設定部分で、defaults というのが デフォルトのオプション設定を行うという意味で、nofail というのはマウント失敗時でも起動を続行するという意味です。
※このnofailを指定せずにマウントに失敗した場合ラズパイが起動しなくなります。
5番目の項目は、dumpコマンド実行時にバックアップ対象にするかという項目です。0を指定するとバックアップ対象にならなくなります。
6番目の項目は、ラズパイ起動時に行われるfsckコマンドによるファイルチェックを行う順番の設定です。0を指定するとチェックされなくなります。
最後に、再起動を行い df -Th を実行して正しくマウントできているか確認してください。