Чистка пакетной базы после USC

Эта статья для тех, кто болен перфекционизмом, нормальные люди могут не читать. А вот, если Вы поставили, к примеру, через Ubuntu Software Center (USC), Calligra Sheets, запустили, он Вам не понравился, решили удалить через тот же USC и заподозрили, что удалилось не всё, то эта статья для Вас.

История установок, удалений, обновлений в UCS очень неудобна, поэтому мы обратимся к старой доброй чёрной консоли.

Первое, что нужно знать, это где хранятся логи.

$ cat /var/log/dpkg.log

Далее, после изучения структуры, применяя grep, можно выцепить из лога нужную информацию по установке и удалению:

$ cat /var/log/dpkg.log | grep -i -w install | grep 2012-09-03

и

$ cat /var/log/dpkg.log | grep -i -w remove | grep 2012-09-03

Этот вывод можно «улучшить», добавив сортировку и убрав всё лишнее:

$ cat /var/log/dpkg.log | grep -i -w remove | grep 2012-09-03 | awk '{print $4}' | sort

В выводе этой команды можно увидеть, что слово «packages» лишнее, оно пришло из строки «startup packages remove», его тоже можно убрать из вывода:

$ cat /var/log/dpkg.log | grep -i -w remove | grep 2012-09-03 | awk '{print $4}' | sort | grep -v packages > removed.txt

На выходе получаем файл со списком удалённых пакетов. Для списка установленных пакетов аналогично:

$ cat /var/log/dpkg.log | grep -i -w install | grep 2012-09-03 | awk '{print $4}' | sort | grep -v packages > installed.txt

Затем нужно узнать разницу, то есть установленные, но неудалённые пакеты, и вывести её списком:

$ diff installed.txt removed.txt | grep '<' | awk '{print $1}'

Можно вывод сразу применить к команде aptitude:

$ sudo aptitude remove `diff installed.txt removed.txt | grep '<' | awk '{print $2}'`

Команда должна удалить установленные, но неудалённые пакеты.

Решение проблем с Ralink RT3592

Я думаю, многим знакома ситуация, когда на ноутбуке определяются все устройства кроме беспроводной связи, ну или, как в моём случае, устройство определяется, но не работает.

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

$ lspci -v | grep -i -A 5 "network controller"
24:00.0 Network controller: Ralink corp. Device 3592
Subsystem: Hewlett-Packard Company Device 1638
Flags: bus master, fast devsel, latency 0, IRQ 19
Memory at d4700000 (32-bit, non-prefetchable) [size=64K]
Capabilities:
Kernel driver in use: rt2800pci

Как видно, устройство определилось как Ralink RT3592, и даже нашёлся драйвер rt2800pci. В описании этого драйвера действительно есть эта карта, но устройство не желает подсоединяться к сети.

Погуглив, я узнал, что я не единственный, у кого наблюдается проблема. Многие рекомендовали сходить на официальный сайт Ralink, скачать тарбол с драйверами и, следуя инструкциям, установить их. Установка правда заключалась в make && make install, что лично мне совсем не нравится: я желаю знать что, куда и зачем копируется в моей системе, чтобы в случае чего проблему было искать легче.

Итак. Первое, что требуется — это скачать тарбол с драйверами с официального сайта (придётся подписать соглашение).

На сайте производителя говорится, что эти драйвера подходят для RT3060, RT3062, RT3562 и RT3592. Я проверил только на своём чипе.

Далее распаковываем тарбол и внутри каталога находим файл README_STA_pci, в котором можно прочитать все инструкции по установке (в том числе пресловутый make install).

Далее по шагам.

1. изменяем Makefile согласно инструкции (мне не понадобилось)
2. изменяем os/linux/config.mk согласно инструкции (изменение значения параметров):

HAS_WPA_SUPPLICANT=y
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y

3. make: у меня выдал ошибку при создании директории в корне (странно, что это есть в make), но сборка завершилась
4. sudo mkdir -p /etc/Wireless/RT2860STA
5. sudo cp RT2860STA.dat /etc/Wireless/RT2860STA
6. sudo cp RT2860STACard.dat /etc/Wireless/RT2860STA
6. sudo cp os/linux/rt3562sta.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/rt2860sta.ko
7. sudo depmod $(uname -r)
8. добавляем модуль rt2800pci в чёрный список, для Ubuntu это равнозначно добавлению в /etc/modprobe.d/blacklist.conf строчки:

blacklist rt2800pci

9. перезагрузить машину

В принципе до восьмого пункта, чтобы проверить успешность, можно попробовать следующее:

$ sudo modprobe -r rt2800pci
$ sudo modprobe rt2860sta

… и перезапустить сеть. Если всё хорошо, то можно смело добавлять свободный модуль в чёрный список.

Конечно, по-хорошему нужно собрать пакет, но времени на разбор принципов сборки у меня не было. Зато такой пакет есть в репозитории Russian Fedora (респект), да и PKGBUILD для AUR тоже несложный.

«Зависание» Firefox во время загрузки страниц.

У Firefox версии 3 есть проблема: он довольно часто не отвечает на запросы пользователя при загрузке страниц (почему-то это особенно выражается если работать через прокси).

Погуглив, я нашёл решение, которое, кажется, помогло.

В about:config нужно поменять следующие значения:

network.http.pipelining <- true
network.http.proxy.pipelining <- true
network.http.pipelining.maxrequests <- 30

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

Отключение индикатора раскладки в Gnome.

В Gnome 2.30 появилась неприятная особенность — неотключаемый через интерфейс индикатор раскладки.

Решение:

gconftool-2 -s /desktop/gnome/peripherals/keyboard/general/disable_indicator -t bool true

SSH через HTTP-прокси с аутентификацией

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

Нам нужна утилита corkscrew, которая умеет поднимать туннель для SSH через HTTP-прокси-сервер.

$ su -c 'yum install corkscrew'

Далее добавляем в /etc/.ssh/config:

Host *
ProxyCommand corkscrew [proxy-server-address] [proxy-server-port] %h %p ~/.ssh/proxyauth

Вместо «*», очевидно, указывающей на применение настройки ко всем хостам, можно указать конкретные хосты (к примеру, только из внешней сети).

Параметры аутентификации (логин и пароль) находятся в файле ~/.ssh/proxyauth в формате

LOGIN:PASSWORD

Теперь можно подсоединяться к удалённым хостам «как обычно» (с точки зрения пользователя).

http://ix.io/ — труЪ-пастбин.

Просто обнаружил это чудо, и захотелось поделиться :) Кто разберётся, несомненно, обрадуется находке :)

Игнорирование Bash’ем ~/.bashrc

Столкнулся, на первый взгляд, со странной проблемой: bash при определённом логине (а именно по ssh и из консоли по alt+f1..f6) не читает конфигурационный файл ~/.bashrc. Действительно, оказывается он читает только ~/.bash_profile, а вышеупомянутый файл игнорирует.

Решение элементарно:

$ echo -e "if [ -s $HOME/.bashrc ] ; then\n . $HOME/.bashrc\nfi\n" >> ~/.bash_profile

Эта команда запишет указание bash’у читать наш ~/.bashrc при старте.

«Раздача» интернета с ограничением по IP+MAC-адрес через iptables.

Данная статья посвящена ненавистникам интернета через прокси (я сам долгое время использовал прокси для доступа в Сеть с ноутбука). Конечно, желательно ограничить круг пользователей «раздачи»: я считаю, что доступ по IP+MAC вполне себе безопасный и не позволит просто так любителям халявы качать байты с вашего канала.

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

$ sudo sysctl -w net.ipv4.ip_forward=1

Это можно сделать и вручную, заменив 0 на 1 в /etc/sysctl.conf в строке

net.ipv4.ip_forward = 0

Далее применяем новые настройки:

$ sudo sysctl -p /etc/sysctl.conf

Теперь правим конфиг iptables — /etc/iptables/iptables.rules (увы, я не уверен, что правильно понял все правила для таблицы nat, но по крайней мере это работает):

*nat
# allow 1st
-A PREROUTING -s [ip #1] -m mac --mac-source [mac #1] -j ACCEPT
# allow 2nd
-A PREROUTING -s [ip #2] -m mac --mac-source [mac #2] -j ACCEPT
# deny all
-A PREROUTING -j REDIRECT
-A POSTROUTING -o [интерфейс] -j MASQUERADE
COMMIT

Теперь, собственно, можно запустить iptables:

$ sudo /etc/rc.d/iptables start

На клиентских машинах нужно прописать роуты:

$ sudo route add default gw [ip сервера]

И перечислить DNS-сервера в файле /etc/resolv.conf:

nameserver [ip dns-сервера]

После этого клиентские машины должны быть обеспечены прямым доступом в Сеть.

Подключение Bluetooth-модема для «мобильного» интернета.

В этой статье я расскажу как настроить мобильный интернет (GPRS/EDGE/UMTS/etc), когда в округе лишь безысходность и нет других средств доступа в Сеть :( Хотя, справедливости ради, надо отметить, что связь третьего поколения (в России это, фактически, синоним UMTS) заставляет задуматься о «нужности» классического «проводного» интернета.

Итак, для настройки соединения требуются пакеты bluez и wvdial, а также описание подключения.

Начинать настройку не стоит без, собственно, конфигурационного файла подключения /etc/wvdial.conf.
Для Мегафон-Москва он выглядит так:

[Dialer Defaults]
Modem = /dev/rfcomm0
Baud = 57600
Init = ATZ
Init2 = AT+CGDCONT=1,"IP","internet"
Dial Command = ATM1L3DT
Phone = *99#
Username = ''
Password = ''
New PPPD = yes

Сначала ищем bluetooth-устройство с сервисом «Dial-Up Networking», из вывода узнаём номер канала, соответствующего этому сервису, а также адрес устройства:

$ sdptool search DUN

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

$ rfcomm connect rfcomm0 [адрес] [канал]

И, наконец, создаём туннель:

$ sudo wvdial

Убеждаемся, что в системе появился новый интерфейс ppp0:

$ ifconfig ppp0

Всё, теперь можно сёрфить. Да, много ручной работы, но это же UNIX-way, он позволяет обнаружить неисправность или «кривую» логику работы максимально быстро. А чтобы автоматизировать рутинный труд, люди придумали скрипты. Далее представлен скрипт, названный мной «blueconn», для подключения к интернету в одну команду.

#!/bin/bash

CFG="$HOME/.mywvdial.conf"

if [ "$USER" != "root" ] ; then
  echo "ERROR: Run script as superuser"
  exit 1
fi

echo "Searching for device with DUN service..."

SRCHRES="$(sdptool search DUN)"
CHAN=$(echo "$SRCHRES" | grep "Channel:" | head -n 1 | awk '{ print $2 }')

if [ -z "$CHAN" ] ; then
  echo "ERROR: Cannot find device with Dial-Up Networking service"
  exit 1
fi

ADDR=$(echo "$SRCHRES" | grep "Searching for DUN on " | head -n 1 | awk '{ print $5 }')

if [ -z "$ADDR" ] ; then
  echo "ERROR: Cannot get device address"
  exit 1
fi

echo "$ADDR (channel $CHAN) found. Trying to connect..."

(rfcomm connect rfcomm0 $ADDR $CHAN >& /dev/null) & 
sleep 6
CONNPID=$(jobs -p)

if [ -z "$CONNPID" ] ; then 
  echo "ERROR: Cannot connect to device"
  exit 1
fi

echo "Connected. Opening tunnel..."

wvdial -C $CFG

Теперь пара примечаний по использованию. Как видно из кода, скрипт использует конфигурационный файл соединения, лежащий в домашней папке — ~/.mywvdial.conf, что позволяет каждому пользователю иметь свои настройки подключения, поэтому перед использованием скопируйте /etc/wvdial.conf в «хомяк» под именем .wvdial.conf (sic!). А чтобы каждый пользователь мог находить скрипт без указания полного пути до него, скопируйте скрипт, к примеру, в /usr/local/bin (и не забудьте сделать его исполняемым).

После этого подключение будет происходить в одну команду:

$ sudo blueconn

«Перегрузка» конфирурационного файла Vim’а.

Меня вполне устраивает мой конфиг Вима (быть может, в ближайшем будущем я поделюсь его второй версией), но иногда для конкретного файла нужно «перегрузить» (как в C++) настройки. К примеру, вместо двухпробельного таба вставлять четырёхпробельный, или жёстко указать подсветку синтаксиса. Собственно, последнее мне сейчас и понадобилось, поэтому я, чтобы не забыть, и решил написать этот пост.

Суть проста: в начале или в конце файла в комментариях указываем следующего вида строку:

[символ комментария] vim [опции, разделённые «:» или пробелом]

«:» — значит set.

К примеру для файла с ассеблерным кодом (NASM):

; vim:syntax=nasm:expandtab

А вообще читать :help modeline.