ru:doc:howto:extroot

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

У многих роутеров существенно ограничено количестве дискового пространства для хранения файлов и данных (встроенная flash-память). Но, в тоже время, роутеры могут быть оборудованы портами USB или SATA, что позволяет подключить к ним внешние устройства хранения, такие, как диски USB-flash и USB-HDD. В более экзотических случаях могут быть подключены даже mini PCI-E или сетевые диски. Подключение подобных устройств позволяет расширить "дисковую" память роутера, в том числе и его корневую файловую систему, для хранения как дополнительного программного обеспечения, так и дополнительных настроек. Существует несколько способов создание внешней корневой файловой системы. Чтобы понять все технические детали реализации OpenWrt extroot, желательно прочитать extroot.theory.

Возможные альтернативы внешней корневой файловой системы

Существует несколько вариантов для построения/подключения устройств с внешней корневой файловой системой. Возможны следующие варианты:

  1. Конфигурирование загрузчика bootloader для непосредственной загрузки с внешнего USB-устройства. Не все загрузчики имеют такую функцию.
    • Популярные загрузчики такие как U-Boot или RedBoot support different file systems поддерживают такой функционал, но требуют драйвер для конкретной реализации аппаратуры!
  2. Конфигурирование загрузчика для загрузки по сети → netboot. Подобной функциональностью обладает ещё меньшее количество загрузчиков.
  3. Создание установки чтобы opkg был в состоянии устанавливать пакеты где-то в файловой системе OpenWrt → Installation destinations. Но обеспечение установки пакетов OPKG в корне намного удобнее, так как все файлы устанавливаются в стандартных местах файловой системы, в которых ОС ожидает их найти.
  4. Использование kexec. Что может потребовать очень специфических настроек в зависимости от устройства.

Прежде чем начать...

  1. Прочитайте статью extroot.theory для лучшего понимания технологии внешней корневой файловой системы. Убедитесь, что поняли различия между двумя основными вариантами: "внешний overlay" (pivot overlay) и "внешний корень" (pivot root).
  2. Для разных версий OpenWrt конфигурации и опции будут различаться или могут отсутствовать вовсе. Инструкция ниже описывает процедуры для версий OpenWrt выше 10. Для версий ниже 10 возможен только вариант "внешний overlay", но не "внешний корень".
  3. Функциональность extroot ещё дорабатывается, поэтому обязательно смотрите статьи об ошибках → Troubleshooting и примечания → Notes в процессе подготовки и далее в процессе установки и настройки!
Если по каким-то причинам extroot сбоит при загрузке, то обычная конфигурация загружается из раздела JFFS2 основной flash-памяти. Вы можете скопировать оттуда старые настройки для их последующего изменения. Подобная конфигурация несёт некоторый риск (например, конфигурация SSH может оказаться незащищённой и даже доступной из Интернета). Перед установкой extroot необходимо убедиться, что система в безопасности и защищена. Также, любые изменения, внесённые в сетевое окружение, должны быть совместимы с безопасностью в исходной конфигурации JFFS2.

Подготовка

Смонтируйте файловую систему, куда будут скопированы настройки и корень.

Убедитесь что ваше устройство смонтировано в режиме чтения/записи и на него можно записывать данные. Для проверки смонтируйте в ручном режиме первый раздел на USB-диске /dev/sda:

  mount /dev/sda1 /mnt/sda1

Убедитесь, что всё успешно подключено, запустив mount или df. Также, вы можете записать файл и прочитать его непосредственно в/из /mnt/sda1.

Chaos Calmer

Подготовка

Установите следующие пакеты:

  • block-mount (подробную информацию смотрите в block_mount и в fstab).
  • kmod-fs-ext4 или kmod-fs-[файловая система, которую вы используете на USB-диске]
  • kmod-usb-storage-extras
    opkg update
    opkg install block-mount kmod-fs-ext4 kmod-usb-storage-extras
  • Если opkg выдаёт ошибку при установке kmod-usb-storage-extras, следует сперва установить
    kmod-usb-core

Установка на внешний overlay (рекомендованный вариант)

  1. Создайте на USB-диске разделы и отформатируйте их, используя любой Live CD с Linux или средствами uci (рекомендуется использовать первый раздел для root overlay, второй для swap (если он вам необходим), а далее разместить прочие разделы, которые вам нужны)
  2. Скопируйте /overlay на USB-устройство
    mount /dev/sda1 /mnt
    tar -C /overlay -cvf - . | tar -C /mnt -xf -
    umount /mnt
  3. Создайте шаблон fstab
    block detect > /etc/config/fstab
    vi /etc/config/fstab
  4. Внесите исправления в /etc/config/fstab:
    1. Все строки вида enabled '0' приведите к enabled '1'
    2. Отредактируйте option target корневого раздела overlay, чтобы он выглядел как /overlay (НЕ overlay, поскольку это приведёт к ошибочному двойному монтированию)
    3. Отредактируйте option target прочих разделов, в соответствии с тем, куда вы хотите их примонтировать (и не забудьте создать соответствующие директории в файловой системе)
      После всех манипуляций ваш fstab будет выглядеть примерно так:
      config 'global'
              option  anon_swap       '0'
              option  anon_mount      '0'
              option  auto_swap       '1'
              option  auto_mount      '1'
              option  delay_root      '5'
              option  check_fs        '0'
      
      config 'mount'
              option  target  '/overlay'
              option  uuid    'c91232a0-c50a-4eae-adb9-14b4d3ce3de1'
              option  fstype  'ext4'
              option  enabled '1'
      
      config 'swap'
              option  uuid    '08b4f0a3-f7ab-4ee1-bde9-55fc2481f355'
              option  enabled '1'
      
      config 'mount'
              option  target  '/data'
              option  uuid    'c1068d91-863b-42e2-bcb2-b35a241b0fe2'
              option  enabled '1'
  5. Перезагрузите роутер
  6. Убедитесь, что разделы корректно смонтированы:
    • с помощью LuCI
      • в System - Software должно быть видно свободное пространство на разделе
      • в System - Mount Points должен быть виден USB-раздел, смонтированный как overlay
    • с помощью консоли
      • команда mount должна показать USB-раздел, смонтированный как /overlay
        root@OpenWrt:mount
        
        /dev/root           on /rom               type squashfs (ro,relatime)
        proc                on /proc              type proc     (rw,noatime)
        sysfs               on /sys               type sysfs    (rw,noatime)
        tmpfs               on /tmp               type tmpfs    (rw,nosuid,nodev,noatime)
        /dev/ubi0_1         on /overlay           type ubifs    (rw,noatime)
        overlayfs:/overlay  on /                  type overlay  (rw,noatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work)
        tmpfs               on /dev               type tmpfs    (rw,relatime,size=512k,mode=755)
        devpts              on /dev/pts           type devpts   (rw,relatime,mode=600)
        /dev/sda1           on /overlay           type ext4     (rw,relatime,data=ordered)
        /dev/sda3           on /data              type ext4     (rw,relatime,data=ordered)
        debugfs             on /sys/kernel/debug  type debugfs  (rw,noatime)
        
      • df должен показать свободное пространство на разделах /overlay и /data
        root@OpenWrt:df
        
        Filesystem           1K-blocks      Used Available Use% Mounted on
        rootfs                   27180      7796     17964  30% /
        /dev/root                 2304      2304         0 100% /rom
        tmpfs                   127668      1468    126200   1% /tmp
        /dev/ubi0_1            1998672      8056   1869376   0% /overlay
        overlayfs:/overlay       27180      7796     17964  30% /
        tmpfs                      512         0       512   0% /dev
        /dev/sda1              1998672      8056   1869376   0% /overlay
        /dev/sda3            242846048    163864 230323224   0% /data

Установка на внешний корень

  1. Создайте на USB-диске разделы и отформатируйте их, используя любой Live CD с Linux или средствами uci (рекомендуется использовать первый раздел для root overlay, второй для swap (если он вам необходим), а далее разместить прочие разделы, которые вам нужны)
  2. Скопируйте корневую файловую систему на USB-устройство
    mkdir -p /tmp/introot
    mkdir -p /tmp/extroot
    mount --bind / /tmp/introot
    mount /dev/sda1 /tmp/extroot
    tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -
    umount /tmp/introot
    umount /tmp/extroot
  3. Создайте шаблон fstab
    block detect > /etc/config/fstab
    vi /etc/config/fstab
  4. Внесите исправления в /etc/config/fstab:
    1. Все строки вида enabled '0' приведите к enabled '1'
    2. Отредактируйте option target корневого раздела, чтобы он выглядел как /
    3. Отредактируйте option target прочих разделов, в соответствии с тем, куда вы хотите их примонтировать (и не забудьте создать соответствующие директории в файловой системе)
      После всех манипуляций ваш fstab будет выглядеть примерно так:
      config 'global'
              option  anon_swap       '0'
              option  anon_mount      '0'
              option  auto_swap       '1'
              option  auto_mount      '1'
              option  delay_root      '5'
              option  check_fs        '0'
      
      config mount
      	option device '/dev/sda1'
      	option target '/'
      	option enabled '1'
      
      config swap
      	option device '/dev/sda2'
      	option enabled '1'
      
      config mount
      	option device '/dev/sda3'
      	option target '/data'
      	option enabled '1'
  5. Перезагрузите роутер
  6. Убедитесь, что разделы корректно смонтированы.

Barrier Breaker

Здесь приведены лишь отличия, характерные для Barrier Breaker. Все остальные действия аналогичны таковым для Chaos Calmer.

Установка на внешний overlay (рекомендованный вариант)

Примерное содержимое fstab:

config mount option target /overlay option device /dev/sda1 option fstype ext4 option options rw,sync option enabled 1 option enabled_fsck 0

Если монтирование не удалось, overlay смонтируется в /tmp/overlay-disabled вместо того, чтобы быть корневой файловой системой.

У некоторых пользователей при использовании Barier Breaker 14.07 (RC-версиях) на устройствах с архитектурой ar71xx раздел продолжает монтироваться как /mnt/sdax вместо /overlay. Проблема решается запуском block detect, который создаст правильный fstab с корректными идентификаторами разделов.

root@OpenWrt:/# cat /etc/config/fstab config global option anon_swap '0' option anon_mount '0' option auto_swap '1' option auto_mount '1' option delay_root '5' option check_fs '0' config mount option target '/overlay' option uuid '1902a323-79a6-4b1a-a511-a58655974ee9' option enabled '1' option fstype 'ext4' config mount option target '/mnt/sda2' option uuid 'dc64a6dd-de63-4363-b405-403cdced1649' option enabled '1' option fstype 'ext4'

Проверка работоспособности extroot с помощью утилиты df:

root@OpenWrt:~# df Filesystem 1K-blocks Used Available Use% Mounted on rootfs 2758072 118004 2501828 5% / /dev/root 2048 2048 0 100% /rom tmpfs 63340 76 63264 0% /tmp /dev/sda1 2758072 118004 2501828 5% /overlay overlayfs:/overlay 2758072 118004 2501828 5% / tmpfs 512 0 512 0% /dev

Учитывайте, что rootfs и overlayfs:/overlay занимают одно и то же место, и оба монтируются в корень (/). Кроме того, /dev/sda1 смонтирован в /overlay и является оверлейной файловой системой. В том случае, если вы настроили не внешний overlay, а внешний корень, в выводе df не будет строки overlayfs:/overlay.

Установка на внешний корень

Примерное содержимое fstab:

config mount option target / option device /dev/sda1 option fstype ext4 option options rw,sync option enabled 1 option enabled_fsck 0

До ревизии r26311 неудачно смонтированный внешний корень монтировался в /tmp/rom-disabled, а после ревизии r26311 - в /tmp/whole_root-disabled.

Attitude Adjustment

Старый вариант установки на внешний overlay

Before r25787 configure by setting the option is_rootfs in your /etc/config/fstab. Besides that, there is nothing to be configured regarding extroot that is different from any other mount.

For trunk versions up to, but not including r25787 the following is an example for an extroot mount entry in the file /etc/config/fstab. Note the fstype, options and enable_fchk options are optional, see fstab.

config mount option target /mnt # This is ignored once is_rootfs is set to 1 option device /dev/sda1 option fstype ext3 option options rw,sync option enabled 1 option enabled_fsck 0 option is_rootfs 1

A target option is not mandatory as it will be the overlay file system. However, using the directory /mnt as target will make testing possible: first set is_rootfs to 0, reboot and check if all mounts well and than set it to 1 and reboot again. Make sure the target it is not manually set to /overlay. /overlay is automatically used on a successful is_rootfs-mount, but if for some reason this file system could not be made the rootfs will be mounted on the target listed here. Using /overlay will result in an double /overlay mount and screw things up. In later releases, the target is used to determine if a mount entry is an extroot device and is_rootfs is not used anymore to circumvent this.

option is_rootfs is deprecated after r25787. Use the new overlay variant where the target is used to determine if a mount entry is an extroot device. Before Trunk r25787 the option is_rootfs is required for block-extroot mounts!

Troubleshooting

  • 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.

Дополнительные сведения

Extroot на карту памяти в слоте USB-модема

В статье Использование 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

Remote File Systems

System Upgrade

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.

Accessing original root

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.

Information on Legacy versions

Backfire see: extroot.old

ru/doc/howto/extroot.txt · Last modified: 2017/06/18 11:53 by tmomas