Найти тему

Когда SD карты перемёрли, или как расширить rootfs beagle bone black с прошитого eMMC на USB-диск.

SD карты допускают 100 циклов перезаписи ( в лучшем случае) а потом превращаются в тыкву, иногда переходят в режим RO, но чаще всего сгорают. Однажды мой фотоаппарат Canon жалобно запищал, выбросил надпись "ошибка карты памяти" и начал бесконечно перезагружаться. Когда открыл батарейный отсек, оттуда пошел дымок. Это сгорела и расслоилась SD карта (SanDisk).
SD карты допускают 100 циклов перезаписи ( в лучшем случае) а потом превращаются в тыкву, иногда переходят в режим RO, но чаще всего сгорают. Однажды мой фотоаппарат Canon жалобно запищал, выбросил надпись "ошибка карты памяти" и начал бесконечно перезагружаться. Когда открыл батарейный отсек, оттуда пошел дымок. Это сгорела и расслоилась SD карта (SanDisk).

Есть огромная разница между USB флешками и MicroSD (ММС) памятью. В флешках и SSD установлена память NAND, допускающая 100 000 циклов записи, в SD карточках - память ММС, на плате одноплатника Биглебон Блэк установлена еММС память на 4 Гб. Количество допустимых циклов на 3 порядка меньше (в 1000 раз) !!!

Итак, в очередной раз закончилась память на одноплатнике, в данном случае это был Биглебон Блэк (до этого такое было на распберри пи, перешитом на Дебиан 11 АТОЛ HUB19, и моя любимая разработка на Xilinx 7010 тоже жрёт SD карты). Нашел на гитхабе описание способа, как это победить. И это работает. Привожу перевод статьи с моей адаптацией.

Я использовал самый последний образ прошивки beagleboard eMMC flasher для прошивки eMMC beagle bone black. На момент написания этой статьи - это AM335x 11.7 2023-09-02 4GB eMMC Xfce Flasher. Этот образ занял 96% на встроенной флеши, apt-get update съел ещё 2% и ничего, даже МС не устанавливался - нет места на диске. А после перезагрузки перестал загружаться графический интерфейс XFCE -- это последние 2% сожрали логи. Для исправления проблемы я взял USB флешку на 32 Гб, которую требовалось разбить на несколько разделов. Это можно сделать прямо на одноплатнике , но он же , собака, не загружается в графическом режиме. Подключился по ssh (как вариант к UART0, он на плате распаян). Сразу же сменил пароль рута:

sudo passwd root , набрал команду su, теперь не нужно постоянно писать sudo перед каждой командой. Чтобы графический рабочий стол , наконец, загрузился, заходим в /var/log/journal и стираем его . Затем сносим Firefox (apt remove....) и наконец XFCE грузится! Ставим MC и gparted, с помощью которого разбиваем флешку на разделы. Я выделил 22 Гб для /usr , 1Gb - /home, 5Gb - /var, 1 Gb -swap , а остальное пространство разбил по 1 Гигу, на всякий пожарный.

После загрузки мы можем использовать fdisk -l для составления списка наших доступных устройств, я нашел свое , проверив размер и таблицу разделов.

После разбиения это должно выглядеть следующим образом:

root@BeagleBone:/home/debian# fdisk -l
Disk /dev/mmcblk1: 3.56 GiB, 3825205248 bytes, 7471104 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: 0x17c9253f

Device Boot Start End Sectors Size Id Type
/dev/mmcblk1p1 * 8192 7471103 7462912 3.6G 83 Linux


Disk /dev/sda: 29 GiB, 31136612352 bytes, 60813696 sectors
Disk model: DT 101 G2
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: 0x365e43c1

Device Boot Start End Sectors Size Id Type
/dev/sda1 268288 45613055 45344768 21.6G 83 Linux
/dev/sda2 45621248 47742975 2121728 1G 83 Linux
/dev/sda4 47742976 60813311 13070336 6.2G 5 Extended
/dev/sda5 47745024 58488831 10743808 5.1G 83 Linux
/dev/sda6 58490880 60340223 1849344 903M 83 Linux
/dev/sda7 60342272 60813311 471040 230M 83 Linux

Можно форматировать разделы как ext4 для файловой системы:

mkfs.ext4 /dev/sda1 ... первый раздел, самый большой, для /usr
mkfs.ext4 /dev/sda2 ... второй, для /home...и так далее.

Далее пробуем вынести на флешку 2 раздела: /usr и /home, для этого создаем место для временного хранения файлов из наших rootfs


mkdir /tmp/usr && mkdir /tmp/home

, затем монтируем созданные нами новые разделы в соответствующие точки и повторно синхронизируем данные. Если у вас новая установка, это должно быть относительно безболезненно, но может занять больше времени, часа 2, если у вас много файлов в этих каталогах.

mount /dev/sda1 /tmp/usr && mount /dev/sda2 /tmp/home
rsync -ahv --progress /usr/ /tmp/usr/
rsync -ahv --progress /home/ /tmp/home/

Когда копирование закончится, можно перезагрузиться и подмонтировать разделы на usb свистке вместо разделов на внутренней eMMC:

mount /dev/sda1 /usr && mount /dev/sda2 /home

для проверки работоспособности нашей затеи делаем apt upgrade , если всё проапгрейдится гладко, то последнее, что нам нужно сделать, это изменить fstab, чтобы отразить внесенные нами изменения и новое расположение нашей файловой системы.

echo UUID=$(lsblk -no UUID /dev/sda1) /usr ext4 defaults 0 1 >> /etc/fstab
echo UUID=$(lsblk -no UUID /dev/sda2) /home ext4 defaults 0 1 >> /etc/fstab

После перезагрузки мы можем проверить это следующим образом:

root@BeagleBone:/home/debian# df -h
Filesystem Size Used Avail Use% Mounted on
udev 211M 0 211M 0% /dev
tmpfs 49M 1.9M 47M 4% /run
/dev/mmcblk1p1 3.5G 3.3G 0 100% /
/
dev/sda2 22G 2.7G 18G 14% /usr
tmpfs 242M 0 242M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda3 987M 38M 882M 5% /home
tmpfs 49M 32K 49M 1% /run/user/1000
/dev/sda5 5.0G 476M 4.3G 10% /var
root@BeagleBone:/home/debian#

Теперь, когда мы видим, что все так, как мы ожидали, пришло время навести порядок: rm -r /tmp/{usr,home};

mkdir /tmp/rootfs; mount --bind / /tmp/rootfs Далее мы просто добавим тестовый файл, чтобы проверить, исправен ли монтаж:

touch /tmp/rootfs/usr/test

root@beaglebone:/# ls /tmp/rootfs/usr/
bin games include lib local sbin share src test
root@beaglebone:/# ls /usr/
bin games include lib local lost+found sbin share src

Все работает! Мы можем завершить наши изменения и двигаться дальше по жизни:

rm -rf /tmp/rootfs/{usr,home}/*

Таким же макаром можно расширить , например, /var /tmp, если там закончится место.

А если вдруг система перестанет загружаться,

у меня такое произошло, когда я в качестве дополнительного диска использовал старый IDE винт на 30Гиг и он крякнул ...

то залейте на sd карту https://www.beagleboard.org/distros/am3358-debian-10-3-2020-04-06-1gb-sd-console и, загрузившись с неё, подмонтируйте /dev/mmcblk1p1 и уберите лишнее из /etc/fstab

root@BeagleBone:/home/debian# cat /etc/fstab
# /etc/fstab: static file system information.
#
/dev/mmcblk1p1 / ext4 noatime,errors=remount-ro 0 1
debugfs /sys/kernel/debug debugfs mode=755,uid=root,gid=gpio,defaults 0 0
# UUID=764a063b-1c8b-4da1-b9cb-8f691268875b /home ext4 defaults 0 1
# UUID=943234fe-0824-416f-ad66-c8e55ebbf3bf /usr ext2 defaults 0 1
# UUID=b7a1f717-1d18-406a-a9a9-dd61e9000132 /usr ext4 defaults 0 1
# UUID=943a5c2e-45fc-4c64-ba2a-9fc54e909518 /home ext4 defaults 0 1

root@BeagleBone:/home/debian#

Dixi