PDA

Bekijk de volledige versie : Поддержка unionfs



VA_DOS
19-02-2012, 13:42
Возникла у меня вдруг необходимость прикрутить на свой wl500gpv2 поддержку unionfs. Качнув модули с http://code.google.com/p/wl500g/ и не обнаружив его в качестве пре-компилированного, решил попробовать добавить поддержку самостоятельно.

Вооружившись coLinux по инструкции http://code.google.com/p/wl500g/wiki/CoLinux , поставив и настроив http://code.google.com/p/wl500g/wiki/CompilingCustomFirmware соответствующие тулчейны, кернел 2.6.22.19 взял крайнюю (r3815) ревизию.

Для начала решил попробовать просто сбилдить, ничего не меняя, как сразу же наступил на грабли - в процессе установке патчей на кернел (make kernel).

Лог:


./125-fs_splice_read.patch
Can not apply ./125-fs_splice_read.patch cleanly
make: [patch] Error 1
make: leaving directory /usr2/broadcom/src/1.9.2.7-rtn/kernel-2.6
make: [kernel_patch] Error 2

Подумав "мало ли, промежуточный релиз", взял r3702 и получил то же самое.

По логам - ошибки наложения патчей на fs/cifs/cifsfs.c

В связи с этим возникает вопрос - это такая своеобразная защита от скрипткидов, которую надо пофиксить? Или такой ошибки быть не должно и стоит копать в другую сторону?

VA_DOS
19-02-2012, 17:09
Пошел исправлять смещения в третьем патч-файле... В общем, складывается такое впечатление, что patch v2.5.4 из дистриба Slackware 12.2 отказывается вычислять некоторые из смещений.

Пока пересчитываю вручную. Кто еще пробовал собирать прошивку самостоятельно? У кого какая версия patch? Может, стоит обновить до какой-нибудь более "дружественной"?..

ryzhov_al
19-02-2012, 17:19
У кого какая версия patch? Может, стоит обновить до какой-нибудь более "дружественной"?..В Ubuntu 11.10:
$ patch --version
patch 2.6.1
Смещения отрабатывает, но не умеет удалять файлы, оставляет их нулевой длины, что чревато (http://www.wl500g.info/showthread.php?t=27384&page=15) для сборки xfs-модуля.

VA_DOS
19-02-2012, 19:24
По XFS - спасибо, учту :)

Последовательно перетянул со Slackware 13.1 в проинсталленную 12.2:

1. tar-1.23 (зависимость pkgtools)
2. xz-4.999.9beta (зависимость pkgtools)
3. pkgtools-13.1 (инсталлятор пакетов нового формата - txz)
4. patch-2.6.1 (починили расчет смещений)
5. glibc-solibs-2.11.1 (с дистрибом 12.2 поставляется glibc-2.7, тулчейн просит 2.11)

Кернел с модулями сбилдились. Спасибо. :)

В общем, фак, видать, малость устарел - лучше сразу ставить 13.1, а не 12.2.

Теперь теперь билд вылетел на busybox/editors/awk.c и busybox/libbb/pw_encrypt.c.


mipsel-uclibc-gcc -Wall -Wshadow -Wwrite-strings -Wundef -Wstrict-prototypes -Wunused -Wunused-parameter -Wunused-function -Wunused-value -Wmissing-prototypes -Wmissing-declarations -Wdeclaration-after-statement -Wold-style-definition -fno-builtin-strlen -finline-limit=0 -fomit-frame-pointer -ffunction-sections -fdata-sections -fno-guess-branch-probability -funsigned-char -static-libgcc -falign-functions=1 -falign-jumps=1 -falign-labels=1 -falign-loops=1 -Os -mips32 -mtune=mips32 -Wno-pointer-sign -DBCMWPA2 -DLINUX26 -Wl,-rpath /lib -o busybox_unstripped -Wl,--sort-common -Wl,--sort-section,alignment -Wl,--gc-sections -Wl,--start-group applets/built-in.o archival/lib.a archival/libarchive/lib.a console-tools/lib.a coreutils/lib.a coreutils/libcoreutils/lib.a debianutils/lib.a e2fsprogs/lib.a e2fsprogs/e2p/lib.a e2fsprogs/ext2fs/lib.a editors/lib.a findutils/lib.a init/lib.a libbb/lib.a libpwdgrp/lib.a loginutils/lib.a mailutils/lib.a miscutils/lib.a modutils/lib.a networking/lib.a networking/libiproute/lib.a networking/udhcp/lib.a printutils/lib.a procps/lib.a runit/lib.a selinux/lib.a shell/lib.a sysklogd/lib.a util-linux/lib.a util-linux/volume_id/lib.a archival/built-in.o archival/libarchive/built-in.o console-tools/built-in.o coreutils/built-in.o coreutils/libcoreutils/built-in.o debianutils/built-in.o e2fsprogs/built-in.o e2fsprogs/e2p/built-in.o e2fsprogs/ext2fs/built-in.o editors/built-in.o findutils/built-in.o init/built-in.o libbb/built-in.o libpwdgrp/built-in.o loginutils/built-in.o mailutils/built-in.o miscutils/built-in.o modutils/built-in.o networking/built-in.o networking/libiproute/built-in.o networking/udhcp/built-in.o printutils/built-in.o procps/built-in.o runit/built-in.o selinux/built-in.o shell/built-in.o sysklogd/built-in.o util-linux/built-in.o util-linux/volume_id/built-in.o -Wl,--end-group
==========
/opt/brcm/hndtools-mipsel-uclibc-4.4.6-K26/lib/gcc/mipsel-linux-uclibc/4.4.6/../../../../mipsel-linux-uclibc/bin/ld: /usr/lib/libz.so.1: no version information available (required by /opt/brcm/hndtools-mipsel-uclibc-4.4.6-K26/lib/gcc/mipsel-linux-uclibc/4.4.6/../../../../mipsel-linux-uclibc/bin/ld)
networking/lib.a(ipcalc.o): In function `ipcalc_main':
ipcalc.c:(.text.ipcalc_main+0x268): warning: gethostbyaddr is obsolescent, use getaddrinfo() instead.
util-linux/lib.a(mount.o): In function `nfsmount':
mount.c:(.text.nfsmount+0xe8): warning: gethostbyname is obsolescent, use getnameinfo() instead.
editors/lib.a(awk.o): In function `evaluate':
awk.c:(.text.evaluate+0xa4c): undefined reference to `cos'
awk.c:(.text.evaluate+0xa5c): undefined reference to `exp'
awk.c:(.text.evaluate+0xa6c): undefined reference to `log'
awk.c:(.text.evaluate+0xa7c): undefined reference to `sin'
awk.c:(.text.evaluate+0xaa0): undefined reference to `sqrt'
awk.c:(.text.evaluate+0xf74): undefined reference to `pow'
editors/lib.a(awk.o): In function `exec_builtin':
awk.c:(.text.exec_builtin+0x148): undefined reference to `atan2'
libbb/lib.a(pw_encrypt.o): In function `pw_encrypt':
pw_encrypt.c:(.text.pw_encrypt+0x8): undefined reference to `crypt'
collect2: ld returned 1 exit status
make[1]: *** [busybox_unstripped] Error 1
make[1]: Leaving directory `/home/usr2/broadcom/src/gateway/busybox'
make: *** [busybox] Error 2

Похоже на неподтянутые из тулчейна libcrypt.a и libm.a. Путь к lib тулчейна что ли прописать в $PATH ?

Хотя, скорее, надо бы поэкспериментировать с $LD_LIBRARY_PATH. ryzhov_al, не могли бы вы выложить содержимое этой переменной на своей машине?

ryzhov_al
20-02-2012, 03:36
Хотя, скорее, надо бы поэкспериментировать с $LD_LIBRARY_PATH. ryzhov_al, не могли бы вы выложить содержимое этой переменной на своей машине?$LD_LIBRARY_PATH я на сборочном стенде не трогал, но сборка у меня не шла пока не добавил в пути папку бинарников тулчейна:

$ export PATH=$PATH:/opt/brcm/hndtools-mipsel-uclibc/bin

ЗЫ Сейчас посмотрел: $LD_LIBRARY_PATH на сборочной машине вовсе не определена.

VA_DOS
20-02-2012, 21:07
Проблема решилась после обнаружения в логах ошибок xargs и перетягивания еще одного пакета - findutils-4.4.2.
Компилим дальше...

В общем, пришлось доустановить еще несколько обновлений (в т.ч. на gettext) прежде, чем удалось собрать прошивку.
Ось явно стоит ставить по-новее, чтоб не мучиться с анализом логов ошибок билда на предмет чего бы еще обновить.

VA_DOS
23-02-2012, 11:46
А знаете как удалось победить? Удалением двух пустых файлов.

me@VBox:~/Projects/firmware_r3722/src/gateway$ rm ../linux/linux-2.6/fs/xfs/Kbuild
me@VBox:~/Projects/firmware_r3722/src/gateway$ rm ../linux/linux-2.6/fs/xfs/Makefile-linux-2.6

Не сильно грязный хак?


Поздравляю! Практически гениально!
Но это значит, что мы возвращаемся к исходной позиции - дряхлые(кривые) patchutils которые не могут корректно отработать 149-fs-xfs.patch и удалить fs/xfs/Kbuild и fs/xfs/Makefile-linux-2.6

А зачем сразу хак? Просто обновите в репозитории файлик /patch.sh, добавив повсеместно для запуска утилиты patch ключик -E, и все хорошо.



Да, для r3702 вроде как собрал модуль unionfs v2.5.11. На выходных потестирую.

theMIROn
23-02-2012, 12:04
Да, для r3702 вроде как собрал модуль unionfs v2.5.11. На выходных потестирую.

собираться то оно собирается (если брать от 2.6.22.19 - это слишком старое, код fs у нас обновлен). нужно подтверждение работоспособности

VA_DOS
24-02-2012, 08:50
код fs у нас обновлен

это я уже оценил, пока портил :) при чем не только fs, но и mm, что куда более серьезнее.

поэтому брал от 2.6.23.17, вроде как больше всего похоже. посмотрим, что получится.

А strace у кого-нибудь есть уже собраный? Действительно, модуль собирается, прекрасно регистрируется в системе (о чем трейсит в dmesg), да не монтирует mount'ом ничего.

ryzhov_al
24-02-2012, 09:34
А strace у кого-нибудь есть уже собраный? Действительно, модуль собирается, прекрасно регистрируется в системе (о чем трейсит в dmesg), да не монтирует mount'ом ничего.strace (http://linux.die.net/man/1/strace)? Мы точно об одном и том же говорим?

$ opkg install strace

VA_DOS
24-02-2012, 17:11
Благодарю.

Очень даже правильно. Не одними printf'ами ж попытки монтирования дебажить. :) Надо бы еще сбилдить его в режиме отладки и глянуть syslog.

А вообще на unionfs.org рекомендуют просто переходить AuFS. К чему бы это...

Хм, оказывается, все очень даже работает. Просто не надо было вручную делать insmod. Просто надо было скопировать новые модули и дать системе самой прогрузить то, что требуется. :)

Мне, вообще, нужно было для объединения нескольких NAS-источников в одном месте. Но можно, к примеру, приспособить под монтирование зеркала / на флешку в режиме rw... Вариантов масса.

В приложении можно забрать (для r3702):

1. 149-fs-unionfs.patch.tar.gz - распаковать в /kernel-2.6, собственно, unionfs v2.5.11 for 2.6.23.17 с косметическими правками. (необходимо)

2. kernel.config.tar.gz - распаковать в /kernel-2.6, просто добавлено 3 пункта: CONFIG_UNION_FS, CONFIG_UNION_FS_XATTR и CONFIG_UNION_FS_DEBUG. (необходимо)

3. patch.sh.tar.gz - распаковать в /, просто добавлен ключ "-E" для запуска утилиты patch, принудительная проверка и удаление пустых файлов. (по желанию, исправляет ошибку с пропуском сборки xfs)

theMIROn
24-02-2012, 23:51
1. 149-fs-unionfs.patch.tar.gz - распаковать в /kernel-2.6, собственно, unionfs v2.5.11 for 2.6.23.17 с косметическими правками. (необходимо)
for 2.6.27 тоже должен заработать, в теории.
есть ли разница?

VA_DOS
25-02-2012, 10:17
Я специально смотрел диффом перед тем, как собирать, что больше всего похоже на текущий кернел с патчами.

Разница - в отсутствующих fs и mm обновлениях, накатив которые надо будет каскадно обновлять все зависящие от них модули. Заставить же работать на текущих версиях будет несколько проблематично, при том, что изменений функциональных/стабилити - аж никаких. Т.е. если спортировать к нам версию для более старшего ядра, подпилив под имеющиеся кернел апи, мы просто получим тот же unionfs, только для более старой версии кернел.

Если интересно какие патчи на кернел требуется перетянуть (это по диффу версий unionfs for 2.6.xx):


2.6.23.12 -> 2.6.24.7

Изменен интерфейс kmem_cache_create() (mm) - изменения прототипа указателя до (*ctor)(struct kmem_cache *, void *)

2.6.24.7 -> 2.6.25.20

Должна быть расширена структура struct nameidata в хидере fs.h новым полем-структурой(или юнионом?) path, под которую перемещены поля struct dentry *dentry и struct vfsmount *mnt

Должны быть какие-то расширения для iget(), не вникал какие именно.

В namei.h должны быть реализации новых функций pathget(), pathput() ; ну, это дописать несложно.

2.6.25.20 -> 2.6.26.8

В fs.h в структуре struct super_operations изменен прототип указателя на функцию: void (*umount_begin)(struct super_block *) , т.е. убран второй параметр - флаги.

2.6.26.8 -> 2.6.27.59

В файле fs.h в структуре struct inode_operations изменен прототип указателя на функцию int (*permission)(struct inode *, int) , т.е. убран третий параметр - struct nameidata *

Очередное изменение интерфейса kmem_cache_create() (mm) - изменения прототипа указателя до (*ctor)(void *)

theMIROn
25-02-2012, 11:20
при том, что изменений функциональных/стабилити - аж никаких.
это и интересовало в первую очередь. чтож, тогда да, смысла нет переезжать на более старшие версии.


Т.е. если спортировать к нам версию для более старшего ядра, подпилив под имеющиеся кернел апи, мы просто получим тот же unionfs, только для более старой версии кернел.
спасибо за анализ, надеюсь он полный.
включу unionfs в отдельные модули


Если интересно какие патчи на кернел требуется перетянуть (это по диффу версий unionfs for 2.6.xx):
Эти изменения потянут за собой и массу других в плане fs минимум, на текущий момент не думаю,что необходимо.
lly может меня поправить, он занимался апдейтами fs

VA_DOS
25-02-2012, 13:01
включу unionfs в отдельные модули

Спасибо, будем ждать.

lly
25-02-2012, 13:32
Эти изменения потянут за собой и массу других в плане fs минимум, на текущий момент не думаю,что необходимо.
lly может меня поправить, он занимался апдейтами fs
Из кардинальных апдейтов fs это splice, sendfile, iov_iter(интерфейсы write_begin/write_end), d_obtain_alias, обновления writeback, exportfs.

Из того, что можно найти сходу по ключу unionfs:
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=73b1262fa43a778b1e154deea63 2cdef5009d6a1
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=d9fe526a83b84edc9c5ff217a00 c896bfc20b2ce
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=a0ee5ec520ede1dc8e2194623bc ebfd9fab408f2
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=5b6ca027d85b7438c84b78a54cc dc2e53f2909cd

Но посмотреть насколько это актуально в ближайшее время не смогу :(

Просьба к VA_DOS - написать подробнее зачем потребовалась unionfs на роутере.

theMIROn
25-02-2012, 14:07
Просьба к VA_DOS - написать подробнее зачем потребовалась unionfs на роутере.

Ну , я вот лично вижу вполне удобную возможность объединения squshfs и jffs* вместо архива flashfs вне /usr/local

lly
25-02-2012, 14:30
Ну , я вот лично вижу вполне удобную возможность объединения squshfs и jffs* вместо архива flashfs вне /usr/local
Хм, а как? В текущей конфигурации в /etc появляются временные файлы, формируемые на основе nvram. И их незачем сохранять в jffs...

P.S. Не смотрел - overhead большой?

theMIROn
25-02-2012, 15:37
Хм, а как? В текущей конфигурации в /etc появляются временные файлы, формируемые на основе nvram. И их незачем сохранять в jffs...в теории же. на практике будет как всегда.
как минимум, даже сейчас можно запретить flashfs и дропбир, организовать там jffs и из preboot монтировать...


P.S. Не смотрел - overhead большой?
экспорты.



2. kernel.config.tar.gz - распаковать в /kernel-2.6, просто добавлено 3 пункта: CONFIG_UNION_FS, CONFIG_UNION_FS_XATTR и CONFIG_UNION_FS_DEBUG. (необходимо)

а это еще зачем CONFIG_UNION_FS_XATTR=y, CONFIG_FS_MBCACHE=y, CONFIG_FS_POSIX_ACL=y, CONFIG_GENERIC_ACL=y, CONFIG_TMPFS_POSIX_ACL=y?

VA_DOS
25-02-2012, 15:54
Просьба к VA_DOS - написать подробнее зачем потребовалась unionfs на роутере.

Ну, лично мне оно понадобилось сугубо для использования роутера еще и в качестве централизированного NAS.

Длительное время спокойно жил с одним USB-винтом подключенным к роутеру и расшаренным по smbd в качестве медиа-хранилища.

С недавних пор появился WDTV Live Hub (по сути - сетевой медиа-плеер со встроенным винтом и возможностями NAS). Создав на нем ту же структуру каталогов и смонтировав на роутере через unoinfs поверх уже имеющейся, получил единое сетевое медиа-хранилище. Которое, к тому же, пополняется крутящимся на роутере rtorrent.

theMIROn
25-02-2012, 16:00
ок, что насчет xattr?

VA_DOS
25-02-2012, 16:00
а это еще зачем CONFIG_UNION_FS_XATTR=y, CONFIG_FS_MBCACHE=y, CONFIG_FS_POSIX_ACL=y, CONFIG_GENERIC_ACL=y, CONFIG_TMPFS_POSIX_ACL=y?

Добавлял лишь:


CONFIG_UNION_FS=m
# CONFIG_UNION_FS_XATTR is not set
# CONFIG_UNION_FS_DEBUG is not set

В раздел "Miscellaneous filesystems". Исходник файла - ревизия r3702, не HEAD.

theMIROn
25-02-2012, 16:05
В раздел "Miscellaneous filesystems". Исходник файла - ревизия r3702, не HEAD.

Спасибо что не для 1.9.2.7-d :)
Проверь с актуальным репозитарием, большая просьба

VA_DOS
25-02-2012, 16:12
Ну, не так страшен дифф как его малюют :)

Полез за r3826.

Вот kernel.config для r3826.

Результаты будут позже - оно ж только часа два-три собирается...

VA_DOS
25-02-2012, 19:08
Итак, собрал для wl500gpv2 на базе r3826. Прошил, проверил. Подтверждаю - работает.

P.S> Не к этой теме, но все-таки: в r3826, похоже, lly что-то забыл обновить в версионном контроле, ибо собралась она у меня с именем r3825M.

lly
25-02-2012, 19:25
P.S> Не к этой теме, но все-таки: в r3826, похоже, lly что-то забыл обновить в версионном контроле, ибо собралась она у меня с именем r3825M.
Не к этой. В гуглкоде общий svn - trunk/branches/toolchain/wiki. А в транке последний коммит 3825.

theMIROn
25-02-2012, 20:50
Итак, собрал для wl500gpv2 на базе r3826. Прошил, проверил. Подтверждаю - работает.
r3827/r3828

VA_DOS
25-02-2012, 21:18
Смотрю, там сейчас массовые вливания в самом разгаре. Ночной билд ставить не буду, лучше днем попробую свежий TIP.

Спасибо!

Проверил r3832 на wl500gpv2 - работает.