Показаны сообщения с ярлыком linux. Показать все сообщения
Показаны сообщения с ярлыком linux. Показать все сообщения

четверг, 31 декабря 2009 г.

Ncmpcpp. MPD-клиент с двумя плюсами

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

В данной заметке я бы хотел рассказать о клиенте Ncmpcpp, представляющим собой логическое продолжение клиента ncmpc, который является удобным консольным клиентом с псевдографическим интерфейсом (ncurses).

Ещё один?

Да, казалось бы, зачем огород городить? Но у ncmpcpp есть ряд преимуществ, по сравнению с любимым многими ncmpc.

Вот неполный список полезностей. Добавлены возможности:

  • Изменение стиля оформления плейлиста и списка песен в базе (положение полей, а также их цвет).
  • Чтение текста песен (не наших :).
  • Редактирование тегов, не выходя из клиента и без необходимости обновлять заново базу.
  • Удаление неугодныех файлов с диска.
  • Добавление в плейлист случайных песен. Может кому-нибудь и будет полезно, чтобы среди терабайтов музыки не забыть какая музыка ещё представлена на компьютере.
  • Поиск песни в браузере базы по песне в плейлисте.

Конфиг расположен по адресу ~/.ncmpcpp/config и прекрасно документирован.

Правка тегов

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

Вот так это выглядит на скриншоте:

Как видно на скриншоте, есть возможность сделать первые буквы заглавными, а также все - строчными. Изменения вступают в силу после нажатия на «Save».

Если хочется подправить теги, скажем, текущей песни в плейлисте, то можно ткнуть на песне в плейлисте «e», откроется «Tiny tag editor», где и можно внести изменения.

Лирика

Лирика качается с двух ресурсов: lyricwiki.org и lyricsplugin.com. Но похоже, что c первой проблемы со скачиванием нахаляву, поэтому можно стягивать со второго ресурса. Для этого в конфиге надо указать lyrics_database = "2". После этого можно выставлять курсор на интересующую песню и давить «l» (латинская маленькая L).

Easy money!

Резюме

Данный клиент почти не отличается от старого-доброго ncmpc, но содержит некоторые рюшечки, которые могут оказаться полезными.

С Новым Годом!


Читать далее…

вторник, 1 сентября 2009 г.

Wcd и CDargs. Удобные бродилки по файловой системе.

Известно, что для навигации по директориям файловой системы в Linux используется команда cd:

$ cd Directory/

Если же директория запрятана далеко, то неизбежно придётся набирать команду:

$ cd /path/to/deeply/hidden/directory/subdirectory/destination

Чтобы добраться до destination даже с учётом дополнения по TAB, придётся потрудиться.

Как это сделать проще?

Здесь мы рассмотрим три способа ускорения навигации в консоли по файловой системе.

Алиасы

Во-первых, для часто посещаемых директорий можно создать алиасы. Например, пропишем в ~/.bashrc (если используем оболочку bash):

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Теперь в файле ~/.bash_aliases будем записывать алиасы:

alias destination='cd /path/to/deeply/hidden/directory/subdirectory/destination'

После обновления оболочки (source ~/.bashrc или простого перезапуска терминала) для того, чтобы пройти по предыдущему пути, в командной строке будет достаточно набрать

$ destination
Более того, будет работать автодополнение (если оно установлено, конечно).

К преимуществам можно отнести простоту и удобство в виде автодополнения. Недостаток же состоит в том, что кроме как перейти в назначенную директорию, мы будем не в состоянии.

Например, пусть в директории destination есть поддиректория subdirectory. Перейти в неё за одно действие описанным способом нельзя. Команда destination/subdirectory не сработает, алиасы bash этого не понимают. Алиасы в zsh поумнее, возможно, они с этим справятся, но я не специалист в этом вопросе.

Программа WCD

WCD (Wherever Change Directory) позволяет быстро менять директории. Программа кэширует дерево каталогов, после чего для перехода в destination из любой точки файловой системы достаточно скомандовать.

$ wcd destination

Здесь не будет работать автодополнение (по крайней мере у меня не работает. Если кто завёл - отзовитесь :) Зато будут функционировать wildcards * и ?. Более того, можно использовать неполное имя директории. Например, сработают варианты:

$ wcd dest
$ wcd *tion
$ wcd dest??ation

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

a /usr/share/doc/texlive-latex-extra-doc/latex/datenumber
b /usr/share/doc/texlive-latex-extra-doc/latex/datetime
c /usr/share/icons/gnome/16x16/stock/data
d /usr/share/icons/gnome/24x24/stock/data
e /usr/share/icons/gnome/48x48/stock/data
f /usr/share/icons/hicolor/128x128/stock/data
g /usr/share/icons/hicolor/16x16/stock/data
h /usr/share/icons/hicolor/192x192/stock/data
i /usr/share/icons/hicolor/22x22/stock/data
j /usr/share/icons/hicolor/24x24/stock/data
k /usr/share/icons/hicolor/32x32/stock/data
l /usr/share/icons/hicolor/36x36/stock/data
m /usr/share/icons/hicolor/48x48/stock/data
n /usr/share/icons/hicolor/64x64/stock/data
o /usr/share/icons/hicolor/72x72/stock/data
p /usr/share/icons/hicolor/96x96/stock/data
q /usr/share/icons/hicolor/scalable/stock/data
r /usr/share/texmf-texlive/tex/latex/dateiliste
s /usr/share/texmf-texlive/tex/latex/datenumber
t /usr/share/texmf-texlive/tex/latex/datetime
u /usr/share/texmf-texlive/tex/latex/ucs/data
v /var/spool/openoffice/uno_packages/cache/registry/com.sun.star.comp.deploym

Wild match for 137 directories.       w=up x=down ?=help  Page 7/7
Please choose one (<Enter> to abort):

С применением wcd есть возможность заходить в поддиректории назначения, но здесь уже не будет работать автодополнение. То есть либо придётся по памяти набивать поддиректорию, используя wildcard, либо, в случае малой вложенности директорий, в качестве поддиректории сразу вколотить *

$ wcd destination/*
Установка WCD

В Debian пакет есть в репозиториях, поэтому просто:

$ sudo aptitude install wcd

После этого копируем бинарник программы куда-нибудь в $PATH (проверить можно по echo $PATH). В моём случае это ~/bin.

$ cp /usr/lib/wcd/wcd.exec ~/bin

Дальше всё по мануалу (man wcd). Лезем в ~/.bashrc (или какая там у вас оболочка?) и добавляем:

# WCD function
function wcd
{
   $HOME/bin/wcd.exeс $*

   . $HOME/bin/wcd.go
}
(Для csh будет alias wcd "$HOME/bin/wcd.exe \!* ; source $HOME/bin/wcd.go")

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

$ wcd -s
$ wcd -A /media
Можно объединить
$ wcd -s -A /media/

Теперь можно пользоваться программой. У wcd много дополнительных возможностей, например графический интерфейс, который строит дерево каталогов:

$ wcd -ga
        |         |       |        |- 700
        |         |       |        |- mm4b -+- 550_105min
        |         |       |        |        |- 550_30min
        |         |       |        |        |- 625
        |         |       |        |        `- 725
        |         |       |        `- old_MM4_PeaksCorrection -+- 350
        |         |       |                                    |- 400
        |         |       |                                    |- 450
        |         |       |                                    |- 500
        |         |       |                                    |- 550
        |         |       |                                    |- 600
        |         |       |                                    |- 625
        |         |       |                                    |-<650>

        |         |       |                                    |- 675
        |         |       |                                    `- 700
        |         |       `- results
        |         |- old_perovskites -+- Membrane -+- air -+- dat
        |         |                   |            |       `- raw
        |         |                   |            |- graphs -+- Air
        |         |                   |            |          `- Vacuum
        |         |                   |            |- photo -+- 280307
        |         |                   |            |         `- 290307
        |         |                   |            |- synchrotron -+- correct
        |         |                   |            |               `- uxd
        |         |                   |            `- vacuum --- Vac_dat
Однако для меня достаточно лишь быстрого хождения по директориям.

Программа CDargs

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

$ cv bookmark
/path/to/buried/directory/with/bookmark
То есть, скомандовав перейти в bookmark из любой директории, мы прошли разом весь путь.

Какое же отличие от простых алиасов? Во-первых, есть возможность заходить в поддиректории, более того, с использованием автодополнения.

$ cv Music [TAB]
Music/Audiobooks/   Music/Foreign/      Music/Sounds/
Music/Classic/      Music/Fun/          Music/Soundtrack/
Music/Collections/  Music/Russian/
$ cv Music/Classic/ [TAB]
Music/Classic/Classic\ in\ rock/     Music/Classic/\М\у\с\о\р\г\с\к\и\й/
Music/Classic/PlanetClassic/         Music/Classic/\П\у\ч\ч\и\н\и/
Music/Classic/\В\и\в\а\л\ь\д\и/      Music/Classic/\Р\а\х\м\а\н\и\н\о\в/
Music/Classic/\Д\в\о\р\ж\а\к/        Music/Classic/\Р\о\с\с\и\н\и/
Music/Classic/\М\о\ц\а\р\т/          Music/Classic/\Ч\а\й\к\о\в\с\к\и\й/

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

$ cpb foo bookmark/subdirectory
Но тут, к сожалению, не работает дополнение по табу :(

В третьих есть псевдогуи, на ncurses.

Установка CDargs

В Debian Lenny, опять же, программа есть. Поэтому

$ sudo aptitude install cdargs

После этого можно запустить cdargs и почитать справку, нажав ?. Можно добавить закладки через GUI, а можно просто отредактировать файл ~/.cdargs:

cac /home/maxim/Documents/conferences/cac
Documents /home/maxim/Documents
Music /home/maxim/Music
Video /home/maxim/Video
devel /home/maxim/devel
python-dev /home/maxim/devel/python
Incomplete /home/maxim/p2p/Incomplete
p2p /home/maxim/p2p
data /media/data/

Для bash в ~/.bashrc пишем:

# CDargs function
if [ -e /usr/share/doc/cdargs/examples/cdargs-bash.sh ]; then

  . /usr/share/doc/cdargs/examples/cdargs-bash.sh
fi
function cv () {
    cdargs "$1" && cd "‘cat "$HOME/.cdargsresult"‘" ;
}

Теперь, после перезапуска оболочки бегаем по файловой системе со скоростью спринтера.

Резюме

Второй и третий методы более совершенны, нежели первый. У каждого есть свои плюсы и минусы, поэтому лично я использую оба, тем более, что с cdargs я познакомился совсем недавно.

Несомненно, программы wcd и cdargs существенно облегчат жизнь обитателям консоли. Напоследок хотелось бы отметить, что с cdargs я познакомился благодаря обзору на Debian Package of the Day.


Читать далее…

понедельник, 17 августа 2009 г.

Смена внешнего вида диалога выбора в Opera

Я иногда пользуюсь браузером Opera, когда не использую Conkeror. Многое в первом меня устраивает, за исключением, пожалуй, диалога выбора файла. Например, при сохранении странички или файла появляется окно, соответствующее стилю библиотеки qt3. Лично мне это не нравится, потому что данный диалог мне неудобен, если даже не говорить о внешних недостатках. Здесь я опишу как можно его можно изменить на стандартный диалог gtk.

Немного начальных условий (а вдруг, понадобятся? :).

$ uname -r
2.6.26-2-686

$ opera -version
Opera 9.64. Build 2480 for Linux. Qt library 3.3.8b.

Для смены вида диалога набираем в адресной строке opera:config, находим "File Selector", выставляем значение "Dialog Toolkit" на 2, сохраняем. После перезапуска Opera получаем стандартный диалог выбора gtk.

Другие значения параметра "Dialog Toolkit" в моём случае не приводят к каким-либо изменениям.

А можно не менять ничего кардинально, а, например, добавить информации в стандартном диалоге: тип файла, время модификации, права доступа. Для этого ставим галку на "Show Details".

Решение нашёл здесь, тов. lizard огромное спасибо!!! Для меня остаётся загадкой, как он до этого дошёл :)


Читать далее…

пятница, 10 июля 2009 г.

Избавляемся от пустых одинаковых иконок. Раскрасим аскетичный рабочий стол.

Проблема

Если вы - пользователь лёгкого оконного менеджера и используете по большей части консольные приложения, или такие программы, как, например, xpdf, mplayer, conkeror, то с проблемой вы, скорее всего знакомы. Дело в том, что эти программы имеют проблемы со значками, которые можно видеть при переключении окон альт-табом или на рамке окна. Все они имеют одну и ту же иконку, неинформативное пустое изображение, которое только мозолит глаза, но не помогает разобраться что это за программа. Знакомая картина?

Не знаю можно ли решить данную проблему более элегантным способом, но был бы рад услышать, если у кого-нибудь есть мысли по этому поводу. Я же нашёл следующее решение, использующее программу fbpanel.

В результате будет так.

Решение

Панель fbpanel сама по себе - весьма хорошее решение для легковесного рабочего стола, однако лично я больше предпочитаю tint2. Однако именно fbpanel позволяет решить озвученную выше проблему - назначает различным приложениям свои иконки.

Установка и конфигурация

В Debian эта программа есть в репозиториях, поэтому ставится как обычно:

$ sudo aptitude install fbpanel

Конфигурационный файл по умолчанию: /etc/fbpanel/default. Чтобы использовать свой конфиг надо создать директорию ~/.fbpanel, если ещё нет, и положить туда конфиг, который мы будем модернизировать (я его назвал icons_panel):

$ mkdir ~/.fbpanel
$ cp /etc/fbpanel/default ~/.fbpanel/icons_panel
Чтобы использовать профиль icons_panel, запуск осуществляем командой:
$ fbpanel -p icons_panel
Теперь открываем файл ~/.fbpanel/icons_panel в своём любимом текстовом редакторе и редактируем. После изменения профиля, надо перезапустить fbpanel.

В первую очередь нас интересуют поля в нижней части файла:

# 'icons' plugin lets you customize window icons.

# these changes apply to entire desktop
Plugin {
    type = icons
    config {
        DefaultIcon = /usr/share/fbpanel/images/default.xpm
        application {
            icon = gnome-terminal
            Image =  /usr/share/fbpanel/images/gnome_terminal.svg
            ClassName = XTerm
        }
        ...
    }
}

Например, окну, у которого ClassName есть XTerm будет назначена иконка gnome-terminal из вашей темы gtk-2 (если я правильно понял) или /usr/share/fbpanel/images/gnome_terminal.svg.

Таким образом, если я хочу, чтобы conkeror имел иконку firefox, я просто запишу в эту секцию конфига:

application {
    icon = firefox
    Image = /home/maxim/.icons/my_icons/firefox.png
    ClassName = Conkeror
}
Если в используемой теме gtk-2 есть иконка firefox, то будет использована она. Если - нет, то будет использована /home/maxim/.icons/my_icons/firefox.png. Эти действия повлияют на окно, у которого ClassName = Conkeror.

Как узнать что есть ClassName для заданного приложения? Нет ничего проще. Наберите в терминале следующую команду и ткните мышью в интересующее окно.

$ xprop | grep WM_CLASS
В случае conkeror я получил выхлоп:
WM_CLASS(STRING) = "Navigator", "Conkeror"
Первый параметр есть AppName, который нам пригодится позже, а второй, "Conkeror", и есть искомый ClassName.

Подобную процедуру мы можем провести с mplayer, xpdf, с другими неконсольными приложениями.

Здорово! Но это не всё. Ведь все приложения, запущенные в терминале будет тогда иметь тот же вид, что и терминал, так что потом среди них не разберёшься. Тут на помощь придёт AppName.

Если просто запустить, какое-нибудь консольное приложение, скажем, ncmpc, в xterm, я получаю выхлоп от xprop:

WM_CLASS(STRING) = "xterm", "XTerm"

Ни о каком названии запущенного приложения не упоминается.

Но если запустить так:

$ xterm -name ncmpc -e ncmpc
то ситуация изменится:
$ xprop  | grep WM_CLASS
WM_CLASS(STRING) = "ncmpc", "XTerm"

Теперь, чтобы fbpanel отличала обычный терминал от консольного приложения ncmpc, в конфиг следует прописать следующее:

application {
    Image = /home/maxim/.icons/my_icons/media-player-banshee.png
    AppName = ncmpc
    ClassName = XTerm
}

Аналогично, скажем, для MidnightCommander ($ xterm -name mc -e mc):

application {
    icon = mc
    AppName = mc
    ClassName = XTerm
}

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

Если используем другую панель

Всё так здорово, но мы не хотим использовать fbpanel в качестве панели? Для этого мы можем сделать панель очень маленькой и поместить в какой-нибудь угол - видеть её мы не будем, а памяти она занимает немного. Для этого редактируем секцию General (я задал ширину width=0 и высоту в один пиксель, height=1) и удаляем все плагины кроме определений иконок.

Приведу свой конфиг:

Global {
    edge = top
    allign = right
    margin = 0
    widthtype = percent
    width = 0
    height = 1
    transparent = false
    tintcolor = #ffffff
    alpha = 37
    setdocktype = true
    setpartialstrut = true
    autohide = true
    heightWhenHidden = 2
}

Plugin {
    type = icons
    config {
        DefaultIcon = /usr/share/fbpanel/images/default.xpm
        application {
            icon = gnome-terminal
            Image = /usr/share/fbpanel/images/gnome_terminal.svg
            ClassName = XTerm
        }
        application {
            icon = gnome-terminal
            Image = /usr/share/fbpanel/images/gnome_terminal.svg
            ClassName = URxvt
        }
        application {
            icon = gnome-emacs
            Image = /usr/share/fbpanel/images/emacs.svg
            ClassName = Emacs
        }
        application {
            icon = mozilla-firefox
            ClassName = Firefox-bin
        }
        application {
            icon = mozilla-firefox
            ClassName = Firefox
        }
        application {
            Image = /home/maxim/.icons/my_icons/totem.svg
            ClassName = MPlayer
        }
        application {
            Image = /home/maxim/.icons/my_icons/xpdf.svg
            ClassName = Xpdf
        }
        application {
            icon = opera
            Image = /home/maxim/.icons/my_icons/opera.svg
            ClassName = Opera
        }
        application {
            icon = firefox
            Image = /home/maxim/.icons/my_icons/firefox.png
            ClassName = Conkeror
        }
        application {
            Image = /home/maxim/.icons/my_icons/media-player-banshee.png
            AppName = ncmpc
            ClassName = XTerm
        }
        application {
            Image = /home/maxim/.icons/my_icons/email.png
            AppName = mymail
            ClassName = XTerm
        }
        application {
            icon = mc
            AppName = mc
            ClassName = XTerm
        }
    }
}

В результате fbpanel делает своё дело, назначает окнам иконки, а в качестве панели мы используем что-нибудь другое, в моём случае это tint2.


Читать далее…

среда, 1 июля 2009 г.

Работаем с лёгкостью с архивами в консоли. Утилита atool.

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

$ tar xzvf archive.tar.gz
$ tar czvf new_archive.tar.gz directory_to_pack
$ tar xjvf archive.tar.bz2
$ tar cjvf new_archive.tar.bz2 directory_to_pack
Как видно, ключи в случае gzip и bzip2 используются разные, а ещё в природе есть (если не вспоминать про более редкие arj, arc, p7zip, ace) zip и rar, которые распаковываются с помощью unzip и unrar.

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

В принципе, не такая уж и проблема, всё запомнить, но было бы, разумеется, куда более здорово, если бы существовала универсальная программа архиватор/разархиватор для всех нужных форматов. И такая программа есть! Это atool, набор скриптов, позволяющий свести к минимуму нагрузку на мозг :)

Для распаковки архива достаточно скомандовать:

$ aunpack archive.tar.gz
Вместо gz может быть bzip, bzip2, zip, 7zip, rar, arj и прочее (смотрите мануал). Замечательно, что все архивы при таком использовании будут распакованы в отдельную поддиректорию, даже если все файлы в архиве лежат в корне, а не в отдельном каталоге (в этом случае будет создана поддиректория с названием, соответствующим названию архива)! Таким образом, текущую директорию вы, независимо от того, что за архив вы поковыряли, не загадите, а что более важно, не перезапишете случайно старые файлы.

Чтобы распаковать содержимое архива в какую-то заданную директорию служит ключ -X или —extract-to:

$ atool archive.rar -X path_to_extract
В данном случае путь path_to_extract уже должен существовать.

Запаковать файлы file1, file2 и директорию dir в zip-архив можно не менее простой командой:

$ apack new_archive.zip file1 file2 dir
Использование wildcards * , ? и прочих регулярных выражений очень облегчает работу.

Для того чтобы запаковать директории dir1, dir2, dir3 в архивы dir?.tar.bz2 достаточно выполнить:

$ apack -e -F tar.bz2 dir*

-e выполняет команду для каждого архива, указанного в регулярном выражении dir*, а -F tar.bz2 указывает на формат архива. Формат можно указывать как в виде расширения, так и в виде tar+bz2.

Для просмотра содержимого архива служит als:

$ als archive.tar.bz2
а посмотреть содержимое файла readme в архиве можно так:
$ acat dwm-4.7.tar.bz2 dwm-4.7/readme | less

Резюме

Если вы предпочитаете работать в консоли, то программа atool окажется очень полезной для работы с архивами, она избавит от необходимости запоминать ключи для разных программ-упаковщиков и позволит освободить мозговые ресурсы для более полезных занятий. А использование регулярных выражений даёт возможность выполнять большой обьём работы, по меркам графических программ, с помощью коротких команд.

Сам я познакомился с atool благодаря этой заметке.


Читать далее…

пятница, 19 июня 2009 г.

Теперь устройство может быть безопасно извлечено :) linux

Постановка задачи

В прошлый раз мы посмотрели как можно вывести информацию о том подмонтирована ли флешка или нет на экран при помощи системного монитора conky. Как известно, если есть какой-нибудь процесс, который занимает какой-нибудь файл на флешке, то umount ругнётся:

umount: /media/usb: device is busy
umount: /media/usb: device is busy
Таким образом, для начала надо узнать что это за процесс, а затем убить его.

В этой заметке я приведу скрипт, который использует для автоматического отключения занимающих процессов программу fuser и выводит сообщения на экран посредством программы gmessage.

Кому это надо? Ну, скорее всего, не пользователям DE, где это и так реализовано уже, наверное (хотя в последний раз, когда я использовал DE, мне приходилось самому искать держащие процессы). А вот пользователям лёгких оконных менеджеров, может и пригодится.

Решение

fuser - для отключения мешающих процессов

Программа fuser идентифицирет процессы, использующие данный файл и позволяет их убить. Допустим, мы открыли какой-то файл на флешке в программе evince и ещё лазим в терминала по файловой системе. Характерный вывод такой:

~> fuser -vm /media/usb/
                     USER        PID ACCESS COMMAND
/media/usb/:         maxim      6369 ..c.. bash
                     maxim      7404 f.... evince
-v означает более полный вывод, а -m /media/usb указывает на точку монтирования. В википедии это хорошо описано, а в конце приведён пример как убить махом все процессы, занимающие требуемую файловую систему. В моём случае для отрубания всего (от точки монтирования /media/usb) будет служить команда:
fuser -km /media/usb

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

lsof - для информативного вывода

Для более информативного вывода, на мой взгляд, больше подойдёт программа lsof. Вот типичный вывод:


~> lsof | grep /media/usb/
bash       6369       maxim  cwd       DIR       8,17    32768    1663 /media/usb/Experiment
evince     7404       maxim   14r      REG       8,17   873474    1684 /media/usb/ABX3_preprint.pdf
Колонки означают следующее:
~> lsof | head -1
COMMAND     PID        USER   FD      TYPE     DEVICE     SIZE    NODE NAME
Более удобный вывод для меня (PID COMMAND NAME, разделённые табуляцией) я получаю с помощью awk:
lsof | grep /media/usb/ | awk '{print $2"\t"$1"\t"$9}'
Здесь мы режем строку на части, разделённые пробелом (в случае непробельного разделителя надо использовать -F "разделитель") и выводим соответствующие части в желаемом порядке.

Таким образом, получим:

~> lsof | grep /media/usb/ | awk '{print $2"\t"$1"\t"$9}'
6369    bash    /media/usb/Experiment
7404    evince  /media/usb/ABX3_preprint.pdf
По-моему, это весьма информативно. Я не соображу сходу что значит процесс 7404, но уж точно пойму /media/usb/ABX3_preprint.pdf. А это мне и надо.

Gmessage - для графического отображения информации

Хочется, когда отмонтирование прошло удачно, получить сообщение, что всё удачно. В обратном случае хотелось бы, чтобы появилось окошко, показывающее, что такие-то процессы мешаются, и предлагающее их убить.

Для этого можно использовать старую добрую программу xmessage или её более приятный глазу аналог, gmessage (оно же gxmessage).

Для отображения текста из файла text-file в окне с кнопками "Ла" и "Нет" достаточно скомандовать:

gxmessage -name "Заголовок окна" -buttons "Да:0,Нет:1" -file text-file
При нажатии на кнопку "Да" будет генериться сигнал 0, при нажатии на "Нет", соответственно - 1.

Таким образом, если мы хотим, чтобы при нажатии на "Да" что-то происходило, мы будем использовать такую конструкцию:

if gxmessage -name "Заголовок окна" -buttons "Да:0,Нет:1" \
    -file text-file;
then
    *что-то выполняем*
fi

Пишем скрипт

Итак, предлагаю такой ход действий:

  • Введём переменную точки монтирования и лога сообщений:
MOUNT_POINT="/media/usb"
LOG=/tmp/mount_usb_log
  • Узнаём подмонтирована ли флешка (если $if_mounted непусто, то выполняем то, что внутри if:
if_mounted=`grep $MOUNT_POINT /etc/mtab`
if [[ -n `echo $if_mounted` ]]; then

...
fi
  • Если флешка подмонтирована, пытаемся её отмонтировать, а все возможные сообщения пишем в лог:
umount $MOUNT_POINT &> $LOG

  • Затем, если лог непустой, то есть что-то пошло не так, выведем сообщение какие процессы нам мешают и предложим их убить.
  • В случае успеха, напишем, что всё получилось.

У меня получилось следующее:

#!/bin/sh
MOUNT_POINT="/media/usb"

if_mounted=`grep $MOUNT_POINT /etc/mtab`
LOG=/tmp/mount_usb_log

function my_umount {
    # если подмонтирована, пытаемся отмонтировать
    if [[ -n `echo $if_mounted` ]]; then

        umount $MOUNT_POINT &> $LOG
    fi
}

my_umount

if [[ -s $LOG ]]; then

    # если лог непустой, то
    # пишем в него какой процесс занимает (попутно приводим к приличному виду с помощью awk)

    lsof | grep /media/usb/ | awk '{print $2"\t"$1"\t"$9}' > $LOG

    # если есть лог, то пишем, что флешка занята

    if gxmessage -file $LOG -name "Флешка занята!" \
        -buttons "Force:0,Cancel:1";
    then

        while [[ -n `echo $if_mounted` ]]; do
            # при нажатии на Force убиваем процессы, которые занимают флешку

            fuser -km $MOUNT_POINT
            # и пытаемся снова отмонтировать
            my_umount
            if_mounted=`grep $MOUNT_POINT /etc/mtab`
            # пока не отмонтируем (пока /etc/mtab не будет содержать "/media/usb")

        done
        gxmessage "Флешка успешно отмонтирована"
    fi

else
        gxmessage "Флешка отмонтирована"

fi

Цикл я использовать поначалу не планировал, думал просто скомандовать

fuser -km $MOUNT_POINT
my_umount

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

Итак, скриншоты.

Когда флешка занята, видим кто мешает:

После нажатия на «Force» процессы убиты, флешка отмонтирована и мы видим:

Ура! :)

Дело за малым:

  • обзываем скрипт umount_usb
  • делаем его исполняемым (chmod u+x umount_usb)
  • кладём куда-нибудь в $PATH (например, в ~/bin, при этом добавить в ~/.bashrc export PATH="$PATH:$HOME/bin")
  • настраиваем sudo, чтобы запускать umount без запроса пароля (смотри здесь на предмет NOPASSWD, тогда в скрипте mount меняем на sudo mount), либо смотрим на мои опции в /etc/fstab (user позволяет от обычного пользователя монтировать): /dev/sdb1 /media/usb auto user,noauto,iocharset=utf8,showexec 0 0 (для кого это - китайская грамота следует прочитать это)
  • назначаем горячую клавишу. Например, я использую xbindkeys. В ~/.xbindkeys: пишем
  "umount_usb"
  Mod4+u

Заключение

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


Читать далее…

понедельник, 8 июня 2009 г.

Подмонтирована ли флешка?

Как известно, перед выдёргиванием флешки надо удостовериться отмонтирована ли файловая система, чтобы не потерять записанные данные и не испортить файловую систему. Пользователи линукс с этим знакомы особо, динозавры привыкли к mount/umount.

Не знаю, у кого как, а у меня иногда возникают сомнения, а отмонтировал ли я флешку или нет. Конечно можно воспользоваться файловым менеджером типа nautilus, thunar, pcmanfm и проделать это вновь для верности что представляет лишние телодвижения. Есть апплеты на панели, типа как в винде, но по мне это лишние свистелки (весьма приличный в kde3, но кедами я не пользуюсь), поэтому в консоли, которая всегда под рукой, я для этого набирал df.

Отображение в Conky

Ещё один альтернативный путь, который я стал использовать, и который, быть может, покажется кому-нибудь полезным заключается в отображении статуса в системном мониторе conky.

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

В конфигурационном файле ~/.conkyrc в разделе «TEXT», в котором и настраивается что будет отображаться на экране, я добавил следующую строку:

${if_mounted /media/usb}${color red}Usb stick is mounted ${alignr}${fs_bar 7,70 /media/usb}${else}${color}Usb stick is NOT mounted ${endif}

Интуитивно понятно, что выполняет конструкция ${if_mounted /media/usb}если_подмонтирована${else}если_не_подмонтирована${endif}. Таким образом, если файловая система флешки подмонтирована в /media/usb, то видим красную надпись «Usb stick is mounted» и красную полоску с индикацией степени заполнения свободного места флешки. В обратном случае увидим надпись «Usb stick is NOT mounted».

Mount, umount в xbindkeys

Теперь, если надо отмонтировать флешку просто надо скомандовать umount /media/usb. Разумеется, здорово было бы забиндить это на какую-нибудь комбинацию клавиш. Например, может придти на помощь программа xbindkeys. В файл ~/.xbindkeysrc пропишем следующие строки:

"mount /media/usb"
Mod4 + i

"umount /media/usb"
Mod4 + u
Программу необходимо запускать всякий раз при старте иксов, например, добавив в ~/.xinitrc строку «xbindkeys &». Таким образом, при нажатии Win+i будет производиться монтирование, а Win+u - размонтирование.

Вот, собственно, и всё :)


Читать далее…

воскресенье, 24 мая 2009 г.

Изменение оформления gtk-приложений

Пользователи среды GNOME могут легко изменить используемую тему оформления, для этого надо просто залезть в графический настройщик внешнего вида и выбрать нужную тему или добавить новую. Но что если вы используете оконный менеджер (WM) вместо DE, который просто по определению не предоставляет такой функционал? В таком случае всегда есть возможность ручной правки конфигов для gtk-приложений. Также присутствуют графические программы, дающие возможность менять тему оформления.

Правка конфигурационного файла

Выбор темы

Конфигурационный файл, который необходимо подправить для изменения темы оформления, имеет имя ~/.gtkrc-2.0. В моём случае этот файл имеет следующий вид (создан с применением прекрасной программы lxappearance из проекта LXDE, хотя можно это и самому написать - результат будет тем же):

gtk-theme-name="Industrial"
gtk-icon-theme-name="gnome-brave"
gtk-font-name="DejaVu Sans 10"
gtk-toolbar-style=0
include "/home/maxim/.gtkrc-2.0.mine"

Итак, что же это означает? Первая строка говорит, что надо использовать тему оформления Industrial, а вторая - что должны использоваться иконки gnome-brave.

Темы оформления лежат в директориях /usr/share/themes/, а иконки /usr/share/icons/. Свои темы и иконки принято кидать в ~/.themes и ~/.icons соответственно. Именно там будут искаться, хотя можно использовать и абсолютный путь до директории с темой.

В третьей строке задаётся используемый шрифт и размер шрифта.

"gtk-toolbar-style=0" означает, что будут отображаться только кнопки, без подписей к ним. Значение 1 даст только подписи без значков, 2 - подписи и значки.

Последняя строчка означает, что также будет считываться содержимое файла "/home/maxim/.gtkrc-2.0.mine". Для чего это надо? Например, есть графические программы, позволяющие настраивать вид gtk-приложений, при этом переписывая всё, что было до этого, кроме строк, содержащих include. Именно в файле "/home/maxim/.gtkrc-2.0.mine" у меня лежат персональные настройки, которые нельзя сделать с помощью простых графических утилит.

Дополнительные настройки

В файле /home/maxim/.gtkrc-2.0.mine я добавил следующие настройки.

Клавиатурные сокращения как в Emacs

Чтобы в gtk-приложениях работали клавиатурные сокращения для перемещения курсора и удаления текста, аналогичные емаксовским, необходимо добавить строку:

gtk-key-theme-name = "Emacs"

Пользователям GNOME этого может оказаться недостаточно, возможно придётся копаться в gconf. Об этом и вообще о емаксовских сокращениях в gtk можно почитать в этом сообщении.

Изменение размера иконок на элементах управления

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

gtk-icon-sizes = "panel-menu=32,32:panel=32,32:gtk-menu=16,16\
:gtk-large-toolbar=24,24:gtk-small-toolbar=16,16:gtk-button=24,24"
Размеры, разумеется, можно подогнать по своему желанию.

Графические утилиты

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

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

Когда я в последний раз видел программу gtk-chtheme она позволяла лишь производить выбор тем и шрифта с предпросмотром, не более того. Но уж это она делает прекрасно.

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


Читать далее…

пятница, 22 мая 2009 г.

MPlayer и xscreensaver

Проблема 1

Для проигрывания видео на компьютере я использую mplayer в качестве плеера. Лёгкий и удобный, а больше ничего и не надо. Всё бы ничего, но была проблема со скринсейвером. Если просто при дефолтных настройках запустить фильм, то через определённое время включится хранитель экрана. Очевидно должно быть решение, конечно не дело каждые 10 минут двигать мышкой. Раньше (версию mplayer уже не скажу) всё относительно успешно решалось опцией -stop-xscreensaver.

mplayer -stop-xscreensaver movie.avi
Или, чтобы каждый раз не печатать эту опцию, можно прописать в конфиге ~/.mplayer/config:
stop-xscreensaver=1
После этого действительно заставка не включалась во время воспроизведения фильма. Если же воспроизведение приостанавливалось на некоторое время, то включалась заставка во время паузы. После того, как воспроизведение запускалось вновь, скринсейвер вновь начинал маячить перед глазами с уже до боли знакомой периодичностью. Меня это в своё время начало капитально бесить - ещё бы плеер и скринсейвер уже просто «динозавры», а так и не научились жить вместе. Кстати, в последнее время stop-xscreensaver=1 перестал работать. Здесь есть решение, но оно неидеальное - тормоза страшные, как говорят разработчики mplayer из-за багов xscreensaver.

Решение проблемы 1

Я подумал, а так ли мне нужен скринсейвер? Вообще-то, всё, что мне от него требовалось - это чтобы экран через определённое время гасился, не более того. А в Linux за это отвечает DPMS (технология, позволяющая управлять питанием монитора, когда компьютер не используется). Стало быть, настроив DPMS, можно избавиться от скринсейвера. Более того, как оказалось тогда, mplayer прекрасно взаимодействует с DPMS, а именно, во время воспроизведения не включается независимо от предыстории, в отличие от xscreensaver. Собственно, то, что надо.

Настраиваем DPMS

В Debian Lenny настраивать DPMS следует правкой файла xorg.conf следующим образом. В раздел "Monitor" добавим строку Option "DPMS" "true":

Section "Monitor"
        Identifier      "Configured Monitor"
        DisplaySize 339 271
        Option  "DPMS" "true"  # то, что добавили
EndSection
А затем, если нет, создадим раздел "ServerFlags" со следующим содержанием:
Section "ServerFlags"
        Option "StandbyTime" "5"
        Option "SuspendTime" "20"
        Option "OffTime" "30"
EndSection
Значения для режима ожидания, спящего режима и отключения, соответственно, указываются в минутах. Во многих руководствах говорится о том, что последние строки надо добавлять в раздел "ServerLayout", однако у меня после такого добавления не стартовали иксы. Может, версия xorg (1:7.3+18), а может именно Debian имеют отличную настройку. В любом случае, man Xorg об этом говорит.

Итак, в результате, кино играет, экран не гаснет именно во время воспроизведения. Как всё здорово... было до недавних пор. По всей вероятности, mplayer обновился, принеся ещё одну проблему.

Проблема 2 и её решение

После обновления mplayer (как мне кажется) стал тухнуть экран во время воспроизведения. Немного погуглив и обнаружив, что в современном мире люди бьются с проблемами xscreensaver использованием опции heartbeat-cmd="xscreensaver-command -deactivate", я протестировал следующую команду:

mplayer -heartbeat-cmd="xset dpms force on" movie.avi
В результате получил то, что надо - экран не гаснет во время воспроизведения, а когда воспроизведение останавливается на длительное время - гаснет вновь. После выключения фильма система DPMS продолжает работать.

Для полного счастья осталось прописать в конфиге ~/.mplayer/config искомую строку:

heartbeat-cmd="xset dpms force on"

Вот и всё, теперь во время просмотра фильма вы будете видеть фильм, а не чёрный экран и не прыгающие квадратики. Интересно, надолго ли… Не взбредёт ли в голову разрабам опять что-то поменять? :)

Если вы всё-таки жить не можете без скринсейвера

Если скринсейвер нужен, то, быть может сработает опция heartbeat-cmd="xscreensaver-command -deactivate &". Знак амперсанда в конце строки обязателен, иначе будут тормоза, по крайней мере, где-то высказывались так на просторах инета. Без амперсанда тормоза действительно есть, но этот вот рецепт сам не пробовал.


Читать далее…

среда, 6 мая 2009 г.

Синхронизация файлов с использованием Unison-gtk

Для чего нужна синхронизация?

У меня есть компьютер на работе, дома, а также есть ноутбук, который тоже порой необходим. Хорошо, если работать надо только находясь на работе, в рабочее время. Но зачастую это не так. Как быть, если вы исправили на работе кучу файлов и хотите с ними продолжить возиться ещё и дома? Каким образом перенести их домой с наименьшими затратами? Можно, конечно, скопировать их на сменный носитель отдельно, но если их много и разбросанных по разным директориям, то этот вариант едва ли осуществим, ведь порой копировать весь большой каталог, в котором заведомо лежат все изменённые файлы, весьма напряжно (с этим ещё можно смириться в крайнем случае). Более того, есть риск удалить с флешки что-либо, что вы могли не перенести на рабочий компьютер (а вот с этим гораздо сложнее!). На помощь приходит синхронизация файлов. Проведя синхронизацию двух директорий, вы получите заведомо одинаковые файлы в обеих директориях. Старые заменятся на новые, те, которые вы удалили, будут удалены и в новой директории. Таким образом, вы избавитесь от необходимости вручную отслеживать что и где вы поменяли, чтобы потом безболезненно перенести результаты своей работы домой.

Unison - программа для синхронизации файлов и директорий

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

Для пользователей KDE, вероятно подойдёт возможность синхронизации в файловом менеджере krusader. О такой возможности можно почитать на официальном сайте.

А для тех, у кого KDE нет я могу посоветовать Unison. Выдержки с официальной страницы:

  • Программа работает как на машинах с Unix-подобными операционными системами, так и с Windows, более того позволяет работать между платформами, производя синхронизацию между машинами с разными осями.
  • В отличие от простого зеркалирования Unison может работать с обновлениями на обоих, так сказать, «концах». Возможные конфликты будут подсвечены.

Допустим, на рабочем компьютере есть директория Dir, в которой содержатся файлы b, c, d. А на флешке директория Dir_flash содержит файлы b, c, e. Отличие заключается в том, что в Dir есть d, но нет e, а в Dir_flash есть e, но нет d. После синхронизации обе директории будут иметь b, c, d, e, что и требовалось.

  • Unison работает между любой парой компьютеров, подключённых к интернету. Трансферы малых обновлений больших файлов оптимизированы благодаря использованию сжатого протокола, аналогичного rsync.

Судя по всему, то, что надо. Более того, программа имеет графический интерфейс gtk, что даёт возможность совсем не напрягаться с настройкой и работой.

Установка Unison в Debian

В Debian имеется две версии программы: с графическим интерфейсом (unison-gtk) и без него (unison). Установим Unison с GUI:

sudo aptitude install unison-gtk

Запускаем. Будет предложено создать профиль, потому что до этого ещё профилей не было. Необходимо указать две директории, в которых нужно произвести синхронизацию (Обращаю внимание, что флешка должна быть примонтирована). Если вдруг вы создали не тот профиль, что хотелось, то удалить его, находясь в графическом режиме не удастся. Профили лежат в директории ~/.unison и имеют формат:

$ cat ~/.unison/devel.prf
root = /home/maxim/devel
root = /media/usb/devel
То есть можно просто переименовать файл профиля и поменять пути простым редактированием файла.

Программа после запуска выглядит так (предлагается выбрать профиль):

Если вы синхронизируете директории впервые, то появится следующее окно, в котором просто сообщается о том, что синхронизация производится впервые. Жмите «OK».

В случае возникновения конфликтов, можно разрешить их вручную, нажав кнопки «Right to Left» или «Left to Right», в зависимости от того, в какую сторону хотите разрешить конфликт. Если файлы текстовые, то посмотреть их различие можно, нажав на кнопку «Diff». Копирование файлов запускается после нажатия кнопки «Go».

Очень полезной особенностью является возможность игнорировать определённые директории или файлы. Для этого надо выбрать в меню «Ignore» соответствующий пункт:

  • «Permanently ignore this path» для того, чтобы всегда пропускать этот путь при сканировании
  • «Permanently ignore files with this extension», чтобы пропускать файлы с данным расширением

При этом в профиле это отображается строкой:

ignore = Path {/your/path/to/ignore}
ignore = Name {,.}*{.tmp}

Вторая строка для того, чтобы пропускать файлы с расширением tmp

Советую посмотреть возможные опции в подменю «Actions», там есть весьма полезные опции типа разрешения конфликтов в пользу определенной директории или в пользу более новых файлов. Думаю, разобраться что пункты этого меню означают весьма легко, английский ведь мы знаем :).

Подводные камни

Без подводных камней здесь тоже не обошлось.

Права доступа

Как известно, в файловых системах Unix используются права доступа для хозяина, для группы и других пользователей. На флешке, обладающей файловой системой fat32 из-за необходимости обмениваться данными с виндовыми компьютерами, такой возможности нет. Поэтому если вы попытаетесь записать с помощью Unison на флешку файлы с правами, отличающимися от 644, то получите, скорее всего сообщение о невозможности синхронизации.

Замечу, что у меня флешка монтируется через /etc/fstab таким образом:
/dev/sda1 /media/usb auto rw,user,noauto,showexec 0 0
я использую параметр showexec, чтобы файлы не были исполняемыми, таким образом, все файлы у меня на флешке имеют права 644.

Конечно в данном случае можно привести все файлы к требуемому виду с помощью утилиты find:

find . -type f -exec chmod 644 \{} \;
Но это не выход.

Другое решение состоит в том, чтобы добавить в профиль строку

perms = 0

После этого права доступа будут игнорироваться.

Не удалите случайно свои файлы!

Если вы не подмонтирете флешку, то при попытке просканировать на ней директорию получите предупреждение:

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

Я проэкспериментировал, нажав «OK», а затем «Go». Программа удалила директорию целиком. При повторной синхронизации с уже подмонтированной флешкой, все вернулось обратно, что радует, но лучше не рисковать с этим.

Резюме

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


Читать далее…

понедельник, 13 апреля 2009 г.

Установка официального драйвера broadcom BCM4312 в Linux

Когда я только стал обладателем ноутбука Acer Extensa 4220, я поставил на него Ubuntu 8.04. Всё заработало из коробки. Но лично мне больше нравится исходный Debian, поэтому его я и решил поставить. Все заработало кроме беспроводного интерфейса wifi. Здесь я напишу каким образом удалось завести сеть на Acer Extensa 4220.

Состав железа.

$ lspci | grep Net
02:00.0 Ethernet controller: Broadcom Corporation NetLink BCM5787M Gigabit Ethernet PCI Express (rev 02)
04:00.0 Network controller: Broadcom Corporation BCM4312 802.11b/g (rev 01)
Видно, что беспроводному интерфейсу соответствует BCM4312. Оказалось, что с недавнего времени появился официальный драйвер. Скачать его можно на официальном сайте. В моем случае, архитектура 32-bit. Там же лежит файл README.txt. Итак, скачали куда-нибудь в домашнюю директорию (в домашней директории делайте все операции от обычного, непривилегированного пользователя), теперь распакуем и перейдем в новую директорию:
tar xzvf hybrid-portsrc-x86_32-v5_10_27_14.tar.gz
cd hybrid-portsrc-x86_32-v5_10_27_14
Чтобы корректно установить модуль, необходимо поставить (имея права суперпользователя) основные средства для работы с ядром, а именно, заголовочные файлы:
aptitude install linux-headers-`uname -r`
(uname -r дает вывод вашей версии ядра) и минимальные средства для компиляции:
aptitude install build-essential
Далее, все делаем по руководству README.txt.
make -C /lib/modules/`uname -r`/build M=`pwd` clean
make -C /lib/modules/`uname -r`/build M=`pwd`
Самое время посмотреть наличие в текущей директории файла искомого wl.ko.
$ ls
built-in.o  Makefile       Module.symvers  wl.ko     wl.mod.o
lib         modules.order  src             wl.mod.c  wl.o
Далее в руководстве не рекомендуется смешивать возможные драйверы broadcom. Поэтому необходимо удалить модули bcm43xx, b43, b43legacy:
rmmod bcm4312 b43, b43legacy
Включаем новый модуль:
modprobe ieee80211_crypt_tkip
insmod /путь/до/файла/wl.ko
Теперь проверяем работоспособность:
sudo iwconfig
Если что-то уже есть, обладающее wireless extension, значит всё поставили правильно. Чтобы всё это стартовало автоматом, добавляем в скрипт /etc/rc.local до exit 0:
modprobe ieee80211_crypt_tkip
insmod /путь/до/файла/wl.ko
Лично я положил файл туда, где и положено лежать всем модулям:
sudo cp wl.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless/

Чтобы не грузились вышеперечисленные модули broadcom, в файле /etc/modprobe.d/blacklist добавим:

blacklist bcm4312
blacklist b43
blacklist b43legacy
Хотя, лично у меня, и так не было этих модулей.

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


Читать далее…