30 мар. 2014 г.

OpenMediaVault - Комплект по созданию города... NAS?!

Для тех, кто ещё пролистывает интернет в поисках готовых решений для хранения данных, но очень любит Debian, возможно OpenMediaVault - это единственно доступное изделие от бывшего программиста с проекта FreeNAS. Этот минималистичный интерфейс по-своему привлекателен тем, что просто радует глаз красиво выровненными окошками и input-элементами. Установка дистрибутива проста... или почти проста, в отличие от предыдущих подопытных образов. Здесь вам не обойтись без машины с монитором. Предлагаемый вам ISO-образ на самом деле представляет обыкновенный консольный инсталлятор Debianоподобной операционной системы (голубые окошки и много глупых вопросов). А это значит, что если вы поставите OMV на единственный жёсткий диск, который доступен в N54L по-умолчанию, то вам нечего будет тестировать. Я поступил очень просто, хотя сперва не очевидно - с помощью виртуальной машины мне пришлось установить OpenMediaVault на всю ту же флешку от Kingston, и загрузиться с неё. Тогда в вашем доступе будет нетронутый 250 Гб жёсткий диск, который мы и будем использовать.

Как и всякая Убунта операционная система, она может быть и должна обновлена. Благо web-интерфейс позволяет это сделать. Однако, если вы рискнёте, то возможно просто получите какую-нибудь ошибку с самым детальным описанием:

Очень красиво, не правда ли?! Почти весь дистрибутив так и норовит показать вам какую-нибудь ошибку, либо не показать её, а втихаря записать в логи. Очень любопытный тот факт, что это единственный сервер, который не смог по-человечески прописаться у меня в таблице имён роутера, а потому долгое время я его пинговал только по IP-адресу. Забавная особенность этого сервера - это постоянно подтверждать свой выбор, даже если вы нажали на кнопку "Save". Наверху выскакивает жёлтая полоска, с соответствующим вопросом через секунду-две. Если вы в своё время щупали предыдущие два сервера, то выставление параметров, пользователей и прав для вас не составит труда.

Version 1.3.1
OS Version: Mac OS X
Processor: Intel(R) Core(TM) i7 CPU M 620 @ 2.67GHz
Date: 03/30/2014
Time: 19:21:43
Program Parameters: 0
High Performance Timer: 0.000000001

Test File: /Volumes/MainSmb/NW_SpeedTest.dat
 Write Time = 62.3846887 Seconds
 Write Speed = 25.6473200 Mbps
 Read Time = 3.4075116 Seconds
 Read Speed = 469.5508640 Mbps

Test File: /Volumes/MainApf/NW_SpeedTest.dat
 Write Time = 15.9898882 Seconds
 Write Speed = 100.0632400 Mbps
 Read Time = 2.2199090 Seconds
 Read Speed = 720.7502480 Mbps

Test File: /Volumes/MainApf/NW_SpeedTest.dat
 Write Time = 17.3354946 Seconds
 Write Speed = 92.2961840 Mbps
 Read Time = 2.1230070 Seconds
 Read Speed = 753.6480000 Mbps

Version 1.3.1
OS Version: Windows 7
Processor: Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
Date: 03/30/2014
Time: 19:11:38
Program Parameters: 0
High Performance Timer: 0.0000005131

Test File: \\my-server\MainSmb\NW_SpeedTest.dat
 Write Time = 9.8255266 Seconds
 Write Speed = 814.2057200 Mbps
 Read Time = 9.9045480 Seconds
 Read Speed = 807.7097440 Mbps

Скорость на запись под Windows составляет где-то 60-65 Мб/с (иногда даже 70 Мб/с). А чтение работает на 114 Мб/с, что не может не радовать. Под Маком лучше конечно пользоваться APF протоколом, но он выше 10 Мб/с мне не выдал. Напоследок, Ubuntu показала противоречивые результаты, которые я как всегда снял в сферическом Nautilus: SMB (47 Мб/с с сервера, 35 Мб/с на сервер), AFP (1.6 Мб/с с сервера, 35 Мб/с на сервер), NFS (30 Мб/с с сервера, 60 Мб/с на сервер).

И вообще, кнопка "Выкл" не сработала на "ура", когда я поставил галочку в настройках :(

FreeNAS - Свободу серверу!

На этот раз мы поговорим немного об излюбленном и красноглазом творчестве компании iXsys... подождите, я же не собираюсь их пиарить. То, что гуглится легко, было когда-то развитием FreeBSD 6.0. Спустя некоторое время одна компания переняла на себя этот проект, а бывшие разработчики форкнули то, что осталось от старых огрызков в Debianоподобное поделие - OpenMediaVault и некий NAS4Free (гордящийся тем, что является отпрыском FreeNAS 7 (для сравнения, в текущей статье, я щупал FreeNAS 9.2.1.2)).
Первый из форков я хотел бы пощупать в следующей статья, а второй не заслуживает внимания по причине своей схожести с FreeNAS (я не вижу большой разницы между ними, тем более, что оба они выглядят вырвиглазно не важно FreeBSD это, или нет. Разве, что за FreeNAS стоит какая-то компания, зарабатывающая деньги).

Первое, что вам бросится в глаза - это то, что скачав небольшой архив образа на 225 Мб, вы обнаружите внутри настоящие 2 Гб пустых данных. Зачем?! Потому что система получается не read-only, и на ней ещё будут храниться всякие конфиги и логи, убивающие вашу флешку.

Сам сервер, будучи установленным, встретит вас унылым интерфейсом, со множеством всевозможных гаечных ключей и кранов, которые вам нужно будет задействовать, чтобы опубликовать директорию на вашем жёстком диске.
Кстати, сказать, вся ваша файловая система будет уничтожена и отформатирована в замечательную ZFS (о которой написано много и везде). Сама файловая система может быть и не плохая, но она уж очень сильно ориентирована на профессионалов, которые хотят иметь чуть ли не бесконечный размер жёсткого диска, снимки разделов и прочую фигню.

Самое примечательное то, что если вы будете обращаться с ней плохо, то сможете огрести много проблем и просто потерять данные. Файловая система, как я уже написал, называется ZFS. Чтобы быть попроще, приведу здесь сразу требования, которым вы должны соответствовать перед тем, как решиться на FreeNAS - Slideshow for noobs. Самое главное - это не просесть по памяти, а именно ваш сервер должен иметь 5 Гб ОЗУ плюс по 1 Гб за каждый 1 Тб предполагаемого хранилища. Короче, по памяти мой сервер не прошёл, а потому потерять данные просто так мне не хотелось.

Все настройки, которые вы сможете сэкпортировать с сервера представляют собой обыкновенный SQLite файл с чудоковатым именем: somebody's-server-FreeNAS-9.2.1.2-RELEASE-x64 (002022c)-20140309145256.db. То есть в случае чего, сможете даже подредактировать его любой утилиткой.

Ещё одна особенность - это управление доступом (к ресурсам, к жёстким дискам, и т.д.). Одним словом, если немного абстрагироваться от всего, то ваш пользователь должен обладать правами для пользования CIFS (прародитель SMB "диалекта"), потом его запрос идёт ниже в файловую систему (то есть на папку), ну и дальше к самому жёсткому диску. Поэтому, если случайно у вас что-нибудь не получится увидеть в Windows или где-нибудь ещё, то проверьте свои права. Когда я с этим столкнулся, то умудрился нагуглить парочку постов с криками о помощи: один и два. Ах да, чуть не забыл. Побаловавшись с правами, чтобы научиться их выставлять правильно, я сломал себе доступ к опубликованным папкам, и починил его перезагрузкой сервера и/или компьютера:

Очень интересная фича - это Тюрьмы, ой! То есть, Jails! С её помощью можно посадить установить *nix дистрибутив, включая "самописаные" плагины во FreeNAS. Вы указываете директорию, где будет храниться ваша, допустим, Убунта, и FreeNAS её свободно скачивает!!! Просто, не так ли?

Но не всё так просто, как показано на картинке сверху. Поставив Убунту, вы столкнётесь с проблемой сетевого доступа к интернету для её обновления, потом выяснится, что SSH недоступен и вам надо его как-нибудь пробросить, потом вы столкнётесь и известным багом, где говорится, что SSH и не заработает в текущей версии... Короче не работает там ничего!

Как я и обещал, вот вам искусственные тесты:

Version 1.3.0
OS Version: Mac OS X
Date: 03/09/2014
Time: 23:03:43
Program Parameters: 0
High Performance Timer: 0.000000001

Это CIFS
Test File: /Volumes/MainCifs/NW_SpeedTest.dat
 Write Time = 169.3175581 Seconds
 Write Speed = 23.6242480 Mbps
 Read Time = 5.2733421 Seconds
 Read Speed = 758.5322480 Mbps

Это AFP
Test File: /Volumes/MainAfp/NW_SpeedTest.dat
 Write Time = 31.2202986 Seconds
 Write Speed = 12.8121760 Mbps
 Read Time = 0.4886687 Seconds
 Read Speed = 818.5504240 Mbps

А это уже интересно. Version 1.3.1
OS Version: Windows 7
Processor: Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz
Date: 03/30/2014
Time: 13:08:27
Program Parameters: 0
High Performance Timer: 0.0000005131

Test File: \\YOUR-SERVER\MainCifs\NW_SpeedTest.dat
 Write Time = 10.2290053 Seconds
 Write Speed = 782.0897360 Mbps
 Read Time = 8.7562632 Seconds
 Read Speed = 913.6317360 Mbps

Как это всё грустно, когда скорость записи под Маком на шару Windows где-то в два раза больше, чем на AFP. Под Windows вы видите сами, и я, признаюсь, не знаю кому верить. Копирование файлов по сети показывает порядка 60 Мб/с на сервер, и около 100 Мб/с в сторону моего компьютера. То есть медленнее, чем показывает софтина. А вообще, измерять скорость файловым менеджером - это неправильно, так как она всё равно скачет от лучшего к худшему. Ubuntu отображает 30-35 Мб/с для AFP и SMB (NFS я сразу не увидел в Nautilus'e, а потом решил забить на него) в обе стороны.

Если вас интересуют такие вещи, как Time Machine, то вот ссылки с картинками из FreeNAS, которые я получил во время бекапа по кабелю: CPU, Disk I/O, RAM, Network.

И последнее слово, FreeNAS смог выключиться сам при нажатии кнопки Power на коробке моего сервера N54L. За что ему огромное спасибо!

7 мар. 2014 г.

unRAID - привет от Слаки

Как вам должно быть понятно, дистрибутив версии 6.0 (бета 3) на самом деле является допиленной Slackware 14.1. Поставляется в виде бесплатного и платного решения. Причём, бесплатное решение представляет собой сервер, в котором вы сможете разместить ровно три диска (и одну флешку). Опять же, из трёх дисков один (самый большой) будет являться диском "чётности" (нет, не "чёткости"). Интересно то, что покупка двух регистрационных ключей позволит вам сэкономить порядка 40 баксов за бозовую версию при сравнении с поштучной парой, и около сотни за про-версию. Разницу версий вы сможете узнать из ссылок, которыми насыщен мой блог, ну а если серьёзно, то версии "плюс" за 70 долларов мне бы хватило за глаза, если бы не одно "но". Зачем мне делать мой сервер дороже и привязывать лицензию к конкретной флешке, если бы я мог взять готовое аппаратное решение. М-м-м, вот ещё что! Вы обратили внимание, что в паре вы экономите порядка 50%, отсюда вывод?! Да-да, интернет пестрит людьми, которые предлагают скинуться на пару ключей, вместо покупки одного. Логичный вопрос, что же вам делать, если флешка, на которую зарегистрирован ваш сервер, умрёт, то не утруждайте себя гуглением - просто пожалуйтесь одному из людей LimeTech и он вам даст новый ключ бесплатно.

Ещё отличительной особенностью этого сервера является то, что операционная система форматирует диски в ReiserFS. Я не могу сказать, что она во всём виновата... но обо всём по-порядку.

Устанавливается сервер очень просто. Вам достаточно скачать ZIP-файл и распаковать его на USB флешку. Далее, запускаете батник или shell-скрипт под OSX, и флешка становится загрузочной. После загрузки с неё установите пароль для root'а и имя сервера, иначе он так и останется "башней". Залогинившись в Web-консоль, вы обнаружите её скудное содержимое. Общий смысл в том, что в лицензии для нищих вам доступно только два диска для данных, и один для контроля чётности, который согласно историй успеха спасал людям время и жизнь. Сами понимаете, что с коробкой для 4-х дисков (не говоря о том, что физически мне доступно 4 внешние поверхности, куда я смогу прилепить жёсткие диски скотчем), мне этот сервер не подходит.

Настройка сервера довольно таки проста (не люблю слово "тривиальна") для того, кто баловался с FreeNAS и смог расшарить под SMB парочку папок. Что стоит сразу сказать - в бесплатной версии вам запрещено создавать какие-то приватные папки. Недостаток как бэ небольшой... просто все пользователи сервера имеют доступ на чтение данных других пользователей. В общем мелочи для тех, кто не собирается хранить онямэ. Презабавный факт этого ограничения в том, что эта киллер-фича отключена для протокола AFP!!! Маководы рукоплещут! Ах да, друзья, не жалуйтесь на этот баг. Исправят ведь.

Отдельное внимание здесь заслуживает интерфейс. Определённо его кто-то проектировал, не мог же он поставляться со Слакой. Но концепт этого интерфейся мне до сих пор непонятен. Скорей всего человек хотел обеспечить транзакционность действий. То есть подразумевается, что администрировать сервер будет целый отдел, и они захотят поменять всё одновременно. А так, обильное наличие кнопок Apply и Done просто гарантируют вам стабильность в ваших решениях... не говоря ещё о всяких чекбоксах вида "а вы точно уверены?!". Презабавный факт в том, что вы же можете ошибиться и нажать Done перед Apply... а потом вы просто вылетите в какой-нибудь главный экран и вам придётся возвращаться назад, потому что ваши настройки не применены. Commit не выполнен.

Ещё один неловкий момент, который меня заставил подумать не один день, это то как нужно стирать сетевые папки. Папки - это отдельная история о том, как unRAID их организовывает. Фактически, дистрибутив не создаёт вам RAID массив. Всё избыточное копирование создаётся на уровне софта, причём одна и та же папка может существовать на разных дисках, а другая папка находящаяся на том же уровне может преспокойно жить на одном из физических носителей (побольше информации об этом). Но у этих каталогов есть один существенный недостаток, неинтуитивность работы интерфейса, когда вам надо их удалить. Попробуйте сравнить два изображения рядом, а теперь задайте себе вопрос, смогли бы вы предположить, что правой картинки вы никогда не видели, а если и видели, то на "разницу" не обращали внимания?

Вчера я честно гуглил по этому поводу. Оказалось, что я ошибался, как и парочка людей на форуме, мы не вчитывались в подсказу. Оказывается для того, чтобы удалить корневую папку, нужно стереть всё её содержимое. Мы не будем ссылаться на людей, которые предполагают, что папка пустая, так как не видят скрытые файлы, но они по-прежнему не смогли её удалить по той же причине. А я по-честному стирал имя у папки и недоумевал. Ну да ладно, что уж обо мне, неудачнике, мы же всегда можем удалить папку через Web-интерфейс:

Не ищите, в веб интерфесе нет кнопки delete. И нет поддержки русского языка. Директория вроде работает на компе, и файл открывается, тут нареканий нет. Вы заметили наличие mc? Да, его нужно использовать при обслуживании вашего сервера - подчистить файлы тут-сям. Без консоли вы не сможете решить простые, казалось бы, задачи.

Итак, думаю мы наконец-то дошли до того, что вам может быть интересно - это сферический тест скорости работы сервера с сеткой. Я решил измерить скорость чтения и записи моего MAC'a по 1 GBit/s сетке с помощью профессиональной утилиты LAN что-то там. В принципе, разница есть при передаче файлов 20-30-100-1000 МБ, но если усреднить эти тесты и показать вам самый хороший результат (в принципе скорость сравнительно стабильная, то есть нет такого разброса либо один мегабит в секунду, а потом сразу гигабит). Ах да, пока не забыл - вот презабавные результаты доступа из-под Мака через SMB и AFP протоколы (размер пересылаемого файла определите сами):

Version 1.3.0
OS Version: Mac OS X
Date: 03/05/2014
Time: 22:56:37
Program Parameters: 0
High Performance Timer: 0.000000001

Это SMB
Test File: /Volumes/Jopa123/NW_SpeedTest.dat
 Write Time = 425.6695776 Seconds
 Write Speed = 9.3969600 Mbps
 Read Time = 5.2043301 Seconds
 Read Speed = 768.5907520 Mbps

А это AFP
Test File: /Volumes/Jopa123-1/NW_SpeedTest.dat
 Write Time = 99.7243957 Seconds
 Write Speed = 40.1105440 Mbps
 Read Time = 5.3135099 Seconds
 Read Speed = 752.7980640 Mbps

Без доказательств, но на Windows 7 Home Premium, скорость записи на сервер была от 15 Мбайт/с и выросла до 26 Мбайт/с. Под любимой Ubuntu 13.10, ой! палюсь, хуже всего выступила AFP (скорость где-то под 12-14 Мбайт/c), а NFS/SMB в два раза побыстрее. Где-то так!

По результатам тестов (если не верите, вот вам ссылка в FAQ) вы видите, что сам NAS не обладает сверхвысокими скоростями на запись. Кстати интересно то, что ReiserFS у другого сферического тестера даёт похожие результаты на запись. Поэтому я бы на месте создателей unRAID списал бы скорость записи на файловую систему, а со стороны главного (и не побоюсь сказать, крутого) разработчика можно сказать, что сам массив обеспечивает большую избыточность, а потому тратит мощности жёсткого диска.

Как-то так! Вам решать. Если есть, чем поделиться, то милости прошу нагадить мне в комментарии

5 мар. 2014 г.

Как не создать NAS своими руками

Итак, добрый вечер, дорогие читатели моего ненужного блога, который не приносит ни мне дохода, ни вам пользы. Сегодня, а может быть и весь последующий месяц до выпуска новой Ubuntu, а также порчи моего заботливо установленного драйвера для NVIDIA карточки, я буду рассказывать вам о сервере, который я почти приобрёл у своего товарища. Название этой машины, как вы уже догадались (потому что она довольно таки распространена за свои малые, я считаю, деньги) - HP ProLiant MicroServer G7 N54L 1P 2GB-U Non-hot Plug SATA 250GB 150W PS Server(704941-421). Машина эта примечательна тем, что за свои где-то €170, она предоставляет вам двухядерный х64 процессор с 4-мя отсеками для 3.5-дюймовых жёстких дисков, не говоря про 5-дюймовый отсек под старое оборудование. На всякий случай, я нагуглил вам более подробную спецификацию.

Как, уважающий себя линуксоид в прошлом... а также я воспользуюсь переделанной цитатой из моего блога моим приятелем, скажу, что Линукс делает многие вещи таким образом, чтобы вам попросту было больно. Да согласен, эта фраза может обидеть моих читателей, которые за всё время существования блога проиндексировали мои страницы около 15.000 раз. Но решив купить сервер для хранения данных, я решил потратить своё время на выбор хорошего и красивого (да-да) программного обеспечения для постройки решения NAS. Для справки скажу, что в прошлом владел и владею сервером Synology DS110j, а посему мне есть с чем сравнивать. Мне бы хотелось иметь похожую простоту в настройке сервера, а также наличии удобных плугинов для разного рода задач. Вы понимаете, что можно было бы уделить время на создание серверной архитектуры с нуля - в интернете полно бесполезных инструкций, которые не прочтёшь без красных очков, но при всём раскладе вы и ваши родные не получите удобства работы с сервером не только вас. Вы без опыта соберёте любой конструктор хуже, чем люди, которые занимаются NASостроением годами и за деньги.

Ну да ладно, не будем о грустном и поговорим о сервере. Его небольшая особенность, с которой вам придётся столкнуться... А точнее их несколько:

  • Ваш сервер гудит, потому что в нём работает вентилятор. Воздух он гоняет с шумом. Не громко, но как настольный компьютер - поэтому если хотите, то уберите его на чердак. Кстати замечу, пищалки я у него не заметил. Эта сволочь не пищит!
  • Если хотите поставить Windows Home Server 2012, то попробуйте скачать последний биос (да-да, его выпустили в октябре-ноябре 2013 - SP64420.exe (2.6 MB)), иначе у вас будет синий экран, и вам придётся покупать отдельную сетевую PCI Express карточку от Intel. Можете побаловаться вскрытыми опциями биоса, но я не знаю - не пробовал пока.
  • Без монитора настраивать сервер может быть сложно. Поэтому из всех готовых операционных систем для NAS, лучше выбирать plug-and-play - прожгли флешку, загрузились с неё (не бойтесь, всё это автоматически), она подцепила сетку по DHCP и через веб морду/SSH вы всё настроили. Кстати, советую первый вариант, потому что наше требование - красота и наглядность... Ну и удобство конечно!
  • Дополнение к вышесказанному - можете купить себе карточку удалённого доступа, чтобы без монитора лазить в биосе. Она дорогая, и не нужна, если вы не сможете сбегать с сервером к другу. Кстати, мой сервер подержанный, поэтому в нём есть и отдельная Интеловская карточка, и планка памяти на 4 Гб.
  • Если вы из партии голзелёных, то обращайте внимание на высокое энергопотребление сервера в бездействии. Моя текущая машина с одним дефолтным винтом на 250 Гб потребляет где-то 35 Вт. На каждый дополнительный жёсткий диск нужно где-то по 4 Вт. С помощью одного из готовых решений (всё будет позже), даже при остановке жёсткого диска, энергопотребление снизилось всего до 33 Вт.

Это пока всё, что я хотел сообщить в этой части. Если вспомню, до допишу ниже. А пока, я хотел бы перечислить все решения, которые мне удалось протестировать на этом сервере. Дальнейшие результаты тестов и общее впечатление я укажу в следующих постах. Кстати, чтобы вы не мучались, скажу, мне понравился XPEnology:

Я не стал рассматривать такие решения как Nas4Free (это тот же старый FreeNAS, успел отколоться, когда FreeNAS купили) и всякие мелкие файловые хранилища по причине, либо проще их конфигурировать через консоль, либо у них нет поддержки AFP протокола, либо просто они выглядят убого. Кстати, я также потыкал в некоторые псевдо-бесплатные решения, но решил забросить это дело. Для моего псевдообзора хватит и unRaid из этой категории.

Засим прощаюсь с вами. Берегите себя и любите всех.

2 нояб. 2013 г.

Ubuntu 13.10, Optimus, NVIDIA и т.д.

Такое ощущение, что мои блоги больше посвящены борьбе человека с Линуксом, нежели чем его использованием. Ну да ладно, этот пост не обещает быть длинным, так как написал я его исключительно в помощь самому себе.
Итак, какие же приключения принесла новая версия для моего лептопа? Для начала, Ubuntu во время установки скачивала обновления. После перезагрузки компьютера, загрузки операционной системы не произошло - выскакивала ошибка Kernel panic - not syncing: No init found. Интернет пишет, что, возможно, образ был битый (хотя контрольная сумма совпала). Одним словом, мне помог следующий workaround - установка Ubuntu была с выключенным wi-fi для того, чтобы не было обновлений во это время. А потом уже, операционная система загрузилась без проблем, где после и была обновлена.
Теперь насчёт драйверов для NVIDIA: для установки использовались следующие пакеты (за собой они подтянули с десяток других) - nvidia-319-updates, nvidia-319-updates-dev (мне нужен для разработки), nvidia-settings-319-updates и bumblebee-nvidia. К сожалению, загрузка Unity сопровождалась наличием обоев и больше ничем. Спасибо ресурсу askubuntu.com, где подсказали, что для работы Unity необходимо включить соответствующий плагин в ccsm. Для простоты, скажу - вы ставите compizconfig-settings-manager и запускаете ccsm. Далее, включаете Ubuntu Unity Plugin, как показано у меня на картинке ниже:

Может получится так, что вы не сможете запустить ccsm, потому что у вас не будет консоли в Unity. Что я сделал: я создал пустую папку на рабочем столе, открыл её, через неё нашёл /usr/bin/gnome-terminal, и оттудра запустил менеджер Compiz. Ах да! Если будут предупреждения о каких-то конфликтах, прочтите их и выберите что хотите сами.
Последнее. Для CUDA достаточно скачать .run пакет для x64 дистрибутива линукс (я брал для Ubuntu 12.10) и поставить его с флагом sudo ./cuda_5.5.22_linux_64.run --override. Скорей всего, gcc 4.7 у вас не стоит, и вам придётся его поставить.
Update: кстати, изменённый и немного универсальный файл .bashrc теперь следующий (к сожалению каталога nvidia-current не существует, а все скрипты NVIDIA ищут библиотеки в нём):
export PATH=$PATH:/usr/local/cuda/bin
export LPATH=/usr/lib/nvidia-319-updates:$LPATH
export LIBRARY_PATH=/usr/lib/nvidia-319-updates:$LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib:/usr/local/cuda/lib64:/usr/lib/nvidia-319-updates
Всего хорошего, и пока!

8 нояб. 2012 г.

Ubuntu - Optimus < 0

Если бы не сегодняшнее горе, то я бы не написал этот блог пост. Проблема возникла в том, что после установки очередной порции обновлений, и, кажется, пакета linux-image-3.5.0.18 что-то там, я сломал свой линукс до неузнаваемости. Оказалось, что пропали драйвера от пакета nvidia-current, и в общем всё нахрен сломалось. Побаловавшись с тем, что вроде бы работало, я сломал свои иксы напрочь и даже чудом лишился файла xorg.conf.

Потерев все ppa, удалив все где упоминались слова типа nvidia и bumblebee, я вернул систему в божеский вид и запустил драйвера nouveau. Отлично, полёт нормальный, но мне захотелось вернуть свою CUDA назад. Что я для этого сделал? С ходу не отвечу, потому что подбирал много параметров, но я решился на установку сырых пакетов из ppa:xorg-edgers/ppa. Кстати, советую поставить заголовки нового ядра: обычные и generic. Думаю, пригодятся :)

Когда bumblebee установился, я понял, что моя Intel карта перестала работать, выдавая вот такую ошибку:

$ glxinfo
name of display: :0
Xlib: extension "NV-GLX" missing on display ":0".
X Error of failed request: BadAlloc (insufficient resources for operation)
  Major opcode of failed request: 153 (GLX)
  Minor opcode of failed request: 3 (X_GLXCreateContext)
  Serial number of failed request: 17
  Current serial number in output stream: 18

Единственная внятная статья по этому поводу мне не помогла. Но я решил на неё забить, потому что я хотел вернуть Optimus назад.

Проект bumblebee не заработал, потому что при запуске любого приложения выдавалась ошибка с "якобы" вот таким решением. Оказалось, что вроде бы драйвер nvidia не может быть найден. Если помните, то nvidia-current решило мне похожую проблему ранее. Но опять таки я не загружал нужный мне модуль, потому что горе-погроммисты переименовали его. И теперь, правильнее было бы подправить /etc/bumblebee/bumblebee.conf вот так:

...
Driver=nvidia
...
[driver-nvidia]
# Module name to load, defaults to Driver if empty or unset
KernelDriver=nvidia_current
Module=nvidia
...

Руки бы им за подчёркивание оторвать. На всякий случай, я также добавил nvidia модуль в /etc/modules:

...
nouveau # не знаю, но в блеклист я этот модуль не стал добавлять
nvidia_current

Ну и немного для истории, вот моя видео карта:

$ optirun ./deviceQuery 
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce GT 540M"
  CUDA Driver Version / Runtime Version          5.0 / 5.0
  CUDA Capability Major/Minor version number:    2.1
  Total amount of global memory:                 2048 MBytes (2147155968 bytes)
  ( 2) Multiprocessors x ( 48) CUDA Cores/MP:    96 CUDA Cores
  GPU Clock rate:                                1344 MHz (1.34 GHz)
  Memory Clock rate:                             900 Mhz
  Memory Bus Width:                              128-bit
  L2 Cache Size:                                 131072 bytes
  Max Texture Dimension Size (x,y,z)             1D=(65536), 2D=(65536,65535), 3D=(2048,2048,2048)
  Max Layered Texture Size (dim) x layers        1D=(16384) x 2048, 2D=(16384,16384) x 2048
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 32768
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  1536
  Maximum number of threads per block:           1024
  Maximum sizes of each dimension of a block:    1024 x 1024 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 65535
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device PCI Bus ID / PCI location ID:           1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 5.0, CUDA Runtime Version = 5.0, NumDevs = 1, Device0 = GeForce GT 540M


$ optirun ./bandwidthTest 
[CUDA Bandwidth Test] - Starting...
Running on...

 Device 0: GeForce GT 540M
 Quick Mode

 Host to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes) Bandwidth(MB/s)
   33554432   6269.0

 Device to Host Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes) Bandwidth(MB/s)
   33554432   6277.8

 Device to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes) Bandwidth(MB/s)
   33554432   23688.5

6 нояб. 2012 г.

CUDA куда-куда? А! В Ubuntu 12.10 - CUDA Part

Круто - но стрёмно! Вот пришла пора описать как я ставил саму CUDA, и какие сложности попались мне на пути. Версия, которую мне захотелось поставить - CUDA 5.0. Четвертая версия сама по себе уже старовата, да и меня прельщала возможность использования Nsight for Linux, нежели чем какие-нибудь собственные make файлы.

Проще говоря, скачать и поставить не проблема, всяких док полно в интернете. Главное есть некоторые нюансы, которые я бы упомянул:

  • Не ставьте драйвера NVIDIA, входящие в комплект SDK;
  • Не ставьте поддержку Optimus - я не знаю, в чем её смысл, но думаю ничего хорошего она вам не принесёт. Во всяком случае интернет молчит по этому поводу;
  • Скорей всего инсталлятор попросит у вас GCC 4.6 - качайте отдельный метапакет для этого. У CUDA заголовков внутри прописана версия компилятора. Поэтому, если попытаетесь всё поднять на 4.7, то у вас отвалится. Любые попытки исправить (особенно, если вы новичок как я) оставьте на потом;

Когда всё поставите (соглашайтесь с дефолтными путями), то первым делом надо собрать каталог ~/NVIDIA_CUDA-5.0_Samples. При сборка каталога командой make вы получите около пяти ошибок, которые легко решаются. И так, понеслось...

g++ -m64 -o vectorAddDrv vectorAddDrv.o -L/usr/local/cuda-5.0/lib64 -lcuda
/usr/bin/ld: error: cannot find -lcuda
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuInit'
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuDeviceGetCount'
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuDeviceComputeCapability'
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuDeviceGetName'
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuDeviceGet'
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuCtxCreate_v2'
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuModuleLoadDataEx'
...
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuMemcpyDtoH_v2'
vectorAddDrv.o:vectorAddDrv.cpp:function CleanupNoFailure(): error: undefined reference to 'cuMemFree_v2'
vectorAddDrv.o:vectorAddDrv.cpp:function CleanupNoFailure(): error: undefined reference to 'cuMemFree_v2'
vectorAddDrv.o:vectorAddDrv.cpp:function CleanupNoFailure(): error: undefined reference to 'cuMemFree_v2'
vectorAddDrv.o:vectorAddDrv.cpp:function CleanupNoFailure(): error: undefined reference to 'cuCtxDetach'
collect2: error: ld returned 1 exit status
make[1]: *** [vectorAddDrv] Error 1

Лечится такая ошибка вот этим. Почему именно в .bashrc, а не в .bash_profile? Потому что из под иксов, при запуске gnome-terminal, вызывается именно первый файл, а не второй. Второй будет использоваться только в голой консоли. На всякий случай, вот мой файл:

export PATH=$PATH:/usr/local/cuda-5.0/bin
export LPATH=/usr/lib/nvidia-current:$LPATH
export LIBRARY_PATH=/usr/lib/nvidia-current:$LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-5.0/lib:/usr/local/cuda-5.0/lib64:/usr/lib/nvidia-current

Когда возникнет ошибка вида MPI not found (simpleMPI), то советую посмотреть сюда для наглядности и поставить ещё один пакет:

sudo apt-get install libopenmpi-dev

Потом у вас должна возникнуть ошибка с libcublas, которая лечится добавлением опции -ldl к компилятору:

cdpLUDecomposition: dlaswp.o dgetf2.o dgetrf.o cdp_lu.o cdp_lu_main.o
    $(NVCC) $(CCFLAGS) $(GENCODE_FLAGS) -o $@ $+ $(LDFLAGS) $(EXTRA_LDFLAGS) -ldl

Собственно это всё, после этого все демки должны будут скомпилиться и работать. Кстати, к сожалению позднее появление этой статьи в моём браузере является причиной написания этого блог-поста. Прочтите и не пожалеете.

Я не буду, наверное, описывать как программировать под CUDA, потому что сам не умею, но точно прошу вас запомнить следующие команды. Они вам помогут:

optirun nsight    # запускает Eclipse, чтобы программы работали с CUDA
optirun cuda-gdb yourCudaProgram    # запускает отладчик через CUDA

Погуглив в интернете более интенсивно, я понял, что nvcc почему-то не генерит отладочные символы (Debug Symbols) для устройства. В общем, если знаете ответ на этот вопрос, будьте добры, напишите мне где-нибудь...

4 нояб. 2012 г.

CUDA куда-куда? А! В Ubuntu 12.10 - Optimus Part

Линуксу - нет! Так получилось, что во время написания этого поста, я являюсь счастливым обладателем ноутбука фирмы ASUS, модель X7BS. Если захочется погуглить, то в нем Intel Core i7 - 2630QM, 2.0GHz, что даёт мне 8 гипертрединговых ядер, ну и два жёстких по 500 Gb. Однако не это в нём примечательное, а то, что он является обладателем технологии NVIDIA Optimus. Другими словами, его видеокарта GeForce GT 540M (2 Gb) умеет распоряжаться интегрированной Intel'овской картой.

Ну раз моя видеокарта может пользоваться CUDA технологией, то я решил поковырять параллельное программирование на ней на досуге. Проблема в том, что официально NVIDIA поддерживает MS Visual Studio 2008/2010 своим плагином Nsight для разработки приложений под CUDA. Начиная с 5.0 версии, они разродились самостоятельной средой разработки на основе Eclipse. Но минус в том, что эта IDE доступна для Linux'a и Мака (кажется).

Попробовав поставить старые .deb пакеты под обновившуюся недавно Убунту, я наткнулся на несколько, для меня, новостей: Optimus под линуксом идёт плохо, CUDA поддерживает старый компилятор GCC-4.6. Всё это меня расстроило в конец, потому что с OpenSuse дела тоже идут не гладко со старыми компиляторами, поэтому я решил написать статью о том как запустить CUDU с моей видеокартой под линукс.

Для начала нам надо запустить Оптимус. Под ОпенЗюзе есть хорошая статья (на немецком и русском языках), которая дала мне понять, что с Оптимусом под линуксом жить можно. Хочу сразу же обратить внимание на небольшую и простую переписку в форуме, которая мне помогла установить поддержку Оптимуса. Кстати да, я там отличился. У вас, скорей всего, как и у меня x-swat репозитории для 12.10 окажутся пустыми. Но это и не важно, ибо он не нужен вроде как :) В лучшем случае, если не полетит, то в файле /etc/bumblebee/bumblebee.conf должно быть так:

...
Driver=
...
[driver-nvidia]
# Module name to load, defaults to Driver if empty or unset
KernelDriver=nvidia-current
Module=nvidia
...

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

$ groups
user adm cdrom sudo dip plugdev lpadmin sambashare bumblebee

Если у вас всё взлетит, то вы увидите следующие или похожие результаты:


$glxgears
Running synchronized to the vertical refresh. The framerate should be approximately the same as the monitor refresh rate.
304 frames in 5.0 seconds = 60.613 FPS
... Intel
$ optirun glxgears
4439 frames in 5.0 seconds = 887.763 FPS
... NVIDIA
$ glxspheres
Polygons in scene: 62464
Visual ID of window: 0xa3
Context is Direct
OpenGL Renderer: Mesa DRI Intel(R) Sandybridge Mobile
60.271004 frames/sec - 67.262440 Mpixels/sec
... Intel
$ optirun glxspheres
Polygons in scene: 62464
Visual ID of window: 0x21
Context is Direct
OpenGL Renderer: GeForce GT 540M/PCIe/SSE2
110.310679 frames/sec - 123.106717 Mpixels/sec
... NVIDIA

Вот собственно и всё для этой части. Что-то поздно и я подумываю над тем, чтобы пойти спать. К сожалению, я не закончил статью, а посему про CUDA напишу позже... Ку!

4 мая 2009 г.

Принтер Samsung ML-2015

С незапамятных времен у меня был принтер, название которого вы видите выше. Так получилось, что мне нужно использовать его под Linux. Всё было хорошо, в ранних версиях Ubuntu (< 9.04), он у меня подхватывался системой CUPS как говориться "искоропки". Но вот, незадача, как-то пришлось мне обновиться (во всяком случае я не так часто печатал, чтобы обратить внимание на то, как вёл себя принтер в 8.10, здесь я говорю именно про сейчас) до Jaunty релиза и он у меня перестал работать. Точнее когда отправляешь задание на печать, я получаю следующее: документ тормозится на обработке и мне сообщается, что принтер не подключён (кстати сказать на моём нетбуке под той же версией Ubuntu принтер работает):

Состояние печати

Сравнив настройки принтера в моих дистрибутивах, я обнаружил интересную разницу, которую сам добавить никак не мог (выделено на рисунке):

Свойства принтера

Стерев разницу мой принтер сразу же заработал. Кстати добавив к с вышеизложенному. В /var/log/syslog я увидел следующее:

May 4 19:29:05 vest-desktop hal_lpadmin: Running hal_lpadmin
May 4 19:29:06 vest-desktop hal_lpadmin: hal_lpadmin triggered by low-level USB device
May 4 19:29:06 vest-desktop hal_lpadmin: Getting device ID from the usblp HAL entry ...
May 4 19:29:06 vest-desktop hal_lpadmin: Device ID for /dev/usb/lp0: MFG:Samsung;MDL:ML-2010;DES:;CMD:GDI;
May 4 19:29:06 vest-desktop hal_lpadmin: Written device ID into HAL database entry: MFG:Samsung;MDL:ML-2010;DES:;CMD:GDI;
May 4 19:29:06 vest-desktop hal_lpadmin: add
May 4 19:29:06 vest-desktop hal_lpadmin: Printer reported by HAL: Samsung ML-2010 3D66BKCPA21817X.
May 4 19:29:06 vest-desktop hal_lpadmin: Found configured printer: ML-2010; URI: usb://Samsung/ML-2010?serial=3D66BKCPA21817X.
May 4 19:29:06 vest-desktop hal_lpadmin: Not adding printer: ML-2010 already exists
May 4 19:29:06 vest-desktop hal_lpadmin: Re-enabling printer ML-2010

То есть принтер-то найден верно, хоть и модель немного другая. И серийный номер совпал, но вот это и являлось причиной. Что ж... если такое повторится дальше, будем продолжать исследование.

4 мар. 2009 г.

Gnome Internationalization или интернационализация средствами Glib и intltool

Теперь пришло время, добавить в наш шаблон «Интернационализацию». Основное отличие от «Локализации» заключается в том, что приложение, поддерживающее интернационализацию физически представляет собой один исполняемый файл (с сопутствующими ему файлами с данными), которое равно запускается в операционной системе и отображает локализованную информацию в зависимости от настроек ОС. Локализованное приложение отображает только тот язык, для которого оно было создано. Так, например, в Windows часто вы встречали фразы «Скачать русскую версию». Так вот, это были локализованные приложения.

Наше приложение пока отображает только английскую локаль. Попробуем встроить в него интернационализацию управляемую библиотекой GLib. Для начала нам понадобятся пара пакетов: intltool и gettext. Они помогут нам, избавив от некоторой рутинной работы.

Для начала подправим наш исходный код, и доведём его до следующего состояния (жирным я отмечу то, что дописал непосредственно в файл):

Здесь и далее хочу сказать, что в исходных кодах можно использовать как TAB символы, так и пробелы, в шаблонах configure.ac также, НО в Makefile.am только TAB.

#include <config.h>
#include <stdio.h>
#include <glib/gi18n.h> -- поддержка макросов gettext

int main(int argc, char** argv)
{
    setlocale (LC_ALL, ""); -- устанавливаем текущую локаль, информацию берём с переменных окружения (это можно опустить в GUI программировании)
    bindtextdomain (GETTEXT_PACKAGE, QUOD_LOCALEDIR); -- устанавливаем каталог, где лежат файлы для разных языков
    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); -- устанавливаем кодировку для вывода символов (благо Linux легко поддерживает Unicode)
    textdomain (GETTEXT_PACKAGE); -- установка домена по умолчанию

    printf(_("Hello World!\n")); -- отмечаем текст, который надо перевести с помощью макроса _()

    return 0;
}

Почитав повнимательнее, я выяснил, что оказывается сам GLib локализован с помощью механизма gettext, поэтому он принят стандартом де-факто. Существуют разные макросы, выделяющие наш текст, требующий интернационализации. Например, для строк, к которым не может быть применён вызов gettext (например глобальные переменные переменные принимающие строки в массивах), то к ним применяется макрос N_(). Дополнительную информацию можете поискать в самом Glib'e, либо Internationalising GNOME applications, ещё как вариант скачать intltool, и там прочесть HOW-TO. Вообще, информации много, но вот собранной воедино и с нуля — мало.

Следующим этапом идёт создание каталога po, где будут находиться наши переводы. Заодно, подправим наши шаблоны:

~/gnome-quod$ mkdir po

configure.ac
# ======================== initialization ===============================
AC_INIT([Gnome Quod],
        [0.4.0],
        [vest@mail.com],
        [gnome-quod])

AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([-Wall -Werror dist-bzip2])
AC_DEFINE([NDEBUG], [], [Disable debugging information])

# ==================== basic compiler settings ==========================
AC_PROG_CC
AM_PROG_CC_C_O
AC_HEADER_STDC

# ==================== internationalization i18n ========================
IT_PROG_INTLTOOL([0.40.4]) -- требование библиотеки intltool не ниже 0.40.4
GETTEXT_PACKAGE=gnome-quod -- название пакета выносим в отдельную переменную
AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"], -- которую делаем в качестве
                   [The domain to use with gettext]) -- директивы для препроцессора (см. config.h)
AM_GLIB_GNU_GETTEXT -- не знаю до конца, но скорей всего включает поддержку GETTEXT у Glib (или через)
AC_SUBST(GETTEXT_PACKAGE) -- добавляет опции в компилятор для включения gettext

QUOD_LOCALEDIR=[${datadir}/locale] --указываем, где будут находиться локализации
AC_SUBST(QUOD_LOCALEDIR) -- запоминаем этот путь и добавляем его в опции компилятора

PKG_CHECK_MODULES([GLIB],[glib-2.0 >= 2.18]) -- проверяем, что у нас стоит Glib нужной версии

# ==================== generate files ===================================
AC_CONFIG_FILES([
  Makefile
  src/Makefile
  po/Makefile.in -- выводим ещё один шаблон Makefile'a в новом каталоге po
])
AC_OUTPUT

В HOW-TO, я прочитал следующее, что вместо AM_GLIB_GNU_GETTEXT можно использовать AM_GNU_GETTEXT([external]), а сам autoreconf предложил мне воспользоваться AM_GNU_GETTEXT_VERSION. С одним предупреждением у меня получился следующий вариант:

...
AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"],
                   [The domain to use with gettext])
AM_GNU_GETTEXT_VERSION
...

$ autoreconf
...
autoreconf: configure.ac: AM_GNU_GETTEXT_VERSION is used, but not AM_GNU_GETTEXT

с другим вариантом:

autoreconf: configure.ac: AM_GNU_GETTEXT is used, but not AM_GNU_GETTEXT_VERSION
configure.ac:23: required file `./config.guess' not found
configure.ac:23: `automake --add-missing' can install `config.guess'
configure.ac:23: required file `./config.rpath' not found
configure.ac:23: required file `./config.sub' not found
configure.ac:23: `automake --add-missing' can install `config.sub'
configure.ac:23: required file `./ABOUT-NLS' not found

То, что я запустил конфигурирование пакета, я решил показать в демонстрационных целях, у Вас пакет ещё не до конца сконфигурирован, поэтому вы возможно получите ошибки. Далее подправляем другие файлы:

// Makefile.am
SUBDIRS = src po -- добавляем лишний каталог

@INTLTOOL_DESKTOP_RULE@ -- этот макрос позволяет intltool определить, где какие файлы требуют перевода (в частности, в корневой директории может находиться будущий ярлык программы)

INTLTOOL_FILES = \
        intltool-extract.in \
        intltool-merge.in \
        intltool-update.in

EXTRA_DIST = $(INTLTOOL_FILES)

DISTCLEANFILES = \
        intltool-extract \
        intltool-merge \
        intltool-update


# здесь я говорю, что вышеследующие файлы (шаблоны) будут распространятся в дистрибутиве без обработки, в случае очистки сгенерированные с шаблонов файлы следует стирать

# эти строки я встречал не всегда. Они отвечают за очистку кеша, создаваемого intltool
clean-local:
        rm -f po/.intltool-merge-cache


// src/Makefile.am
quod_CFLAGS = \ -- задаём флаги для конкретного исполняемого файла (quod)
        -DQUOD_LOCALEDIR=\"${QUOD_LOCALEDIR}\" \ -- где лежат наши локали
        $(GLIB_CFLAGS) \ -- флаги для компиляции с Glib
        -I$(top_srcdir) -- путь, с заголовками уровнем выше (обычно для config.h)

quod_LDADD = \ -- тоже самое, но для линковщика
        $(INTLLIBS) \ -- библиотеки intltool
        $(GLIB_LIBS) -- библиотеки Glib

bin_PROGRAMS = quod
quod_SOURCES = main.c

В предыдущем посте я описывал, почему я использовал макрос AM_PROG_CC_C_O. Именно благодаря ему, я указал для конкретного бинарного файла нужные флаги для компилятора. Теперь следует дописать небольшие файлы в po каталог, и затем приступить к запуску скриптов. Процедура создания файлов немного автоматизирована:

~/gnome-quod$ intltoolize -- этот скрипт создаст файл po/Makefile.in.in

// вручную создаём po/LINGUAS
# please keep this list sorted alphabetically
#
ru -- по алфавиту указываем какие языки у нас будут присутствовать

// вручную создаём po/POTFILES.in
# List of source files containing translatable strings.
# Please keep this file sorted alphabetically.
src/main.c -- здесь описываем все файлы, где нужен перевод (даже файлы с ярлыками для рабочего стола)

// Проверяем:
~/gnome-quod/po$ ls -l
итого 8
-rwxr-xr-x 1 vest vest 51 2008-12-10 10:50 LINGUAS
lrwxrwxrwx 1 vest vest 34 2009-03-04 18:52 Makefile.in.in -> /usr/share/intltool/Makefile.in.in
-rwxr-xr-x 1 vest vest 68 2009-03-04 19:04 POTFILES.in

На самом деле видите, что Makefile.in.in это всего-навсего ссылка. Далее попытаемся создать pot-файл, содержащий строки, нуждающиеся в переводе:

~/gnome-quod/po$ intltool-update --pot -- выполнять это надо внутри каталога po

~/gnome-quod/po$ cat gnome-quod.pot
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-03-04 19:08+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: ../src/main.c:13
#, c-format
msgid "Hello World!\n"
msgstr ""

Вот так выглядит шаблон, созданный скриптом. Сам pot-файл не нужен, так как генерируется автоматически. То, что требуется от вас, это сделать копию файла с именем того языка, на который вы будете создавать свою локализацию (в нашем случае ru.po). Сам файл хорошо документирован, вам следует обратить внимание на то, что CHARSET следует исправить в UTF-8. Есть другой способ создать шаблон нужной локализации средствами gettext (но про UTF-8 строки следует не забывать. Помните наши изменения в исходном файле main.c):

~/gnome-quod/po$ msginit --locale=ru
Новый каталог сообщений должен содержать ваш адрес электронной почты,
чтобы пользователи могли присылать свои замечания по поводу ваших
передов, а также чтобы сопроводители программ могли связаться с вами в
том случае, если возникнут непредвиденные технические проблемы.

Which is your email address?
1 Vest@home.tula.net
...
9 vest@vest-desktop

Please choose the number, or enter your email address.
9 -- я ввёл это чисто (просто так, на самом деле введите либо номер либо свой реальный адрес)
A translation team for your language (ru) does not exist yet.
If you want to create a new translation team for ru, please visit
 http://www.iro.umontreal.ca/contrib/po/HTML/teams.html
 http://www.iro.umontreal.ca/contrib/po/HTML/leaders.html
 http://www.iro.umontreal.ca/contrib/po/HTML/index.html

Создано ru.po. -- вот это самое главное.

~/gnome-quod/po$ cat ru.po
# Russian translations for Gnome Quod package.
# Copyright (C) 2009 THE Gnome Quod'S COPYRIGHT HOLDER
# This file is distributed under the same license as the Gnome Quod package.
# Vladislav Volodin <vest@vest-desktop>, 2009.
#
msgid ""
msgstr ""
"Project-Id-Version: Gnome Quod 0.4.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-03-04 19:08+0300\n"
"PO-Revision-Date: 2009-03-04 19:18+0300\n"
"Last-Translator: Vladislav Volodin <vest@vest-desktop>\n"
"Language-Team: Russian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n" -- как видите, это надо поменять на UTF-8
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"

#: ../src/main.c:13
#, c-format
msgid "Hello World!\n"
msgstr ""

Далее переводим строку следующим образом. Оставляем оригинал вверху, нужный перевод внизу, и всё сохраняем в формате UTF-8:

...
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"

#: ../src/main.c:13
#, c-format
msgid "Hello World!\n"
msgstr "Привет Мир!\n"

И пробуем реконфигурировать наш проект, собирать, и устанавливать. Остаётся проверить:

vest@vest-desktop:~/gnome-quod$ autoreconf && ./configure && make
...
checking whether NLS is requested... yes
checking for intltool >= 0.40.4... 0.40.5 found
checking for intltool-update... /usr/bin/intltool-update
checking for intltool-merge... /usr/bin/intltool-merge
checking for intltool-extract... /usr/bin/intltool-extract
checking for xgettext... /usr/bin/xgettext
checking for msgmerge... /usr/bin/msgmerge
checking for msgfmt... /usr/bin/msgfmt
checking for gmsgfmt... /usr/bin/msgfmt
...
checking for GLIB... yes
...
# INTLTOOL_MAKEFILE
make all-recursive
make[1]: Вход в каталог `/home/vest/gnome-quod'
Making all in src
make[2]: Вход в каталог `/home/vest/gnome-quod/src'
gcc -DHAVE_CONFIG_H -I. -I.. -DQUOD_LOCALEDIR=\"/usr/local/share/locale\" -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I.. -g -O2 -MT quod-main.o -MD -MP -MF .deps/quod-main.Tpo -c -o quod-main.o `test -f 'main.c' || echo './'`main.c
mv -f .deps/quod-main.Tpo .deps/quod-main.Po
gcc -DQUOD_LOCALEDIR=\"/usr/local/share/locale\" -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I.. -g -O2 -o quod quod-main.o -lglib-2.0
...
~/gnome-quod$ quod
Привет Мир!
$

Теперь можно вас поздравить с тем, что у вас «интернационализовано» ваше приложение. Далее попробуйте уже сами создать пакет с помощью make dist, и просмотреть какие файлы распространяются с пакетом, а какие нет.

И ещё, не забывайте каждый раз обновлять файл POTFILES.in, когда добавляете новые исходные файлы в src каталог. И затем выполняйте intltool-update ru. Она также обновляет файлы с переводом, если у вас добавляются новые строки, указывая вам на число переведённых или не переведённых строк. Смотрите, что будет если подправить исходный код следующим образом:

// main.c
printf(_("Hello World!!\n")); -- лишний восклицательный знак

:~/gnome-quod$ cd po
~/gnome-quod/po$ intltool-update ru
... завершено.
0 переведенных сообщений, 1 неточный перевод.
~/gnome-quod/po$ cat ru.po

#: ../src/main.c:13
#, fuzzy, c-format -- здесь он подправил, что наше исходной сообщение теперь другое. После исправления это слово можно стереть
msgid "Hello World!!\n" -- ведь появился восклицательный знак
msgstr "Привет Мир!!\n" -- добавим его здесь

Вот собственно и всё, жду Ваших комментариев и дополнений.

Web-камера Creative Vista IM (VF0420)

Небольшое предисловие, мне понадобилась камера, которая работала бы в Linux'е (а именно у меня в Ubuntu 8.10), и упор делался на проприетарный Skype. И я купил камеру, модель Creative Vista IM (VF0420). Определяется эта камера следующим образом:

$ lsusb
Bus 001 Device 002: ID 041e:4064 Creative Technology, Ltd

Могу сказать, что с нуля, камера на Desktop-машине работала на приложении Cheese притормаживая, VLC ничего не открывал. Другие я не пробовал. Сам Skype определяет камеру, но к сожалению во время тестов и вещания вместо изображения рисует шумы в виде зелёных полос и точек.

Говорят, что модуль gspca плохо поддерживает камеру. Готовое решение я сперва отыскал здесь, но потом (когда уже всё заработало по первому варианту) обнаружил здесь (на русском языке). Потому, чтобы не дублироваться решил привести ссылки на эти источники.

Вот, что хочу добавить: после установки модулей у меня перестал работать cheese, плохо заработала camorama (чёрно-белые 4-5 изображений, сжатых в один ряд по-горизонтали). Можно запустить gstreamer-properties и попробовать принудительно выбрать устройство видеозахвата (на v4l работало, на v4l2 — нет)

Ещё, что не указано в источниках, проверьте принадлежит ли ваш пользователь группе video. Название группы можно уточнить, просмотрев аттрибуты на файл /dev/video0. Добавив пользователя в группу и перелогинившись в X у меня заработал Skype (2.0.0.72).

Удачи вам с вашими камерами. Даже купив камеру, которая создала мне по умолчанию видео устройство, мне всё равно пришлось выполнить вышеуказанное.

27 февр. 2009 г.

Autotools с нуля

На этот раз, я постараюсь объяснить, возможно, знакомую всем по предыдущим постам тему об использовании Autotools. Мне пришлось этот путь пройти заново, и немного по-другому, для того, чтобы мой проект выглядел так, как того требуют Gnome Games. Так получилось, что я написал им письмо о том, что у меня есть игра Gnome Quod (для Ubuntu вы сможете использовать мой автоматический репозиторий на PPA), и я бы хотел привести её к виду, соответствующему Gnome Games. Автор сборника игр, выделил мне ряд требований, решив которые, я смогу попробовать заново попросить его о включении моей игры в их пакет. Ну да ладно, это будет не скоро, и я сомневаюсь в этом, но давайте приступим к подготовке нового пакета, прежней игры.

Здесь я буду описывать конкретные вещи, что я делал, и по-возможности, что получал. Для подробной информации по тому или иному макросу, советую вам поискать в мануалах.

Для начала создадим папку с названием gnome-quod. Так будет называться мой каталог, где будут находиться все исходники, весь пакет, откуда потом, мы будем создавать пакеты. Затем, создаём файл-шаблон configure.ac. Его будет просматривать скрипт Autotools с названием autoreconf. Этот скрипт занимает одно из главных положений, в нашем проекте. Первоначальное содержание configure.ac будет следующим (комментарии только для осмысления.):

# ======================== initialization ===============================
Здесь будет описываться инициализация проекта: имя, начальный каталог и пр.

# ==================== basic compiler settings ==========================
Основные опции компилятора (например, используемый язык)

# ==================== checks for libraries =============================
Проверка существования библиотек

# ==================== checks for header files ==========================
Проверка существования заголовочных файлов (если нужно)

# ===== checks for typedefs, structures and compiler characteristics ====
Проверка типов, структур, особенностей компилятора

# ==================== checks for library functions =====================
Проверка функций библиотек. Полезно, когда версия библиотеки мало ли соответствует требуемой, но в ней нет функции, или, например, вы не уточняете версию библиотеки, и потому в случае отсутствия функции, можете реализовать её сами.

# ==================== generate files ===================================
Здесь создаются файлы, которые потом используются make'ом

AC_OUTPUT -- эта строка даёт всему начало

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

# ======================== initialization ===============================
AC_INIT([Gnome Quod],
        [0.4.0],
        [vest@mail.com],
        [gnome-quod]) -- длинное имя, версия пакета, адрес куда стоит писать bug-репорты, краткое имя пакета

AC_CONFIG_SRCDIR([src/main.c]) -- проверка безопасности, что по этому адресу находится заведомо известный исходный файл
AC_CONFIG_HEADERS([config.h]) -- здесь создаётся заголовочный конфигурационный файл, который может быть использован в исходных файлах (в частности, там определена директива NDEBUG, см. ниже)
AM_INIT_AUTOMAKE([-Wall -Werror dist-bzip2]) -- включаем компилятору все предостережения и ошибки, чтобы подробно видеть всё на экране, о процессе компилции, дистрибутив распространяется в виде упакованного файла bz2
AC_DEFINE([NDEBUG], [], [Disable debugging information]) -- эта строка нужна лично мне, так как я использую assert функции, и если что, мне их нужно отключать

# ==================== basic compiler settings ==========================
AC_PROG_CC -- используем только Си компилятор
AM_PROG_CC_C_O -- нужно использовать вместо AC_PROG_CC_C_O, позволяет использовать флаги для каждой цели в Makefile
AC_HEADER_STDC -- проверка стандартных заголовочных файлов "stdlib.h", "stdarg.h", "string.h", "float.h". Это уже не нужно, так как они всегда есть, можно не проверять.

# ==================== generate files ===================================
AC_CONFIG_FILES([
  Makefile
  src/Makefile
]) -- происходит вызов AC_OUTPUT для каждого файла.
AC_OUTPUT -- создаёт много файлов, которые нам нужны

Далее создаём файлы-шаблоны Makefile.am и src/Makefile.am:

# Makefile.am
SUBDIRS = src

# src/Makefile.am
bin_PROGRAMS = quod
quod_SOURCES = main.c

Конечно же нам нужно создать main.c, с неким Hello World'ом.

#include <config.h>
#include <stdio.h>

int main(int argc, char** argv)
{
    printf("Hello World!\n");

    return 0;
}

Вот собственно и всё, на данный момент, далее выполняем следующие команды:

~/gnome-quod$ autoreconf --install
/usr/share/aclocal/lf_x11.m4:33: warning: underquoted definition of LF_PATH_XLIB
/usr/share/aclocal/lf_x11.m4:33: run info '(automake)Extending aclocal'
/usr/share/aclocal/lf_x11.m4:33: or see http://sources.redhat.com/automake/automake.html#Extending-aclocal
configure.ac:14: installing `./compile'
configure.ac:9: installing `./install-sh'
configure.ac:9: installing `./missing'
src/Makefile.am: installing `./depcomp'
Makefile.am: installing `./INSTALL'
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
Makefile.am: installing `./COPYING'
autoreconf: automake failed with exit status: 1

Как вы видите, получили ошибки. Связаны они с тем, что наш проект полностью соответствует GNU стандарту, согласно configure.ac, но на деле таковым не является. Требуется создать самому следующие файлы, и желательно заполнить их. Вы можете посмотреть пример заполнения в любом серьёзном проекте, либо обратившись к Learning the GNU development tools. Создадим их и попробуем ещё раз (я ещё создал файл THANKS, название говорит само за себя):

$ ls
AUTHORS ChangeLog configure.ac Makefile.am NEWS README THANKS src

$ autoreconf --install
/usr/share/aclocal/lf_x11.m4:33: warning: underquoted definition of LF_PATH_XLIB
/usr/share/aclocal/lf_x11.m4:33: run info '(automake)Extending aclocal'
/usr/share/aclocal/lf_x11.m4:33: or see http://sources.redhat.com/automake/automake.html#Extending-aclocal
configure.ac:14: installing `./compile'
configure.ac:9: installing `./install-sh'
configure.ac:9: installing `./missing'
src/Makefile.am: installing `./depcomp'
Makefile.am: installing `./INSTALL'
Makefile.am: installing `./COPYING'

Каждый раз, когда меняется один из шаблонов, следует вызывать autoreconf без параметров. Иногда вы встретите в пакетах файл autogen.sh, по идеи он похож с предыдущим. Не вдаваясь в подробности этапов конфигурирования, здесь осуществляется поочерёдный вызов некоторых скриптов, входящих в состав Autotools.

Можно избежать проблем с тем, что не существует файлов, для этого стоит "сказать", что мы не соответствуем стандарту, для этого следует изменить макрос AM_INIT_AUTOMAKE следующим образом:

...
AM_INIT_AUTOMAKE([-Wall -Werror dist-bzip2 foreign])
...

Теперь поочерёдно выполним следующие команды, и взглянем на результат:

$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
....
checking for ANSI C header files... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands

$ make
make all-recursive
make[1]: Вход в каталог `/home/vest/gnome-quod'
Making all in src
make[2]: Вход в каталог `/home/vest/gnome-quod/src'
gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gcc -g -O2 -o quod main.o
make[2]: Выход из каталога `/home/vest/gnome-quod/src'
make[2]: Вход в каталог `/home/vest/gnome-quod'
make[2]: Выход из каталога `/home/vest/gnome-quod'
make[1]: Выход из каталога `/home/vest/gnome-quod'

$ src/quod
Hello World!

Здесь я решил не урезать вывод, чтобы вы могли заметить. Тут поэтапно проходит конфигурирование, компиляция программы и последующий её запуск. Если вам нужен распространяемый пакет, выполните следующую команду make dist, в текущем каталоге вы получите следующие два файла:

$ ls -l gnome-quod-*
-rw-r--r-- 1 vest vest 73173 2009-02-27 01:01 gnome-quod-0.4.0.tar.bz2
-rw-r--r-- 1 vest vest 87568 2009-02-27 01:01 gnome-quod-0.4.0.tar.gz

Итак, на сегодня это пока всё. Вся вышеперечисленная информация, чуть более чем подробно объясняется в этой презентации (http://www.lrde.epita.fr/~adl/autotools.html). Советую с ней ознакомиться.

25 янв. 2009 г.

Игра на КДЕ. День последний.

Вот собственно игра окончилась, можно сказать, по-честному, прошла она не очень, но в то же время всё-таки прошла.

Короче... я стёр KDE и поставил себе Чистый Gnome.

Как высказались мои друзья, после KDE я потерял всякую мораль, стал замкнутым и отчуждённым. Глупо, но такое ощущение, что KDE может повлиять на человека не в лучшую сторону... не в лучшую.

Вы спросите буду ли я играть на KDE вновь? — Быть может, быть может. Я не хочу обещать, может быть это будет традицией, неделя Gnome, неделя KDE. Но если честно, KDE меня нервирует.

Я сожалею о том, что играл на KDE...