OpenWRT — подключение USB-диска

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

Необходимые пакеты для подключения USB-диска

Для подключения внешнего USB-накопителя нам понадобятся первым делом необходимые модули ядра.
В случае, если Вы сами собираете прошивку OpenWRT, то тогда включаем в настройках сборки следующие пункты

make menuconfig
Kernel modules  --->
   USB Support  --->
      <*> kmod-usb-core
      <*> kmod-usb-ohci
      <*> kmod-usb-storage
      <*> kmod-usb-usb2
   Filesystems  --->
      <*> kmod-fs-ext4
Ну и, конечно, следует позаботиться об пакете block-mount, который выполняет роль аналога сервиса fstab — монтирует разделы при загрузке устройства.

Base system   --->
   <*> block-mount
Ну теперь дело за малым — собираем прошивку

make clean
make V=-1
и прошиваем наше устройство.

Подключение и монтирование USB-накопителя

Настоятельно рекомендую использовать для подключения накопители с файловыми системами Ext2/Ext3/Ext4. Хоть и существует возможность монтирования FAT32/NTFS, но все попытки обычно обрастают кучей проблем, которые решать желания никакого не имею.

В этой статье априори рассматриваю лишь Ext-семейство.

Если подключаете Флешку или SSD-диск, то рекомендую использовать Ext2, чтобы особо не волноваться о циклах перезаписи.
Если USB-HDD, то рекомендую переходить на Ext4.

Итак, будем считать, что носитель Вы подготовили и подключили.

Если же вы впервые сталкиваетесь с вопросом о форматировании USB-флешки, то для Linux-систем можете почитать эту статью:Форматирование USB-диска

Теперь надо примонтировать всё это дело.

Отложим интерфейс, он несколько кривовато работает для этих целей в настоящее время, проще ручками через консоль.

Для начала удалим старый файл /etc/config/fstab

rm /etc/config/fstab
А теперь создадим новый с помощью полезной команды

block detect >> /etc/config/fstab
И приступим к редактированию

vi /etc/config/fstab
Перед нами во всей красе и величии предстали настройки автоматического монтирования, созданные автоматически командой block detect.

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  '/mnt/sda1'
        option  uuid    '7f41e7d8-3b3a-4725-a295-cbc58bb89493'
        option  enabled '0'
Теперь нам надо определиться как монтировать будем. Тут два варианта:

Монтируем как отдельный раздел — тут вообще никаких комментариев. Обычное монтирование.
Монтируем как overlay-раздел — подменяем область, которую прошивка использует для перезаписи данных, так как файлы в самой прошивке находятся в read-only файловой системе. В общем если хотите устанавливать пакеты или поберечь флеш устройства от перезаписей, который как USB-флешку поменять не получится, а только паяльником, то советую хотя бы раздел 128-256 мб выделить под overlay-раздел.
Монтируем как отдельный раздел

Итак, чтобы примонтировать USB раздел как отдельный каталог, например, в будущем для хранения данных файлового сервера, приводим второй блок файла fstab к следующему виду

config 'mount'
        option  target  '/mnt/sda1'
        option  uuid    '7f41e7d8-3b3a-4725-a295-cbc58bb89493'
        option  enabled '1'
Да, просто меняем одну цифру, с нуля на единицу.
В общем и сами догадались бы.

Монтируем как overlay-раздел

Вот это уже интереснее.
Сначала приводим fstab к виду

config 'mount'
        option  target  '/overlay'
        option  uuid    '7f41e7d8-3b3a-4725-a295-cbc58bb89493'
        option  enabled '1'
А теперь нам необходимо еще файлы из встроенной памяти роутера перенести в этот раздел.

Сделаю небольшое отступление — в интернете бытует мнение, которое я до недавнего времени так же разделял, мол необходимо на внешний носитель переносить все данные с устройства.
Если Вы так сделаете и у Вас не флешка, а USB-HDD, то ваш жесткий диск парковаться будет чуть реже, чем никогда.
В overlay необходимо перенести лишь то, что сейчас находится в overlay’е.

Итак, монтируем будущий overlay раздел ручками в /mnt/sda1

mkdir /mnt/sda1
mount /dev/sda1 /mnt/sda1
И переносим всё содержимое с сохранением прав доступа и символьными ссылками хитрым способом с помощью архиватора tar:

tar -C /overlay -cf - . | tar -C /mnt/sda1 -xf -
Проверяем, что скопировали:

~# ls /mnt/sda1 -lah
drwxr-xr-x    5 root     root        4.0K Sep 25 09:44 .
drwxr-xr-x    1 root     root           0 Sep 25 09:20 ..
drwxr-xr-x    5 root     root        4.0K Sep 25 09:44 etc
drwx------    2 root     root       16.0K Sep 25 09:16 lost+found
drwxr-xr-x    3 root     root        4.0K Sep 25 09:44 mnt
Замечательно, вот только каталог /overlay/mnt на флешку перемещать смысла не было, удалим его на всякий случай:

rm -Rf /mnt/sda1/mnt
Ну и перезагружаемся:

reboot
После перезагрузки промеряем, как у нас всё смонтировалось и куда

~# df -h|grep sd
/dev/sda1                 3.7G      7.6M      3.5G   0% /overlay
ну всё, флешка подключена как overlay-раздел и теперь у вас куча места для установки пакетов, а не жалкие несколько мегабайт.