Яндекс.Метрика

    Песочница

    Сборка кастомной прошивки OpenWRT

    Не так давно озадачился поднятием на своем роутере D-Link DIR-320 сервера OpenVPN. Но после установки прошивки OpenWRT оказалось, что на 4-х мегабайтной флешке роутера не осталось достаточно места для установки OpenVPN. Выходом из ситуации стала сборка собственного варианта прошивки с помощью Image Generator, что позволило при том же наборе пакетов получить прошивку меньшего размера.
    Прежде чем продолжить описание сборки, остановлюсь немного на том, как устроена корневая файловая система OpenWRT. Она представляет собой файловую систему mini_fo, которая прозрачно объединяет две другие файловые системы: неизменяемую SquashFS, смонтированную в /rom, и изменяемую JFFS2, смонтированную в /overlay. Все файлы, которые создаются или изменяются после установки прошивки, находятся в /overlay. При удалении файлов, изначально бывших в прошивке, mini_fo просто помечает их как удаленные, сами же файлы остаются в /rom и продолжают занимать место. Как SquashFS, так и JFFS2 используют сжатие, но SquashFS дает лучшую степень сжатия, поэтому помещение всех необходимых пакетов сразу в /rom дает прошивку меньшего размера. Исключение ненужных пакетов из прошивки также позволяет сэкономить столь драгоценное место на флешке.

    Для сборки кастомной прошивки необходимо скачать архив ImageBuilder. Для моего роутера был только i686-вариант архива, но никаких проблем на 64-битной Gentoo с ним не возникло. Для всего, что связано с прошивкой я создал директорию ~/dir-320, а в ней директорию 10.03, соответствующую версии используемой прошивки OpenWRT, куда и распаковал архив ImageBuilder. Сборка минимального образа осуществляется с помощью команды make image, вместе с которой можно также указать три переменные:
    • PROFILE — профиль сборки, который определяет список дополнительных пакетов для включения в прошивку. Список профилей можно получить с помощью make info. У меня по какой-то причине переменная не оказывала никакого влияния, и список необходимых для моего роутера пакетов пришлось указывать вручную.
    • PACKAGES — список пакетов для добавления или удаления. Перед именами пакетов, которые необходимо удалить, ставится минус. При сборке вычисляются зависимости пакетов, которые также добавляются в прошивку.
    • FILES — путь к директории с дополнительными файлами для включения в прошивку.

    Для удобства повторного использования я создал скрипт make_image.sh, где вызываю make image с необходимыми мне значениями переменных:
    #!/bin/bash
    
    make image PROFILE="Broadcom-b43" PACKAGES="kmod-b43 kmod-b43legacy -wpad-mini wpad ip iptables-mod-conntrack-extra ntpclient miniupnpd openvpn ddns-scripts nano" FILES="files/"
    

    Очень удобной оказалась возможность добавлять свои файлы в образ прошивки. Пользуясь тем, что все новые и измененные файлы находятся в /overlay, я написал скрипт backup.sh для извлечения таких файлов из устройства:
    #!/bin/bash
    
    DATE=`date +%Y-%m-%dT%H:%M:%S`
    BACKUP="backup-$DATE.tar.gz"
    ROUTER=172.22.222.1
    BASEDIR=`dirname $0`
    FILELIST="etc/"
    
    ssh root@$ROUTER tar -czf /tmp/$BACKUP -C /overlay -X /etc/backup_exclude $FILELIST
    scp root@$ROUTER:/tmp/$BACKUP $BASEDIR/backup/$BACKUP
    

    Файлы META_* в /overlay являются служебными в файловой системе mini_fo и их нужно исключить. Поскольку встроенный в busybox архиватор tar для исключения файлов поддерживает только опцию -X, необходимо на роутере создать файл /etc/backup_exclude со следующим содержимым:
    META_*
    

    В одной директории со скриптом создаем подкаталог backup, куда и будут сохраняться архивы.

    Новые и измененные файлы помещаем в каталог, на который ссылается переменная FILES, с сохранением структуры подкаталогов. Запускаем скрит make_image.sh и получаем в каталоге bin преднастроенную прошивку со всем необходимым ПО.