Кросскомпиляция для NAS

    Я хочу рассказать, как можно расширить функциональность NAS-устройств, работающих под управлением Linux с uClibc. Вполне возможно, что манипуляции с симлинками и переменными окружения позволят добиться успеха там, где нет uClibc.

    Я не буду рассматривать пути получения root shell. Механизмов слишком много, все зависит от конкретной модели. На сайте посвященном взлому NASов рассматриваются различные методики получения root shell и даются ссылки на сайты сообществ взлома конкретных моделей.

    Цель данной статьи показать насколько легко добавить в NAS недостающую функциональность и указать на некоторые подводные камни.

    До того как начать ломать копья посетите сайт посвященный Вашему девайсу — его можно найти в списке сообществ по взлому NASов. Там может быть не только важная информация, но и готовые бинарники, полезные советы и т.п. В первую очередь нас интересует как получить root shell. Во вторую — версии uClibc и ядра.

    Сбор исходников.


    Идем на сайт производителя. Там с большой вероятностью можно скачать файл вроде GPL_sources.tgz в котором будет ядро с конфигом под Ваш NAS. Если повезет еще больше, там будут исходники toolchain, среды компиляции для Вашего девайса. В моем случаи исходников toolchain не было. Более того, на сайте этой замечательной среды скачать toolchain нужной мне версии uClibc (0.9.26) невозможно. Однако существует заметка, где есть не только адрес исходников, но и необходимые патчи. Если ядра на сайте производителя не было, его всегда можно скачать с kernel.org. Еще нам понадобится module-init-tools или modutils, если ядро версии 2.6 или 2.4, соответственно.

    Подготовка среды.


    Для начала нужно собрать toolchain. Под Linux это труда не составит, под BSD понадобится gmake. Говорят, что можно скомпилить под cygwin, я не пробовал. Обратите внимание, в Makefile нужно проставить ARCH:=XXX, где XXX — архитектура Вашего NASа и LINUX_SOURCE:=kernel-headers-K.KK.KK.tar.bz2, где K.KK.KK — версия ядра.

    Теперь можно компилировать программы, которые будут запускаться на NASе.

    Для этого нужно во-первых добавить в PATH путь к бинарникам toolchain, например,
    $ export PATH=$PATH:~/uclibc-toolchain-src-20040609/gcc-3.3.x/toolchain_i386/bin

    Во-вторых, при запуске ./configure нужно добавить ключ --host=XXX-linux, где XXX — архитектура Вашего NASа, например,
    $ ./configure --host=i386-linux

    Обратите внимание! У моего NASа архитектура i386, у Вашего скорее всего другая.

    Если Вы хотите добавлять модули ядра (например драйвер файловой системы или сервер NFS), нужно скомпилировать module-init-tools или modutils и само ядро. Не забудьте указать в качестве CC gcc из toolchain. Причем, будьте бдительны, модуль должен быть скомпилирован той же версией gcc, что и ядро. Соответственно, может возникнуть ситуация, когда Вам понадобится два toolchain — один с gcc для ядра и другой с Вашей любимой версией gcc для userland.

    Все готово


    Теперь Вы можете компилировать нужные Вам программы и запускать их на NASе. Ни каких дополнительных манипуляций не требуется.

    Мне в первую очередь хотелось сделать ядерный сервер NFS. Я собрал модуль ядра и nfs-utils, но запустить все это ни как не удавалось. После долгих бесплодных исследований я понял: я скомпилировал модуль не той версией gcc. Это мне сказал insmod из modutils. До этого я использовал insmod, который обеспечивает busybox. Пресквернейшая вещь, надо сказать. Он не выдает ни какой полезной информации, в том числе и предупреждение о разных версиях gcc.

    По-этому я настоятельно рекомендую использовать modutils. Когда я скомпилировал модуль правильно все заработало!

    Игра стоит свеч: на моем NASе лузерспейсовая sama дает 5 МБ/с, лузерспейсовый nfs дает 4,5 МБ/с, а ядерный nfs 7 МБ/с. Я подозреваю, что загрузка при этом не 100%.

    Комментарии 27

      0
      Все придумано уже до вас. Воспользуйтесь openembedded. Я публиковал пару статей о нем. Право слово им проще все это делается.
        0
        openembedded — немного не то. Здесь не надо создавать целую embedded систему. Напротив, надо скомпилить для готовой системы еще одну программу.

        Я не уверен, что openembedded будет проще собрать правильный toolchain. При удаче можно скачать исходники toolchain у производителя, и тогда вообще ни каких сложностей не будет.
          0
          Как раз то. И он позволяет не только генерировать целую систему, но и пакеты. А вот насчет проще ли собрать тулчейн это вы зря. Наиболее просто тулчейн собирается при помощи crossdev (в Gentoo) или openembedded.
            0
            В portage нет uClibc 0.9.26, в openembedded нужно прыгнуть через голову, чтоб заработала gcc 2.95

            После этого Вы говорите, что это это значительно проще, чем скачать готовый тулчейн и скомпилить его?
              0
              Я считаю, что пора завязывать пользоваться античными версиями ПО :) Если вы продолжите пользоваться именно этими версиями, то будьте готовы что часть софта вы просто не сможете собрать.
                0
                Возможно я не очень четко обозначил задачу. Я предлагаю добавить программы и модули в систему, без перепрошивок и т.п. Таким образом гарантия не нарушается.

                В некоторых девайсах ядро собрано gcc 2.95 и во многих используется uClibc 0.9.26
                  0
                  Я предлагаю добавить программы и модули в систему, без перепрошивок и т.п. Таким образом гарантия не нарушается.
                  Вообще если вы модифицируете продукт под свои нужды таким образом и это не разрешено производителем, то вы теряете гарантию :)

                  В некоторых девайсах ядро собрано gcc 2.95 и во многих используется uClibc 0.9.26
                  Чем собрано ядро стреляет лишь при добавлении модулей к нему. Поверх него спокойно может работать и uClibc и glibc.
                    0
                    Если не менять прошивку, после перезагрузки девайса обнаружить запуск других программ будет невозможно.

                    Если в системе уже стоит uClibc 0.9.26, а нам нужно всего лишь добавить например tftp сервер, зачем еще одна версия libc?

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

                      А где они тогда стоят? Или в память кладется и все? :)

                      Если в системе уже стоит uClibc 0.9.26, а нам нужно всего лишь добавить например tftp сервер, зачем еще одна версия libc?

                      Когда у вас не соберется этот самый tftp сервер вот тогда и поймете зачем.
                        0
                        А где они тогда стоят? Или в память кладется и все? :)

                        На HDD наверно. По крайней мере у меня на HDD.

                        Когда у вас не соберется этот самый tftp сервер вот тогда и поймете зачем.

                        Все что было нужно мне собралось. Следовательно есть ненулевая вероятность, что соберется и у других. В таком случае будет значительно проще использовать готовый тулчейн.
      • НЛО прилетело и опубликовало эту надпись здесь
          0
          тулчейн для Вашей железки есть в природе?
            0
            Наклепать тулчейн можно, а вот с ядром не повезло.
            • НЛО прилетело и опубликовало эту надпись здесь
                0
                какой роутер (производитель/модель)? какой SoC?
                дело в том, что я занимался подобными железками и как правило можно можно или проапрейгдить ядро, или сделать бэкпорт нужной фичи.
                • НЛО прилетело и опубликовало эту надпись здесь
                    0
                    у меня этот роутер стоит дома (правда только как wlan бридж) со старенькой openwrt прошивкой

                    залей свежую openwrt прошивку на 2.6 ядре и будет тебе счастье
                    • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      Раз уж прошивка неродная, может попробовать заменить в ней ядро на 2.4.21?
                      • НЛО прилетело и опубликовало эту надпись здесь
              0
              Есть в наличии linksys nss4000, все пытаюсь самбу на по-новее обновить, ибо там она жутко древняя — 3.0.14а (2005 год.), пока безуспешно. Есть проблемы с вистой (думаю и с сервер 2008 тоже). Линксис на этот nas забил, в faq прикрутил отмазку — на server 2008 не работает и точка. Пока пробую обновить бинарниками для mipsel от дебиана. Рут получить в этой железке просто: сохранил конфиги на флешку, добавил шару на корень файловой системы, загрузил обратно и поменял хеш пароля рута в /etc/shadow.
                +1
                а в чем непосредственно проблема?
                  0
                  1) Нет опыта работы с linux.
                  2) Железка используется в компании (стремно что то глобально там менять).
                  3) Файловая система для основных файлов — squashfs (только чтение), при ругательстве на отсутствие файлов приходится добавлять в сжатый файл файлы, и менять прошивку.
                  Ни с чем критичным пока не столкнулся, только долго это — добавляю файлы какие требуются и вечером из дома обновляюсь, смотрю чего опять требует и т.д. Глобально много файлов обновил — не загрузилось :) Пока вот так, в процессе. Если есть советы — буду благодарен. :)
                    0
                    с 1,2 конечно помочь сложно ;)

                    3) — напиши простые скрипты для распаковки/запаковки, поищи альтернативные прошивки
                      0
                      С запаковкой файлов в rootfs нет проблем, проблема пока сделать чтоб и самба поновее была и все остальное не отвалисось :) Зависимости по списку обновляю, авось заработает ;)
                      Альтернативные прошивки для «домашних» линксис nas'ов есть, этот вроде как для бизнеса, для него не видел, хоть и искал :(
                      Хотя наверно от NSLU2 может подойти…
                        +1
                        Предлагаю по максимуму вынести бинарники и конфиги, связанные с самбой на другую файловую систему. Тогда будет значительно проще ковыряться.

                        Больше общих рекомендаций на ум не приходит. Если есть какие-то конкретные затыки, пишите, вдруг что придумаю.
                          +1
                          Если железка умеет грузиться по сети, то лучше всего на время отладки лучше всего использовать эту функцию. Это позволит быстро модифицировать как ядро так и rootfs. Ну и логи виднее.

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

                Самое читаемое