Корневая файловая система на внешнем устройстве (extroot)

Для полного понимания процедур крайне желательно ознакомится с темами приведенными ниже:

Так же необходимо отметить что механизм конфигурирования extroot существенно зависит от версии OpwnWrt и в меньшей степени зависит от типа вашего устройства. Данная русскоязычная версия документации будет отталкиваться от версии OpwnWrt 18.06. В качестве аппаратной платформы будет использоваться роутер TP-LINK TL-WDR4300/3600.

У многих роутеров существенно ограничено размер дискового пространства для хранения файлов и данных (встроенная flash-память). Но, в тоже время, роутеры могут быть оборудованы портами USB или SATA, что позволяет подключить к ним внешние устройства хранения, такие, как диски USB-flash и USB-HDD. В более экзотических случаях могут быть подключены даже mini PCI-E или сетевые диски. Подключение подобных устройств позволяет расширить “дисковую” память роутера, в том числе и его корневую файловую систему,rootfs для хранения как дополнительного программного обеспечения, так и дополнительных настроек. В большинстве поддерживаемых устройств OpenWrt разбивает внутреннее хранилище на разделы rootfs и rootfs_data, которые объединяются в одну перезаписываемую файловую систему наложения overlay.

Partition(раздел) Mount point(точка монтирования) Compression(сжатие) Writable(записываемый)
rootfs /rom Yes(Да) No(Нет)
rootfs_data /overlay No(Нет) Yes(Да)
overlay / Unmodified files(Не модифицированные файлы) Yes(Да)

Таким образом, OpenWrt помещается даже в крошечные объемы внутренней памяти (всего 4 МБ), но все же позволяет записывать настройки и устанавливать некоторые пакеты в доступный для записи раздел без изменения всех используемых программ Linux.
Extroot работает, устанавливая другой overlay раздел на внешнем устройстве хранения, и во время загрузки этот новый overlay раздел будет смонтирован поверх overlay раздела внутреннего хранилища. Этот подход позволяет легко откатиться в случае удаления внешнего устройства хранения, поскольку ваше устройство по-прежнему будет иметь свой собственный overlay раздел и, следовательно, будет загружать всю конфигурацию оттуда.
Это означает, что он будет вести себя точно так же, как и перед настройкой extroot.

В образах прошивки OpenWrt по умолчанию нет инструментов для создание extroot, так как система сборки в настоящее время создает только barebone-образы.
Единственный способ использовать эти устройства - перестроить образ прошивки с нужными пакетами с помощью Image Builder.
Image Builder может работать только в 64-битной операционной системе Linux, поэтому, если у вас нет системы Linux, посмотрите инструкции по установке Ubuntu 64bit в VirtualBox.
Затем перейдите на ту же страницу загрузки, где вы можете загрузить прошивку для своего устройства, и прокручивать вниз, пока не найдете файл, начинающийся с “ OpenWrt-imagebuilder ”.
Загрузите его и распакуйте в папку в системе Linux.

Откройте терминал в этой папке и напишите:

make info

Это выведет на экран все возможные имена профилей для устройств, поддерживаемых этим Image Builder, чтобы мы могли создать образ для нужного устройства. Каждая запись будет выглядеть так:

tl-wr1043nd-v1:
    TP-LINK TL-WR1043N/ND v1
    Packages: kmod-usb-core kmod-usb2 kmod-ledtrig-usbdev

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

В нашем случаи это TP-LINK TL-WR1043N/ND v1, поэтому имя профиля этого устройства tl-wr1043nd-v1 Теперь нам нужно написать команду, чтобы начать сборку образа (обратите внимание, что имя после PROFILE= является именем профиля данного устройства, обязательно используйте имя профиля для своего устройства):

make image PROFILE=tl-wr1043nd-v1 PACKAGES="kmod-fs-ext4 kmod-usb-storage kmod-usb-ohci kmod-usb-uhci"

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

К сожалению, пакет e2fsprogs с инструментами для файловой системы ext4 слишком велик, чтобы поместиться в 4 МБ. Если кто-то может отделить mke2fs и инструменты проверки файловой системы от него, то можно сделать отделенные инструкции по использованию файловой системы ext4.

После этого откройте папку bin внутри папки Image Builder, затем откройте папку target, затем папку, в которой вы ее найдете (она имеет имя, зависящее от типа устройства), а затем внутри папки. называется generic , и вы должны добраться образа для прошивки. Выберите правильный образ (factory или sysupgrade) и установите его.

Затем вам нужно будет отформатировать USB-накопитель в файловую систему ext4, и для этого вам потребуется использовать Linux LiveCD или gparted диск.
К сожалению, это неудобно, но, как сказано выше, мы не можем разместить инструменты форматирования на устройствах с 4 МБ флэш-памяти.

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

Из интерфейса командной строки напишите (в одну строку):

opkg update && opkg install block-mount kmod-fs-ext4 kmod-usb-storage e2fsprogs kmod-usb-ohci kmod-usb-uhci fdisk

Это установит пакеты, необходимые для раздела с файловой системой ext4.

Пользователи, подверженные риску, могут захотеть создать собственный образ (как описано в предыдущем разделе), содержащий эти инструменты и особенно модули ядра, которые соответствуют ядру прошивки, чтобы они были доступны в отказоустойчивом режиме(failsafe mode).

Подключитесь через ssh к устройству.

Сконфигурируйте /etc/config/fstab для монтирования rootfs_data в другой каталог на тот случай, если вам понадобится получить доступ к исходному оверлею root для изменения настроек extroot:

DEVICE="$(awk -e '/\s\/overlay\s/{print $1}' /etc/mtab)"
uci -q delete fstab.rwm
uci set fstab.rwm="mount"
uci set fstab.rwm.device="${DEVICE}"
uci set fstab.rwm.target="/rwm"
uci commit fstab

Или вы можете определить раздел rootfs_data вручную:

grep -e rootfs_data /proc/mtd

Каталог /rwm будет содержать исходный корневой overlay, который используется в качестве основного корневого overlay до тех пор, пока extroot не будет поднят и запущен. Позже вы можете отредактировать /rwm/upper/etc/config/fstab, чтобы изменить вашу конфигурацию extroot (или временно отключить ее), если вам это когда-либо понадобится.

Посмотрите, какие есть у вас разделы:

# block info
/dev/mtdblock2: UUID="9fd43c61-c3f2c38f-13440ce7-53f0d42d" VERSION="4.0" MOUNT="/rom" TYPE="squashfs"
/dev/mtdblock3: MOUNT="/overlay" TYPE="jffs2"
/dev/sda1: UUID="fdacc9f1-0e0e-45ab-acee-9cb9cc8d7d49" VERSION="1.4" TYPE="ext4"

Здесь мы видим mtdblock устройства (разделы во внутренней флеш памяти), и раздел /dev/sda1 это ваш USB флеш диск.

Отформатируйте раздел /dev/sda1 в ext4 если это необходимо:

mkfs.ext4 /dev/sda1

Сейчас мы от конфигурируем /dev/sda1 как новый overlay через подсистему fstab uci:

DEVICE="/dev/sda1"
eval $(block info "${DEVICE}" | grep -o -e "UUID=\S*")
uci -q delete fstab.overlay
uci set fstab.overlay="mount"
uci set fstab.overlay.uuid="${UUID}"
uci set fstab.overlay.target="/overlay"
uci commit fstab

Если у вас есть раздел подкачки, он также будет распознан и добавлен автоматически.

Теперь мы перенесем содержимое текущего оверлея на наш новый оверлей на внешнем диске:

mount /dev/sda1 /mnt
cp -a -f /overlay/. /mnt
umount /mnt

Перезапустите устройство:

reboot
  1. LuCI → System → Mount Points должен быть показан раздел на внешнем USB устройстве подмонтированный как overlay.
  2. LuCI → System → Software должно быть показано большее свободное пространство на overlay разделе.

Раздел на внешнем USB устройстве должен быть подмонтирован как overlay Свободное пространство в корневом разделе / должно быть равно пространству на /overlay.

# grep -e /overlay /etc/mtab
/dev/sda1 /overlay ext4 rw,relatime,data=ordered
overlayfs:/overlay / overlay rw,noatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work
 
# df /overlay /
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1              7759872    477328   7221104   6% /overlay
overlayfs:/overlay     7759872    477328   7221104   6% /

Сохранение статуса установленных пакетов opkg в /usr/lib/opkg/lists хранящемся в extroot, а не в RAM, экономит некоторую оперативную память и сохраняет списки пакетов доступными после перезагрузки.

1. LuCI → System → Software → Configuration

смените

lists_dir ext /var/opkg-lists

на

lists_dir ext /usr/lib/opkg/lists

это должно выглядеть примерно так:

dest root /
dest ram /tmp
lists_dir ext /usr/lib/opkg/lists
option overlay_root /overlay
option check_signature

2. LuCI → System → Software → Actions → Update lists производит первоначальное обновление списка пакетов на extroot

-----------Перевод и обновление статьи продолжается! ------------ далее идет старая версия!

  • Add option force_space in /etc/opkg.conf to allow installation of packets bigger than your /rom partitions free space:
    echo option force_space >> /etc/opkg.conf
  • Do not use vfat (FAT/FAT32); it does not work. If you have a FAT preformatted USB drive, you cannot use it for extroot without reformatting. Use e.g. ext4 (install e2fsprogs, then format your FAT formatted USB drive using mkfs.ext4 /dev/sda1 as per the example, also see storage).
  • On Barrier Breaker, block-mount will create a file /etc/.extroot-uuid on extroot filled with uuid of mtd partition rootfs. At boot time when trying to do extroot, block-mount would try to check the actual uuid with the content of .extroot-uuid. If they did not match, extroot would fail. So if you want to continue use extroot after flashing a new firmwre, /etc/.extroot-uuid needs to be deleted first.
  • If the partition containing your extroot isn't mounted during boot, but you can mount it without problems from a shell, you should try to increase config 'global' / option delay_root. On my system I had to set it to 15 to get extroot working. Another hint to this being the culprit is having a working swap or other partitions mounted after booting, but not your extroot.

В статье Использование 3g/UMTS USB модема для WAN соединений рекомендуют добавить в образ прошивки утилиту usb-modeswitch.
Использование данной утилиты имеет особенности: если /overlay расположить на карте памяти, находящейся в слоте USB-модема, то даже при совершенно правильных настройках внешнего overlay, работоспособных при любом другом размещении оверлея, в данном случае будут наблюдаться неполадки файловой системы, возникающие на завершающей стадии загрузки ОС. Неполадки вызваны тем, что утилита usb-modeswitch, отключая CDROM и подключая модем, попутно на некоторое время отключает и считыватель карт памяти, нарушая работу файловой системы.
Избежать этого можно заранее настроив USB-модем так, чтобы usb-modeswitch не потребовался вообще: устройство должно сразу представляться ОС как модем или сетевой адаптер со считывателем карт памяти включенными по-умолчанию.

Подключите USB-модем к компьютеру и с помощью терминала отправьте на модем соответствующие AT-команды.
Проверяем исходную конфигурацию USB-модема:

at^setport?
^SETPORT:A1,A2;1,3,2,A1,A2
OK

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

at^setport=?
^SETPORT:A1: CDROM
^SETPORT:A2: SD
^SETPORT:A: BLUE TOOTH
^SETPORT:B: FINGER PRINT
^SETPORT:D: MMS
^SETPORT:E: PC VOICE
^SETPORT:1: MODEM
^SETPORT:2: PCUI
^SETPORT:3: DIAG
^SETPORT:4: PCSC
^SETPORT:5: GPS
^SETPORT:6: GPS CONTROL
^SETPORT:16: NCM
OK

В данном примере у нас USB-модем, в котором в первой конфигурации (слева от символа ;) включены CDROM и считыватель карт, во второй конфигурации (справа от символа ;) включен модем, управляющий и диагностический интерфейсы, и считыватель карт памяти. Именно между двумя этими конфигурациями утилита usb-modeswitch переключает USB-модем на роутере.

Ваша цель - оставить только одну конфигурацию, в которой по-умолчанию включен модем (см. 1 выше) или сетевой адаптер (см. 16 выше), присутствует считыватель карт памяти (см. A2 выше), но при этом выключен CDROM.
ВНИМАНИЕ: Нельзя отключать интерфейс PCUI (см. 2 выше) - вы потеряете возможность управлять USB-модемом!

Некоторые USB-модемы принимают параметр 'выключить всё' (см. FF ниже).
Перечислите все необходимые вам по-умолчанию функции модема в списке справа от символа ; по их кодам из ответа модема вверху:

at^setport="ff;1,2,3,a2"
OK

at^reset
OK

at^setport?
^SETPORT:;1,2,3,A2
OK

Данная последовательность команд выключила CDROM и оставила единственную конфигурацию, в которой по-умолчанию присутствуют модем, интерфейсы и считыватель карт памяти - без необходимости пользоваться утилитой usb-modeswitch на роутере. Обратите внимание на символ ; - слева от него пусто.

Список USB-модемов, поддерживающих предварительную конфигурацию

  • Huawei E3131s-2 f/w v21.158.47.00.1094

I recommend that you DO NOT try to do upgrades using opkg upgrade. You will likely end up with an inconsistent state and bricked router that way:

  • The main reason is that the uClibc ABI (Application Binary Interface) is unstable and changes from revision to revision, so binaries for one version of uClibc may be incompatible with versions from another.
  • Another problem that can arise is if you try to follow the advice in the Old Notes and upgrade the kernel packages, then flash and reboot, but your operation is interrupted in any way, then you will have a kernel and module mismatch and likely a brick.
  • Finally, if you upgrade all packages but the kernel and the kernel modules, some packages like iptables will be broken.
In Trunk r25269 respectably Backfire r25270 the detection of a mismatch in a previously generated key (md5sum) for extroot and JFFS2 was correctly implemented! Since that the following applies:
A potentially broken overlay is mounted on /tmp/overlay-disabled instead of as rootfs, to give you a chance to fix it before mounting the extroot as the rootfs. That means you can safely flash the kernel with e.g. sysupgrade imagename.bin and not end up with a brick.
Instead the system will have mounted from the SquashFS/JFFS2 instead of the extroot.

In case of a md5sum-mismatch you should:

  1. make a copy of any data you want to keep from the extroot
  2. recreate the extroot
  3. copy back your data back to recreated extroot
  4. remove the md5sums (<extroot>/.extroot.md5sum and <extroot>/etc/extroot.md5sum). As of trunk r26312 you can achieve the md5sum removal with
    /etc/init.d/fstab overlay_enable
  5. make sure your /etc/config/fstab (located on the JFFS2) is correct
  6. reboot.

In future I plan to have a script that removes all non-conffiles (except also preserving files preserved by sysupgrade) pointed to the opkg list on the extroot, and few other cleanups, which will hopefully sanitize extroot so it can be safely used again.

Sometimes you may need to access the original root overlay, for example to change your extroot settings. A convenient way of doing this is to configure /etc/config/fstab on your extroot partition to mount the original root overlay in another directory, like this:

config mount option target /overlay-boot option device /dev/mtdblock3 option fstype jffs2 option options rw,sync option enabled 1 option enabled_fsck 0

This assumes the original overlay was on /dev/mtdblock3 - check your router's page on this wiki and look at the flash map to confirm what MTD block it is for you. Or run “$ cat /proc/mtd” and search the partition named rootfs_data to know where is your overlay.

If you then create /overlay-boot on the extroot partition, this directory will contain the original root overlay, which is used as the main root overlay until the extroot is up and running. So you can then for example edit /overlay-boot/etc/config/fstab to change your extroot configuration (or temporarily disable it) should you ever need to.

Old Notes

So to upgrade all your installed packages, you could do

opkg upgrade $(opkg list-upgradable)

:!: DO NOT DO THAT! Since the kernel is on read-only flash partition, and all the kernel modules are on your external device, the modules will be updated, but the kernel not. You will end up with not matching kernel <> kernel-modules and your installation will not survive a reboot. To avoid that, you have to exclude all kernel-modules from being updated, for example so:

opkg upgrade $(opkg list-upgradable | awk '($1 !~ "^kmod|Multiple") {print $1}')

To upgrade kernel + kernel modules you need to first upgrade the kernel-modules (with opkg upgrade ... --force... ) and then immediately WITHOUT rebooting, reflash Kernel + SquashFS with sysupgrade. Then reboot.

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2023/01/17 04:16
  • by vgaetera