Расширение области памяти для хранения программ и данных, организация внешнего свопа и перенос каталога /overlay на карту памяти в микрокомпьютерах Onion Omega2/Omega2+.

Даже если вы приобрели версию Onion Omega2+ с увеличенным объемом памяти, все равно ее мало для разработки приложений и экспериментов с микрокомпьютером. Стоит лишь установить полную версию Python2 или Python3 и онлайн-утилиты для комфортной работы с Onion OS, как от свободной памяти ничего не останется. Сейчас производитель собирает предзаказы на версию Omega2 Pro, оснащенную быстрым накопителем на 8GB, но даже по предварительному заказу он обойдется с учетом доставки в $55. Тем более, вам нужно расширить доступную память для того компьютера, который у вас уже имеется.

Настоятельно рекомендую выполнить операции по расширению памяти в первую очередь – до того, как вы начнете устанавливать остальные утилиты и приложения! Перенос файловой системы на внешний накопитель – это достаточно рискованная операция. Можно потерять все файлы, если, например, в процессе переноса отключится питание, или SD-карта сбоит. Лучше выполнить и проверить расширение памяти до того, как вы накопите важные данные.

Имейте в виду, что обновление прошивки сбрасывает все настройки расширения памяти, поэтому вы потеряете доступ к данным и приложениям на внешнем носителе. Впрочем, повторная настройка расширения пространства памяти позволит восстановить доступ к данным (но при значительном обновлении версии прошивки это может и не получиться).

Мы будем увеличивать пространство доступной памяти двумя способами:

  1. Увеличим место для хранения приложений и данных за счет расширения пространства памяти на внешний носитель.
  2. Освободим место в оперативной памяти за счет организации свопа на внешнем носителе.

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

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

По практическим соображениям удобнее всего для расширения пространства памяти использовать SD-карту, установленную в слот микрокомпьютера. Постарайтесь приобрести самую быструю и надежную карту памяти объемом 4GB или 8GB. Это важно! Владельцы Omega2 без слота microSD могут воспользоваться USB-накопителем.

Подготовка внешнего накопителя

Установите SD-карту в слот или подключите USB-накопитель. Выполните в терминале команду

ls /dev/

В новой версии OpenWrt/LEDE немного изменилось именование и расположение устройств в файловой системе. Теперь накопитель, подключенный к USB-хосту, будет виден в списке устройств под именем sda1, а карта памяти будет видна под именем mmcblk0p1. Запомните эти имена, они понадобятся позже. Именем mmcblk0 обозначена встроенная память Omega2.

Здесь и далее я подразумеваю, что накопители не разбиты на логические разделы (partitions). В противном случае в списке появятся устройства с именами вида sda1p1 или mmcblk0p2 и тому подобные, содержащие другие номера логических разделов.

Список подмонтированных в систему носителей теперь доступен в каталоге /mnt:

ls /mnt/

На всякий случай проверим наличие необходимых модулей ядра и установим недостающие:

opkg update
opkg install kmod-usb-storage-extras e2fsprogs kmod-fs-ext4

Отмонтируем накопитель, который будем форматировать:

umount /mnt/mmcblk0p1       (если SD карта)
umount /mnt/sda1 (если USB накопитель)

Будьте внимательны и осторожны при выборе имени накопителя! Все данные на этом накопителе будут необратимо уничтожены при форматировании!

Запускаем форматирование накопителя:

mkfs.ext4 /dev/mmcblk0p1       (если SD карта)
mkfs.ext4 /dev/sda1 (если USB накопитель)

Перенос системных файлов на внешний накопитель

Подмонтируем внешний накопитель в файловую систему:

mount /dev/mmcblk0p1 /mnt/        (если SD карта) 
mount /dev/sda1 /mnt/ (если USB накопитель)

Перенесем все доступные для перезаписи системные файлы операционной системы на внешний носитель. Защищенные файлы останутся в памяти компьютера. Такой метод расширения памяти называется pivot-overlay. Введите следующую команду одной строкой (!):

mount /dev/mmcblk0p1 /mnt ; tar -C /overlay -cvf - . | tar -C /mnt -xf - ; umount /mnt

Настроим автоматическое монтирование внешнего каталога /overlay при загрузке. Для этого сначала убедимся, что у нас установлен пакет block-mount:

opkg update
opkg install block-mount

Создадим точку входа fstab при загрузке:

block detect > /etc/config/fstab

Теперь воспользуемся удобной утилитой uci для редактирования файла конфигурации. Сначала выведем на экран содержимое файла:

uci show fstab

теперь отредактируем нужные опции и сохраним изменения:

uci set fstab.@mount[0].target='/overlay'
uci set fstab.@mount[0].enabled='1'
uci commit fstab

Перезагрузим Omega2 командой reboot, а затем проверим объем доступной памяти командой df -h:

Как видите, в системе появилось 3.5GB свободного пространства, из которого сейчас занято системными файлами всего лишь около 1%.

Итак, мы расширили пространство памяти для хранения приложений и данных. Теперь мы можем скачать и сохранить очень много разных утилит и приложений. Но мы по-прежнему можем столкнуться с нехваткой оперативной памяти, особенно если запускаем сложные и ресурсоемкие приложения. Даже обычные компьютеры, оснащенные гигабайтами памяти, в таких случаях используют своп (swap) – специальный файл, в который выгружается временно ненужное содержимое ОЗУ, чтобы освободить место для текущих потребностей.

Разумеется, при активном использовании свопа быстродействие компьютера будет существенно зависеть от быстродействия внешнего накопителя, который работает совсем не так быстро, как встроенная память. Поэтому важно приобрести самый быстрый накопитель из тех, которые вам доступны. Желательно SDHC(XC) Class 10.

Настройка свопа на внешнем носителе

Создадим файл свопа размером 256Mb на внешнем носителе командой для SD карты или USB-накопителя соответственно:

dd if=/dev/zero of=/mnt/mmcblk0p1/swap.page bs=1M count=256
или
dd if=/dev/zero of=/mnt/sda1/swap.page bs=1M count=256

Выполнение этой команды длится около 10 сек, и может показаться, что компьютер завис. Но это не так.

Сообщаем операционной системе, что теперь у нее есть свой своп-файл:

mkswap /mnt/mmcblk0p1/swap.page
или
mkswap /mnt/sda1/swap.page

Включаем своп в работу:

swapon /mnt/mmcblk0p1/swap.page
или
swapon /mnt/sda1/swap.page

Проверяем состояние оперативной памяти командой free и видим, что в системе появился своп-файл:

Теперь сделаем так, чтобы своп автоматически подключался при загрузке системы. Для этого откроем файл конфигурации по адресу /etc/rc.local и при помощи встроенного текстового редактора vim (если вы хардкорный линуксоид) или при помощи встроенного редактора утилиты WinSCP для Windows добавим в него следующие строки перед строкой exit 0:

SWAP_FILE="/overlay/swap.page"
if [ -e "$SWAP_FILE" ]; then
swapon $SWAP_FILE
fi
exit 0

Если вы не настраивали перенос системных файлов pivot-overlay, а решили ограничиться только свопом, то путь к своп-файлу будет выглядеть так:

SWAP_FILE="/mnt/mmcblk0p1/swap.page"   для SD карты
SWAP_FILE="/mnt/sda1/swap.page" для USB накопителя

Перезагрузите Omega2 командой reboot и при помощи команды free убедитесь, что после перезагрузки своп-файл подключается к системе.

Больше про Omega2 и Arduino вы можете прочитать в моей книге