Создание Linux: создаём загрузочный Linux LiveCD



17 коммент.
Несмотря на то, что загрузочных Linux дистрибутивов развелось огромное количество, так или иначе хочется создать Linux для личных нужд и конкретных целей. Способов для создания загрузочных дистрибутивов Linux имеется много, от LFS до Knoppix Customisation Kit. Но "мы пойдём другим путём"и будем создавать загрузочный Linux на основе собственного дистрибутива и с минимальными трудозатратами. Ниже описываются шаги на примере Debian GNU/Linux и live-scripts.


Необходимые приготовления для создания загрузочного Linux
Для начала нужно скачать скрипты для создания загрузочного диска Linux отсюда. Желательно так же скачать и ядро, которое уже подготовлено для работы - и если вы не гонитесь за какими-то рекордами. Можно собрать и собственное ядро, но его придётся не раз пропатчить...

Далее нужна уже установленная система. Можно создать загрузочный Linux диск на основе той системы, которая есть, но я поставил отдельно Дебиан в эмуляторе QEMU и установил там только те приложения, которые нужны.


Настраиваем систему
Для этого монтируем файл-образ с установленной и настроенной системой на петлевое устройство и затаскиваем туда необходимые скрипты и ядро (от рута):
mount -t ext3 debianEtch40Xorg71Xwm.img /cdrom -o loop,offset=32256
cp linux-2.6.21.5-i486-1.tgz /cdrom/root
umount /cdrom

Распаковываем архив с ядром, перемещаем получившиеся файлы в соответствующие директории (загрузочный образ в /boot, модули - в /lib/modules, утилиты squashfs в /usr/bin). Всё это делается от рута. Далее генерируем образ initrd:
mkinitramfs -o /boot/initrd.img-2.6.21.5 2.6.21.5
Версия ядра может измениться, так что команду нужно будет поправить. Заменяем дистрибутивное ядро новым, изменяем grub.list, обновляем загрузчик update-grub - это сэкономит нам ещё около 60 Мб.
Загружаем эмулятор вместе с файлом-образом получившейся системы, тестируем, пробуем.
qemu -kernel-kqemu -hda debianEtch40Xorg71Xwm.img
Настраиваем виртуальный дистрибутив под наши задачи, устанавливая нужные пакеты и удаляя лишние. Лично у меня есть некий базовый дистрибутив в сжатом виде, как образ QEMU, и в зависимости от задач я меняю состав его программ.

Обязательно проверьте, установлен ли mkisofs - иначе создать живой CD не удастся и вы (забегая вперёд) получите сообщение:

# /tmp/live_data_2865/virenslinux/make_iso.sh
Target ISO file name [ Hit enter for /linux-live-6.1.4.iso ]: virenslive.iso
/tmp/live_data_2865/virenslinux/make_iso.sh: line 25: mkisofs: command not found


Если mkisofs есть, переходим дальше.


Создание загрузочного
диска Linux
Снова монтируем файл-образ настроенной системы на петлю:
mount -t ext3 debianEtch40Xorg71Xwm.img /cdrom -o loop,offset=32256
Теперь согласно руководству, копируем в /cdrom/temp (куда прикручена система для liveCD) скрипты для создания диска. Скрипты будут работать только от рута, так что можно немножко покрасноглазить :-)

Настраиваем скрипты, для чего заходим в каталог /linux-live-версия на прикрученной системе и редактируем файл .config
В нём можно изменить название LIVECDNAME на то, которое больше нравится, и главное - изменить KERNEL на то, которое установлено в той системе (здесь это 2.6.21.5). Таким образом, строка будет выглядеть:
KERNEL=2.6.21.5
Сделайте это, иначе на следующем шаге скрипт ядро не найдёт.


Генерация файлов живого диска
Теперь переходим к точке монтирования нашей новой системы
cd /cdrom
и входим в неё:
chroot /cdrom
Теперь все действия будут выполняться рутом относительно той системы, а не в которой вы работаете. Переходим в каталог со скриптами:
cd /tmp/linux-live-6.1.4/
и даём команду собрать образ:
./build
Для того, чтобы всё прошло успешно, в ядре обязательно должна быть включена поддержка ext2, иначе при сборке всё закончится ошибкой.

Changing current directory to /tmp/linux-live-6.1.4
Name of your live distro [hit enter for virensLinux]:
Linux Live scripts were installed successfuly in /
Enter path for the kernel you'd like to use [hit enter for /boot/vmlinuz]:
Creating LiveCD from your Linux
some debug information can be found in /tmp/linux-live-debug.log
copying cd-root to /tmp/live_data_9345, using kernel from /boot/vmlinuz
creating initrd image...
Using kernel modules from /lib/modules/2.6.21.5
mount: /dev/loop6 has wrong device number or fs type ext2 not supported
Error mounting initrd! Not enough free loop devices?

Если всё на месте, отвечаем на несколько вопросов, и видим процесс генерации:

notebeast:/tmp/linux-live-6.1.4# ./build
Changing current directory to /tmp/linux-live-6.1.4
Name of your live distro [hit enter for virenslinux]:
Linux Live scripts were installed successfuly in /
Enter path for the kernel you'd like to use [hit enter for /boot/vmlinuz]:
Creating LiveCD from your Linux
some debug information can be found in /tmp/linux-live-debug.log
copying cd-root to /tmp/live_data_2865, using kernel from /boot/vmlinuz
creating initrd image...
Using kernel modules from /lib/modules/2.6.21.5
creating compressed images...
base/bin.lzm ...
[========================================================= ] 100/112 89%
base/etc.lzm ...
[================================================================] 709/709 100%
base/home.lzm ...
[==================================================================] 37/37 100%
base/lib.lzm ...
[==============================================================] 2161/2161 100%
base/opt.lzm ...

base/root.lzm ...
[====================================================================] 7/7 100%
base/usr.lzm ...
[========================================================== ] 21934/22313 98%
base/sbin.lzm ...
[========================================================= ] 95/106 89%
base/srv.lzm ...

base/var.lzm ...
[==============================================================] 2100/2100 100%
--------done----------

* run /tmp/live_data_2865/virenslinux/make_iso.bat to create ISO image
* or copy content of /tmp/live_data_2865 to your USB device
and run ./boot/bootinst.sh (from the device!) to setup boot sector

Now press Enter...


За это время можно выпить чашечку кофе, или принять ванну (в зависимости от мощи процессора). У меня это отнимает около 10 минут. После этого нужно создать ISO-образ нашего загрузочного живого пингвина.


Создание загрузочного Linux LiveCD
Осталось последнее - создать ISO образ живого диска и пропалить его на болванку. Для этого переходим в каталог, куда скрипты утоптали пингвина и выполняем:
notebeast:/tmp/live_data_16804/virensLinux# ./make_iso.sh
После этого поползут диагностические строчки, и пойдёт процесс компоновки диска:
Target ISO file name [ Hit enter for /tmp/virensLinux.iso ]:
genisoimage 1.1.2 (Linux)
Scanning ../.
Scanning .././virensLinux
Scanning .././virensLinux/rootcopy
Scanning .././virensLinux/tools
Scanning .././virensLinux/tools/WIN
Scanning .././virensLinux/modules
Scanning .././virensLinux/optional
Scanning .././virensLinux/base
Scanning .././boot
Scanning .././boot/dos
Scanning .././boot/isolinux
Scanning .././boot/syslinux
Writing: Initial Padblock Start Block 0
Done with: Initial Padblock Block(s) 16
Writing: Primary Volume Descriptor Start Block 16
Done with: Primary Volume Descriptor Block(s) 1
Writing: Eltorito Volume Descriptor Start Block 17
Size of boot image is 4 sectors -> No emulation
Done with: Eltorito Volume Descriptor Block(s) 1
Writing: Joliet Volume Descriptor Start Block 18
Done with: Joliet Volume Descriptor Block(s) 1
Writing: End Volume Descriptor Start Block 19
Done with: End Volume Descriptor Block(s) 1
Writing: Version block Start Block 20
Done with: Version block Block(s) 1
Writing: Path table Start Block 21
Done with: Path table Block(s) 4
Writing: Joliet path table Start Block 25
Done with: Joliet path table Block(s) 4
Writing: Directory tree Start Block 29
Done with: Directory tree Block(s) 12
Writing: Joliet directory tree Start Block 41
Done with: Joliet directory tree Block(s) 12
Writing: Directory tree cleanup Start Block 53
Done with: Directory tree cleanup Block(s) 0
Writing: Extension record Start Block 53
Done with: Extension record Block(s) 1
Writing: The File(s) Start Block 54
6.43% done, estimate finish Sat Aug 11 10:00:37 2007
12.85% done, estimate finish Sat Aug 11 10:00:37 2007
19.27% done, estimate finish Sat Aug 11 10:00:32 2007
25.70% done, estimate finish Sat Aug 11 10:00:41 2007
32.11% done, estimate finish Sat Aug 11 10:00:43 2007
38.54% done, estimate finish Sat Aug 11 10:00:45 2007
44.95% done, estimate finish Sat Aug 11 10:00:46 2007
51.39% done, estimate finish Sat Aug 11 10:00:47 2007
57.80% done, estimate finish Sat Aug 11 10:00:47 2007
64.23% done, estimate finish Sat Aug 11 10:00:48 2007
70.64% done, estimate finish Sat Aug 11 10:00:48 2007
77.07% done, estimate finish Sat Aug 11 10:00:47 2007
83.49% done, estimate finish Sat Aug 11 10:00:48 2007
89.92% done, estimate finish Sat Aug 11 10:00:48 2007
96.34% done, estimate finish Sat Aug 11 10:00:48 2007
Total translation table size: 2048
Total rockridge attributes bytes: 6393
Total directory bytes: 22528
Path table size(bytes): 168
Done with: The File(s) Block(s) 77653
Writing: Ending Padblock Start Block 77707
Done with: Ending Padblock Block(s) 150
Max brk space used 0
77857 extents written (152 MB)


Готово, будет создан (в моём случае) файл virensLinux.iso, который является загрузочным диском. Проверяю в QEMU:
qemu -cdrom virensLinux.iso
Работает! Вот, например, что в итоге получилось у меня:



Простой и строгий IceWM с одной из тем по умолчанию (Infadel2). Простенько, но со вкусом. Правда, при загрузке оно пишет Slax, но это уже другая история.
Теперь ISO-образ пропаливаем на болванку любимой программой прожига, и радуемся.


Ссылки
Собственно, это есть расширенное руководство к скриптам отсюда, на которых, в частности, создаётся Slax. Документация в комплекте к скриптам страдает отчаянным лаконизмом, и я решил это исправить.
Море ссылок на аналогичные ресурсы можно найти там, сям и тут. Так же опытом в живом дистростроительстве делится мой коллега здесь. Некоторые говорят, что нечто подобное (live-package) есть в Debian, но я пока не пробовал.
Мысли, трюки и собственные впечатления в комментариях приветствуются.
Читать далее

Wget - повелитель закачек, или Как использовать wget



51 коммент.
Задача: хочется Teleport Pro и FlashGet для Linux.
Решение: откройте для себя wget - это программа скачивания сайтов, которая позволит вам скачать сайт целиком.

Часто ищут прежде всего множество графических программ с несколькими кнопками - но есть одна утилита, способная заменить их и предоставляющая возможности, которых больше нигде нет. Это wget и всё, что на нём основано. Освоение этой утилиты требует некоторых усилий и хотя бы беглого прочтения руководства, но взамен вы получаете мощную утилиту, которая будет экономить ваше время и трафик. Кстати, есть wget для windows, так что wget можно пользоваться не только в nix-системах.

Стоит сказать, что man wget при первом взгляде производит сокрушительное впечатление, однако потом понимаешь, что далеко не все опции нужны при повседневном использовании. Ниже приводятся наиболее часто используемые мною опции.

Эпиграф
О любви wget так много песен спето,
Я спою, тебе спою, ещё одну...
(c) Романс из к/ф "Три друга"



Использование а-ля "FlashGet for Linux"
Нужно просто скачать файл и/или продолжить закачку, которая оборвалась. Это очень и очень легко сделать, написав в терминале несколько строчек.

Просто скачать файл wget-ом

wget ftp://vasya.pupkin.com/film.avi

Ещё вариант: часть файла скачана, закачка оборвалась.

Для продолжения файла закачки пишем:

wget -c ftp://vasya.pupkin.com/film.avi
или
wget -continue ftp://vasya.pupkin.com/film.avi
Вместо -с можно написать -continue, так как каждый ключ имеет короткую и длинную формы: длинные ключи проще запомнить, но дольше писать. Можно легко смешивать различные формы написания.

Чтобы выкачать файлы из списка, содержащего прямые ссылки:

wget -i pupkinlist
или
wget -input-file=pupkinlist
Здесь указывается только файл, в котором содержатся ссылки. Файл может так же быть HTML-страницей, в которой есть ссылки. Они будут выкачаны указанной выше командой.



Использование а-ля "Teleport Pro for Linux"
При скачивании веб-сайтов возможностей больше, и поэтому требуется больше ключей. Опять-таки, запоминать их все не обязательно, можно сделать скрипт (а лучше несколько - под разные случаи) и вызывать их.
Так вот, если имеется веб-сайт, и хотелось бы иметь его локальную копию на компьютере, чтобы, отключившись от сети, можно было не торопясь его почитать.

Зеркалирование сайтов на локальную машину:

wget -m http://www.vasyapupkin.com/

Замечу, что при этом ссылки останутся абсолютными - то есть, будут указывать на Интернет-адреса, и удобно просматривать на локальной машине будет затруднительно.

Копирование сайта для локального просмотра:
wget -r -l0 -np -k http://www.vasyapupkin.com/

При этом будет включена рекурсивная выгрузка (ключ -r, --recursive), то есть не только файлы с главной страницы, но и все остальные, на которые ведут ссылки (ключ -l0 бесконечная вложенность ссылок). Имена ссылок будут переконвертированы в локальные для удобства просмотра (ключ -k). Так же при помощи ключа -np (no-parrent) можно запретить wget подниматься выше начального адреса при рекурсивной загрузке, то есть если вы копируете http://home.vasyapupkin.com/ то по ссылкам с основного сайта http://www.vasyapupkin.com/ скопированы не будут.

И несколько других полезных ключей
Включение и исключение файлов при загрузке
-A acclist | -accept acclist

-R rejlist | -reject rejlist
Задаёт разделяемые запятыми шаблоны имён файлов, которые следует загружать (acclist) или игнорировать (rejlist).

-k | -convert-links
Превращает абсолютные ссылки (типа http://www...) в относительные (типа file///home/vasya/www/index.html) для удобства локального просмотра. Чтобы локально в броузере просмотреть скачанный сайт, открываете файл index.html в броузере и бродите по ссылкам точно так же, как если бы вы были подключены к Интернету.



-H
--span-hosts

Разрешает wget скачивать данные с любого адреса, на который есть ссылка в запрашиваемом документе.

-p --page-requisites

Загружать все файлы, которые нужны для отображения страниц HTML. Например: рисунки, звук и каскадные стили. После завершения загрузки конвертировать ссылки в документе для просмотра в автономном режиме. Это касается не только видимых ссылок на другие документы, а ссылок на все внешние локальные файлы.


Ограничение канала загрузки –limit-rate=значение в кб. Например:

wget --limit-rate=50k http://www....

Это приведет к тому, что скорость загрузки не будет превышать указанных в примере пятидесяти килобайт/сек.

Siteget - простой скрипт для скачивания сайтов
Если вам надоели все эти премудрости с ключами wget и нужно просто скачать сайт, то siteget вам определённо понравится. Это довольно простой скрипт с необходимыми параметрами для загрузки сайта.
Взять скрипт можно тут, использование очень простое:
siteget http://www.vasyapupkin.com/
Большое спасибо за ссылку jetxee, который писал об этом здесь.


Ссылки:
Их очень много. Вот здесь лежит простое описание возможностей wget, здесь часть ключей с интересными комментариями. Что-то взято отсюда и отсюда. Ну и конечно это не отменяет прочтение руководства man wget, в том числе на русском.
Читать далее

Настройка WiFi в Linux на примере беспроводной карты WiFi Intel PRO/Wireless на ноутбуке Asus M5200AE



17 коммент.
Здесь я уже писал о том, что на моём ноутбуке Asus M5200AE всё играет и поёт. А не так давно, в связи с приобретением Nokia N800, потребовалось настроить WiFi в Linux. Тут я вспомнил, настройка WiFi прошла как-то слишком просто - сейчас, думаю, с полпинка всё и настрою. Полпинка вылились в небольшое пешее эротическое путешествие со счастливым концом :-)






На всякий случай, в BIOS на Asus M5200AE можно попасть с помощью кнопки  <F2> при загрузке. Если же мы хотим увидеть меню выбора загрузочных устройств (Boot Menu), нужно нажать кнопку <ESC> при появлении экрана BIOS. Доступны варианты загрузки с USB drive, CD-ROM и жёсткого диска.




Настройка WiFi в Linux на примере Intel PRO/Wireless 2200Адаптер от Интел, так что проблем быть по определению не должно. Их, собственно, и нет: качаем firmware отсюда, распаковываем и кидаем её в /usr/share/firmware







Как говорят здесь, WLAN works with the driver ipw2200 from IPW2200's homepage. To use it with 2.6.13, you need these patches:

    ieee80211-for-2.6.13
    ipw2200-for-2.6.13
    ipw2200-suspend2-fix

But still, there is a problem with the RF-Kill switch. According to /sys/bus/pci/drivers/ipw2200/0000:01:05.0/rf_kill, it is hardware-controlled, but Fn+F2 does not do anything. The driver from the project RFSwitch does not work either.



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

aptitude install wireless-tools, kwifimanager, kwirelessmonitor-net kwirelessmonitor kwrapper
А так же ставим пакеты для работы с ACPI, если они ещё не установлены:
aptitude install acpi-support acpid laptop-mode-tools
После этого у вас будет запущен демон acpid и в /etc/acpi добавится много полезных и нужных скриптов.

И если всё правильно сделано, то при загрузке в логах будет видно вот что:
ieee80211_crypt: registered algorithm 'NULL'
ieee80211: 802.11 data/management/control stack, 1.1.14
ieee80211: Copyright (C) 2004-2005 Intel Corporation
ipw2200: Intel(R) PRO/Wireless 2200/2915 Network Driver, 1.1.3dmprq
ipw2200: Copyright(c) 2003-2006 Intel Corporation
ACPI: PCI Interrupt 0000:01:05.0[A] -> GSI 18 (level, low) -> IRQ 17
ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection
ipw2200: Radio Frequency Kill Switch is On:
Kill switch must be turned off for wireless networking to work.
ipw2200: Detected geography ZZM (11 802.11bg channels, 0 802.11a channels)
Всё здорово, и вроде как работает, но смущают строчки, которые я выделил красным. Что за Kill Switch и почему нельзя подключиться к сети, если он включён?


Аппаратный убийца радиопередатчика

Есть такая комбинация клавиш на ноутбуке, которая включает и выключает радиопередатчик wifi-чипа. Эта комбинация называется "Kill Switch" - если вы не нажали эти клавиши и не включили передатчик, никакие ваши шаманства не помогут.

Проверяется это так: в /proc должен быть файлик с названием rf_kill. Лежать он может в директории, в которой находятся сведения о беспроводной карте. Для того, чтобы проверить положение Kill Switch, выводим его содержимое:
# cat /sys/bus/pci/drivers/ipw2200/0000\:01\:05.0/rf_kill
2
Согласно документации, имеем:
rf_kill
read -
0 = RF kill not enabled (radio on)
1 = SW based RF kill active (radio off)
2 = HW based RF kill active (radio off)
3 = Both HW and SW RF kill active (radio off)

Всё, аппаратный переключатель включён, радио выключено. Это видно и в выводе iwconfig:

eth3 radio off ESSID:"virens"
Mode:Ad-Hoc Frequency:2.412 GHz Cell: Not-Associated
Bit Rate:0 kb/s Tx-Power=off Sensitivity=8/0
Retry limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:off
Link Quality:0 Signal level:0 Noise level:0
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0

Как правило, комбинация для включения\отключения Kill Switch - Fn+F2 но у вас она может быть другой.



Для того, чтобы она работала, нужно, чтобы в ядре была включена поддержка ACPI, причём само ACPI монолитно, а драйверы для событий - модульно. При этом должна быть выключена поддержка Asus Extras (если у вас ноутбук Asus, конечно).
Странно, но именно так - поддержка дополнительных возможностей должна быть отключена, чтобы заработала единственная кнопка Fn+F2. Необычно, но медицинский факт - с ней не работает...
Если у вас ядро дистрибутивное и там всё включено - я очень за вас рад, можете это пропустить. Тем, кто собирает ядра под свои машины - шпаргалка.

Итак, в ядре должно быть:

Power management options (ACPI, APM) --->
[*] Power Management support ---->
[*] ACPI Support:
<М> AC Adapter
<М> Battery
<М> Button
<М> Video
<М> Fan
<М>Processor
<М>Thermal Zone
< > ASUS/Medion Laptop Extras
<--- в положении ВЫКЛЮЧЕНО!
Теперь идём дальше и включаем поддержку Radio Frequency Kill Switch

Networking --->
[*] Networking support -->
Improved wireless configuration API
--- Wireless extensions
<М> Generic IEEE 802.11 Networking Stack (mac80211)
[ ] Enable debugging output
<М>Generic IEEE 802.11 Networking Stack
[ ] Enable full debugging output
--- IEEE 802.11 WEP encryption (802.1x)
<М> IEEE 802.11i CCMP support
<М> IEEE 802.11i TKIP encryption
<М> Software MAC add-on to the IEEE 802.11 networking stack
[ ] Enable full debugging output

Там же, в Networking, включаем:
<*> RF switch subsystem support --->
<*> Input layer to RF switch connector
Наверняка потребуется NAT для того, чтобы беспроводные устройства могли выходить в Интернет по проводному \ модемному соединению. Поэтому включаем всё, что относится к NAT и Masquerading:

Networking --->
[*] Networking support -->
Networking options --->
[*] Network packet filtering framework (Netfilter) --->
Core Netfilter Configuration --->

<*> Netfilter netlink interface
...
<*> Netfilter connection tracking support

IP: Netfilter Configuration --->
<*> IPv4 connection tracking support (required for NAT)
[*] proc/sysctl compatibility with old connection tracking
<*> IP tables support (required for filtering/masq/NAT)
<*> IP range match support
<*> TOS match support
<*> recent match support
<*> ECN match support
<*> AH match support
<*> TTL match support
<*> Owner match support
<*> address type match support
<*> Packet filtering
<*> REJECT target support
<*> LOG target support
<*> ULOG target support
<*> Full NAT
<*> MASQUERADE target support
<*> REDIRECT target support
<*> NETMAP target support
<*> SAME target support
...
<*> Packet mangling
<*> TOS target support
<*> ECN target support
<*> TTL target support
Приведённые настройки - не догма, а руководство к действию. Но всё, что касается NAT и Masquerade включать обязательно.

Идём дальше, нам нужно включить поддержку нашей интеловской карты. Нужен раздел в корне под названием Device Drivers, оттуда мы продолжим успешное наступление на беспроводные сети.

Device Drivers ---->
Network device support --->
[*] Network device support
.................
Wireless LAN --->

[*] Wireless LAN (IEEE 802.11)
<М> Intel PRO/Wireless 2200BG and 2915ABG Network Connection
<------- это наш драйвер, его делаем модулем.
[*] Enable promiscuous mode
--- Enable radiotap format 802.11 raw packet support
[*] Enable creation of a RF radiotap promiscuous interface
[*] Enable QoS support
[*] Enable full debugging output in IPW2200 module.

Включаем поддержку загрузки firmware:
Device Drivers ---->
Generic Driver Options ---->
Hotplug firmware loading support

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

Для шифрования соединения нужна поддержка алгоритмов шифрования:
Cryptographic options ->
<*>ARC4 cipher algorithm
<*>Michael MIC keyed digest algorithm
<*>AES cipher algorithms (i586)

И ещё вот это:
Library routines ->
<*>CRC32 functions


Ну и наконец включаем поддержку LED-ов, чтобы лампочками можно было мигать при включении WiFi. Там же, в Device Drivers, ищем внизу:

Device Drivers ---->
LED devices --->
[*] LED Support
<*> LED Class Support
--- LED drivers
--- LED Triggers
Поздравляем себя, ещё раз проверяем, не пропустили ли от счастья какие-нибудь подлые грабли, собираем ядро, ставим его в загрузку, перезагружаемся.


Ключ на старт!Всё готово для нашего беспроводного счастья. Собственно, оно должно наступить ещё при загрузке: ядро обнаружит ACPI-возможности ноутбука и включит лампочку беспроводного соединения. Подгрузится модуль ipw2200, ieee80211 и ieee80211_crypt.

Теперь нажимаем Fn+F2 и смотрим, загорается \ потухает ли лампочка. Если да - мои поздравления, аппаратный переключатель в наших руках. Снова проверяем состояние Kill Switch, выводим его содержимое:
# cat /sys/bus/pci/drivers/ipw2200/0000\:01\:05.0/rf_kill
0
Всё, радио включено. Теперь смотрим вывод:
# iwconfig
lo no wireless extensions.

eth1 no wireless extensions.

Warning: Driver for device eth3 has been compiled with version 22
of Wireless Extension, while this program supports up to version 20.
Some things may be broken...

eth3 unassociated ESSID:"virens"
Mode:Ad-Hoc Frequency=2.412 GHz Cell: Not-Associated
Bit Rate:0 kb/s Tx-Power=20 dBm Sensitivity=8/0
Retry limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:off
Link Quality:0 Signal level:0 Noise level:0
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
Заработало! Остался сущий пустяк - настроить сеть. Для начала лучше настроить простую Ad-Hoc сеть (то есть точка-точка). Лучше назначить сетевые адреса, и, если сеть маленькая - статические.

В /etc/network/interfaces пишем что-то вроде:

auto eth3
iface eth3 inet static
address 10.106.146.1
netmask 255.255.255.0
wireless-mode ad-hoc
wireless-channel 1
wireless-rate auto
wireless-essid virens

Теперь настраиваем саму карту:
iwconfig eth3 mode Ad-Hoc channel 1 essid virens
Всё, теперь у вас есть простая одноранговая беспроводная сеть с идентификатором virens (настройка сети приведена, естественно, на моём рабочем примере). Прочитать о том, что такое essid и прочие заумные тонкости беспроводной связи можно в этой изумительной статье.
Читать далее

Вертикальная конкатенация двух файлов



9 коммент.
Обработанные экспериментельные данные часто представляют собой ряды чисел, по которым затем небходимо строить графики. Иногда требуется склеить данные из двух источников так, чтобы новые данные были дополнительными столбцами в уже существующих данных.

Задача:
Есть данные A:
$ cat RAWMAXmeasurementresult
2.7100000e+02 2.8300000e+02 2.8000000e+02
2.7300000e+02 2.8700000e+02 2.8400000e+02
2.7400000e+02 2.9600000e+02 2.9000000e+02
2.7800000e+02 3.0400000e+02 2.9800000e+02

Есть другой файл с данными B, полученный обработкой результата эксперимента в другой программе:
$ cat shutter
.00024414062500000000
.00031661600810536980
.00037652020030874656
.00048828125000000000

Нужно сделать так, чтобы в результате получился файл типа:
2.7100000e+02 2.8300000e+02 2.8000000e+02 .00024414062500000000
2.7300000e+02 2.8700000e+02 2.8400000e+02 .00031661600810536980
2.7400000e+02 2.9600000e+02 2.9000000e+02 .00037652020030874656
2.7800000e+02 3.0400000e+02 2.9800000e+02 .00048828125000000000
Так проще строить графики в гнуплоте, что в скриптах реализуется сравнительно просто.

Условия:
1. Ряды A и B можно перемещать, но нежелательно менять местами данные в ряде А.
2. Решение должно предполагать автоматизированную обработку (данных очень много, Ексель \ ОпенОфис Calc отпадают).
3. Ряд B получается не напрямую, сделать всё в одной программе нельзя.
4. Разделители - пробелы (количество неважно).
5. Задача не надуманная.

Что требуется:
Скрипт\программа, делающая такую конкатенацию, максимально кроссплатформенная (никаких вижуал васиков), ориентированная на *nix-среду.


Решение:
Изумительное по краткости и лаконичности: использование команды paste.
$ paste -d " " RAWMAXmeasurementresult shutter > ourendresult
И вся любовь.

Первоначально найденное решение:
Скрипт на Perl делающий всё это:

#! /usr/bin/perl
use strict;
use warnings;

my $kmvSourceFileName="RAWMAXmeasurementresult"; ## File that will be expanded by adding data
my $kmvTargetFileName="shutter";## File to be added to source file

my @kmvSourceFile =`cat $kmvSourceFileName`; ## file content
my @kmvTargetFile =`cat $kmvTargetFileName`;

my $kmvMaxIndexSourceFile = scalar @kmvSourceFile; ## how many elements in massive?

for (my $ii=0; $ii<$kmvMaxIndexSourceFile; $ii++)
{
if (index($kmvSourceFile[$ii], "\n")>0) ## if there is end-of-line symbol - remove it from source line
{
chop $kmvSourceFile[$ii];
}
$kmvSourceFile[$ii] = $kmvSourceFile[$ii]." ".$kmvTargetFile[$ii];
}

my $kmvResultFileName = $kmvSourceFileName.$kmvTargetFileName;

open(DATA, "+>$kmvResultFileName");##Открываем файл, куда пишем тестовые результаты
print (DATA @kmvSourceFile); ## Сюда пишем тестовые результаты
close(DATA); ##Закрываем файл, куда пишем тестовые результаты

Скрипт есть и он работает, но з
олотые мои анонимные комментаторы предложили решение, изумительное по краткости и лаконичности: использование команды paste.
Читать далее

Продвинутые средства анализа изображений в nip2



7 коммент.
Некоторое время назад я уже писал об этом замечательном графическом редакторе nip2 для огромных изображений - сейчас я хочу записать методы обработки изображений в нём. По роду текущей деятельности приходится иметь дело с 12-битными изображениями (конвертированные RAW-файлы при помощи dcraw в полностью документальный режим), так что просматривать и работать с такими картинками в обычных редакторах (типа GiMP или Krita) не удобно. Зато в nip2 можно и просматривать изображения любой битности, и выполнять весьма изощрённые методы обработки. Об этом ниже и будет говориться.


Несколько слов об интерфейсе
Способ взаимодействия с пользователем у nip2 весьма оригинален, и к нему требуется привыкнуть. Это своеобразная таблица, каждая следующая ячейка которой - результат операции с предыдущей. И так далее: таким образом, конечный результат зависит от результатов обработки на предыдущих шагах, и при изменении любого шага автоматически пересчитывается.
Это одна из изюминок nip2. Например, вы создали некую последовательность фильтров, откадрировали и хотите быстро посмотреть фурье-спектр, но для другого изображения вместо загруженного сейчас. Легко и просто: щёлкаем правой кнопкой мыши по ячейке с исходным изображением (как правило, левое верхнее), и выбираем "Replace from file".
После этого результаты всей цепочки фильтров и преобразований быстро пересчитаются для нового изображения. Это бывает очень полезно при анализе результатов экспериментов.

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


Изменение масштаба яркости при просмотре
Очень полезная функция для просмотра изображений.

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


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


Быстрое выделение области
Если нужно быстро выделить область интереса на изображении, достаточно зажать клавишу CTRL на клавиатуре и начать выделять мышью нужную область. Тут же будет создана новая область с названием, соответствующем текущему ряду и последнему свободному номеру ячейки (например, если ряд B и ячейка 14 последняя - новая будет называться B15).


Быстрое перемещение по изображению
Колёса продолжают рулить! Колесом мыши можно скроллить изображение вверх-вниз, а если зажать SHIFT и использовать колесо мыши - скроллинг будет в направлениях "влево-вправо". Очень удобно перемещаться так без использования полос прокрутки.


Горячие клавиши в nip2
Если вы часто используете какую-то функцию, есть смысл поставить на неё горячую клавишу. Для этого открываем меню, доходим до нужной нам функции кнопками клавиатуры, подсвечиваем её (или нажимаем её кнопкой мыши и держим для подсветки) и наживаем к примеру сочетание клавиш CTRL+M - и теперь эту функцию можно вызвать по нажатию CTRL+M.



Анализ изображений в nip2

С помощью nip2 можно проводить довольно сложный анализ изображений: Фурье-анализ, корреляционный анализ, свёртка, low-pass/high-pass фильтры и прочее.

Фурье-анализ в nip2
Часто бывает необходимо видеть Фурье-спектр изображения, особенно тогда, когда к нему применяются методы обработки. Для этого идём в Toolkits - Math - Fourier - Forward для прямого фурье-преобразования. Считается оно в первый раз довольно долго, зато потом будет пересчитываться быстро.

Там же, в nip2, можно выполнить и обратное фурье-преобразование. Для этого идём в Toolkits - Math - Fourier - Reverse и получаем назад своё изображение.

Гистограмма изображения в nip2
Гистограмма это зависимость количества пикселей одного уровня яркости от яркости изображения - она даёт представление о том, пикселей какой яркости на изображении больше или меньше. Функция чрезвычайно полезная при анализе изображений, и, разумеется, она присутствует в nip2. Для этого выделяем изображение, которое собираемся анализировать, и идём в меню Toolkits - Histogram - Find - One Dimension.
В результате, как на скриншоте выше, имеем красивую и информативную гистограмму изображения.



Изменение изображений в nip2
Некоторые привычные операции, такие как кадрирование, в nip2 есть, просто они могут выглядеть, согласно философии nip2, несколько непривычно...

Кадрирование
Есть и эта операция, причём её можно делать и визуально, и имея точные координаты.
Точное кадрирование можно осуществить, либо когда вам известны координаты области, либо используя nip2 в поточном режиме (для этого следует использовать команду vips и мануал к ней). Отмечаем ячейку с изображением, которое необходимо кадрировать, и идём в Toolkits - Image - Crop. После этого появится ещё одна ячейка ниже, и
потребуется указать координаты среза.

Визуальное кадрирование можно применить к изображению, открыв изображение на просмотр в окне, идём в меню File - New - New Region. Теперь меняем размер области и её положение по вкусу.
А можно сделать и ещё проще: для кадрирования в nip2 достаточно, зажав клавишу CTRL, выделить желаемую область на изображении - и в следующей ячейке сразу же появится желаемая область выделения.


Порог
Казалось бы, простая вещь - есть в любом уважающем себя графическом редакторе. В nip2 это тоже есть, но не так очевидно. Мне пришлось некоторое время поломать голову и проявить немного сообразительности: порог, как выясняется, можно сделать в два этапа. В nip2 есть простые статистические операции: среднее, минимум, максимум и прочее. Выделяем изображение и находим, например, среднее (Toolkits - Math - Statistics - Mean). В следующей ячейке появится число:
Теперь выделяем, зажав Shift, сначала ячейку с числом, а потом ячейку с картинкой. После чего идём в математику (Toolkits - Math) и ищем Relational (Соотношения). Выбираем Less than - это ли не порог? Отлично, в следующей ячейке появится чёрно-белое изображение с порогом. На скриншоте выделено полупрозрачным.
Обновлено: оказывается, всё проще - в nip2 недавно появилась специальная функция порога, которая упрятана в меню Toolkits - Image - Select - Threshold.

Склеивание изображений в nip2.
Чтобы склеить несколько изображений в одно, вовсе не нужен фотошоп - с этим прекрасно и быстро справляется nip2. Причём справляется тем лучше, чем больше изображений или фотографий нужно склеить. Например, если у вас имеются снимки со сканирующего микроскопа и нужно склеить десяток снимков - это лучше сделать в nip2. Для этого идём в меню Toolkits - Image - Join - Left to Right если хотим склеить изображения по горизонтали (левый край к правому краю) или Top to Bottom (если нужно склеить верхний край изображения к нижнему краю). Вот что при этом получается:


Пользуясь Toolbox - Image - Join, легко склеить несколько больших изображений в одно для последующего просмотра и анализа.


Корректировка перекоса яркости (tilt brightness)
Следует отметить, что при научных съёмках часто на изображениях появляется перекос яркости: когда одна часть изображения освещения сильнее другой (меняющаяся яркость от края изображения к середине). Этот достаточно неприятный эффект можно устранить в nip2 так: Tools - Filters - Tilt brightness.
Это позволит восстановить освещённость на изображении. А используя табличное свойство nip2, вы получаете возможность оперативно перерисовать большое изображение с учётом скорректированной яркости.

Вывод посчитанных данных
Вывод посчитанных значений из nip2 делается так: открываем меню View / Workspace Definitions, и пишем:
main = A1;
нажимаем "Process". После этого сохраняем Now save the workspace as "test.ws" and at the
command-line run:
$ nip2 -bp test.ws
и получите свои данные в консоли.

Резюме
Здесь я привёл несколько наиболее часто используемых мной возможностей nip2 для просмотра и анализа изображений. На всякий случай, особенности сборки последних версий nip2 в Linux описаны в этом посте.

Читать далее

Юмор: Линус Торвальдс теперь с нами



15 коммент.
Один из разработчиков Дебиан, Филип Хендс (Philip Hands), сфотографировал Линуса, когда он примерял новую футболку.

На блоге the debian user в комментариях Линуса призывают присоединиться "к тёмной стороне Силы".
И хотя Линус говорил о том, что ему нравится Федора и даже Мак - мы-то теперь располагаем неопровержимыми данными о том, какой же дистрибутив ему нравится на самом деле :-)
Читать далее

Новый метод масштабирования растровых изображений с учётом их содержимого Liquid Rescale



12 коммент.

На блоге Александра Артёменко aka Большой 40ваттный Светляк появилось описание замечательного плагина для GiMP - Liquid Resize. Этот плагин - реализация алгоритма, который анализирует изображение перед изменением размеров на предмет "важных" и "неважных" областей. При изменении размера "неважные" области сдавливаются, что приводит к сохранению на изображении существенных деталей и, до разумных пределов, пропорции этих деталей.

На странице автора, Ариэля Шамира, есть статьи в PDF, поясняющие работу алгоритма. Но лучше всего посмотреть это видео:


Плагин для GiMP доступен для скачивания и установки здесь в виде пакета Дебиан (собрано для Etch), нужно лишь подключить репозиторий. После установки плагина, в меню "Изображение" появляется строчка "Liquid Resize". Далее появляется простой диалог для изменения размера:

Плагин работает, но требователен к ресурсам, довольно медленный и имеет небольшой баг:

«Умершее дополнение может испортить внутреннее состояние GIMP. Возможно, для обеспечения безопасности стоит сохранить изображения и перезапустить GIMP

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

Тем не менее, интересные возможности плагина стоят того, чтобы пару раз перезапустить GiMP :-)

Сейчас скачал статью Шамира и сижу читаю. Прочитал - принцип в общих чертах понятен.

Принцип работы

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

Далее, нужно создать кривую, от верхнего края картинки до нижнего и от правого края до левого - попавшие на эту кривую пиксели будут убраны для уменьшения масштаба. Такая своеобразная "обрезка по шву".
Это не так просто: нужно кривую подобрать так, чтобы она проходила по "неважным" пикселям - тем, которые не являются градиентом. Пиксели с резким переходом будут удаляться такими кривыми в последнюю очередь - вот что обеспечивает сохранение пропорций важных объектов!

Может, я немного мутно излагаю - поясню на примере. Вот у нас есть картинка с морем и детьми.
Нужно её сжать в горизонтальном направлении, сделать уже. Что делает алгоритм? Он находит градиент, и начинает создавать вертикальные швы - швы, которые обходят контрастные детали (дети, резкие края берега моря, силуэты гор). При этом удаляются детали воды и облака - а так как швы не просто прямые линии, а непрерывные кривые, пропорции "важных" деталей сохраняются. Получается что-то вроде прореживания.

Другой вариант - растяжение. Тут всё тоже самое: находится градиент, и изображение начинает растягиваться за счёт увеличения количества "неважных" деталей: становится длиннее море с берегами, растут вширь горы - а изображения детей и других контрастных элементов почти не уширяются. Алгоритм пытается найти такие швы, которые наименьшим образом искажают элементы изображения, имеющие большую энергию (которые находятся в области градиента).


Чтобы стало совсем всё понятно, откройте в GiMP изображение, найдите от него градиент ("Фильтры" - "выделение края" - "Лаплас") и попробуйте изменить масштаб при помощи этого фильтра.

В оригинальной статье (20Мб, PDF) всё это рассказано с формулами и выкладками, а я попытался это изложить на пальцах - если кому интересно.
Читать далее