Підключення камер для передачі даних до комп’ютерів з операційними системами POSIX-родини
Не відповімо ми з усією визначеністю. Бо один із принципів спільноти Open Sources — «Справа порятунку потопаючих — справа самих потопаючих». І якщо виробники «заліза» не виявляють схильності до піклування про волелюбних користувачів - вони подбають про себе самі. А як вони це роблять — ми намагатимемося продемонструвати у цій статті.
Як об'єкт для вправ була обрана досить рідкісна поки що операційна система POSIX-родини — DragonFlyBSD (відомості про неї в англомовному виконанні можна знайти на сайті проекту, а українською — тут). Чому така екзотика? По-перше, як сказав би товариш Сталін, іншої ОС у нас не було під рукою. А по-друге, ми намагалися показати, що навіть у такій молодій і мало поширеній ОС, якщо розібратися, жодних складнощів при роботі з цифровими фотоматеріалами не виникає. Так що не слід чекати їх і у FreeBSD і тим більше в будь-якому user-орієнтованому дистрибутиві Linux. А взагалі особливості, специфічні для кожної ОС, будуть за необхідності в ході справи відзначатись окремо.
Ми навряд чи помилимося, якщо припустимо, що майже будь-яка щойно куплена в магазині цифрова камера передбачає підключення до комп'ютера за допомогою USB-інтерфейсу. Так що перше завдання, яке постає перед фото-користувачем вільної POSIX-системи - це доступ до знятих матеріалів. І для її вирішення потрібно знати кілька простих речей.
Перше - те, куди записуються зняті кадри, є вбудованим або (що останнім часом буває частіше) знімний твердотільний накопичувач типу Compact Flash і так далі - нині ім'я їм легіон. Деталі реалізації їх нас не хвилюють - досить того, що вони нічим не відрізняються від флешки з USB-роз'ємом. Тож надалі називатимемо їх просто «камерними»накопичувачами.
"Камерний" накопичувач, поза залежністю від його типу, несе на собі файлову систему - і нею буде будь-який варіант FAT (VFAT при об'ємах до 2 ГБ і FAT32 - на більш ємних носіях). Так що проблема доступу до «камерного» носія інформації зводиться просто до монтування його файлової системи в загальну файлову ієрархію нашої ОС — чи то Linux, чи будь-який представник BSD-родини.
Звичайно, бувають камери і з накопичувачами як би без файлової системи, але це явище відносно рідкісне. Та й враження про відсутність файлової системи - лише здається. Адже, якщо відзняті кадри з'являються в кінцевому рахунку у вигляді файлів відповідних графічних форматів, файлова система матиме місце в будь-якому випадку. Просто реалізація USB-інтерфейсу конкретної моделі камери може бути такою, що вона не дає користувачеві прямого доступу до файлової системи свого носія. Однак це не привід для відчаю, і методи боротьби з таким неподобством ми розглянемо нижче.
А тим часом набирає чинності другий момент: з причин, що історично склалися, в POSIX-системах будь-які пристрої зберігання інформації, інтерфейс яких не IDE/ATA, постають як вінчестери SCSI - в тому числі і всі USB-накопичувачі. Відповідно, і монтуватися вони повинні як звичайні SCSI-диски - тобто блокові пристрої, яким відповідають файли типу /dev/sda# (Linux) або /dev/da# (BSD).
Припустимо, проблему ідентифікації імені файлу пристрою, що відповідає «камерному» накопичувачу та підлягає монтуванню, ми благополучно вирішили (повірте, на практиці це набагато простіше, ніж на словах). І тепер приступаємо до власне монтування. У Linux це виглядатиме так: $ mount -t vfat /dev/sda /mnt_point
де значення опції -t визначає типфайлової системи, /dev/sda - ім'я файлу несучого її пристрою (у прикладі - не розміченого як дисковий розділ), а /mnt_point - існуючий (і, бажано, порожній) каталог - так звана точка монтування (наприклад, /mnt/dc - саме в підкаталоги каталогу /mnt прийнято монтувати різного роду змінні накопичувачі).
У BSD-системах немає єдиної команди для монтування файлових систем різних типів – за кожну з них відповідає власна програма. І тому процедура монтування буде трохи іншою: $mount_msdos /dev/da0 /mnt_point
де mount_msdos – команда монтування файлових систем FAT-родини, а /dev/da0 – ім'я файлу SCSI-пристрою (від Direct Access). Можлива інша форма: $ mount -t msdos /dev/da0 /mnt_point
Тут опція -t загальної команди mount викликає програму для встановлення відповідної файлової системи.
В обох прикладах як носій файлової системи фігурує накопичувач, не розмічений як дисковий розділ (raw-пристрій). Якщо ж розділ на ньому був створений — ім'я відповідного файлу буде на кшталт /dev/sda1 в Linux і /dev/da0s1 в BSD. Цифра 1 як ідентифікатор не обов'язкова - вбудований накопичувач може бути помічений і як 4-й, наприклад, первинний розділ (чому - ця таємниця велика є).
Якщо підключення цифрової камери здійснюється регулярно, можна спростити введення відповідних команд монтування – для цього потрібно вписати у файл /etc/fstab рядок на кшталт /dev/sda1 /mnt/dc vfat noauto,user 0 0
у Linux або /dev/da0s1 /mnt/dc msdos rw,noauto 0 0
у FreeBSD (і DragonFlyBSD). І тепер для монтування нашого «камерного» пристрою як аргумент команди mount достатньо вказати точку монтування, а потреби в будь-яких опціях не буде взагалі: $ mount /mnt/dc
Звернемоувага на слово user у прикладі для Linux — ця опція дозволить виконувати монтування «камерного» накопичувача звичайному користувачеві, який не має повноважень адміністратора. У BSD-системах аналогічного результату можна досягти за допомогою команди $sysctl vfs.usermount=1
Так, ще: монтування USB-носіїв як SCSI-пристроїв вимагає, щоб ядро системи було зібрано з підтримкою («жорсткою» або модульною) відповідних опцій, тобто: загальної підтримки SCSI, підтримки SCSI-дисків, USB-інтерфейсу взагалі та USB -«сховищ» (usb mass storage) зокрема, не кажучи вже про файлову систему FAT та її модифікацію VFAT. Втім, морочитися цим користувачеві особливо не потрібно: прекомпільовані ядра сучасних user-орієнтованих дистрибутивів Linux збираються саме так. А у FreeBSD і DragonFlyBSD ядро GENERIC підтримує все необхідне як модулі, які навіть не вимагають ручного завантаження — воно відбувається автоматично при зверненні до відповідних пристроїв і файлових систем.
З файловою системою змонтованого «камерного» носія можна надходити так само, як і з будь-яким каталогом нашої спільної файлової системи, тобто переглядати її за допомогою команди типу $ls/mnt/dc
копіювати з неї файли до свого домашнього каталогу або куди завгодно ще, і навіть записувати файли на неї. Потрібно лише пам'ятати, що власне файли знятих кадрів можуть бути закопані досить глибоко у вкладених підкаталогах усередині /mnt/dc.
Описана процедура була зроблена нами в DragonFlyBSD для камер, що опинилися під рукою: Casio QV4000 і Minox Leica M3. У першій ролі носіїв використовувався Compact Flash 512 (число — обсяг у мегабайтах), друга змінного носія немає (тільки вбудований накопичувач). Жодних проблем помічено небуло…
Тепер розглянемо ситуацію, коли після під'єднання камери змонтувати її накопичувач як дисковий пристрій так і не вдалося, і команда mount видає повідомлення про помилку типу mount: /dev/da0s1: Device not configured
Саме така ситуація виникла, коли ми спробували отримати доступ до того ж CompactFlash у камері Canon EOS D60. Причому DragonFlyBSD (і FreeBSD також) її цілком можна передбачити в момент підключення - в цих ОС інформація про будь-який пристрій «гарячого підключення» виводиться на перший віртуальний термінал, що виконує роль системної консолі. І якщо для камер, що не маскують файлову систему свого накопичувача, це повідомлення буде виглядати приблизно як umass0: OnSpec USB 2.0 Storage Device, rev 2.00/1.00 -0 device da0: 1.000MB/s transfers da0: 38154MB (78140160 512 byte sectors: 255H 63S/T 4864C)
то у випадку з камерою типу Canon EOS D60 відповіддю буде радісне повідомлення про підключення абстрактного пристрою ugen# (USB Generic номер такий-то), що є пристроєм символьним і, відповідно, не може бути змонтованим.
До вирішення цієї проблеми можна підійти двома шляхами. Перший - просто вийняти "камерний" накопичувач і вставити його в кард-рідер - благо останніх нині чимало, всі вони орієнтовані на безліч форматів і зазвичай мають USB-інтерфейс. Зокрема, ми скористалися пристроєм All-in-Black 12 in 1 USB2, який сприймає, як можна зрозуміти з його імені, карти 12 форматів. В результаті колишній «камерний» накопичувач був змонтований як SCSI-диск, приблизно так, як було описано вище: $ mount -t msdos /dev/da0s1 /mnt/dc
До речі, такий спосіб придатний і для доступу до будь-яких"камерним" накопичувачам, якщо їх фізично можна витягти з камери. Перевага його, перед прямим підключенням камери до комп'ютера, полягає в тому, що зчитування відбувається по інтерфейсу USB2: з не цілком зрозумілої причини, самі по собі камери, навіть не з дешевих, досі оснащуються тільки роз'ємом USB1. програмний шлях
Однак що робити, якщо а) «камерний» носій незнімний (хоча таке нині зустрічається не дуже часто), б) під рукою немає кард-рідера відповідного формату, або в) просто ліниво витягувати картку з камери і вставляти її кудись?
У цих випадках допоможе прийде програма, спеціально призначена для «зняття» кадрів з цифрових фотокамер — gphoto2. Отримати її у вихідних текстах можна із сайту проекту (http://www.gphoto.org/). Входить вона також до складу портів та пакетів FreeBSD, а також у постачання поширених дистрибутивів Linux. Це утиліта командного рядка, яка, запущена з належними опціями, виконує сканування портів, до яких може бути підключена цифрова камера (USB або, для любителів архаїки, серіальних), автоматичне визначення підтримуваних пристроїв і підключення відповідного драйвера (а список камер, з якими ця програма працює, дуже великий) і їх перекачування на локальну машину - подібно до того, як це роблять звичайні ftp-клієнти для файлів з віддалених серверів.
Опції команди gphoto2 дуже численні, з ними можна ознайомитися на man-сторінці — man (1) gphoto2. Тому затримаємо увагу лише на деяких із них.
Для автоматичного підключення камери команда gphoto2 надається таким чином: $ gphoto2 --auto-detect
Спрацює він, однак, тільки в тому випадку, якщо камера входить до списку пристроїв, що підтримуються програмою.Що можна з'ясувати за допомогою такої команди: $ gphoto2 --list-cameras
яка виведе список приблизно 500 позицій — від дуже стародавніх моделей до цілком сучасних.
Нарешті, найцікавіший спосіб запуску програми такий: $ gphoto2 --shell
Фотографії зазвичай знімають для того, щоб їх дивитися:-) — чи в роздрукованому вигляді, чи прямо з екрана. Взагалі-то, кольоровий, тим паче фотореалістичний, друк із Linux співтовариші — тема окремої розмови, і торкатися її тут ми не будемо. Відзначивши тільки, щоб уникнути ілюзій, що для справжнього фотореалістичного друку в даний час краще підшукати іншу платформу.
Нарешті, як в'ювер можна використовувати і Gimp (хоча це дещо нагадує обстріл одинокої чайки з головного калібру лінкора). Однак коли справа дійде до серйозної обробки зображень, Gimp виявиться незамінним.