Raspberry Pi の microSD を乗せ換える


SD が壊れたようで時々フリーズしたり、数秒反応がなくなったりするので SD を入れ替える。
Raspberry Pi 3B+ に付いていた 32GB SD を Transcend 128GB に置き換える。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">下のは Ras 4B に入れた Ubuntu の microSD (左) と、Raspberry Pi 3B+ に付いていた半年で壊れたと思われる microSD (右)。 <a href="https://t.co/dxQRRy7Dad">pic.twitter.com/dxQRRy7Dad</a></p>&mdash; 1円切手 (&amp;o54) (@jp_yen) <a href="https://twitter.com/jp_yen/status/1190537639109132288?ref_src=twsrc%5Etfw">November 2, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 
Raspberry Pi の電源を切り、microSD を Windows に挿してみた。ディスク 7 (L:, Q: ドライブ) として認識。
![ディスクの管理](https://pbs.twimg.com/media/EIWqcp3XsAQ_pO1?format=png)

[Win32 Disk Imager](https://sourceforge.net/projects/win32diskimager/) で見てみたがイメージ元がドライブレター単位で、SD カード全体をイメージするような選択肢が見付からない。
![Win32 Disk Imager](https://pbs.twimg.com/media/EIWqcp3XkAALLkm?format=png)
取り敢えず、L: でイメージを取得してみた。
Read を選んで 30分ほど待つ。→ 32GB 取れたので SD 全体をイメージファイルにできたっぽい。

# イメージファイルを microSD に書き込む
取得したイメージファイルを同じく Win32 Disk Imager で 128GB SD に書き込む。

# Raspberry Pi の起動
書き込んだイメージを Raspberry Pi に挿して起動。
→ 正常に起動。

```
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        28G   18G  9.1G  66% /
devtmpfs        335M     0  335M   0% /dev
tmpfs           463M     0  463M   0% /dev/shm
tmpfs           463M   13M  451M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           463M     0  463M   0% /sys/fs/cgroup
tmpfs            64M  4.0K   64M   1% /tmp
/dev/mmcblk0p6   68M   23M   46M  33% /boot
tmpfs            93M     0   93M   0% /run/user/109
tmpfs            93M     0   93M   0% /run/user/1000

# fdisk -l
...snip
Device         Boot   Start      End  Sectors  Size Id Type
/dev/mmcblk0p1         8192  3292968  3284777  1.6G  e W95 FAT16 (LBA)
/dev/mmcblk0p2      3292969 62333951 59040983 28.2G  5 Extended
/dev/mmcblk0p5      3293184  3358717    65534   32M 83 Linux
/dev/mmcblk0p6      3358720  3500031   141312   69M  c W95 FAT32 (LBA)
/dev/mmcblk0p7      3506176 62333951 58827776 28.1G 83 Linux
```
ディスクの容量は増えていないみたいですね。
パーティションはこんな感じ。

```pre:
┏━━━━━━━━━━━━━━━━━━━━━━━━━
┃p1 FAT16 (1.6G)
┣━━━━━━━┳━━━━━━━━━━━━━━━━━
┃p2　　　┃p5 なんだろう？ (32M)
┃(28.2G)┣━━━━━━━━━━━━━━━━━
┃　　　　┃p6 FAT32 (69M) boot 用
┃　　　　┣━━━━━━━━━━━━━━━━━
┃　　　　┃p7 ext4 (28.1G) データ
┣━━━━━━━┻━━━━━━━━━━━━━━━━━
┃空き領域 (90Gぐらい)
┗━━━━━━━━━━━━━━━━━━━━━━━━━
```
p1 プライマリパーティションで FAT 16
p2 プライマリパーティションで、p5, p6, p7 の拡張パーティションを含む

※方針
p2 を一杯まで伸ばして、p7 も p2 のお尻まで伸ばす。


# p2 のサイズを拡張
fdisk コマンドはパーティションの操作の後に w コマンドで書き込まない限りはディスクに影響しないので試行錯誤してみる。

```fdisk:起動
# fdisk /dev/mmcblk0p2

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Failed to read extended partition table (offset=65749): Invalid argument

Command (m for help):
```
```fdisk:現状を表示(p)
Command (m for help): p

Disk /dev/mmcblk0p2: 1 KiB, 1024 bytes, 2 sectors
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: 0x00000000

Device           Boot Start      End  Sectors  Size Id Type
/dev/mmcblk0p2p1        215    65748    65534   32M 83 Linux
/dev/mmcblk0p2p2      65749 59040982 58975234 28.1G  5 Extended
```
```fdisk:/dev/mmcblk0p2p2を削除(d)
Command (m for help): d
Partition number (1,2, default 2): 2

Partition 2 has been deleted.
```
```fdisk:そして再作成(n)
Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): 
Partition number (2-4, default 2): 
First sector (1-1, default 1): 

Created a new partition 2 of type 'Linux' and of size 512 B.

Command (m for help): p
Disk /dev/mmcblk0p2: 1 KiB, 1024 bytes, 2 sectors
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: 0x00000000

Device           Boot Start   End Sectors  Size Id Type
/dev/mmcblk0p2p1        215 65748   65534   32M 83 Linux
/dev/mmcblk0p2p2          1     1       1  512B 83 Linux
```
何故か First sector が 1番目のセクターしか選べない。しかもサイズは問答無用で 1セクタ。
これでは元のデータも消えてしまうので、書き込む前に q でキャンセル。

上手く拡張できないようです。

# 空き領域を別パーティションとして確保
既存のパーティションを拡張することは諦めて、空き領域を p3 として利用することにする。

```pre:
┏━━━━━━━━━━━━━━━━━━━━━━━━━
┃p1 FAT16 (1.6G)
┣━━━━━━━┳━━━━━━━━━━━━━━━━━
┃p2　　　┃p5 (32M)
┃(28.2G)┣━━━━━━━━━━━━━━━━━
┃　　　　┃p6 FAT32 (69M)
┃　　　　┣━━━━━━━━━━━━━━━━━
┃　　　　┃p7 ext4 (28.1G)
┣━━━━━━━┻━━━━━━━━━━━━━━━━━
┃空き領域 → p3 ext4 (90Gぐらい)
┗━━━━━━━━━━━━━━━━━━━━━━━━━
```

```fdisk:fdisk
# fdisk /dev/mmcblk0

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
```
```fdisk:現状確認
Command (m for help): p
Disk /dev/mmcblk0: 119.1 GiB, 127865454592 bytes, 249737216 sectors
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: 0x0001a5c2

Device         Boot   Start      End  Sectors  Size Id Type
/dev/mmcblk0p1         8192  3292968  3284777  1.6G  e W95 FAT16 (LBA)
/dev/mmcblk0p2      3292969 62333951 59040983 28.2G  5 Extended
/dev/mmcblk0p5      3293184  3358717    65534   32M 83 Linux
/dev/mmcblk0p6      3358720  3500031   141312   69M  c W95 FAT32 (LBA)
/dev/mmcblk0p7      3506176 62333951 58827776 28.1G 83 Linux
```
## 新しいプライマリパーティションを作成
/dev/mmcblk0p2 の End の次のセクターから最後までを p3 として作成する。

```fdisk:
Command (m for help): n
Partition type
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p):
Partition number (3,4, default 3): 
First sector (2048-249737215, default 2048): 62333952
Last sector, +sectors or +size{K,M,G,T,P} (62333952-249737215, default 249737215): 

Created a new partition 3 of type 'Linux' and of size 89.4 GiB.
```
## パーティションの作成完了、できたパーティションを表示 (確認) する
```fdisk:
Command (m for help): p
Disk /dev/mmcblk0: 119.1 GiB, 127865454592 bytes, 249737216 sectors
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: 0x0001a5c2

Device         Boot    Start       End   Sectors  Size Id Type
/dev/mmcblk0p1          8192   3292968   3284777  1.6G  e W95 FAT16 (LBA)
/dev/mmcblk0p2       3292969  62333951  59040983 28.2G  5 Extended
/dev/mmcblk0p3      62333952 249737215 187403264 89.4G 83 Linux
/dev/mmcblk0p5       3293184   3358717     65534   32M 83 Linux
/dev/mmcblk0p6       3358720   3500031    141312   69M  c W95 FAT32 (LBA)
/dev/mmcblk0p7       3506176  62333951  58827776 28.1G 83 Linux

Partition table entries are not in disk order.
```
並びがおかしいとか言ってるけど、表示だけの問題なので気にせずに書き込み (w)

```fdisk:
Command (m for help): w

The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
```
はい、kernel が新しいパーティションを認識していないので再起動してね。と。

# reboot
```tcsh:
# reboot
```

# パーティションの再確認
```tcsh
# fdisk -l
...
Device         Boot    Start       End   Sectors  Size Id Type
/dev/mmcblk0p1          8192   3292968   3284777  1.6G  e W95 FAT16 (LBA)
/dev/mmcblk0p2       3292969  62333951  59040983 28.2G  5 Extended
/dev/mmcblk0p3      62333952 249737215 187403264 89.4G 83 Linux
/dev/mmcblk0p5       3293184   3358717     65534   32M 83 Linux
/dev/mmcblk0p6       3358720   3500031    141312   69M  c W95 FAT32 (LBA)
/dev/mmcblk0p7       3506176  62333951  58827776 28.1G 83 Linux
```
p3 に 90G ぐらいのパーティションができました。
どこを別パーティションにしようかな？

# フォーマット
ファイルシステムとしては xfs とかの方がファイルシステムとしては良いけども、メモリを消費したりするらしいので ext4 にする。

```tcsh:
# mkfs -t ext4 /dev/mmcblk0p3
mke2fs 1.43.4 (31-Jan-2017)
Discarding device blocks: done
Creating filesystem with 23425408 4k blocks and 5857280 inodes
Filesystem UUID: 232e233f-a9f5-43a8-90f1-7fd2855811d1
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000

Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done
```

# 試しに mount
```tcsh:mount
# mkdir /home2
# mount /dev/mmcblk0p3 /home2
# df -h /home2
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk0p3   88G   57M   83G   1% /home2
```

あとは、シングルユーザモードにして cpio でコピー、fstab 書き換えて reboot かな。

# シングルユーザモードへ
```tcsh:
# /sbin/runlevel
N 5
# telinit s
# runlevel
5 1
```
シングルユーザモード (s 或いは 1) へ移行完了

# ファイルの移動
```
# cd /home
# ls -la
total 12
drwxr-xr-x  3 root root 4096 Nov 13  2018 .
drwxr-xr-x 24 root root 4096 Nov  3 00:44 ..
drwxr-xr-x 38 pi   pi   4096 Nov  3 00:52 pi
# mv pi /home2
```
ディレクトリが一つだったので mv で横着。

# fstab の書き換え
以下の 1行を追加

```tcsh:vi&nbsp;/etc/fstab
/dev/mmcblk0p3  /home   ext4    defaults,noatime        0       1
```

# fstab の記述を確認
```tcsh:
# umount /home2
# mount /home
# mount
/dev/mmcblk0p7 on / type ext4 (rw,noatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=342316k,nr_inodes=85579,mode=755)
...snip
/dev/mmcblk0p3 on /home type ext4 (rw,noatime)
#
# df -h | grep -v tmpfs
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        28G   14G   14G  51% /
/dev/mmcblk0p6   68M   23M   46M  33% /boot
/dev/mmcblk0p3   88G  4.1G   79G   5% /home
```
エラーは出ずにマウントできました。書き間違えはなかったようです。成功！

# reboot
```tcsh:reboot
# reboot
```
作業完了！
再起動すると fsck が走ったようです。

# 最終状態の確認
```tcsh:df
% df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        28G   14G   14G  51% /
devtmpfs        335M     0  335M   0% /dev
tmpfs           463M     0  463M   0% /dev/shm
tmpfs           463M   13M  451M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           463M     0  463M   0% /sys/fs/cgroup
tmpfs            64M  4.0K   64M   1% /tmp
/dev/mmcblk0p6   68M   23M   46M  33% /boot
/dev/mmcblk0p3   88G  4.1G   79G   5% /home
tmpfs            93M     0   93M   0% /run/user/109
tmpfs            93M     0   93M   0% /run/user/1000
```

初期インストールだとこの辺が参考になると思います
http://twinklesmile.blog42.fc2.com/blog-entry-77.html