Разные, на мой взгляд, интересные замечания, связанные с компьютерами в частности и техникой вообще.
Показаны сообщения с ярлыком Linux. Показать все сообщения
Показаны сообщения с ярлыком Linux. Показать все сообщения
вторник, 17 июля 2012 г.
MySQL: Дамп всех таблиц с определённым префиксом
Попалась недавно одна кривая база. В ней были одновременно два проекта. У одного из них для всех таблиц использовался один префикс(условно xxx_), у другого соответственно другой(скажем yyy_). Понадобилось разделить эту таблицу на две разных. Были идеи дампить каждую таблицу отдельно, а потом в консоли объединять cat'ом или писать скрипт, который по регекспу сдампит только те таблицы, что мне нужны. Но оба решения мне показались костылями, поэтому немного подумав пришёл в итоге к такому вот решению(параметры -u, -p, -h опустил намеренно для наглядности):
mysql -NB information_schema -e "select table_name from tables where table_name like 'prefix_%'" | xargs mysqldump dbname > only_prefix.sql
вторник, 21 февраля 2012 г.
Восстановление базы установленных пакетов в debian
Решил тут перейти на нетбуке со стабильной ветки debian'а на тестинг. Так как на моей eeepc'шке всего 4 гига флешка внутри, места для dist-upgrade не хватило бы. Но я уже обновлял его с lenny до squeeze в своё время, так что это не проблема. Беру обычную флешку, форматирую в ext3, подключаю и тут я допускаю первую ошибку. Вместо того, чтобы просто примонтировать эту флешку как /var/cache/apt/archives, я копирую на неё содержимое /var/ и командую mount /dev/sdb1 /var/. Само по себе это тоже не проблема. Я спокойненько обновился, отмонтировал флешку и ребутнулся. Это было второй ошибкой. Дело в том, что помимо всего прочего на /var/ лежит база установленных пакетов dpkg. Находится она в /var/lib/dpkg/status. И тут я понимаю, что после того, как система обновилась, я допустил третью ошибку. Мне понадобилась флешка и я её снова форматнул.
Итак, ситуация. На нетбуке установлен Debian Wheezy. Но dpkg думает, что там squeeze(я же монтировал просто поверх /var/, и всё, что там было, осталось неизменным). В итоге dpkg и apt в ступоре. Они смотрят в базы установленных пакетов, сравнивают их с репами и понимают, что надо обновляться. Но при попытке что-нибудь установить или обновить, dpkg проверяет установленные файлы и понимает, что они не соответствуют тому, что у него в базе(версии-то разные) и отказывается что-либо делать. И я его понимаю. Например, он ругается на libc6. Он же видит, что у меня динамический линковщик ссылается на определённую библиотеку. Но у него в базе говорится, что стоит другая библиотека. Поэтому dpkg честно выдаёт "Ты там разберись сперва с тем, что в обход меня поставил, а потом уже обновляйся, а то я тебе всё сломать могу". Итого - система как бы работает, но пакетный менеджер как бы умер.
Есть два выхода. Каким-то образом восстановить dpkg или переустановить всё с нуля, забекапив конфиги. В случае со вторым вариантом, желательно ещё узнать, какие пакет у меня были установлены, чтобы потом не сидеть и не вспоминать, чего там где было. И пока я думал, как же вытащить список пакетов, в голову пришла идея "если у меня будет список пакетов, зачем переустанавливать? Можно же просто записать их в базу dpkg и работать дальше". На том и порешили.
Для начала надо получить список. Чем славится debian(ну и любой нормальный linux)? Правильно. Тем, что у него на каждый пакет обязательно существует документация. И находится она прямо в системе. Не нужно ни интернетов, ни толстых книжек. Всё с собой. А это значит, что мне нужно посмотреть, на что у меня есть доки и я узнаю, какие у меня стоят пакеты. Решение для первой части проблемы есть.
Но это даст мне только названия пакетов. А для dpkg нужно версии, зависимости и ещё целую кучу всякой информации. И лучшее место, где взять эту информацию - репы. Собственно, это всё тоже уже в системе. Мы получаем все версии, описания, зависимости и т.д., когда командуем apt-get update. И, к счастью, для этой команды не важно - есть там что-то в базе установленного или нет. Она работает и так.
Осталось дело за малым - написать скрипт, который пройдётся по докам, соберёт имена, а потом с этими именами пробежится по спискам пакетов из реп, распарсит это дело и сложит в нужном виде в базу dpkg.
Собственно, вот этот скрипт.
syntax highlighted by Code2HTML, v. 0.9.1
Небольшие пояснения. Сначала мы указываем пути, где лежит документация и где списки пакетов, скачанные с реп при обновлении. Потом получаем список пакетов и начинаем по очереди для каждого из них искать информацию, складывать её в хеш, из которого потом в свою очередь записывать в файл в формате, необходимом dpkg. Вот и всё. Запускается скрипт без параметров, работает долго, на выходе выдаёт файл status, который надо положить в /var/lib/dpkg/.
Какие можно из всего этого сделать выводы?
1. Не начинайте делать серьёзных вещей в два-три часа ночи. По невнимательности можно допустить несколько казалось бы мелких ошибки, из-за которых потом придётся долго отдуваться.
2. GNU/Linux - система неубиваемая. Даже после конца света, она будет работать, хотя, может быть, людей уже и не останется.
Итак, ситуация. На нетбуке установлен Debian Wheezy. Но dpkg думает, что там squeeze(я же монтировал просто поверх /var/, и всё, что там было, осталось неизменным). В итоге dpkg и apt в ступоре. Они смотрят в базы установленных пакетов, сравнивают их с репами и понимают, что надо обновляться. Но при попытке что-нибудь установить или обновить, dpkg проверяет установленные файлы и понимает, что они не соответствуют тому, что у него в базе(версии-то разные) и отказывается что-либо делать. И я его понимаю. Например, он ругается на libc6. Он же видит, что у меня динамический линковщик ссылается на определённую библиотеку. Но у него в базе говорится, что стоит другая библиотека. Поэтому dpkg честно выдаёт "Ты там разберись сперва с тем, что в обход меня поставил, а потом уже обновляйся, а то я тебе всё сломать могу". Итого - система как бы работает, но пакетный менеджер как бы умер.
Есть два выхода. Каким-то образом восстановить dpkg или переустановить всё с нуля, забекапив конфиги. В случае со вторым вариантом, желательно ещё узнать, какие пакет у меня были установлены, чтобы потом не сидеть и не вспоминать, чего там где было. И пока я думал, как же вытащить список пакетов, в голову пришла идея "если у меня будет список пакетов, зачем переустанавливать? Можно же просто записать их в базу dpkg и работать дальше". На том и порешили.
Для начала надо получить список. Чем славится debian(ну и любой нормальный linux)? Правильно. Тем, что у него на каждый пакет обязательно существует документация. И находится она прямо в системе. Не нужно ни интернетов, ни толстых книжек. Всё с собой. А это значит, что мне нужно посмотреть, на что у меня есть доки и я узнаю, какие у меня стоят пакеты. Решение для первой части проблемы есть.
Но это даст мне только названия пакетов. А для dpkg нужно версии, зависимости и ещё целую кучу всякой информации. И лучшее место, где взять эту информацию - репы. Собственно, это всё тоже уже в системе. Мы получаем все версии, описания, зависимости и т.д., когда командуем apt-get update. И, к счастью, для этой команды не важно - есть там что-то в базе установленного или нет. Она работает и так.
Осталось дело за малым - написать скрипт, который пройдётся по докам, соберёт имена, а потом с этими именами пробежится по спискам пакетов из реп, распарсит это дело и сложит в нужном виде в базу dpkg.
Собственно, вот этот скрипт.
#!/usr/bin/perl -w # my $docsdir = "usr/share/doc/"; my $listsdir = "var/lib/apt/lists/"; my (@packages, @lists); # Get package names print "Reading all installed packages.\n"; opendir(DOCSDIR, "$docsdir") or die "Couldn't open $docsdir : $!"; while (defined(my $packagename = readdir(DOCSDIR))) { push(@packages, $packagename) if (!($packagename =~ m/([A-Z]|^debian$|\.+)/)); print "."; } print "\n"; closedir(DOCSDIR); print "Reading complete.\n"; my $p_count = $#packages + 1; print "There was $p_count packages found.\n"; undef $p_count; # Get package indexes opendir(LISTSDIR, "$listsdir") or die "Couldn't open $listsdir : $!"; while (defined(my $listname = readdir(LISTSDIR))) { push(@lists, $listname) if ($listname =~ m/Packages/); } closedir(LISTSDIR); # Searching information and make new dpkg status file. open(my $statusfile, '>', 'status'); foreach my $package (@packages) { my %information; foreach my $list (@lists) { my $filepath = join('/', $listsdir, $list); open(my $listfile, '<', $filepath); my $write = 0; my $multiline = 0; while ( defined($line = readline($listfile)) ) { if (grep(/^Package: $package$/, $line)) { print "Package $package found in list $list.\n"; $write = 1; } if ( ($write) && (!$multiline) ) { if ( $line =~ m/^Tag/ ) { $multiline = 1; } else { my @data = split(/:\s/, $line); $information{"$data[0]"} = $data[1]; } } if ( ($write) && ($multiline) ) { if ( $line =~ m/^Tag/ ) { my @data = split(/:\s/, $line); $information{"$data[0]"} = $data[1]; } elsif ( $line =~ m/^\s/ ) { $information{"Tag"} = join('', $information{"Tag"}, $line); } else { $multiple = 0; } } $write = 0 if ($line =~ m/^$/); } close($listfile); } print { $statusfile } "Package: $information{'Package'}" if (defined($information{"Package"})); print { $statusfile } "Status: install ok installed\n" if (defined($information{"Package"})); print { $statusfile } "Priority: $information{'Priority'}" if (defined($information{"Priority"})); print { $statusfile } "Section: $information{'Section'}" if (defined($information{"Section"})); print { $statusfile } "Installed-Size: $information{'Installed-Size'}" if (defined($information{"Installed-Size"})); print { $statusfile } "Maintainer: $information{'Maintainer'}" if (defined($information{"Maintainer"})); print { $statusfile } "Architecture: $information{'Architecture'}" if (defined($information{"Architecture"})); print { $statusfile } "Source: $information{'Source'}" if (defined($information{"Source"})); print { $statusfile } "Version: $information{'Version'}" if (defined($information{"Version"})); print { $statusfile } "Depends: $information{'Depends'}" if (defined($information{"Depends"})); print { $statusfile } "Description-md5: $information{'Description-md5'}" if (defined($information{"Description-md5"})); print { $statusfile } "Homepage: $information{'Homepage'}" if (defined($information{"Homepage"})); print { $statusfile } "Multi-Arch: $information{'Multi-Arch'}" if (defined($information{"Multi-Arch"})); print { $statusfile } "\n" if (defined($information{"Package"})); } close($statusfile);
syntax highlighted by Code2HTML, v. 0.9.1
Небольшие пояснения. Сначала мы указываем пути, где лежит документация и где списки пакетов, скачанные с реп при обновлении. Потом получаем список пакетов и начинаем по очереди для каждого из них искать информацию, складывать её в хеш, из которого потом в свою очередь записывать в файл в формате, необходимом dpkg. Вот и всё. Запускается скрипт без параметров, работает долго, на выходе выдаёт файл status, который надо положить в /var/lib/dpkg/.
Какие можно из всего этого сделать выводы?
1. Не начинайте делать серьёзных вещей в два-три часа ночи. По невнимательности можно допустить несколько казалось бы мелких ошибки, из-за которых потом придётся долго отдуваться.
2. GNU/Linux - система неубиваемая. Даже после конца света, она будет работать, хотя, может быть, людей уже и не останется.
суббота, 15 января 2011 г.
Управление зонами в BIND9
Давно обещал немного рассказать про организацию своей домашней сети. Надеюсь, в дальнейшем это выльется в цикл статей.
Начнём с DNS.
У меня стоит отдельный роутер и разумеется внутри сети используются так называемые серые ip-адреса. Когда компов мало, можно ходить на них по ip, но я админ ленивый, а потому стараюсь всегда упростить себе жизнь. Ещё один минус связи исключительно по ip-адресам - скрипты. Ну, например, укажу я монтирование удалённого диска в скрипте по ip-адресу, а через пару месяцев захочется мне этот ip сменить(мало ли чего, всякое бывает). Придётся в скрипте править. А если таких скриптов много? Возникает проблема. Чтобы такого не было, лучше настроить связь между компами по именам, тогда при смене ip одного из компов, будет достаточно лишь поправить запись в DNS.
Начнём с DNS.
У меня стоит отдельный роутер и разумеется внутри сети используются так называемые серые ip-адреса. Когда компов мало, можно ходить на них по ip, но я админ ленивый, а потому стараюсь всегда упростить себе жизнь. Ещё один минус связи исключительно по ip-адресам - скрипты. Ну, например, укажу я монтирование удалённого диска в скрипте по ip-адресу, а через пару месяцев захочется мне этот ip сменить(мало ли чего, всякое бывает). Придётся в скрипте править. А если таких скриптов много? Возникает проблема. Чтобы такого не было, лучше настроить связь между компами по именам, тогда при смене ip одного из компов, будет достаточно лишь поправить запись в DNS.
воскресенье, 26 декабря 2010 г.
Весёлый hddtemp.
ВНИМАНИЕ: Диск /dev/sdb не включен в базу данных поддерживаемых приводов.
ВНИМАНИЕ: Но с использованием распространенных параметров он что-то выдает.
ВНИМАНИЕ: Но с использованием распространенных параметров он что-то выдает.
Понимаю, что ничего необычного в этом выводе нет, но всё же как-то бросается в глаза фраза "он что-то выдаёт". :) Звучит настораживающе.
вторник, 21 декабря 2010 г.
Украшаем процесс загрузки в Debian GNU/Linux
суббота, 30 октября 2010 г.
Мои пакеты для debian.
Обзавёлся недавно доменом, поднял небольшой сервер и теперь балуюсь со всякими настройками. Пока что там особо ничего интересного нет, но один из планируемых разделов - собранные(или портированные) мной пакеты для debian. Пока что не оформлено в виде отдельного репозитария, в дальнейшем организую, с учётом архтектур и версий дистрибутива(заранее скажу, что поддерживать буду только stable и oldstable для архитектур i386 и x86_64). Пока доступно по адресу http://cppmm.net.ru/debian_packages/
Из планов на будущее, поднять небольшую вику с используемыми мной типичными конфигами и скриптами.
На данный момент скорость почти никакая - всё на стадии разработки, в дальнейшем ситуация улучшится.
Из планов на будущее, поднять небольшую вику с используемыми мной типичными конфигами и скриптами.
На данный момент скорость почти никакая - всё на стадии разработки, в дальнейшем ситуация улучшится.
четверг, 30 сентября 2010 г.
Автоматическое изменение яркости экрана Asus EeePC 701 4G в Debian
Я обычно работаю на своём нетбуке с яркостью, поднятой на максимум. Но при переходе в режим работы от батареи это даёт очень неслабую нагрузку на неё. Fn-клавиши, конечно, работают, но постоянно повышать/понижать яркость руками лень. Вот я и решил поковырять acpi на предмет автоматизации процесса. В принципе, ничего сложного.
Из man acpid можно узнать принципы работы acpi-скриптов. В /etc/acpi/events/ лежат файлы событий формата
event=событие
action=скрипт, который выполняется на это событие
Чтобы узнать, на какое именно событие реагировать, можно воспользоваться функцией acpi_listen.
В моём случае результат её работы выглядит так при выдёргивании блока питания из розетки:
[root@skynet ~]# acpi_listen
ac_adapter AC0 00000080 00000000
battery BAT0 00000080 00000001
hotkey ATKD 00000051 0000001e
battery BAT0 00000080 00000001
ac_adapter AC0 00000080 00000000
и вот так при подключении:
[root@skynet ~]# acpi_listen
ac_adapter AC0 00000080 00000001
battery BAT0 00000080 00000001
hotkey ATKD 00000050 0000001c
battery BAT0 00000080 00000001
ac_adapter AC0 00000080 00000001
Так как мне надо всего лишь сменить яркость, я не стал заморачиваться на параметры и указал реагировать просто на любые изменения в ac_adapter
Итоговый файл события у меня выглядит так:
Я же использую функцию getState() из /usr/share/acpi-support/power-funcs. Она при вызове передаёт переменной STATE либо значение AC, либо BATTERY в зависимости от режима работы нетбука.
Осталось только найти способ менять яркость. Тут тоже всё просто. Пробежался быстро по тем же acpi'шным скриптам и выяснил, что уровень яркость указывается в /sys/class/backlight/eeepc/brightness. От 1 до 15, где 15 - максимально яркое, 1 соответсвенно тусклое.
Итоговый скрипт получился такой:
[root@skynet ~]# cat /etc/acpi/auto_brightness.sh
Из man acpid можно узнать принципы работы acpi-скриптов. В /etc/acpi/events/ лежат файлы событий формата
event=событие
action=скрипт, который выполняется на это событие
Чтобы узнать, на какое именно событие реагировать, можно воспользоваться функцией acpi_listen.
В моём случае результат её работы выглядит так при выдёргивании блока питания из розетки:
[root@skynet ~]# acpi_listen
ac_adapter AC0 00000080 00000000
battery BAT0 00000080 00000001
hotkey ATKD 00000051 0000001e
battery BAT0 00000080 00000001
ac_adapter AC0 00000080 00000000
и вот так при подключении:
[root@skynet ~]# acpi_listen
ac_adapter AC0 00000080 00000001
battery BAT0 00000080 00000001
hotkey ATKD 00000050 0000001c
battery BAT0 00000080 00000001
ac_adapter AC0 00000080 00000001
Так как мне надо всего лишь сменить яркость, я не стал заморачиваться на параметры и указал реагировать просто на любые изменения в ac_adapter
Итоговый файл события у меня выглядит так:
[root@skynet ~]# cat /etc/acpi/events/auto_brightnessТеперь надо написать непосредственно скрипт, меняющий яркость взависимости от того, есть питание или нет. Здесь есть два пути - смотреть напрямую в /proc и парсить то, что там имеется или воспользоваться готовой функцией из acpi-support. Я выбрал второй вариант. Для тех, кому больше по душе первый, текущее положение адаптера отображается в /proc/acpi/ac_adapter/AC0/state
# /etc/acpi/events/auto_brightness
# Called when ac off and we need to switch brightness down or up when ac on.
#
event=ac_adapter.*
action=/etc/acpi/auto_brightness.sh
Я же использую функцию getState() из /usr/share/acpi-support/power-funcs. Она при вызове передаёт переменной STATE либо значение AC, либо BATTERY в зависимости от режима работы нетбука.
Осталось только найти способ менять яркость. Тут тоже всё просто. Пробежался быстро по тем же acpi'шным скриптам и выяснил, что уровень яркость указывается в /sys/class/backlight/eeepc/brightness. От 1 до 15, где 15 - максимально яркое, 1 соответсвенно тусклое.
Итоговый скрипт получился такой:
[root@skynet ~]# cat /etc/acpi/auto_brightness.sh
#!/bin/bashВсё. Рестартим acpid и радумаемся.
. /usr/share/acpi-support/power-funcs
getState
if [ "$STATE" = "AC" ]
then
echo 15 > /sys/class/backlight/eeepc/brightness
else
echo 1 > /sys/class/backlight/eeepc/brightness
fi
воскресенье, 29 августа 2010 г.
Userfrendly OS
Я тут рассказывал, как ставил Fedora 13 на ноут для тестов. Протестил, всё отлично работает. но хозяевам нужна была на этом компе Vista, которая шла вместе с ноутом. Вот, небольшая оценка времени, затраченного на обустройстов первой и второй системы.
Тестовая площадка - ноутбук MSI PR200
Обновления и установка софта зависят от скорости интернета - 256 кбит/с
--
Fedora GNU/Linux 13
Время установки - 30 минут(получаем вполне юзабельную систему, в которой есть всё, кроме офиса и проигрывания mp3).
Настройка сети(wi-fi) - 5 минут.
Настройка дополнительных репозитариев - 10 минут.
Полное обновление системы - 40 минут.
Установка нужного софта(проприетарные кодеки, skype, OO.o, разные программы для тестирования железа) - 10 минут.
Настройка панелей, рюшечек, компиза и прочего - 20 минут.
Итого - 1 час 55 минут до полностью рабочей системы.
--
Windows Vista Home Basic
Время установки - 1 час(получаем систему, в которой не работает ничего кроме блокнота с разрешением 800х600, без звука, без сети).
Установка драйверов - 30 минут на скачивание на другом компе(сеть не поднялась из коробки), 30 минут на установку(с учётом перезагрузок). Камера не завелась, bluetooth не завёлся, звук не завёлся. Ещё +30 минут на танцы с бубном.
Настройка сети(wi-fi) - 15 минут(оказалось не так просто найти, где же прописывать сети со скрытым SSID и вспоминать, какое же шифрование TKIP или AES - все три мои linux-машины, это автоматом определяют).
Базовое обновление(только обновления безопасности и важные багфиксы) - 3 часа(причём после того, как всё скачалось и устанавливается - ноут неюзабелен).
Установка нужного софта(кодеки, firefox, skype, OO.o, разная мелочь) - 30 минут(разумеется установка не автоматическая, надо сидеть и периодически нажимать "Далее").
Итого - 6 часов 15 минут.
--
Выводы делайте сами.
Тестовая площадка - ноутбук MSI PR200
Обновления и установка софта зависят от скорости интернета - 256 кбит/с
--
Fedora GNU/Linux 13
Время установки - 30 минут(получаем вполне юзабельную систему, в которой есть всё, кроме офиса и проигрывания mp3).
Настройка сети(wi-fi) - 5 минут.
Настройка дополнительных репозитариев - 10 минут.
Полное обновление системы - 40 минут.
Установка нужного софта(проприетарные кодеки, skype, OO.o, разные программы для тестирования железа) - 10 минут.
Настройка панелей, рюшечек, компиза и прочего - 20 минут.
Итого - 1 час 55 минут до полностью рабочей системы.
--
Windows Vista Home Basic
Время установки - 1 час(получаем систему, в которой не работает ничего кроме блокнота с разрешением 800х600, без звука, без сети).
Установка драйверов - 30 минут на скачивание на другом компе(сеть не поднялась из коробки), 30 минут на установку(с учётом перезагрузок). Камера не завелась, bluetooth не завёлся, звук не завёлся. Ещё +30 минут на танцы с бубном.
Настройка сети(wi-fi) - 15 минут(оказалось не так просто найти, где же прописывать сети со скрытым SSID и вспоминать, какое же шифрование TKIP или AES - все три мои linux-машины, это автоматом определяют).
Базовое обновление(только обновления безопасности и важные багфиксы) - 3 часа(причём после того, как всё скачалось и устанавливается - ноут неюзабелен).
Установка нужного софта(кодеки, firefox, skype, OO.o, разная мелочь) - 30 минут(разумеется установка не автоматическая, надо сидеть и периодически нажимать "Далее").
Итого - 6 часов 15 минут.
--
Выводы делайте сами.
пятница, 4 июня 2010 г.
Настройка атоматического выбора wi-fi сети в Debian.
Есть у меня одна замечательная вещь - Asus EeePC. И, так как тут имеется wi-fi карта, не пользоваться услугами беспроводной связи просто грех. Но хорошо, когда сеть одна. А что, если их много и надо в одном месте включать одну, в другом другую? И при этом всякие графические монструозные комбайны ставить не хочется. Как быть? Настроить имеющиеся в Debian'е инструменты работы с сетью. Это на самом деле намного проще, чем может показаться на первый взгляд.
Управление сетевыми интерфейсами осуществляется в Debian'е через файл /etc/network/interfaces и скрипт /etc/init.d/networking. Для нас важен файл настроек. Если заглянуть в его man, то можно найти замечательный параметр mapping. Эта опция даёт возможность создавать разные логические интерфейсы на одном физическом и автоматически выбирать нужный по определённым параметрам. Проще говоря - что-то типа профилей. Для выбора надо набросать небольшой скриптик и прописать условия.
Итак, к делу.
Условие определения логического интерфейса могут быть любые. Мне лично удобно по mac-адресу(логичнее, конечно, кажется по SSID, но мне этот вариант не подходит, потому что на всех, настроенных мной точках, я выставляю опцию SSID Broadcast в off, поэтому увидеть его стандартными средствами, не подключившись проблематично, но если у вас не так, то разумеется определение профиля по SSID более правильный выбор). Логика работы проста - при поднятии интерфейса, система сканирует сеть, смотрит, какая из знакомых ей точек доступна и подключается к ней. Основную работу за нас будет делать небольшой скрипт. Примеры таких скриптов можно глянуть в /usr/share/doc/ifupdown/examples/ . Там же лежат примеры настройки файла interfaces. У меня скрипт получился такой:
Как можно заметить, несмотря на простоту, в скрипте есть несколько особенностей. Первая - ему по умолчанию в качестве первого аргумента передаётся имя интерфейса. Вторая - он читает построчно заданные в настройках параметры. Третья - он должен вернуть выбранное логическое имя интерфейса и код выхода(0 - всё хорошо, работаем, 1 - ошибка, выходим). Если первое и последнее - понятно, то второе требует небольшого пояснения. Скрипту передаются параметры, заданные в interfaces. Последним параметром обязательно должно быть имя логического интерфейса. И всё, что делает скрипт, в конечном счёте направлено на то, чтобы это имя вернуть на stdout. Как видно, в моём случае я сканирую воздух, и, если попадается знакомый mac, тут же выбираю соответствующее ему имя. Если знакомых нет, разумеется подключение прерывается. Маки и имена указаны в interfaces. Для тех, кто будет использовать выборку по SSID, надо будет сделать что-то типа iwlist $iface scanning | grep $ssid.
И наконец, запись в interfaces:
И последний штрих. Дело в том, что по умолчанию при загрузке /etc/init.d/networking стартует достаточно рано относительно других сервисов. Оно понятное дело нужно, когда у меня сервер со всякими sshd, apache и прочими радостями. Но на нетбуке это совершенно лишнее. А из-за такой "спешки" не успевают подгрузиться все нужные для работы выбирающего скрипта части. А именно, не инициализировался до конца интерфейс, поэтому команда iwlist не возвращала ожидаемого результата. Я решил это просто - двумя командами перенёс загрузку сети с ранних этапов на стандартные, вместе с основными частями системы:
# update-rc.d -f networking remove
# update-rc.d networking defaults
Всё. При загрузке, если я нахожусь в зоне действия знакомой сети, нетбук автоматом к ней подключится. Если я не выключал нетбук и перешёл от одной знакомой сети к другой, достаточно рестартануть сеть и всё будет отлично.
Именно за такие простые и удобные вещи я и люблю Linux вообще и Debian в частности.
Управление сетевыми интерфейсами осуществляется в Debian'е через файл /etc/network/interfaces и скрипт /etc/init.d/networking. Для нас важен файл настроек. Если заглянуть в его man, то можно найти замечательный параметр mapping. Эта опция даёт возможность создавать разные логические интерфейсы на одном физическом и автоматически выбирать нужный по определённым параметрам. Проще говоря - что-то типа профилей. Для выбора надо набросать небольшой скриптик и прописать условия.
Итак, к делу.
Условие определения логического интерфейса могут быть любые. Мне лично удобно по mac-адресу(логичнее, конечно, кажется по SSID, но мне этот вариант не подходит, потому что на всех, настроенных мной точках, я выставляю опцию SSID Broadcast в off, поэтому увидеть его стандартными средствами, не подключившись проблематично, но если у вас не так, то разумеется определение профиля по SSID более правильный выбор). Логика работы проста - при поднятии интерфейса, система сканирует сеть, смотрит, какая из знакомых ей точек доступна и подключается к ней. Основную работу за нас будет делать небольшой скрипт. Примеры таких скриптов можно глянуть в /usr/share/doc/ifupdown/examples/ . Там же лежат примеры настройки файла interfaces. У меня скрипт получился такой:
#!/bin/sh
#
# Auto wi-fi choise.
iface="$1"
ifconfig=$(which ifconfig)
iwlist=$(which iwlist)
which=""
# Проверка на случай, если wi-fi карта выключена.
if [ ! "$(grep $iface /proc/net/dev)" ]; then exit 1; fi
# Без этого не получится просканировать сеть.
$ifconfig $iface up
# Собственно выбор.
while read mac scheme; do
if [ "$which" ]; then continue; fi
if [ "$($iwlist $iface ap | grep $mac)" ]; then which="$scheme"; fi
done
# Передача выбора системным скриптам и выход.
if [ "$which" ]; then echo $which; exit 0; fi
exit 1
Как можно заметить, несмотря на простоту, в скрипте есть несколько особенностей. Первая - ему по умолчанию в качестве первого аргумента передаётся имя интерфейса. Вторая - он читает построчно заданные в настройках параметры. Третья - он должен вернуть выбранное логическое имя интерфейса и код выхода(0 - всё хорошо, работаем, 1 - ошибка, выходим). Если первое и последнее - понятно, то второе требует небольшого пояснения. Скрипту передаются параметры, заданные в interfaces. Последним параметром обязательно должно быть имя логического интерфейса. И всё, что делает скрипт, в конечном счёте направлено на то, чтобы это имя вернуть на stdout. Как видно, в моём случае я сканирую воздух, и, если попадается знакомый mac, тут же выбираю соответствующее ему имя. Если знакомых нет, разумеется подключение прерывается. Маки и имена указаны в interfaces. Для тех, кто будет использовать выборку по SSID, надо будет сделать что-то типа iwlist $iface scanning | grep $ssid.
И наконец, запись в interfaces:
mapping ath0Я для примера показал две точки, но их на самом деле может быть сколько угодно. Главное соблюдать формат записи - map mac-адрес логическое_имя. Разумеется, параметры для каждой из точек могут совершенно любыми.
script /usr/local/sbin/awfc.sh
map 11:22:33:44:55:66 ath0-home
map AA:BB:CC:DD:EE:FF ath0-tmp
allow-hotplug ath0
# Домашняя сетка
iface ath0-home inet dhcp
wireless-essid HomeNet
wpa-ssid HomeNet
wpa-psk *********
# моё любимое кафе с wi-fi
iface ath0-tmp inet dhcp
wireless-essid TMPNet
И последний штрих. Дело в том, что по умолчанию при загрузке /etc/init.d/networking стартует достаточно рано относительно других сервисов. Оно понятное дело нужно, когда у меня сервер со всякими sshd, apache и прочими радостями. Но на нетбуке это совершенно лишнее. А из-за такой "спешки" не успевают подгрузиться все нужные для работы выбирающего скрипта части. А именно, не инициализировался до конца интерфейс, поэтому команда iwlist не возвращала ожидаемого результата. Я решил это просто - двумя командами перенёс загрузку сети с ранних этапов на стандартные, вместе с основными частями системы:
# update-rc.d -f networking remove
# update-rc.d networking defaults
Всё. При загрузке, если я нахожусь в зоне действия знакомой сети, нетбук автоматом к ней подключится. Если я не выключал нетбук и перешёл от одной знакомой сети к другой, достаточно рестартануть сеть и всё будет отлично.
Именно за такие простые и удобные вещи я и люблю Linux вообще и Debian в частности.
пятница, 29 января 2010 г.
Gentoo
Наконец собрался написать про Gentoo.
Давно хотел попробовать этото дистрибутив в работе. Я его, конечно, пробовал до этого, но так, мельком. Пару раз ставил, пару раз настраивал, но со временем забрасывал. Потом так получилось, что пришлось повозиться с уже установленной системой, которую надо было довести до ума. Как это всегда бывает, система попалась полумёртвая и восстанавливать её приходилось долго и непросто. Но в процессе этого восстановления я открыл для себя некоторые довольно интересные вещи. Тогда-то и появилась мысль взяться за этот дистрибутив серьёзно. Порывшись в куче старого железа был извлечён винт на сосрок гигов, закуплено кофе и запланированы пару спокойных ночей. В итоге - ура. На компе в качестве второй системы(рядом с родным Debian Lenny) стоит Gentoo. Но как-то всё тоже выходило неудачно. То иксы криво стартовали, то софт при компиляции ошибки выдавал, то ещё какие-нибудь косяки и никак не хватало времени довести до ума. Но за несколько дней до Нового Года, наконец, время позволило взяться за Gentoo серьёзно...И вот, в новый 2010 год я вошёл, имея на компе стабильную gentoo с kde4.
Как у меня всегда бывает, вышло несовсем гладко. То забывал нужный драйвер в ядро вкомпилить, то USE-флаги криво выставлял, но так или иначе, сейчас могу сказать честно: новой системой я доволен.
А теперь несколько подробностей.
Ну, во-первых:
[cppmm@damned ~]$ uname -a
Linux damned 2.6.31-gentoo-r6-cppmm-v7 #1 SMP Fri Jan 29 07:25:45 NOVT 2010 x86_64 AMD Athlon(tm) 64 X2 Dual Core Processor 5600+ AuthenticAMD GNU/Linux
Да, как можно заметить, нормальное ядро удалось собрать только с седьмой попытки. И тут дело исключительно в моей невнимательности. Собственно, последняя пересборка понадобилась потому что неправильно были выставлены опции кодировок для файловой система FAT, из-за чего флешки либо монтировались криво, либо вообще отказывались подключаться.
Впечатления от системы хорошие. Когда говорят, что gentoo работает быстро - можете смело верить. Это действительно так. Например, даже со стандартным init'ом загрузка до рабочего стола проходит буквально за несколько секунд. При этом, я решил попробовать не старую добрую крысу(xfce4), а kde. И если раньше у меня было впечатление, что кеды - это что-то монструзно-торзмонутое, то тут всё совсем не так. Весь софт прямо сказать летает. Кроме всего прочего, раз уж стоят кеды, я решил и софт использовать исключительно qt'шный.
Плеер: По-умолчанию в kde4 идёт JuK. Штука до безобразия простая, малофункциональная(даже по моим меркам). Немного повспоминав мандривовскую молодость было принято решение поставить amarok... Я даже не ожидал, насколько он стал хорош! Ну, старых проблем с кодировками тегов у меня быть не могло - все теги давно сконвертированы в utf. А вот интерфейс порадовал. Теперь он действительно удобен. Один раз задав пути к библиотеке, я забыл про мучительный поиск нужной песни и добавление её руками. Так же очень порадовала фишка с прикрученной википедией. Да-да. Когда я запускаю песню, amarok автоматом идёт в инет на википедию, и стягивает описание исполнителя. Ну и кроме этого он ещё откуда-то вытягивает текст песни и обложку. Если с описанием - это так, свистелки, то текст песни оказался как нельзя кстати. Очень удобно. Выглядит это всё примерно так:
С видео-проигрывателем получилось практически так же. Дефолтный dragonplayer как-то неинтересн. Но память подсказала, что был когда-то неплохой kaffeine. Он тоже стал удобнее и функциональнее. Кушает всё, работает с dvd-меню и вообще в принципе устраивает во всём. Один раз, правда, он отказался играть хороший фильм(точнее, фильм играл, а вот звука не было). Поставил SMPlayer(фронтенд к mplayer), но тот тоже отказался. Попытка воспроизвести этот же фильм на другой системе, а потом и на другом компе показала, что проблема не в плеерах, а в самом фильме. :)
Теперь о интернет-приложениях. Вот что, по-моему, осталось таким же, как и много лет назад, так это konqueror. Как был кривоват, так и остался. :)
Пришлось компилять firefox. Всё бы хорошо, но gtk-ашная лиса смотрится в qt-окружении убого. Но, это лечится. Нужно сперва поставить x11-themes/gtk-engines-qtcurve, который несколько облагораживает гткшный софт. А для совсем эстетов, у лисы есть замечательный плагин Personas. Там есть множество разнообразных тем и украшений. И теперь моя лиса выглядит так:
В качестве jabber-клиента был оставлен старый-добрый psi. А точнее, его модификация psi+(кстати, вот тут вот и проявляется одна из фишек гентушных портажей - при помощи простейших манипуляций, я ставлю софт нужной мне версии с нужным мне функционалом, не заморачиваясь сборкой пакета).
Единственное, что пока не радует, это irc-клиент. Привычный xchat как-то тут не понравился, но я решил попробовать что-нибудь kde'шное, а именно kvirc. Не, клиент очень неплохой. Но настроек у него.... Тьма! До сих пор до конца ещё не донастроил. :) Но работать можно.
Остальное всё использую родное kde'шное, не особо заморачиваясь.
На обслуживание системы много времени не уходит. Я это, в принципе, и раньше знал, но повторюсь для особо упёртых. Если один раз всё настроить, в дальнейшем обновления можно делать на автомате. Главное не допускать глупых ошибок. К примеру, если хочется изменить USE-флаги у какого-либо приложение, не стоит это делать на лету. Для этого есть специальный файлик в /et/portage/. Там же, кстати, можно очень удобно маскировать ненужные пакеты, управлять зависимостями и вообще делать со своей системой всё, что душе угодно.
В дальнейших планах разобраться с написанием своих ebuild'ов для сборки собственных пакетов(например, недавно вышел vacuum im 1.0.0 - очень хочется попробовать, но в репах пока его нет).
Разумеется, этот переход на домашнем десктопе совершенно не значит, что я резко переметнулся из стана Debian'щиков в gentoo'шники. Нет. На нетбуке всё тот же lenny. Ну и на рабочем компе ничего не изменится в ближайшее время. А то, что лучшей системой для серверов является debian меня вряд ли кто-нибудь когда-нибудь переубедит. Всё это просто значит, что linux'ы бывают разные и многие из них хороши. А если есть желание разобраться и какие-то базовые знания, то пойдёт любой дистрибутив(за исключением всяких ubuntu :)).
И на последок общий вид рабочего стола:
вторник, 17 ноября 2009 г.
Запись устанавливаемых зависимостей для пакета в Debian.
Часто приходится ставить софт "на посмотреть". Т.е. поставил, один-два раза запустил и удалил. Вроде бы ничего страшного - apt-get наш спаситель, но нередко бывает, что пакет при установке притягивает за собой толпы библиотек по зависимостям, и при удалении этого пакета все библиотеки остаются в системе. Часть из них, конечно, можно вычистить с помощью apt-get autoremove, но большая часть всё-таки остаётся. Я обычно в таких случаях записывал себе куда-нибудь список пакетов, устанавливаемых с нужным мне софтом и потом сносил его руками. Вот, решил этот процесс немного автоматизировать скриптом. Ничего особенного, просто небольшая экономия времени.
Скрипт до безобразия простой, так что всё должно быть понятно из комментариев. :) Получился такой себе небольшой костыль над apt-get.
Работать с ним просто.
Нашли нужный пакетик, сказали на него ./depends_store.sh -i и всё запомнилось в базе. Поработали с пакетом, сделали apt-get purge `./depends_store.sh -s имя_пакета` && ./depends_store.sh -r имя_пакета и забыли о нём.
#!/bin/bash
#
INST_BASE=/var/cache/apt/Inst
INST_PROG=/usr/bin/apt-get
# Функция вывода ошибки в случае использования неправильных аргументов
f_argerror() {
echo "depends_store.sh: Пропущен операнд."
echo "Попробуйте \"depends_store.sh -h\" для получения более подробного описания."
}
# Функция записи данныхх о зависимостях с проверкой на наличие этих данных.
# Если данные имеются, вызывается функция их вывода.
f_install() {
if [ -e ${INST_BASE}/${OPTARG} ]
then
echo "Данные о зависимостях для данного пакета уже присутсвуют."
f_show
exit 0
fi
${INST_PROG} -s install ${OPTARG} | grep Inst | cut -d ' ' -f 2 > ${INST_BASE}/${OPTARG}
echo `cat ${INST_BASE}/${OPTARG}`
}
# Функция удаления данных о зависимостях.
f_remove() {
rm ${INST_BASE}/${OPTARG}
}
# Функция вывода данных о зависимостях.
f_show() {
echo `cat ${INST_BASE}/${OPTARG}`
}
# Функция вывода списка пакетов, для которых есть записи о зависимостях.
f_list() {
echo `ls ${INST_BASE}`
}
# Функция вывода справки.
f_help() {
echo "Использование: depends_store.sh КЛЮЧ [ПАКЕТ]"
echo " -i ПАКЕТ записать данные о зависимостях для пакета"
echo " -r ПАКЕТ удалить данные о зависимостях для пакета"
echo " -s ПАКЕТ показать данные о зависимостях для пакета"
echo " -l вывести список пакетов, для которых записаны данные о зависимостях"
echo " -h показать эту справку и выйти"
}
# Проверка на наличие аргументов коммандной строки.
if [ $# -eq "0" ]
then
f_argerror
fi
# Проверка на наличие директории для хранения данных о пакетах и создание таковой в случае отсутсвия.
if [ ! -e ${INST_BASE} ]
then
mkdir -p ${INST_BASE}
fi
# Перебор параметров командной строки.
getopts ":i:r:s:lh" Option
case $Option in
i)
f_install
;;
r)
f_remove
;;
s)
f_show
;;
l)
f_list
;;
h)
f_help
;;
*)
f_argerror
;;
esac
exit 0 Скрипт до безобразия простой, так что всё должно быть понятно из комментариев. :) Получился такой себе небольшой костыль над apt-get.
Работать с ним просто.
Нашли нужный пакетик, сказали на него ./depends_store.sh -i и всё запомнилось в базе. Поработали с пакетом, сделали apt-get purge `./depends_store.sh -s имя_пакета` && ./depends_store.sh -r имя_пакета и забыли о нём.
четверг, 17 сентября 2009 г.
Мой vimrc
Вот, добрались руки упорядочить свой .vimrc
Пока что маленький и скромный, но со временем, думаю, функций добавится.
1 " Подсветка синтаксиса
2 syntax on
3
4 " Отключить режим совместимости с Vi
5 set nocompatible
6
7 " Включить нормальную работу Backspace
8 set backspace=indent,eol,start
9
10 " История команд - 50
11 set history=50
12
13 " Вставка новой строки Enter'ом без перехода в режим вставки.
14
15 map <CR> o<Esc>
16
17 " Автоопределение файлов
18 filetype plugin on
19 filetype indent on
20
21 " Всегда показывать положение курсора
22 set ruler
23
24 " Показывать текущую команду
25 set showcmd
26
27 " Показывать режим работы
28 set showmode
29
30 " Поиск в реалтайме
31 set incsearch
32
33 " Хоткей Ctrl+n включает нумерацию строк, а Ctrl+b отключает.
34 map <C-n> <Esc>:set number<CR>
35 map <C-b> <Esc>:set nonumber<CR>
36
37 " Быстрое сохранение на <F2> во всех режимах
38 imap <F2> <Esc>:w<CR>
39 map <F2> <Esc>:w<CR>
40
41 " Выход без сохранения на <F10> во всех режимах
42 imap <F10> <Esc>:q!<CR>
44 map <F10> <Esc>:q!<CR>
45 " Вставка из буфера мыши
46 map <S-Insert> <Middlemouse>
47
48 " При вводе открывающей фигурной скобки автоматом вводится и закрывающая.
49
50 inoremap { {<CR>}<Esc>O
51
52 " При вводе закрывающей скобки подсвечивает открывающую
53 set showmatch
54
55 " Выключить любые звонки-мигалки
56 set novisualbell
57 set t_vb=
58 " Удаление от текущей позиции до конца строки по Ctrl+e
59 map <C-e> <Esc>d$
Пока что маленький и скромный, но со временем, думаю, функций добавится.
1 " Подсветка синтаксиса
2 syntax on
3
4 " Отключить режим совместимости с Vi
5 set nocompatible
6
7 " Включить нормальную работу Backspace
8 set backspace=indent,eol,start
9
10 " История команд - 50
11 set history=50
12
13 " Вставка новой строки Enter'ом без перехода в режим вставки.
14
15 map <CR> o<Esc>
16
17 " Автоопределение файлов
18 filetype plugin on
19 filetype indent on
20
21 " Всегда показывать положение курсора
22 set ruler
23
24 " Показывать текущую команду
25 set showcmd
26
27 " Показывать режим работы
28 set showmode
29
30 " Поиск в реалтайме
31 set incsearch
32
33 " Хоткей Ctrl+n включает нумерацию строк, а Ctrl+b отключает.
34 map <C-n> <Esc>:set number<CR>
35 map <C-b> <Esc>:set nonumber<CR>
36
37 " Быстрое сохранение на <F2> во всех режимах
38 imap <F2> <Esc>:w<CR>
39 map <F2> <Esc>:w<CR>
40
41 " Выход без сохранения на <F10> во всех режимах
42 imap <F10> <Esc>:q!<CR>
44 map <F10> <Esc>:q!<CR>
45 " Вставка из буфера мыши
46 map <S-Insert> <Middlemouse>
47
48 " При вводе открывающей фигурной скобки автоматом вводится и закрывающая.
49
50 inoremap { {<CR>}<Esc>O
51
52 " При вводе закрывающей скобки подсвечивает открывающую
53 set showmatch
54
55 " Выключить любые звонки-мигалки
56 set novisualbell
57 set t_vb=
58 " Удаление от текущей позиции до конца строки по Ctrl+e
59 map <C-e> <Esc>d$
четверг, 14 мая 2009 г.
Замена содержимого в файлах по шаблону
Замена во всех файлах в поддиректориях одного слова на другое.
find ./ -type f | xargs perl -pi -e 's/oneword/anotherword/g'
find ./ -type f | xargs perl -pi -e 's/oneword/anotherword/g'
среда, 29 апреля 2009 г.
Debian GNU/Linux 5.0 Lenny и Eee PC 701 4G
Как можно понять из заглавия, не хватило у меня терпения на Xandros. Очень уж много там надо убирать лишнего и ставить своего. Конечно, не поспоришь, разработчики постарались на славу: для обычного неподготовленного пользователя Eee PC с Linux в стандартной настройке - это очень и очень удобно. Всё просто и понятно - ничего лишнего. Напоминает даже не ноутбук(путь и маленький), а какой-то большой КПК с его менюшками, стандартными кнопочками и т.д. Но если начать копать глубже, менять что-то, то нарываешься на множество раздражающих вещей. То сделать нельзя, это не получится, сюда смотреть не желательно, туда вообще не надо и т.д. Кеды, которые я туда поставил, быстро надоели. Да и подглючивали немного. Снести половину софта пакетный менеджер не дал, ругнувшись на зависимости(или предлагал снести слишком много). Последнее, что меня добило - это в режиме "Полноценного рабочего стола"(читай KDE) при загрузке нетбук не спрашивает логина с паролем. Нужно переключаться в стандартный режим. И, да. Добавлять других пользователей помимо стандартного бесполезно. Залогиниться не получится. Автоматом идёт загрузка в стандартного пользователя. В принципе, я нашёл, кто отвечает за такую загрузку, где идёт управление пользователями, но исправлять это и приводить систему в нормальный вид мне было уже неохота. Зачем, если можно поставить нормальную систему, которая 100% хорошо работает.
Отсюда берём образ инсталятора. Заливаем его на флешку:
И грузимся с флешки(при старте нетбука надо нажимать Esc, чтобы выбрать загрузочное устройство).
Далее идёт обычная всем знакомая установка Debian из сети. К слову, wi-fi-карточка определилась сразу и даже замечательно подхватила ключ шифрования. А так же без проблем прописались настройки прокси-сервера с авторизацией. В этот раз я впервые в жизни выбрал reiserfs и пункт "Окружение рабочего стола"(а так же выбрал пункт "Для ноутбуков"). Всё прошло замечательно.
Теперь на моём нетбуке Debian. Скинув туда бекапы моих отточенных временем конфигов, я получил привычную рабочую систему. При этом не пришлось настраивать ничего. С питанием работает нормально, заряд батареи показывает адекватно. Жаловаться нечего.
Единственное, что я ещё не проверял - web-камеру. По-моему не определилась. Но точно не знаю.
Вот man по установке(дублировать здесь не вижу смысла).
Updated: web-камера работает. Надо было просто включить её в /sys.
echo 1 > /sys/devices/platform/eeepc/camera
Отсюда берём образ инсталятора. Заливаем его на флешку:
dd if=debian-eeepc.img of=/dev/sda
И грузимся с флешки(при старте нетбука надо нажимать Esc, чтобы выбрать загрузочное устройство).
Далее идёт обычная всем знакомая установка Debian из сети. К слову, wi-fi-карточка определилась сразу и даже замечательно подхватила ключ шифрования. А так же без проблем прописались настройки прокси-сервера с авторизацией. В этот раз я впервые в жизни выбрал reiserfs и пункт "Окружение рабочего стола"(а так же выбрал пункт "Для ноутбуков"). Всё прошло замечательно.
Теперь на моём нетбуке Debian. Скинув туда бекапы моих отточенных временем конфигов, я получил привычную рабочую систему. При этом не пришлось настраивать ничего. С питанием работает нормально, заряд батареи показывает адекватно. Жаловаться нечего.
Единственное, что я ещё не проверял - web-камеру. По-моему не определилась. Но точно не знаю.
Вот man по установке(дублировать здесь не вижу смысла).
Updated: web-камера работает. Надо было просто включить её в /sys.
echo 1 > /sys/devices/platform/eeepc/camera
вторник, 28 апреля 2009 г.
Рекурсивное удаление файлов
рекурсивное удаление всех файлов в директории и её поддиректориях:
find ./ -type f -delete
Скрипт работы с cd/dvd-дисками в консоли.
Вот, роясь на просторах винта, откопал старый скрипт для записи/очистки и т.д. дисков в консоли. Писал во времена, когда не признавал почти никаких GUI-приложений.
#!/bin/bash
#
TMPFILE=/home/cppmm/wtmp/cdrom.iso
# Определение действия.
case $1 in
wr)
FUNC="f_write"
;;
cp)
FUNC="f_copy"
;;
cl)
FUNC="f_clear"
;;
ch)
FUNC="f_check"
;;
wi)
FUNC="f_write_iso"
;;
help)
FUNC="f_help"
;;
*)
FUNC="f_help"
;;
esac
shift
# Определение параметров.
until [ -z $1 ]
do
if [ "$1" = "-d" ]
then
DIR="$2"
shift
fi
if [ "$1" = "-s" ]
then
SPEED="$2"
shift
fi
if [ "$1" = "-o" ]
then
ODISK="$2"
shift
fi
if [ "$1" = "-i" ]
then
IDISK="$2"
shift
fi
if [ "$1" = "-f" ]
then
ISO="$2"
shift
fi
shift
done
# Функйия проверки наличия переменных и оповещения.
f_var_check() {
case "$1" in
v_help)
echo "Для справки: cd.sh help"
exit 0
;;
v_dir)
if [ -z "$DIR" ]
then
echo "Нужно указать директорию, подготовленную для записи."
f_var_check v_help
fi
;;
v_odisk)
if [ -z "$ODISK" ]
then
echo "Нужно указать устройство, производящее запись."
f_var_check v_help
fi
;;
v_idisk)
if [ -z "$IDISK" ]
then
echo "Нужно указать устройство, с которого производится копирование."
f_var_check v_help
fi
;;
v_speed)
if [ -z "$SPEED" ]
then
SPEED="4"
echo "Скорость записи не установленна. По-умолчанию 4"
echo "Продолжить? [Y/n]: "
read ANSWER
case $ANSWER in
[nN])
f_var_check v_help
;;
*)
;;
esac
fi
;;
v_eject)
eject -r /dev/${ODISK}
echo "Вставьте записываемый диск и нажмите Enter."
read ready
eject -t /dev/${ODISK}
;;
v_iso)
if [ -z "$ISO" ]
then
echo "Укажите файл образа."
f_var_check v_help
fi
;;
esac
}
# Функция записи дирректории на диск.
f_write() {
f_var_check v_odisk
f_var_check v_dir
f_var_check v_speed
mkisofs -V "Disk" -l -J -R -v -o ${TMPFILE} ${DIR}
f_var_check v_eject
cdrecord -v -dev=/dev/${ODISK} -speed=${SPEED} ${TMPFILE}
rm -f ${TMPFILE}
}
# Функция копирования диска.
f_copy() {
f_var_check v_odisk
f_var_check v_idisk
f_var_check v_speed
dd if=/dev/${IDISK} of=${TMPFILE} bs=2048
f_var_check v_eject
cdrecord -v -dev=/dev/${ODISK} -speed=${SPEED} ${TMPFILE}
rm -f ${TMPFILE}
}
# Функция очистки диска.
f_clear() {
f_var_check v_odisk
cdrecord dev=/dev/${ODISK} -blank=all
}
# Функция проверки размера будующего образа.
f_check() {
f_var_check v_dir
echo "Размерв байтах:"
expr `mkisofs -print-size -quiet $DIR` \* 2084
}
# Функция записи iso-образа.
f_write_iso() {
f_var_check v_odisk
f_var_check v_iso
f_var_check v_speed
cdrecord -v -dev=/dev/${ODISK} -speed=${SPEED} ${ISO}
}
# Функция помощи.
f_help() {
echo " Использование: cd.sh ДЕЙСТВИЕ ОПЦИИ"
echo " Действия:"
echo " wr запись директории на диск."
echo " cp копирование с диска на диск."
echo " cl очистка диска."
echo " ch проверка размера будущего образа диска из директории."
echo " wi запись на диск образа."
echo " Опции:"
echo " -d Директория, подготовленная для записи."
echo " -f Файл ISO."
echo " -i Исходный диск."
echo " -o Диск, подготовленный для записи."
echo " -s Скорость записи."
}
$FUNC
пятница, 24 апреля 2009 г.
Asus Eee Pc 701 4G
Ещё давно, прочитав на каком-то техническом сайте о том, что прогнозируется появления такой железки, мне почему-то сразу захотелось с ней поиграться. Тем более было анонсировано, что на борту устанавливается Linux. И вот, через несколько лет с того момента, я, наконец, приобрёл себе этот нетбук. Специально остановился на младшей модели из линейки, потому как характеристики железа тут всё-равно круче, чем у моего первого компа, а как плюс идёт более длительное время работы.
Итак, знакомство.
Первый взгляд снаружи.
В Томске найти поначалу не удавалось. Различные версии Eee PC встречал, но все они были старших моделей и все они были с виндой. Дошло то дого, что я, отчаявшись найти нетбук тут, начал искать его в online-магазинах. Затея с треском провалилась: во всех магазинах стояла пометка, нет на складе, а на письма с просьбой уточнить, можно ли заказать, либо вообще не было ответа, либо фраза "Нет и не будет". В конце концов я уже договорился с одним замечательным человеком из Москвы, знакомым по linux-форуму, что он там его купит и вышлет мне и буквально на следующий день увидел в одном из местных компьютерных магазинов желаемую машинку. Был даже выбор из разных моделей, но я всё-таки взял младшую. Единственный минус - цвет: первоначально хотел чёрный, но пришлось взять белый с розовой крышкой. :) Ну это, в принципе, не важно.
Первый взгляд изнутри.
Стандартный интерфейс напоминает больше какой-то КПК, а не полноценный ноутбук. Я перепробовал много разных оконных менеджеров, но тут сперва даже немного растерялся. Какие-то вкладки, какие-то кнопочки... Всё предельно просто и понятно, но неинтересно. Первый вопрос, который у меня возник - где же терминал? :) Гугл сказал, что он вызывается по Alt+Ctrl+T. Уже лучше. Так же играясь с настройками и бегая по менюшкам наткнулся на неработающую web-камеру. Оказалось, надо было в BIOS опцию "OS Installation" переключить в значение Finished. Так же удивил набор программ. В качестве проигрывателя аудиофайлов используется amarok(ага, т.е. там KDE), а мессенджера Pidgin(или всё-таки Gnome?). Остальной софт такой же раношёрстный, но, в принципе, приемлемый - полный комплект OpenOffice.org, Firefox в качестве браузера, набор каких-то простеньких игрушек и т.д. В общем, стандартная комплектация. И тут я нахоже первый момент, которыймне совершенно не понравился в стандартном интерфейсе - невозможность устанавливать свои программы. Так же нет привычного списка открытых окон(читай панели задач). Ну и вообще, как-то не привык я пользоваться чужими настройками. Хочу своё.
Копаем глубже.
Стандартная документация ничего внятного по поводу используемой DE и её смены ничего не сказала, поэтому в руки берётся гугл и начинается штурм.
Итак, на борту:
ОС: Xandros Linux специально допиленный для Eee PC.
WM: IceWM, с какой-то Asus'овской утилитой управления рабочим столом.
Первое, что удаётся найти - это возможность включить панель задач с кнопкой меню.
Копируем системный файл с настройками IceWM в домашнюю директорию и выставляем опцию TaskBarShowStartMenu в значение 1:
$ cat /etc/X11/icewm/preferences > /home/user/.icewm/preferences
Ребутаемся(или рестартим иксы, кому как удобнее) и радуемся работающей панельке.
Стало немного удобнее, но хотелось бы большего. В конце концов, поискав ещё немного в гугле, выясняется, что можно подключить нормальные человеческие репозитарии и поставить любой, нужный для работы софт. Так как Xandros основан на Debian, правим /etc/apt/sources.list(надо быть осторожным, потому что из всех, найденных мной в инете адресов репозитариев, половина не работала). Да, править надо с правами root'а. Это либо через sudo, либо, сделава sudo passwd и потом su.
Дальше, как обычно.
# apt-get update
# apt-get dist-upgrade
Вот тут и натыкаемся на первые грабли. Причём, судя по интернету не я первый. Видимо, из-за того, что пакетов много и все разные, получаем конфликт - keyboardmap-data не может установиться из-за мешающего ему пакета keyboardmap-data-ru-ru. Решилось удалением последнего спомощью apt-get remove и повторным запуском apt-get dist-upgrade.
В большинстве обзоров и статей предлагается в качестве стандартного DE использовать кеды. Я решил не выделяться пока и пошёл по проторенной дорожке:
# apt-get install advanced-desktop
Это мета-пакет с KDE и всем, что ему надо.
После установки, на вкладке настроек рабочего стола, выбираем пункт "Быстрое выключение" и там жмём на "Полноценный рабочий стол". После ребута мы видим KDE. :)
Ну а потом всё пошло совсем просто. Первым делом я удалил всё, что мне не нужно - игры, pidgin, amarok, половину OO.o, оставив только Writer и Calc и там ещё что-то по мелочи, полюбовался проделанной работой и установил набор, любимого мной софта: psi, xchat, audacious и т.д. Как практически в любом дистрибутиве понадобилось поставить кодеки. Через некоторое время у меня была полностью рабочая система, настроенная так, как мне нужно.
Итоги знакомства и первые впечатления.
Понравилось. После первого взгляда на xandros возникла идея сразу же его снести и поставить родной Debian. Пока что повременю. Да и к тому же надо разобраться с организацией файловой системы. Из-за некоторых особеннойстей работы с SSD-флешками(которая тут вместо винта) файловая система устроена несколько необычно - подробнее распишу, когда сам разберусь.
Батарейка, как и обещали, держит неплохо. Полноценного теста ещё не проводил, но, к примеру, 5-минутный клип на полном экране с максимальной яркостью и громкостью, работающим в фоне apt-get'ом, Firefox-ом, Psi и ещё парой терминалов, включённым wi-fi не отобрал у батареи ни одного процента заряда.
К слову о скорости работы и многозадачности - никаких тормозов. Ни у каждого так хорошо полноценные десктопы работают.
Остался только один минус, с которым пока не успел разобраться. При подключении флешек и SD-карт постоянно выскакивает противное окошко с предложением открыть флешку в файловом менеджере или ещё в чём-нибудь. Отвечает за это некий usbstorageapplet, который даже если убить его по kill -9 всё равно каким-то процессом воскрешается. Почему нельзя было сделать автомонтирование как у всех нормальных людей с помощью udev без привлечения лишних приблуд - не понимаю. Но скоро с этим разберусь. :)
Отдельно хочется отметить сайты:
eeeusers.org и eee-pc.ru
тут можно найти достаточно много грамотной документации.
Итак, знакомство.
Первый взгляд снаружи.
В Томске найти поначалу не удавалось. Различные версии Eee PC встречал, но все они были старших моделей и все они были с виндой. Дошло то дого, что я, отчаявшись найти нетбук тут, начал искать его в online-магазинах. Затея с треском провалилась: во всех магазинах стояла пометка, нет на складе, а на письма с просьбой уточнить, можно ли заказать, либо вообще не было ответа, либо фраза "Нет и не будет". В конце концов я уже договорился с одним замечательным человеком из Москвы, знакомым по linux-форуму, что он там его купит и вышлет мне и буквально на следующий день увидел в одном из местных компьютерных магазинов желаемую машинку. Был даже выбор из разных моделей, но я всё-таки взял младшую. Единственный минус - цвет: первоначально хотел чёрный, но пришлось взять белый с розовой крышкой. :) Ну это, в принципе, не важно.
Первый взгляд изнутри.
Стандартный интерфейс напоминает больше какой-то КПК, а не полноценный ноутбук. Я перепробовал много разных оконных менеджеров, но тут сперва даже немного растерялся. Какие-то вкладки, какие-то кнопочки... Всё предельно просто и понятно, но неинтересно. Первый вопрос, который у меня возник - где же терминал? :) Гугл сказал, что он вызывается по Alt+Ctrl+T. Уже лучше. Так же играясь с настройками и бегая по менюшкам наткнулся на неработающую web-камеру. Оказалось, надо было в BIOS опцию "OS Installation" переключить в значение Finished. Так же удивил набор программ. В качестве проигрывателя аудиофайлов используется amarok(ага, т.е. там KDE), а мессенджера Pidgin(или всё-таки Gnome?). Остальной софт такой же раношёрстный, но, в принципе, приемлемый - полный комплект OpenOffice.org, Firefox в качестве браузера, набор каких-то простеньких игрушек и т.д. В общем, стандартная комплектация. И тут я нахоже первый момент, которыймне совершенно не понравился в стандартном интерфейсе - невозможность устанавливать свои программы. Так же нет привычного списка открытых окон(читай панели задач). Ну и вообще, как-то не привык я пользоваться чужими настройками. Хочу своё.
Копаем глубже.
Стандартная документация ничего внятного по поводу используемой DE и её смены ничего не сказала, поэтому в руки берётся гугл и начинается штурм.
Итак, на борту:
ОС: Xandros Linux специально допиленный для Eee PC.
WM: IceWM, с какой-то Asus'овской утилитой управления рабочим столом.
Первое, что удаётся найти - это возможность включить панель задач с кнопкой меню.
Копируем системный файл с настройками IceWM в домашнюю директорию и выставляем опцию TaskBarShowStartMenu в значение 1:
$ cat /etc/X11/icewm/preferences > /home/user/.icewm/preferences
Ребутаемся(или рестартим иксы, кому как удобнее) и радуемся работающей панельке.
Стало немного удобнее, но хотелось бы большего. В конце концов, поискав ещё немного в гугле, выясняется, что можно подключить нормальные человеческие репозитарии и поставить любой, нужный для работы софт. Так как Xandros основан на Debian, правим /etc/apt/sources.list(надо быть осторожным, потому что из всех, найденных мной в инете адресов репозитариев, половина не работала). Да, править надо с правами root'а. Это либо через sudo, либо, сделава sudo passwd и потом su.
Дальше, как обычно.
# apt-get update
# apt-get dist-upgrade
Вот тут и натыкаемся на первые грабли. Причём, судя по интернету не я первый. Видимо, из-за того, что пакетов много и все разные, получаем конфликт - keyboardmap-data не может установиться из-за мешающего ему пакета keyboardmap-data-ru-ru. Решилось удалением последнего спомощью apt-get remove и повторным запуском apt-get dist-upgrade.
В большинстве обзоров и статей предлагается в качестве стандартного DE использовать кеды. Я решил не выделяться пока и пошёл по проторенной дорожке:
# apt-get install advanced-desktop
Это мета-пакет с KDE и всем, что ему надо.
После установки, на вкладке настроек рабочего стола, выбираем пункт "Быстрое выключение" и там жмём на "Полноценный рабочий стол". После ребута мы видим KDE. :)
Ну а потом всё пошло совсем просто. Первым делом я удалил всё, что мне не нужно - игры, pidgin, amarok, половину OO.o, оставив только Writer и Calc и там ещё что-то по мелочи, полюбовался проделанной работой и установил набор, любимого мной софта: psi, xchat, audacious и т.д. Как практически в любом дистрибутиве понадобилось поставить кодеки. Через некоторое время у меня была полностью рабочая система, настроенная так, как мне нужно.
Итоги знакомства и первые впечатления.
Понравилось. После первого взгляда на xandros возникла идея сразу же его снести и поставить родной Debian. Пока что повременю. Да и к тому же надо разобраться с организацией файловой системы. Из-за некоторых особеннойстей работы с SSD-флешками(которая тут вместо винта) файловая система устроена несколько необычно - подробнее распишу, когда сам разберусь.
Батарейка, как и обещали, держит неплохо. Полноценного теста ещё не проводил, но, к примеру, 5-минутный клип на полном экране с максимальной яркостью и громкостью, работающим в фоне apt-get'ом, Firefox-ом, Psi и ещё парой терминалов, включённым wi-fi не отобрал у батареи ни одного процента заряда.
К слову о скорости работы и многозадачности - никаких тормозов. Ни у каждого так хорошо полноценные десктопы работают.
Остался только один минус, с которым пока не успел разобраться. При подключении флешек и SD-карт постоянно выскакивает противное окошко с предложением открыть флешку в файловом менеджере или ещё в чём-нибудь. Отвечает за это некий usbstorageapplet, который даже если убить его по kill -9 всё равно каким-то процессом воскрешается. Почему нельзя было сделать автомонтирование как у всех нормальных людей с помощью udev без привлечения лишних приблуд - не понимаю. Но скоро с этим разберусь. :)
Отдельно хочется отметить сайты:
eeeusers.org и eee-pc.ru
тут можно найти достаточно много грамотной документации.
пятница, 10 апреля 2009 г.
Монтирование образов жёстких дисков.
При работе с виртуальной машиной(qemu или VirtualBox) создаётся отдельный образ жёсткого диска со своей таблицей раздела и своими файловыми системами. Иногда нужно что-то быстро оттуда скопировать. Наладка сети между виртуальной машиной и хост-компом не всегда удобно, потому как если копировать надо много, занимает очень много времени. Расшаренные общие директории тоже не выход, так как для этого нужно устанавливать дополнительное ПО в хост-системе. Но выход есть.
Сперва надо переконвертировать образ диска в формат raw(как это сделать, надо смотреть в документации к используемой вирт-машине).
Далее подключаем образ к loop-устройству:
Разбиваем его на разделы:
Проверяем, как всё прошло:
И, собственно, монтируем:
Решение взято отсюда.
Сперва надо переконвертировать образ диска в формат raw(как это сделать, надо смотреть в документации к используемой вирт-машине).
Далее подключаем образ к loop-устройству:
# losetup /dev/loop0 disk_image.raw
Разбиваем его на разделы:
# kpartx -av /dev/loop0
Проверяем, как всё прошло:
# ls -alF /dev/mapper
brw-rw—- 1 root disk 253, 4 2007-11-24 14:56 loop0p1
brw-rw—- 1 root disk 253, 5 2007-11-24 14:56 loop0p5
И, собственно, монтируем:
# mount /dev/mapper/loop0p1 /mnt/
Решение взято отсюда.
понедельник, 16 марта 2009 г.
Compiz в xfce4. Debian GNU/Linux 5.0 Lenny
После обновления с Etch сменилось ядро. Соответственно, отпали дрова на видеокарту(если они были установлены не из стандартного репозитария). И как следствие отпал compiz.
Лечение.
1. Ставим драйвера:
apt-get install nvidia-glx nvidia-kernel-2.6.26-1-686
Учитывайте, что ядро у вас может быть другое.
2. Обновляем компиз(на всякий случай ;):
apt-get --reinstall install compiz compiz-core
3. Прописываем автостарт:
Заметьте, что без второго файла работать толком не получится.
Вот, собственно и всё. Старая схема, работавшая в Etch теперь не поможет. Многие описания в гугле говорят, что всё делается проще с использованием файла /etc/xdg/xfce4-session/xfce4-session.rc, но у меня почему-то ни один wm стартовать оттуда не захотел.
Лечение.
1. Ставим драйвера:
apt-get install nvidia-glx nvidia-kernel-2.6.26-1-686
Учитывайте, что ядро у вас может быть другое.
2. Обновляем компиз(на всякий случай ;):
apt-get --reinstall install compiz compiz-core
3. Прописываем автостарт:
$ cat ~/.config/autostart/compiz.desktop
[Desktop Entry]
Name=No Name
Encoding=UTF-8
Version=1.0
Exec=/usr/bin/compiz --replace --fast-filter
X-GNOME-Autostart-enabled=true
$ cat ~/.config/autostart/compiz_start.desktop
[Desktop Entry]
Encoding=UTF-8
Version=0.9.4
Type=Application
Name=compiz_start
Comment=Запуск декораций окон
Exec=/usr/bin/gtk-window-decorator --replace
StartupNotify=false
Terminal=false
Заметьте, что без второго файла работать толком не получится.
Вот, собственно и всё. Старая схема, работавшая в Etch теперь не поможет. Многие описания в гугле говорят, что всё делается проще с использованием файла /etc/xdg/xfce4-session/xfce4-session.rc, но у меня почему-то ни один wm стартовать оттуда не захотел.
четверг, 12 марта 2009 г.
Смена локали. Debian.
До недавнего времени использовал везде исключительно koi8-r. Но, всё течёт, всё изменяется. Решил перейти на utf-8.
Сама смена локали порблем не вызывает - dpkg-reconfigure locales и всё. С этим просто. Но дело в том, что имена всех файлов остаются в koi8-r. Тут пришлось немного поковыряться.
Первое, за что взялся - за колекцию музыки. Есть такая замечательная утилита EasyTag. Давно пользуюсь ей(все теги у меня уже давно в UTF). Она же умеет менять имена файлов в соответствии с тегами.
А вот для всех остальных файлов пришлось наваять маленький скриптик.
Для начала, копирую все файлы, которые надо переименовать в отдельную директорию. Далее, создаю временный файл с листингом этой директории:
Число STRN - количество файлов из листинга. Это число можно получить с помощью cat -n tmpfile. Директорию new создал руками. Всё. После отработки скрипта(в качестве первого аргумента даём ему tmpdir, а второго -количество файлов), в new будут лежать все наши файлики с именами в utf-8.
P.S. Перемещать файлы, предназначенные для переименования во временную директорию надо только с помощью cp! Никаких mc.
Update: В обсуждении этого способа на welinux.ru подсказали, что есть утилита convmv. Вердикт - гуглите, перед тем, как браться за что-то! :)
Update2: Оказывается всё ещё проще. В Debian есть пакет, специально предназначенный для смены локали на utf-8: utf8-migration-tool
Сама смена локали порблем не вызывает - dpkg-reconfigure locales и всё. С этим просто. Но дело в том, что имена всех файлов остаются в koi8-r. Тут пришлось немного поковыряться.
Первое, за что взялся - за колекцию музыки. Есть такая замечательная утилита EasyTag. Давно пользуюсь ей(все теги у меня уже давно в UTF). Она же умеет менять имена файлов в соответствии с тегами.
А вот для всех остальных файлов пришлось наваять маленький скриптик.
Для начала, копирую все файлы, которые надо переименовать в отдельную директорию. Далее, создаю временный файл с листингом этой директории:
ls -1 tmpdir/ > tmpfileЭтот файл надо слегка обработать. ls добавляет туда неотображаемые символы, которые в скрипте обрабатывать мне показалось сложновато. Я их просто убрал с помощью vim. В командном режиме:
%s/\e\[0m//gТеперь собственно скрипт:
#!/bin/bash
#
STRN=$2
for((i=1;i<=$STRN;i++)) do
# Получаем каждое определённое имя файла в UTF по очереди.
UTFNAME=`cat tmpfile | iconv -f koi8-r -t utf-8 | tail -n ${i} | head -n 1`
# Получаем каждое отдельное текущее имя файла
KOI8NAME=`ls -1 ${1} | tail -n ${i} | head -n 1`
rename ${1}"${KOI8NAME}" new/"$UTFNAME"
done
Число STRN - количество файлов из листинга. Это число можно получить с помощью cat -n tmpfile. Директорию new создал руками. Всё. После отработки скрипта(в качестве первого аргумента даём ему tmpdir, а второго -количество файлов), в new будут лежать все наши файлики с именами в utf-8.
P.S. Перемещать файлы, предназначенные для переименования во временную директорию надо только с помощью cp! Никаких mc.
Update: В обсуждении этого способа на welinux.ru подсказали, что есть утилита convmv. Вердикт - гуглите, перед тем, как браться за что-то! :)
Update2: Оказывается всё ещё проще. В Debian есть пакет, специально предназначенный для смены локали на utf-8: utf8-migration-tool
Подписаться на:
Сообщения (Atom)



