raspi5_m2_ssd

2024-10-27

树莓派5_PCIE_2_M2_SSD硬盘

树莓派5支持了 mini PCIE 接口,默认工作在 PCIE gen2x1,也可以通过修改配置,使其工作在 PCIE gen3x1。通过 PCIE to M.2 HAT,可以使用 NVME 协议 M.2 接口的 SSD。

0 硬件配件

具体配件如下: alt text

从左到右依次是:

  • 树莓派5
  • 转接排线
  • 2242 固态硬盘
  • PCIE to M.2 HAT
  • 铜柱螺丝

硬件连接很简单,这里就不再赘述了。

1 软件更新

树莓派5默认没有启用 PCIE 接口,先启用 PCIE 接口。

  • 更新软件
    sudo apt update && sudo apt upgrade
    
  • 更新固件
    # 检查固件
    sudo rpi-eeprom-update
    

如果看到 2023 年 12 月 6 日或更晚的日期,请继续下一步。如果看到的日期早于 2023 年 12 月 6 日,运行以下命令打开 Raspberry Pi 配置 CLI:

sudo raspi-config

Advanced Options --> Bootloader Version下,选择 Latest。然后用 Finish 或 Escape 键退出raspi-config

运行以下命令将固件更新到最新版本:

sudo rpi-eeprom-update -a

然后,使用sudo reboot重新启动。

2 启用 PCIe Gen 3

Raspberry Pi 5 未通过 Gen 3.0 速度认证。PCIe Gen 3.0 连接可能不稳定。

2.1 启用 PCIe

默认情况下,除非连接到 HAT+ 设备,否则 PCIe 连接器不会启用。要启用该连接器,需要在/boot/firmware/config.txt中添加以下一行:

dtparam=pciex1

使用 sudo reboot 重新启动,使配置更改生效。

2.2 启用 PCIe Gen 3.0

树莓派5 pcie 接口已通过 Gen 2.0 速度(5 GT/秒)认证,但是也可以强制使用 Gen 3.0(10 GT/秒)速度。要启用 PCIe Gen 3.0 速度,请在/boot/firmware/config.txt中添加以下一行:

dtparam=pciex1_gen=3

使用 sudo reboot 重启 Raspberry Pi,使这些设置生效。

完成以下步骤以启用 PCIe Gen 3.0 速度

  • 运行以下命令打开 Raspberry Pi 配置 CLI:
    sudo raspi-config
    
  • 选择 Advanced Options。
  • 选择 PCIe Speed。
  • 选择 Yes 启用 PCIe Gen 3 模式。
  • 选择 Finish 退出。

使用 sudo reboot 重启 Raspberry Pi,使这些设置生效。

3 硬盘挂载

检查 pcie 设备:

lspci

# 0000:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries BCM2712 PCIe Bridge (rev 21)
# 0000:01:00.0 Non-Volatile memory controller: MAXIO Technology (Hangzhou) Ltd. NVMe SSD Controller MAP1202 (rev 01)
# 0001:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries BCM2712 PCIe Bridge (rev 21)
# 0001:01:00.0 Ethernet controller: Raspberry Pi Ltd RP1 PCIe 2.0 South Bridge

可以看到有以太网控制器和非易失性存储控制器两个 PCIE 设备。其中非易失性存储控制器就是插入的 NVMe SSD 硬盘。

查看磁盘:

lsblk

# NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
# mmcblk0     179:0    0  59.5G  0 disk
# ├─mmcblk0p1 179:1    0   512M  0 part /boot/firmware
# └─mmcblk0p2 179:2    0    59G  0 part /
# nvme0n1     259:0    0 476.9G  0 disk

可以看到有一个 476.9G 的 nvme0n1 就是添加的 SSD 硬盘了。

如果需要对 SSD 硬盘进行分区,可以使用fdisk进行分区,

sudo fdisk /dev/nvme0n1

后面根据提示和需要进行分区即可,这里只分了一个区:

lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
mmcblk0     179:0    0  59.5G  0 disk
├─mmcblk0p1 179:1    0   512M  0 part /boot/firmware
└─mmcblk0p2 179:2    0    59G  0 part /
nvme0n1     259:0    0 476.9G  0 disk
└─nvme0n1p1 259:1    0 476.9G  0 part

如果不需要分区,就跳过分区处理,直接进行硬盘的格式化,输入mkfs,之后连续按两次tab,查看支持哪些文件系统格式:

mkfs
mkfs         mkfs.cramfs  mkfs.ext2    mkfs.ext4    mkfs.minix   mkfs.ntfs
mkfs.bfs     mkfs.exfat   mkfs.ext3    mkfs.fat     mkfs.msdos   mkfs.vfat

可以看到系统支持多种格式,这里选择ext4:

sudo mkfs.ext4 /dev/nvme0n1p1

mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done
Creating filesystem with 125026560 4k blocks and 31260672 inodes
Filesystem UUID: 80e18405-0ce0-4b2c-a208-db71b375dd6a
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000

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

至此,硬盘格式化完成。

  • 新建挂载点
    sudo mkdir -p /mnt/nvme0
    
  • 挂载
    # 单次挂载
    sudo mount /dev/nvme0n1p1 /mnt/nvme0
    

可以通过df -h来查看是否挂载成功。

  • 设置开机自动挂载 首先查看UUID: ```bash blkid

/dev/nvme0n1p1: UUID=”80e18405-0ce0-4b2c-a208-db71b375dd6a” BLOCK_SIZE=”4096” TYPE=”ext4” PARTUUID=”67259595-020c-6647-8d67-21ccf6915bb6”


将`/dev/nvme0n1p1`的 UUID 复制出来,然后写入到`/etc/fstab`中去:
```bash
sudo echo "UUID=80e18405-0ce0-4b2c-a208-db71b375dd6a /mnt/nvme0 ext4 defaults 0 0" >> /etc/fstab
  • 将 /etc/fstab 中定义的所有档案系统挂上
    mount -a
    
  • 修改挂载目录权限
    sudo chmod 777 -R /mnt/nvme0/
    

最后,重启试验一下是否成功。

4 硬盘读写测试

  • 进入磁盘挂载目录
    cd nvme_ssd0
    
  • 清除缓存
    sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"
    
  • 写测试 ```bash sudo dd if=/dev/zero of=./test_write count=2000 bs=1024k

2000+0 records in

2000+0 records out

2097152000 bytes (2.1 GB, 2.0 GiB) copied, 1.56196 s, 1.3 GB/s


我这里的写速度为 1.3GB/s,确实可以跑满 PCIE gen3x4 的速度。

* 读测试
```bash
# 清除缓存
sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"
sudo dd if=./test_write of=/dev/null count=2000 bs=1024k

2000+0 records in
2000+0 records out
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 2.25042 s, 932 MB/s

我这里的读速度为 932 MB/s,这里一定要先清除缓存,否则会由于缓存的原因,达到很高的读速度。

也可以设置从 pcie 通过 nvme 固态硬盘来启动气筒,但是我目前没有这个需求,目前仅把固态硬盘当做高速存储使用。