Архив рубрики «linux»

nvidia в ubuntu: реанимация

20.11.2009

Внезапно умерли иксы. Как в анекдоте: шел ежик ubuntu по лесу, забыл как дышать грузить драйвер nvidia и умер.

Шел ежик по лесу, и вдруг забыл как дышать

Шел ежик по лесу, и вдруг забыл как дышать

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

/var/log/Xorg.0.log:

  1. (II) LoadModule: "nvidia"
  2. (WW) Warning, couldn't open module nvidia
  3. (II) UnloadModule: "nvidia"
  4. (EE) Failed to load module "nvidia" (module does not exist, 0)

Примерно такие сообщения я увидел в логах, войдя с ноута по ssh на терпящую бедствие рабочую станцию.

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

Тут позволю себе немного лирики.

Линукс дома стоит у меня уже давно, и проблем с ним никогда особо не было.Смешные случаи были. Вот например жена, человек максимально далекий от компов, по радио как-то услышала, что есть такой Линукс, и под ним нет ни вирусов, ни троянов, и вообще чудо-система! И так ей эта идея понравилась, что говорит мне: «Слушай, а давай нам тоже этот Линукс поставим! Я в нем может тоже разберусь». Я ей говорю, «Мать, а ты не заметила что последние полгода ты на моем компе сидишь на этом самом Линуксе?» Это при том, что она не только по интернетам ходила, но и проги под Wine запускала, в Open Office чего-то та ваяла, GIMP-ом фотки редактировала ("странный у тебя фотошоп"). Посмеялись, удивлению её не было предела..

В общем, Линукс в целом был надежной домашней системой. А тут, после обновления Ubuntu до 9.10, начался сплошной гемор: то тут отвалится, то там. Ни кино посмотреть, ни в инет выйти. И вот сегодня женщина предложила снести к ебеням Ubuntu и поставить «нормальный виндовс».

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

На этом с лирикой закончим.

В общем, гугль не помог, пришлось действовать по наитию.

Сначала смотрим, что у нас есть в системе:

  1. $ sudo dpkg --get-selections|grep nvidia
  2. nvidia-173-modaliases install
  3. nvidia-180-modaliases install
  4. nvidia-185-libvdpau deinstall
  5. nvidia-185-modaliases install
  6. nvidia-190-kernel-source install
  7. nvidia-190-libvdpau install
  8. nvidia-190-modaliases install
  9. nvidia-96-modaliases install
  10. nvidia-common install
  11. nvidia-glx deinstall
  12. nvidia-glx-173 deinstall
  13. nvidia-glx-177 deinstall
  14. nvidia-glx-185 deinstall
  15. nvidia-glx-190 deinstall
  16. nvidia-glx-new deinstall
  17. nvidia-glx-new-envy deinstall
  18. nvidia-kernel-common install
  19. nvidia-settings deinstall
  20. nvidia-settings-190 install

Как видно, много всего. Удаляем всё:

  1. $ sudo dpkg --get-selections | grep nvidia | grep -v deinstall | awk '{print $1}' | xargs sudo apt-get remove

Проверяем, что все удалено:

  1. $ sudo dpkg --get-selections | grep nvidia | grep -v deinstall

И ставим только то, что нужно, а именно последний официальный драйвер от Canonical:

  1. $ sudo apt-get install nvidia-glx-185

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

Тот самый ежик (картинка с сайта photo.ejik-land.ru)

Тот самый ежик (картинка с сайта photo.ejik-land.ru)

firefox: оптимизация внутренних баз данных sqlite

26.08.2009
  1. $ find .mozilla/firefox -type f -name "*.sqlite" -exec time sqlite3 \{\} "VACUUM" ";"

via

linux: как узнать (проверить) key fingerprint?

08.06.2009

Узнать fingerprint ключа можно при помощи команды ssh-keygen:

  1. # ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key
  2. 2048 e2:02:50:2b:d8:1f:ce:d4:18:07:02:7b:22:90:44:25 /etc/ssh/ssh_host_rsa_key.pub (RSA)

По-умолчанию команда ищет публичный ключ и печатает для него fingerprint.

Создание /etc/init.d/nginx на debian 5.0 lenny

05.06.2009
  1. $ sudo vim /etc/init.d/nginx

Вставляем нижеследующий код (помним про команду ‘set :paste’ для вставки в VIM):

  1. #!/bin/sh
  2. ### BEGIN INIT INFO
  3. # Provides: nginx
  4. # Required-Start: $remote_fs $syslog $named $network $time
  5. # Required-Stop: $remote_fs $syslog $named $network
  6. # Default-Start: 2 3 4 5
  7. # Default-Stop: 0 1 6
  8. # Short-Description: Start nginx at boot time
  9. # Description: Enable service provided by nginx.
  10. ### END INIT INFO
  11. # $Id$
  12.  
  13.  
  14. NGINXHOME=/usr/local/nginx
  15. NGINXPID=$NGINXHOME/logs/nginx.pid
  16.  
  17. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  18. DAEMON=$NGINXHOME/sbin/nginx
  19. NAME=nginx
  20. DESC=nginx
  21.  
  22. if [ ! -x $DAEMON ]
  23. then
  24. echo "Couldn't find $DAEMON. Please set path to DAEMON."
  25. exit 0
  26. fi
  27.  
  28.  
  29. # Include nginx defaults if available
  30. if [ -f /etc/default/nginx ] ; then
  31. . /etc/default/nginx
  32. fi
  33.  
  34. set -e
  35.  
  36. case "$1" in
  37. start)
  38. echo -n "Starting $DESC: "
  39. start-stop-daemon --start --pidfile $NGINXPID \
  40. --exec $DAEMON -- $DAEMON_OPTS
  41. echo "$NAME."
  42. ;;
  43. stop)
  44. echo -n "Stopping $DESC: "
  45. start-stop-daemon --stop --pidfile $NGINXPID \
  46. --exec $DAEMON
  47. echo "$NAME."
  48. ;;
  49. restart|force-reload)
  50. echo -n "Restarting $DESC: "
  51. start-stop-daemon --stop --pidfile \
  52. $NGINXHOME/run/$NAME.pid --exec $DAEMON
  53. sleep 1
  54. start-stop-daemon --start --pidfile \
  55. $NGINXPID --exec $DAEMON -- $DAEMON_OPTS
  56. echo "$NAME."
  57. ;;
  58. reload)
  59. echo -n "Reloading $DESC configuration: "
  60. start-stop-daemon --stop --signal HUP --pidfile $NGINXPID \
  61. --exec $DAEMON
  62. echo "$NAME."
  63. ;;
  64. *)
  65. N=/etc/init.d/$NAME
  66. echo "Usage: $N {start|stop|restart|force-reload}" >&2
  67. exit 1
  68. ;;
  69. esac
  70.  
  71. exit 0

Сохраняем скрипт и выходим из vim.

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

  1. $ sudo chmod 755 /etc/init.d/nginx

Указываем, что nginx нужно запускать при запуске и остановке сервера:

  1. $ sudo /usr/sbin/update-rc.d -f nginx defaults

UPD: Блок, заключенный между строками

  1. ### BEGIN INIT INFO
  2. ### END INIT INFO

обеспечивает LSB-совместимость. Подробнее см. http://wiki.debian.org/LSBInitScripts

Установка nginx на debian 5.0 lenny

04.06.2009

На "пустом" свежеустановленном Debian не хватает ряда инструментов и библиотек для сборки и установки nginx.

Ставим gcc, make, и компания:

  1. $ sudo apt-get install build-essential

Библиотеки для сборки nginx:

  1. $ sudo apt-get install libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev

Для поддержки встроенного Perl добавляем:

  1. $ sudo apt-get install libperl-dev

Собственно процесс сборки и установки (вместо 0.7.XX впишите номер актуальной версии):

  1. $ wget http://sysoev.ru/nginx/nginx-0.7.XX.tar.gz
  2. $ tar zxvf nginx-0.7.XX.tar.gz
  3. $ ln -s nginx-0.7.XX nginx
  4. $ cd nginx
  5. $ ./configure \
  6. --prefix=/usr/local/nginx \
  7. --with-cc-opt="-I /usr/include" \
  8. --with-ld-opt="-L /usr/lib" \
  9. --with-http_stub_status_module \
  10. --with-http_realip_module \
  11. --with-http_perl_module \
  12. --with-http_ssl_module
  13.  
  14. $ make && make install
  15.  

Обратите внимание, параметры

  1. --with-cc-opt="-I /usr/include" --with-ld-opt="-L /usr/lib"

указывают на расположение системных заголовков и библиотек, без них configure не видит ряда системных библиотек.

Unix: Поиск и замена во многих файлах одновременно

09.02.2009

Задача: найти все файлы содержащие OLDTEXT, и заменить OLDTEXT на NEWTEXT.

UPD2:Решение, предложенное ocehb:

  1. grep -rl OLDTEXT . | grep -Ev '(~|.o|.a)$' | grep -Ev '/.svn/' | xargs perl -i -pe "s/OLD_TEXT/NEW_TEXT/g;"

UPD1:Вариант без vim:

  1. grep -HR OLDTEXT ./ | awk '{print $1}' | sed 's/:.*$//' | grep -v '~' | sort | uniq | xargs perl -i -pe "s/OLD_TEXT/NEW_TEXT/g;"

Изначально предложенное решение с vim:

  1. grep -HR OLDTEXT ./ | awk '{print $1}' | sed 's/:.*$//' | grep -v '~' | sort | uniq | xargs vim -p

В открывшемся окне vim командуем:

  1. :tabdo %s/OLDTEXT/NEWTEXT/g

(заменить OLDTEXT на NEWTEXT во всех вкладках)

  1. :xa

(записать изменения во всех вкладках)
либо

  1. :qa!

(отменить изменения во всех вкладках)

Ссылки по теме:

  1. VIM FAQ
  2. Save all open buffers at once
  3. Сохранение файла без прав на запись в vim используя sudo
  4. [SLUG] Vim. Search and replace in multiple files

linux: iproute2 для управления сетевой подсистемой

19.12.2008

iproute2 -- набор утилит для управления сетевой подсистемой TCP/IP и управления трафиком в Linux.

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

Проект /etc/net project ставит целью поддержку современных сетевых технологий, и, предоставляет набор утилит для наиболее полного контроля всех возможностей iproute2, включая управление трафиком.

Ссылки по теме:

ubuntu: обновляем систему до последнего релиза

18.12.2008

Инструкция по обновлению:
http://www.ubuntu.com/getubuntu/upgrading

Поехали..

tar: Просмотр содержимого архива (tar.gz, tgz, tar.bzip2)

05.12.2008

Для вывода оглавления tar-архива используется команда -t:

  1. ~$ tar -tvf archive.tar
  2. -rw-rw-rw- 0 username groupname 45523421 Dec 5 16:17 file1.txt
  3. -rw-r--r-- 0 username groupname 13234112 Dec 5 16:17 file2.txt
  4. -rw-r--r-- 0 username groupname 75323624 Dec 5 16:17 file3.txt

Для tar.gz (tgz; tar+gzip):

  1. ~$ tar -ztvf archive.tar.gz
  2. ...

Для tar.bz2 (tar+bzip2):

  1. ~$ tar -jtvf archive.tar.bz2
  2. ...

Использованные команды:
-t – печать содержимого архива на stdout
-v - подробный вывод, аналог ключа -l утилиты ls. Без этой команды будет выведен краткий спискок файлов без размеров и прав.
-f имя_файла - использовать указанный файл в качестве архива, иначе читать с ленты
-zgzip-фильтр. В некоторых реализациях использовать необязательно.
-jbzip2-фильтр. В некоторых реализациях использовать необязательно.

ubuntu: сохранение точки монтирования при смене названия устройства

02.12.2008

Понадобилось мне слить информацию со старого HDD, отформатированного в NTFS. Подключив его, обнаружил, что порядок монтирования устройств сбился, все разделы NTFS "съехали": тот, что был /dev/sda1 стал /dev/sdb1, /dev/sdb1 стал /dev/sdc1, а новый диск получил идентификатор /dev/sda1. В итоге новый диск оказался смонтирован на месте старого, а старый стал вроде как новым несмонтированным устройством.

Система, жившая до того на семействе /dev/sda2..8, спокойно перенесла виртуальный переезд на /dev/sdb2..6, поэтому я даже не сразу сообразил, как такое могло произойти, и как уберечься от подобных фокусов в дальнейшем.

Отгадка, как обычно, крылась в манах (UsingUUID):

Linux now prefers to use UUID (Universally Unique Identifier), LABEL, or symlinks to identify media storage devices on a system. Directly using /dev/hd*# or /dev/sd*# is no longer preferred since these device assignments can change between system boots:

  • all filesystems should be specified by UUID= or LABEL= for each partition.
  • all physical devices should be specified by a symlink, like /dev/cdrom for a cd drive and /dev/disk/by-id/... for each physical hard drive.

The files for which UUID is most critical:

  • /boot/grub/menu.lst
  • /etc/fstab
  • /etc/initramfs-tools/conf.d/resume

Просмотр /etc/fstab подтвердил догадку. Системные ext3 разделы были смонтированы через UUID, в то время как ntfs-разделы монтировались по старинке через имена вида /dev/sd*.

Таким образом, решение проблемы заключается в монтировании ntfs-разделов по UUID.

Узнать UUID для конкретного раздела можно так:

  1. $ sudo vol_id -u /dev/sdb1
  2. 7CF803F6A8035E22
  3.  

Размонтируем все ntfs-разделы, меняем записи в /etc/fstab, и заново монтируем раздел.

Было:

  1. /dev/sda1 /mnt/sda1 ntfs rw,noexec,utf8 0 0

Стало:

  1. UUID=7CF803F6A8035E22 /mnt/sda1 ntfs rw,noexec,utf8 0 0

Теперь при подключении новых устройств запись прежний порядок монтирования сохранится.

UPD: Харитон пишет:

мне было известно 4 способа определения uuid'а, теперь знаю пятый))
- с помощью утилиты blkid (входит в пакет e2fsprogs)
sudo blkid /dev/sda1
- "...существуют и другие способы получить UUID например для ext2 используя dumpe2fs..."
dumpe2fs -h /dev/sda6
- или так:
ls -al /dev/disk/by-uuid/
- или так:
sudo tune2fs -l /dev/sda1 | grep UUID

самый примечательный из них третий, т.к. можно обойтись без sudo и дает список uuid'ов всех устройств