Затеял обновление своего сборочного окружения, которое используется для компиляции пакетов для 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
Комментариев нет:
Отправить комментарий