Затеял обновление своего сборочного окружения, которое используется для компиляции пакетов для armel, armhf и arm64 архитектур. Сейчас оно построено на Raspberry PI 4 2GB и загружается с SD карточки на 32GB в которой /var/cache/pbuilder/build использует bcache поверх NFS и ram диска (подробности есть тут).
Это прилично ускоряет сборку в pbuilder, но только если размер билда не превысит размер ram диска. Raspberry PI 4 умеет загружаться с USB без плясок с бубном и поэтому самым простым решением для ускорения будет отказ от SD карт. Для этого я прикупил Orico M.2 NVMe SSD enclosure и Kingston A2000 на 256GB.
Внутри NVMe переходника используется чип Realtek RTL9210, который без проблем определился в Linux:
$ sudo lsusb -d 0bda:9210 -v Bus 002 Device 007: ID 0bda:9210 Realtek Semiconductor Corp. Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 3.20 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 9 idVendor 0x0bda Realtek Semiconductor Corp. idProduct 0x9210 bcdDevice 20.01 iManufacturer 1 Realtek iProduct 2 RTL9210 iSerial 3 012345682741 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 0x0079 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 896mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 8 Mass Storage bInterfaceSubClass 6 SCSI bInterfaceProtocol 80 Bulk-Only iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 15 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 15 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 1 bNumEndpoints 4 bInterfaceClass 8 Mass Storage bInterfaceSubClass 6 SCSI bInterfaceProtocol 98 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 15 MaxStreams 32 Data-in pipe (0x03) Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 15 MaxStreams 32 Data-out pipe (0x04) Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 15 MaxStreams 32 Status pipe (0x02) Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x04 EP 4 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 0 Command pipe (0x01) Binary Object Store Descriptor: bLength 5 bDescriptorType 15 wTotalLength 0x002a bNumDeviceCaps 3 USB 2.0 Extension Device Capability: bLength 7 bDescriptorType 16 bDevCapabilityType 2 bmAttributes 0x00000006 BESL Link Power Management (LPM) Supported SuperSpeed USB Device Capability: bLength 10 bDescriptorType 16 bDevCapabilityType 3 bmAttributes 0x00 wSpeedsSupported 0x000e Device can operate at Full Speed (12Mbps) Device can operate at High Speed (480Mbps) Device can operate at SuperSpeed (5Gbps) bFunctionalitySupport 1 Lowest fully-functional device speed is Full Speed (12Mbps) bU1DevExitLat 10 micro seconds bU2DevExitLat 2047 micro seconds SuperSpeedPlus USB Device Capability: bLength 20 bDescriptorType 16 bDevCapabilityType 10 bmAttributes 0x00000001 Sublink Speed Attribute count 1 Sublink Speed ID count 0 wFunctionalitySupport 0x1100 bmSublinkSpeedAttr[0] 0x000a4030 Speed Attribute ID: 0 10Gb/s Symmetric RX SuperSpeedPlus bmSublinkSpeedAttr[1] 0x000a40b0 Speed Attribute ID: 0 10Gb/s Symmetric TX SuperSpeedPlus can't get debug descriptor: Resource temporarily unavailable Device Status: 0x0000 (Bus Powered)
Прочитать SMART получилось после установки smartmontools из buster-backports
$ sudo smartctl -d sntrealtek -Ai /dev/sdb smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.10.0-0.bpo.8-amd64] (local build) Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org === START OF INFORMATION SECTION === Model Number: KINGSTON SA2000M8250G Serial Number: 50026B76846130AD Firmware Version: S5Z42105 PCI Vendor/Subsystem ID: 0x2646 IEEE OUI Identifier: 0x0026b7 Controller ID: 1 NVMe Version: 1.3 Number of Namespaces: 1 Namespace 1 Size/Capacity: 250,059,350,016 [250 GB] Namespace 1 Utilization: 31,911,821,312 [31.9 GB] Namespace 1 Formatted LBA Size: 512 Namespace 1 IEEE EUI-64: 0026b7 6846130ad5 Local Time is: Sun Aug 22 12:32:27 2021 +03 === START OF SMART DATA SECTION === SMART/Health Information (NVMe Log 0x02) Critical Warning: 0x00 Temperature: 27 Celsius Available Spare: 100% Available Spare Threshold: 10% Percentage Used: 0% Data Units Read: 12,941 [6.62 GB] Data Units Written: 3 [1.53 MB] Host Read Commands: 405,009 Host Write Commands: 118 Controller Busy Time: 0 Power Cycles: 10 Power On Hours: 0 Unsafe Shutdowns: 7 Media and Data Integrity Errors: 0 Error Information Log Entries: 0 Warning Comp. Temperature Time: 0 Critical Comp. Temperature Time: 0
Теперь нужно скопировать содержимое SD карты на NVMe
$ sudo dd if=/dev/mmcblk0 of=/dev/sdb bs=1M $ sudo partprobe /dev/sdb
После переноса данных нужно поменять размер второго раздела, чтобы он занимал все свободное место на NVMe
$ sudo parted /dev/sdb > resizepart 2 100%
После увеличения размера раздела нужно увеличить файловую систему
$ sudo resize2fs -p /dev/sdb2
После всех манипуляций нужно обновить /boot/firmware/cmdline.txt чтобы заменить root=/dev/mmcblk1p2
на root=/dev/sda2
.
Когда NVMe накопитель готов пора включить загрузку с USB в самом Raspberry. Для начала скачиваю Raspberry PI OS Lite и распаковываю его на SD карту
$ unzip 2021-05-07-raspios-buster-armhf-lite.zip $ sudo dd if =2021-05-07-raspios-buster-armhf-lite.img of=/dev/mmcblk0 bs=1M
Дальше нужно загрузить Raspberry с этой SD карты и запустить raspi-config чтобы обновить загрузчик и включить загрузку с USB. После этого SD карту можно извлекать, подключать NVMe и загружать систему с NVMe.
Напоследок немного цифр
До апгрейда
$ df -h / Filesystem Size Used Avail Use% Mounted on /dev/mmcblk1p2 30G 1.7G 27G 7% / $ dd if=/dev/zero of=test.bin bs=1M count=5000 5000+0 records in 5000+0 records out 5242880000 bytes (5.2 GB, 4.9 GiB) copied, 199.594 s, 26.3 MB/s
После апгрейда
$ df -h / Filesystem Size Used Avail Use% Mounted on /dev/sda2 230G 1.8G 218G 1% / $ dd if=/dev/zero of=test.bin bs=1M count=5000 5000+0 records in 5000+0 records out 5242880000 bytes (5.2 GB, 4.9 GiB) copied, 22.3616 s, 234 MB/s
В результате апгрейда скорость записи на диск возрасла в 9 раз (с 26MB/s до 234MB/s)!
P.S. В Debian не поставляется vcgencmd, но его можно установить из Ubuntu
$ sudo apt install device-tree-compiler $ wget http://ports.ubuntu.com/ubuntu-ports/pool/universe/r/raspberrypi-userland/libraspberrypi0_0~20200520+git2fe4ca3-0ubuntu2_arm64.deb http://ports.ubuntu.com/ubuntu-ports/pool/universe/r/raspberrypi-userland/libraspberrypi-bin_0~20200520+git2fe4ca3-0ubuntu2_arm64.deb $ sudo dpkg -i libraspberrypi0_0~20200520+git2fe4ca3-0ubuntu2_arm64.deb libraspberrypi-bin_0~20200520+git2fe4ca3-0ubuntu2_arm64.deb $ sudo vcgencmd measure_temp temp=42.3'C
Комментариев нет:
Отправить комментарий