Вот тут для welinux.ru описал, как настроил у себя заставку grub2 и usplash на нетбуке под управлением Debian GNU/Linux.
А вот тут можно посмотреть, как оно выглядит.
Разные, на мой взгляд, интересные замечания, связанные с компьютерами в частности и техникой вообще.
Показаны сообщения с ярлыком Debian. Показать все сообщения
Показаны сообщения с ярлыком Debian. Показать все сообщения
вторник, 21 декабря 2010 г.
суббота, 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
пятница, 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 в частности.
вторник, 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 имя_пакета и забыли о нём.
среда, 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
понедельник, 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
вторник, 10 февраля 2009 г.
Мобильный интернет в Debian GNU/Linux.
Так уж получилось, что последнее время к "нормальному" интернету доступа нет. Поэтому приходится пользоваться мобильными технологиями(как-никак на дворе 21-ый век).
Итак, путь первый - выход через мобильный телефон.
У меня Sony Ericsson k320i. usb-шнурок шёл в комплекте. При подключении к компьютеру телефон спрашивает, в каком режиме ему работать: передача файлов или режим телефона. В данном случае выбираем второе. Перед подключением я запустил tail -f /var/log/messages и получил такие строки:
Создаём файлы настройки pppd(обязательно должен быть установлен пакет ppp).
Как видно, я использую mts. Основные параметры, типа номера дозвона, точки доступа, логина, пароля и т.д., можно узнать у мобильного оператора, так что с этим проблем быть не должно. Что касается того, что у меня продублированы логин с паролем и в chap, и в pap - это потому, что я так и не узнал, какой именно тип авторизации надо использовать, и для верности прописал оба. Хуже не будет. Ну и самое главное - это устройство модема, которое я узнал из messages.
В принципе, всё.
Подключение идёт командой pppd call mts. Я для удобства сделал скриптик:
и добавил пользователя в /etc/sudoers, чтобы не логиниться под рутом каждый раз для выхода в инет.
Скорость, конечно, оставляет желать лучшего, но жить можно.
Но постоянно включать/выключать телефон со временем надоедат. Да и ко всему прочему денег много уходит, если пользоваться таким интернетом постоянно, а подключенный мной тариф "Ночной безлимитный" неудобен тем, что работать приходится только ночью. Поэтому было решено купить GPRS-модем.
Путь второй. ZTE MF626 USB Modem.
Тут всё чуть сложнее. Дело в том, что эта замечательная железка, сразу не определилась. В голове промелькнули мысли о пересборке ядра, но как всегда, гугл спас. Довольно быстро нашлась ссылка: http://ru.gentoo-wiki.com/wiki/MF626.
Беглый просмотр не обрадовал. Однако, после прочтения треда, из которого появилась эта статья, стало немного проще.
Сперва, запускаю, как обычно tail -f /var/log/messages и подключаю модем. Как и предсказано в статье, он определяется, как ZeroCD:
Если тут же заглянуть в dmesg, видно, что в устройствах он называется /dev/sr1 (на других машинах может быть иначе). Пробую eject /dev/sr1.
В messages вижу следующее:
Т.е. выходит, что всё определилось без пересборки ядра или изменений внутренних настроек модема, предложенных в статье. В очередной раз говорю про себя "спасибо" разработчикам debian(а меня только недавно на gentoo сманивали).
Смотрим, как именно определилось с помощью cat /proc/bus/usb/devices
Устройство мы видим, но драйвер ещё не подгружен.
Подгружаю: modprobe usbserial vendor=0x19d2 product=0x031
Параметры vendor и product указаны в выводе предыдущей команды. В принципе, для данного модема они есть и в статье с гентушной вики.
В messages видно, что устройства создались:
Отлично. В статье(и особенно в исходном треде) много говорилось про сложности работы с этими устройствами, однако для меня оказалось важным только одно: для основной работы используется именно третий интерйес, т.е. /dev/ttyUSB2.
Поэтому в настройках pppd создаю такой файл:
Все остальные настройки совершенно такие же, как и при подключении через телефон.
Всё. Готово. Теперь, скомандовав pppd call mts_modem, я оказываюсь в интернете. Никаких проблем с разрывами соединения, описанных в статье, у меня не было. Поэтому и окончательное доведение до ума вышло проще. Достаточно ограничиться созданием правил в udev(обращаю внимание, что правила немного отличаются от приведённых в статье):
И изменении в скрипте для запуска инета mts на mts_modem.
Система: Debian GNU/Linux Etch 4.0r6
# uname -a
Linux damned 2.6.18-6-k7 #1 SMP Fri Dec 12 17:19:09 UTC 2008 i686 GNU/Linux
Дополнение.
Так как модем остаётся подключённым к системе постоянно, нет надобности стартовать соединение вручную, поэтому я решил написать небольшой скрипт:
Этот скрипт сохраняется в /etc/init.d/ и добавляется в загрузку/останов с помощью команды update-rc.d gprs_inet.sh defaults
Итак, путь первый - выход через мобильный телефон.
У меня Sony Ericsson k320i. usb-шнурок шёл в комплекте. При подключении к компьютеру телефон спрашивает, в каком режиме ему работать: передача файлов или режим телефона. В данном случае выбираем второе. Перед подключением я запустил tail -f /var/log/messages и получил такие строки:
Feb 10 10:06:51 damned kernel: usb 2-3: new full speed USB device using ohci_hcd and address 3Отсюда видно, что у меня появилось два новых устройства: /dev/ttyACM0 и /dev/ttyACM1. Дальше всё просто:
Feb 10 10:06:51 damned kernel: usb 2-3: configuration #1 chosen from 1 choice
Feb 10 10:06:52 damned kernel: cdc_acm 2-3:1.1: ttyACM0: USB ACM device
Feb 10 10:06:52 damned kernel: cdc_acm 2-3:1.3: ttyACM1: USB ACM device
Feb 10 10:06:52 damned kernel: usbcore: registered new driver cdc_acm
Feb 10 10:06:52 damned kernel: drivers/usb/class/cdc-acm.c: v0.25:USB Abstract Control Model driver for USB modems and ISDN adapters
Создаём файлы настройки pppd(обязательно должен быть установлен пакет ppp).
# cat /etc/ppp/chap-secrets
mts * mts
# cat /etc/ppp/pap-secrets
mts * mts
# cat /etc/ppp/options | grep -v "#"
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
noipx
# cat /etc/ppp/peers/mts | grep -v "#"
user "mts"
connect "/usr/sbin/chat -v -f /etc/chatscripts/mts"
/dev/ttyACM0
noipdefault
usepeerdns
defaultroute
persist
noauth
# cat /etc/ppp/chat/mts
ABORT BUSY
ABORT 'NO CARRIER'
""
ATZ OK
AT+CGDCONT=1,"IP","internet.mts.ru" OK
ATDT*99***1#
CONNECT ""
Как видно, я использую mts. Основные параметры, типа номера дозвона, точки доступа, логина, пароля и т.д., можно узнать у мобильного оператора, так что с этим проблем быть не должно. Что касается того, что у меня продублированы логин с паролем и в chap, и в pap - это потому, что я так и не узнал, какой именно тип авторизации надо использовать, и для верности прописал оба. Хуже не будет. Ну и самое главное - это устройство модема, которое я узнал из messages.
В принципе, всё.
Подключение идёт командой pppd call mts. Я для удобства сделал скриптик:
#!/bin/bash
sudo /usr/sbin/pppd call mts
и добавил пользователя в /etc/sudoers, чтобы не логиниться под рутом каждый раз для выхода в инет.
Скорость, конечно, оставляет желать лучшего, но жить можно.
Но постоянно включать/выключать телефон со временем надоедат. Да и ко всему прочему денег много уходит, если пользоваться таким интернетом постоянно, а подключенный мной тариф "Ночной безлимитный" неудобен тем, что работать приходится только ночью. Поэтому было решено купить GPRS-модем.
Путь второй. ZTE MF626 USB Modem.
Тут всё чуть сложнее. Дело в том, что эта замечательная железка, сразу не определилась. В голове промелькнули мысли о пересборке ядра, но как всегда, гугл спас. Довольно быстро нашлась ссылка: http://ru.gentoo-wiki.com/wiki/MF626.
Беглый просмотр не обрадовал. Однако, после прочтения треда, из которого появилась эта статья, стало немного проще.
Сперва, запускаю, как обычно tail -f /var/log/messages и подключаю модем. Как и предсказано в статье, он определяется, как ZeroCD:
Feb 10 09:17:40 damned kernel: usb 1-1: new high speed USB device using ehci_hcd and address 5
Feb 10 09:17:40 damned kernel: usb 1-1: configuration #1 chosen from 1 choice
Feb 10 09:17:40 damned kernel: scsi6 : SCSI emulation for USB Mass Storage devices
Feb 10 09:17:45 damned kernel: Vendor: ZTE Model: USB SCSI CD-ROM Rev: 2.31
Feb 10 09:17:45 damned kernel: Type: CD-ROM ANSI SCSI revision: 00
Feb 10 09:17:45 damned kernel: sr1: scsi3-mmc drive: 0x/52x cd/rw xa/form2 cdda tray
Feb 10 09:17:45 damned kernel: sr 6:0:0:0: Attached scsi generic sg2 type 5
Если тут же заглянуть в dmesg, видно, что в устройствах он называется /dev/sr1 (на других машинах может быть иначе). Пробую eject /dev/sr1.
В messages вижу следующее:
Feb 10 09:19:57 damned kernel: usb 1-1: USB disconnect, address 5
Feb 10 09:20:02 damned kernel: usb 1-1: new high speed USB device using ehci_hcd and address 6
Feb 10 09:20:02 damned kernel: usb 1-1: configuration #1 chosen from 1 choice
Feb 10 09:20:02 damned kernel: scsi7 : SCSI emulation for USB Mass Storage devices
Feb 10 09:20:07 damned kernel: Vendor: ZTE Model: MMC Storage Rev: 2.31
Feb 10 09:20:07 damned kernel: Type: Direct-Access ANSI SCSI revision: 02
Feb 10 09:20:07 damned kernel: sd 7:0:0:0: Attached scsi removable disk sdb
Feb 10 09:20:07 damned kernel: sd 7:0:0:0: Attached scsi generic sg2 type 0
Т.е. выходит, что всё определилось без пересборки ядра или изменений внутренних настроек модема, предложенных в статье. В очередной раз говорю про себя "спасибо" разработчикам debian(а меня только недавно на gentoo сманивали).
Смотрим, как именно определилось с помощью cat /proc/bus/usb/devices
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 6 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=19d2 ProdID=0031 Rev= 0.00
S: Manufacturer=ZTE, Incorporated
S: Product=ZTE CDMA Technologies MSM
S: SerialNumber=1234567890ABCDEF
C:* #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=500mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=none
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=none
E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
I: If#= 2 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I: If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=none
E: Ad=84(I) Atr=03(Int.) MxPS= 64 Ivl=2ms
E: Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
Устройство мы видим, но драйвер ещё не подгружен.
Подгружаю: modprobe usbserial vendor=0x19d2 product=0x031
Параметры vendor и product указаны в выводе предыдущей команды. В принципе, для данного модема они есть и в статье с гентушной вики.
В messages видно, что устройства создались:
Feb 10 09:43:00 damned kernel: usbcore: registered new driver usbserial
Feb 10 09:43:00 damned kernel: drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
Feb 10 09:43:00 damned kernel: usbserial_generic 1-1:1.0: generic converter detected
Feb 10 09:43:00 damned kernel: usb 1-1: generic converter now attached to ttyUSB0
Feb 10 09:43:00 damned kernel: usbserial_generic 1-1:1.1: generic converter detected
Feb 10 09:43:00 damned kernel: usb 1-1: generic converter now attached to ttyUSB1
Feb 10 09:43:00 damned kernel: usbserial_generic 1-1:1.3: generic converter detected
Feb 10 09:43:00 damned kernel: usb 1-1: generic converter now attached to ttyUSB2
Feb 10 09:43:00 damned kernel: usbcore: registered new driver usbserial_generic
Feb 10 09:43:00 damned kernel: drivers/usb/serial/usb-serial.c: USB Serial Driver core
Отлично. В статье(и особенно в исходном треде) много говорилось про сложности работы с этими устройствами, однако для меня оказалось важным только одно: для основной работы используется именно третий интерйес, т.е. /dev/ttyUSB2.
Поэтому в настройках pppd создаю такой файл:
# cat /etc/ppp/peers/mts_modem | grep -v "#"
user "mts"
connect "/usr/sbin/chat -v -f /etc/chatscripts/mts"
/dev/ttyUSB2
noipdefault
usepeerdns
defaultroute
persist
noauth
Все остальные настройки совершенно такие же, как и при подключении через телефон.
Всё. Готово. Теперь, скомандовав pppd call mts_modem, я оказываюсь в интернете. Никаких проблем с разрывами соединения, описанных в статье, у меня не было. Поэтому и окончательное доведение до ума вышло проще. Достаточно ограничиться созданием правил в udev(обращаю внимание, что правила немного отличаются от приведённых в статье):
# cat /etc/udev/rules.d/z80_usb_modem.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="2000", RUN+="/usr/bin/eject /dev/sr1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0031", RUN+="/sbin/modprobe usbserial vendor=0x19d2 product=0x031"
И изменении в скрипте для запуска инета mts на mts_modem.
Система: Debian GNU/Linux Etch 4.0r6
# uname -a
Linux damned 2.6.18-6-k7 #1 SMP Fri Dec 12 17:19:09 UTC 2008 i686 GNU/Linux
Дополнение.
Так как модем остаётся подключённым к системе постоянно, нет надобности стартовать соединение вручную, поэтому я решил написать небольшой скрипт:
# cat /etc/init.d/gprs_inet.sh
#! /bin/sh
PATH=/sbin:/bin
start () {
echo "Starting GPRS Internet Connection..."
/usr/bin/eject /dev/sr1 2>/dev/null
# Задержка нужна, потому как между отключением ZeroCD и стартом
# собственно модема, проходит время.
/bin/sleep 10
/usr/sbin/pppd call mts_modem
echo "GPRS Connection Established."
}
stop () {
echo "Stoping GPRS Connection..."
/usr/bin/killall pppd 2>/dev/null
echo "GPRS Connection is stopped."
}
case "$1" in
start)
start
;;
restart)
stop
start
;;
stop)
stop
;;
*)
echo "Usage: gprs_inet.sh [start|restart|stop]" >&2
exit 0
;;
esac
Этот скрипт сохраняется в /etc/init.d/ и добавляется в загрузку/останов с помощью команды update-rc.d gprs_inet.sh defaults
Подписаться на:
Сообщения (Atom)
