Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Шелезяки —> Canon/gphotofs

Монтирование фотоаппарата Canon через gphotofs

Автор: lissyara.


    Предистория. Подарил тёщще на новый год цифровик - Canon PowerShot A480 - попрощще, лишь бы снимал. Третье тысячелетие, а она с мыльницей плёночной рассекает =) К вечеру 1 января, вылезла проблема - цифровик был передан в руки жене, а та захотела смотреть/ковырять фотки в нём на компе...
   Подрубаем к компу, и видим стандартную для Canon картинку:
Jan  7 18:03:56 dc7700p kernel: ugen4.3: <Canon Inc.> at usbus4

Ладно. Это решаемо - топаем в порты и ставим:
dc7700p$ cd /usr/ports/
dc7700p$ make search name=gphotofs
Port:   fusefs-gphotofs-0.4.0_1
Path:   /usr/ports/graphics/fusefs-gphotofs
Info:   Mount PTP camera as a file system
Maint:  pav@FreeBSD.org
B-deps: fusefs-libs-2.7.4 gettext-0.18.1.1 glib-2.26.1_1 jpeg-8_3
libexif-0.6.18_1 libgphoto2-2.4.10.1 libiconv-1.13.1_1 libltdl-2.2.10
pcre-8.11 perl-5.10.1_3 pkg-config-0.25_1 python26-2.6.6
R-deps: fusefs-kmod-0.3.9.p1.20080208_7 fusefs-libs-2.7.4
gamin-0.1.10_4 gettext-0.18.1.1 gio-fam-backend-2.26.1 glib-2.26.1_1
jpeg-8_3 libexif-0.6.18_1 libgphoto2-2.4.10.1 libiconv-1.13.1_1
libltdl-2.2.10 pcre-8.11 perl-5.10.1_3 pkg-config-0.25_1 python26-2.6.6
WWW:    http://gphoto.sourceforge.net/proj/gphotofs/

Port:   sysutils/fusefs-gphotofs
Moved:
Date:   2009-10-05
Reason: Removed

dc7700p$ cd /usr/ports/graphics/fusefs-gphotofs
dc7700p$ make install clean

   Пробуем примонтировать цифровик:
dc7700p$ gphotofs /mnt
dc7700p$ df -h | grep mnt
/dev/fuse0                      0B      0B      0B     0%    /mnt
dc7700p$ ll /mnt/
total 0
drwxr-xr-x  2 root  wheel     0B  1 янв  1970 store_00010001
dc7700p$ ll /mnt/store_00010001/
total 0
drwxr-xr-x  2 root  wheel     0B  1 янв  1970 DCIM
dc7700p$ ll /mnt/store_00010001/DCIM/
total 0
drwxr-xr-x  2 root  wheel     0B  1 янв  1970 100CANON
dc7700p$ ll /mnt/store_00010001/DCIM/100CANON/
total 9434
-rw-r--r--  1 root  wheel   2,0M 18 дек 11:10 IMG_0001.JPG
-rw-r--r--  1 root  wheel   2,6M 31 дек 21:42 IMG_0002.JPG
-rw-r--r--  1 root  wheel   2,7M 31 дек 21:42 IMG_0003.JPG
-rw-r--r--  1 root  wheel   2,0M  7 янв 15:13 IMG_0004.JPG
dc7700p$ 

   Чё-то виднеется. На этом можно было бы и остановится. Но, жене в консоль негоже втыкать. Порылся в панельке управления KDE4 - цифровик такой в списках есть, вот тока цепляться не хочет. Толи нехватает чё-то, толи совсем помойко-ориентированные стали они.
   Ладно. Коммунисты не ищут лёгких путей. Есть sh, есть devd - больше ничё не надо. Для начала включаем дебаг и рестартуем devd:
dc7700p$ grep devd /etc/rc.conf 
devd_flags="-d -D"
dc7700p$ /etc/rc.d/devd restart
devd not running?
Starting devd.
Parsing /etc/devd.conf
setting scsi-controller-regex=(aac|adv|adw|aha|ahb|ahc|ahd|aic
|amd|amr|asr|bt|ciss|ct|dpt|esp|ida|iir|ips|isp|mlx|mly|mpt|ncr
|ncv|nsp|stg|sym|trm|wds)[0-9]+
Parsing files in /etc/devd
Parsing /etc/devd/asus.conf
Parsing /etc/devd/uath.conf
Parsing files in /usr/local/etc/devd

   Подрубаем аппарат, наблюдаем такой девайс на экране
Processing event '? at bus=1 hubaddr=1 port=4 devaddr=3 interface=0 vendor=0x04a9 product=0x31bf devclass=0x00 devsubclass=0x00 sernum="F7D1136708674498A2950C137682C518" release=0x0001 intclass=0x06 intsubclass=0x01 on uhub4'
Pushing table
setting bus=1
setting hubaddr=1
setting port=4
setting devaddr=3
setting interface=0
setting vendor=0x04a9
setting product=0x31bf
setting devclass=0x00
setting devsubclass=0x00
setting sernum=F7D1136708674498A2950C137682C518
setting release=0x0001
setting intclass=0x06
setting intsubclass=0x01
setting bus=uhub4
Processing nomatch event
Testing bus=uhub4 against ^pccard[0-9]+
Testing bus=uhub4 against ^uhub[0-9]+
Executing 'logger Unknown USB device: vendor 0x04a9 product 0x31bf bus uhub4'
Popping table

   Изучение devd.conf подсказывает мысль - править конфиг не надо, достаточно создать инклюд. Что и делаем. Рисуем такой файл (на самом деле, это примерно третий вариант - в первых двух внешнего скрипта не было, просто монтировался цифровик и на рабочем столе создавался симлинк. Была обнаружена проблема, что KDE не всегда корректно его понимала... Причина не понятна, да и красоты хотелось - чтоб значок был какой нужно) - vendor/product/release - из вышеприведённого лога:
dc7700p$ cat /usr/local/etc/devd/canon.conf
# mount canon photo using gphotofs
attach 100 {
        match   "vendor"        "0x04a9";
        match   "product"       "0x31bf";
        match   "release"       "0x0001";
        action  "/root/scripts/canon.A480.sh attach;";
};
# umount when dettach
detach 100 {
        match   "vendor"        "0x04a9";
        match   "product"       "0x31bf";
        match   "release"       "0x0001";
        action  "/root/scripts/canon.A480.sh dettach;";
};

dc7700p$ 

   Плюс дополнительный скрипт, который занимается красивостями - и не забываем сделать его исполняемым:
dc7700p$ cat /root/scripts/canon.A480.sh
#!/bin/sh

# цепляем цифровик
if [ x$1 = "xattach" ]
then
        # монтируем
        /usr/local/bin/gphotofs -o allow_other /mnt;
        # ставим права, на всякий случай
        /bin/chmod 775 /mnt;
        # перебираем всех пользователей
        cd /home/ && ls |
        {
        while read user
        do
                # file path
                file="/home/$user/Desktop/Canon.A480.desktop"
                # create file link
                echo '[Desktop Entry]'                          >> $file
                echo 'Comment[ru]='                             >> $file
                echo 'Comment='                                 >> $file
                echo 'Exec=/usr/local/kde4/bin/dolphin /mnt'    >> $file
                echo 'Icon=camera-photo'                        >> $file
                echo 'Name[ru]=Canon.A480'                      >> $file
                echo 'Name=Canon.A480'                          >> $file
                echo 'StartupNotify=true'                       >> $file
                echo 'Terminal=false'                           >> $file
                echo 'TerminalOptions='                         >> $file
                echo 'Type=Application'                         >> $file
                echo 'X-KDE-SubstituteUID=false'                >> $file
                # set permissions
                chown $user $file
                chmod 755 $file
        done
        }
        exit 0;
fi

# отцепляем цифровик
if [ x$1 = "xdettach" ]
then
        /sbin/umount -f /mnt;
        cd /home/ && ls |
        {
        while read user
        do
                cd /home/$user/Desktop && \
                rm -f /home/$user/Desktop/Canon.A480.desktop
        done
        }
        exit 0;
fi


echo "Usage: `basename $0` {attach|dettach}"

   Далее, убираем дебаг, рестартуем devd и пробуем. Должно работать.

Обновление, от 2011-06-26:
В последнем -CURRENT чё-то снова поменяли, перестало работать. Так что файл инклюда теперь должен выглядеть так:
# mount canon photo using gphotofs
notify 100 {
        match   "vendor"        "0x04a9";
        match   "type"          "ATTACH";
        action  "/root/scripts/canon.A480.sh attach;";
};
# umount when dettach
notify 100 {
        match   "vendor"        "0x04a9";
        match   "type"          "DETACH";
        action  "/root/scripts/canon.A480.sh dettach;";
};

И всё заработает.



размещено: 2011-01-07,
последнее обновление: 2011-06-26,
автор: lissyara


nero777, 2011-01-08 в 18:24:12

лис,как всегда,на высоте!
тёща тоже на фряхе,молодец!

ow, 2011-02-07 в 23:43:58

> dc7700p$ df -h | grep mnt

ведь можно df -h /mnt. зачем grep?

Alex Keda, 2011-02-08 в 9:22:05

привык

keks, 2011-03-20 в 12:38:37

Спасибо за статью. Не дала умерить FreeBSD 8.1 + KDE-4.5.5.
Мини подарок к 8 матра был)))))).
Сказал жене настроил по статье на лисяре автомоунт фотоаппарата Canon A610, на что она мне ответила, для девочек наверное этот способ)))))))). Прям вступление статьи читала)))))))))). Раньше я пользовался Digikam с разрешением на пользователя devfs.rules

FAndrey, 2011-08-13 в 3:20:58

Кстати или что то поменялось или у тебя уже был зарание подгружен модуль fusefs, иначе выдаёт
fuse: failed to open fuse device: No such file or directory
следственно надо либо ручками
# /usr/local/etc/rc.d/fusefs onestart
или прописать его в rc.conf
после этого вроде и gphotofs работает, надо посмотреть на твои решения в скриптах :)

Alex Keda, 2011-08-13 в 11:03:34

Ну, вообще-то, при установке этого самого фузе - вылезает окно с галкой про загрузку модуля. И он автоматом попадает в атозагрузку =)

FAndrey, 2011-08-13 в 14:31:44

AUTOSETUP=off (default)
так что если сильно зарание не позаботится, то всё пройдёт тихо и спокойно.
Сам fusefs когда то 100 лет назад поставился как зависимость к чему то, и не юзался. Соответственно при установке gphotofs оно просто глянуло что уже есть и всё, ничего доконфигурировать не надо было.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0725 секунд
Из них PHP: 31%; SQL: 69%; Число SQL-запросов: 77 шт.
Исходный размер: 32305; Сжатая: 8112