суббота, 3 октября 2009 г.

makeinfo: not found

При очередном обновлении портов заметил странную вещь:
% portupgrade -ap
---> Upgrading 'libtool-2.2.6a' to 'libtool-2.2.6a_1' (devel/libtool22)
---> Building '/usr/ports/devel/libtool22'
===> Cleaning for libtool-2.2.6a_1
===> Extracting for libtool-2.2.6a_1
=> MD5 Checksum OK for libtool-2.2.6a.tar.gz.
=> SHA256 Checksum OK for libtool-2.2.6a.tar.gz.
===> Patching for libtool-2.2.6a_1
===> Applying FreeBSD patches for libtool-2.2.6a_1
/usr/bin/sed -i.bak -e 's|sed gsed|sed|g' /usr/obj/usr/ports/devel/libtool22/work/libtool-2.2.6/configure
===> Configuring for libtool-2.2.6a_1
## ------------------------- ##
## Configuring libtool 2.2.6 ##
## ------------------------- ##

checking for a BSD-compatible install... /usr/bin/install -c -o root -g wheel
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... libltdl/config/install-sh -c -d
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether subdir libobjs are useable... yes
.....
make all-recursive
test -f doc/.dirstamp || make doc/.dirstamp
restore=: && backupdir=".am$$" && am__cwd=`pwd` && cd . && rm -rf $backupdir && mkdir $backupdir && if (makeinfo --no-split --version) >/dev/null 2>&1; then for f in ./doc/libtool.info ./doc/libtool.info-[0-9] ./doc/libtool.info-[0-9][0-9] ./doc/libtool.i[0-9] ./doc/libtool.i[0-9][0-9]; do if test -f $f; then mv $f $backupdir; restore=mv; else :; fi; done; else :; fi && cd "$am__cwd"; if makeinfo --no-split -I doc -I ./doc -o ./doc/libtool.info ./doc/libtool.texi; then rc=0; cd .; else rc=$?; cd . && $restore $backupdir/* `echo "././doc/libtool.info" | sed 's|[^/]*$||'`; fi; rm -rf $backupdir; exit $rc
makeinfo: not found
*** Error code 127

Stop in /usr/obj/usr/ports/devel/libtool22/work/libtool-2.2.6.
*** Error code 1

Stop in /usr/obj/usr/ports/devel/libtool22/work/libtool-2.2.6.
*** Error code 1

Stop in /usr/obj/usr/ports/devel/libtool22/work/libtool-2.2.6.
*** Error code 1

Stop in /usr/ports/devel/libtool22.
** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portupgrade20091003-1547-1j96bj1-0 env UPGRADE_TOOL=portupgrade UPGRADE_PORT=libtool-2.2.6a UPGRADE_PORT_VER=2.2.6a make DEPENDS_TARGET=package
** Fix the problem and try again.
** Listing the failed packages (-:ignored / *:skipped / !:failed)
! devel/libtool22 (libtool-2.2.6a) (unknown build error)


Оказывается, новый мир был собран с опцией WITHOUT_INFO=true в файле /etc/make.conf, а при очередной чистке устаревших библиотек система лишилась доступа к info-файлам установленных приложений.

Решение этой проблемы найдено очень быстро:
1) Убираем вредную строчку из /etc/make.conf (и из /etc/src.conf, если она там была);
2) Собираем и устанавливаем недостающие библиотеки мира
% cd /usr/src/gnu/usr.bin/texinfo/
% make && make depend && make install
===> libtxi (all)
===> makeinfo (all)
===> info (all)
===> infokey (all)
===> install-info (all)
===> texindex (all)
===> doc (all)
===> libtxi (depend)
===> makeinfo (depend)
===> info (depend)
===> infokey (depend)
===> install-info (depend)
===> texindex (depend)
===> doc (depend)
===> libtxi (install)
===> makeinfo (install)
===> info (install)
===> infokey (install)
===> install-info (install)
===> texindex (install)
===> doc (install)
% rehash


После этого апгред порта проходит нормально.

суббота, 5 сентября 2009 г.

FreeBSD: Automount

Известная проблема непривелегированного использования съёмных носителей с неродными файловыми системами с использованиеванием таблиц перекодирования символов (mount_msdosfs: msdosfs_iconv: Operation not permitted) под FreeBSD может быть решена, собственно, самой системой.

Как это есть


Обычный сценарий использования съёмного носителя под операционными системами класса Unix заключается в следующем:
  1. Подсоединить устройство с носителем к внешнему интерфейсу (USB, SAS, FireWire).
  2. Создать каталог-точку монтирования (если каталог не создан заранее).
  3. Смонтировать сменный носитель в каталог-точку монтирования с опциями по перекодированию символов неродной файловой системы в родную файловую систему и обратно.
  4. Поработать с файловой системой носителя.
  5. Демонтировать сменный носитель.
  6. Отсоединить устройство.

Все эти действия пользователь выполняет без какой-либо автоматизации, вручную!

В отличие от вездесущего Linux-демона HAL, работающего в связке с PolicyKit и демоном информационной шины D-Bus, встроенные системные средства FreeBSD позволяют обойтись без нагромождений стороннего софта. Естественно, модуль конвертации кодировок msdosfs_iconv из одной системы в другую и обратно всё же должен быть прописан в автозагрузке в файле /boot/loader.conf (msdosfs_iconv_enable="YES"), либо вкомпилирован в ядро системы (options MSDOSFS_ICONV).

"Всё должно быть просто, но не так чтобы сильно." © кто-то из великих

Преамбула


Только хозяин (owner, создатель) каталога может производить в него монтирование устройств, работать с файловой системой смонтированого устройства как ему вздумается. Демон devd(8) (device state change daemon) работает с системной (root) учётной записью и у него нет понятия "текущий пользователь" (строго говоря, FreeBSD — это многопользовательская ОС, в которой одновременно работают различные процессы под разными учётными записями). В общем, демон devd(8) имеет понятие только об устройствах (классах устройств) виртуальной файловой системы devfs(8), файловой системе вообще и событиях, случающихся в системе, но не имеет понятия, какой пользователь подсоединил или отсоединил девайс.

Фокус-покус


Хорошая новость: FreeBSD больше не падает при отсоединении неотмонтированной флэшки. А именно это будет происходить всякий раз, при использовании следующего описания. Хотя и не страшно.

Пишем в /etc/devd.conf следующие строчки:

# Automount
attach 10 {
match "device-name" "umass[0-9]+";
action "sleep 4 && mkdir -p /media/$device-name && chown -R username /media/$device-name && \
(/sbin/mount_msdosfs -o sync -L ru_RU.UTF-8 -D CP1251 /dev/da0s1 /media/$device-name || \
/sbin/mount_msdosfs -o sync -L ru_RU.UTF-8 -D CP1251 /dev/da0 /media/$device-name)";
};
detach 10 {
match "device-name" "umass[0-9]+";
action "/sbin/umount -f /media/$device-name && rm -r /media/$device-name";
};

Запускаем демон состояния виртуальной файловой системы устройств:
% echo 'devd_enable="YES"' >> /etc/rc.conf
% /etc/rc.d/devd start

Или рестартуем его, если он работает (чтобы он перечитал свой конфиг):
% /etc/rc.d/devd restart
Stopping devd.
Starting devd.

На события attach/detach демон devd(8) реагирует следующим образом: определяет, какой тип устройства подключается/отключается (здесь: umassНомерустройства) и совершает соответствующее действие (action). Из описанных действий нетрудно понять, каким образом ведётся работа с флэшкой.

При подсоединении съёмного носителя (флэшки) будет создан каталог /media/umass0, носитель будет подвергнут проверке fsck и, если никаких ошибок не найдено, созданный каталог изменит владельца на username, и в этот каталог смонтируется устройство /dev/da0s1 (первый слайс накопителя с файловой системой FAT). После этого пользователь, имеющий учётную запись username, сможет работать с устройством как с собственным файловым хранилищем.

Так как устройство работает в синхронном режиме, то есть данные на носитель пишутся и читаются последовательно, без отложенных операций, то ручное отмонтирование не требуется — по завершении всех операций достаточно просто отсоединить устройство — это событие заставит демон devd(8) выполнить действия по очистке точки монтирования, как в виртуальной файловой системе devfs (демонтирует каталог /dev/da0s1), так и в реальной файловой системе (удалит временный каталог /media/umass0).

Три ложечки дёгтя


  1. Необходимость в использовании имени учётной записи пользователя (username), к которому привязывается точка монтирования;
  2. Фиксированное название раздела носителя (da0s1) не позволит смонтировать в автоматическом режиме другие носители;
  3. Фиксированный тип файловой системы (msdosfs) на монтируемом носителе не позволяет правилом attach смонтировать носитель, с тем же названием раздела, но с отличной от FAT ФС.


P.S.


Я имею представление о портах, позволяющих обходить проблему автомонтирования флэшек с разных сторон: sysutils/kiconvtool и sysutils/automounter. Но лично у меня первый порт не заработал (ошибка осталась), а второй несколько избыточен по функциональности (надстройка над amd(8)).

четверг, 13 августа 2009 г.

Diablo JDK 1.6: ошибка в VM

Информация о системе


> uname -rsm
FreeBSD 8.0-BETA2 amd64
Дерево портов обновлено.

Инсталляция и неудачный запуск


% portinstall -p java/diablo-jdk16
...
===> Registering installation for diablo-jdk-1.6.0.07.02_5
...
===> Building package for diablo-jdk-1.6.0.07.02_5
...
===> Cleaning for diablo-jdk-1.6.0.07.02_5
---> Cleaning out obsolete shared libraries
[Updating the pkgdb in /var/db/pkg ... - 444 packages found (-0 +1) . done]
% rehash
% java -version
Error occurred during initialization of VM
Unable to load ZIP library: /usr/local/diablo-jdk1.6.0/jre/lib/amd64/libzip.so
%

Решение проблемы

% echo "libz.so.4 libz.so.5 #for diablo-jdk1.6" >> /etc/libmap.conf
% rehash
% java -version
Diablo Java(TM) SE Runtime Environment (build 1.6.0_07-b02)
Diablo Java HotSpot(TM) 64-Bit Server VM (build 10.0-b23, mixed mode)
%