вторник, 24 августа 2021 г.

Апгрейд сборочного окружения ARM

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

Комментариев нет:

Отправить комментарий