Raspberry Piで障害に強い暗号化された最強ストレージを作る

USBを二本使ってRAID 1を組んでみました。
LUKSで暗号化されたボリュームを作り、そこに障害性に優れている(らしい)btrfsでRAIDを構築します。

## 準備
btrfs
```console
apt-get install btrfs-progs
```

## パーティションを作る
今回のUSBは容量が違います。
一本目は4GB、二本めは16GBです。

> 1     3.77GiB  /dev/sda
> 2    14.84GiB  /dev/sdb

二本めは最初の4GBだけパーティションを切ります。


```
sudo parted /dev/sdaGNU Parted 3.2
```

> Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                                
Model: General UDisk (scsi)
Disk /dev/sda: 4048MB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Disk Flags: 
> 
> Number  Start  End     Size    File system  Flags
 1      0.00B  4048MB  4048MB  btrfs


```
sudo parted /dev/sdb
```

> GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) rm 1
(parted) mkpart                                                         
Partition name?  []?                                                      
File system type?  [ext2]?                                                
Start? 1MB                                                                
End? 4049MB
(parted)                                                                  
(parted) p                                                                
Model: Mass Storage Device (scsi)
Disk /dev/sdb: 15.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 
> 
> Number  Start   End     Size    File system  Name  Flags
 1      1049kB  4049MB  4048MB  ext2
> 
> (parted)                                                                  
(parted) mkpart                                                      
Partition name?  []?                                                      
File system type?  [ext2]?                                                
Start? 4049MB                                                             
End? 16GB
(parted) p                                                                
Model: Mass Storage Device (scsi)
Disk /dev/sdb: 15.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 
> 
> Number  Start   End     Size    File system  Name  Flags
> 1      1049kB  4049MB  4048MB  ext2
> 2      4049MB  15.9GB  11.9GB  ext2
>
> (parted) q                                                                
> Information: You may need to update /etc/fstab.


## 暗号化ボリュームを作る
LUKSで暗号化ボリュームを作ります。

```
sudo cryptsetup  luksFormat /dev/sda
```

> WARNING!
> ========
> This will overwrite data on /dev/sda irrevocably.
> 
> Are you sure? (Type uppercase yes): YES
> Enter passphrase for /dev/sda: 
> Verify passphrase: 

```
sudo cryptsetup  luksFormat /dev/sdb1
```

> WARNING!
> ========
> This will overwrite data on /dev/sdb1 irrevocably.
> 
> Are you sure? (Type uppercase yes): YES
> Enter passphrase for /dev/sdb1: 
> Verify passphrase: 


LUKSボリュームをマウントします。

```
sudo cryptsetup luksOpen /dev/sda device1
```

> Enter passphrase for /dev/sda: 

```
sudo cryptsetup luksOpen /dev/sdb1 device2
```

> Enter passphrase for /dev/sdb1: 


## btrfsでRAID作成

```
sudo mkfs.btrfs -d raid1 /dev/mapper/device1 /dev/mapper/device2
```

> btrfs-progs v5.10 See http://btrfs.wiki.kernel.org for more information.
> 
> Label:              (null)
> UUID:               09b7e77b-5b97-9138-d2da-12d612203a90
> Node size:          16384
> Sector size:        4096
> Filesystem size:    7.51GiB
> Block group profiles:
>   Data:             RAID1           384.38MiB
>   Metadata:         RAID1           256.00MiB
>   System:           RAID1             8.00MiB
> SSD detected:       no
> Incompat features:  extref, skinny-metadata
> Runtime features:   
> Checksum:           crc32c
> Number of devices:  2
> Devices:
>    ID        SIZE  PATH
>     1     3.75GiB  /dev/mapper/device1
>     2     3.75GiB  /dev/mapper/device2

## マウントしてみる
```
sudo mount /dev/mapper/device1 /mnt
```

## テストしてみる

まずはディレクトリを作って再マウントしても無事か確かめてみましょう

```
sudo install -m 777 -o pi -g pi -d /mnt/test
sudo umount /mnt
sudo mount /dev/mapper/device2 /mnt
ls /mnt
```
> test

再マウントしても大丈夫のようです。

## ベンチマークしてみる
```
cd /mnt/test
dd if=/dev/zero of=benchmark bs=64K count=1K conv=fdatasync
```

> 1024+0 records in
> 1024+0 records out
> 67108864 bytes (67 MB, 64 MiB) copied, 37.6293 s, 1.8 MB/s

```
dd if=benchmark of=/dev/null131072+0 records in
```

> 131072+0 records out
> 67108864 bytes (67 MB, 64 MiB) copied, 1.62382 s, 41.3 MB/s

書き込みが約2MB/sなのは遅いですが作れるもの作れたので満足です。