понедельник, 16 декабря 2013 г.

И снова глюки fglrx

Установлена последняя доступная на сегодняшний день версия проприетарных драйверов AMD - ati-drivers-13.11_beta6. С завидной регулярностью (приблизительно, раз в день) экран КДЕ превращался в набор наложенных друг на друга треугольников разных размеров или даже превращался в набор полос при загрузке. Избавиться от этого можно было только перезапуском иксов.

Изучение логов показало, что драйвер fglrx ищет файл fglrx_dri.so в каталоге /usr/X11R6/lib64/modules/dri, а такого каталога вообще не существует. Файл же fglrx_dri.so был найден в каталоге /usr/lib64/dri.

Решение, конечно, костыльное, но какое есть. Просто создадим символическую ссылку из несуществующего пути на существующий. Недостающие каталоги создаем с помощью команды mkdir:

# mkdir /usr/X11R6 /usr/X11R6/lib64 /usr/X11R6/lib64/modules /usr/X11R6/lib64/modules/dri

# ln -s /usr/lib64/dri/fglrx_dri.so /usr/X11R6/lib64/modules/dri/fglrx_dri.so

Теперь, вроде как, все работает и ошибок в лог не сыпется.

воскресенье, 15 декабря 2013 г.

Windows 7 загрузочная флешка из под Linux

Если у вас возникла ситуация, когда на комп без дисковода нужно установить или  попрввить испорченую Windows 7, то эта заметка вам поможет. Здесь будет рассказано как сделать загрузочную флешку имея образ диска Windows 7, и сделать это из Linux. Все действия нужно производить из-под root.

Для начала нужно отформатировать флешку в NTFS. Если флешка определяется как /dev/sdb1, то имеем:

# mkfs.ntfs -f /dev/sdb1

Далее нам нужно скопировать файлы из образа винды на флешку. Но сначала примонтируем образ и саму флешку:

# mkdir /mnt/mustdie /mnt/flash
# mount -o loop mustdie7.iso /mnt/mustdie
# mount /dev/sdb1 /mnt/flash
# cp -r /mnt/mustdie/* /mnt/flash

где
    mustdie7 - образ Windows 7;
    /dev/sdb1 - флешка для записи образа.

И наконец самое главное - устанавливаем программу ms-sys, которая умеет создавать MBR на диске в стиле разных версий Windows. Установка для Gentoo:

# emerge sys-block/ms-sys
и записываем Windows 7 MBR на флешку:

# ms-sys -7 /dev/sdb

Всё. Теперь перезагружайтесь, выбирайте в БИОСе загрузку с usb-накопителя и ... Ну, вы меня поняли - винда мастдай.

воскресенье, 8 декабря 2013 г.

Автоматическая загрузка модулей ядра

После установки VirtualBox, столкнулся с проблемой запуска виртуальной машины. При запуске ВМ ругалась на незагруженный модуль ядра vboxdrv. Можно, конечно, загрузить модуль и вручную:

# modprobe vboxdrv

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

А нужно всего лишь отредактировать файл /etc/conf.d/modules

# nano /etc/conf.d/modules

и дописать в переменную modules требуемые модули ядра (vboxdrv и it87 в моем случае)

modules="vboxdrv it87"

суббота, 26 октября 2013 г.

Как разрезать avi видеофайл

Можно, конечно, воспользоваться каким-нибудь mencoder или другим навороченным кодеровщиком, но логика подсказывает, что данная операция не требует мощных инструментов кодирования/декодирования. И это действительно так.

Существует консольная утилита avisplit (из пакета transcode) специально предназначенная для того, чтобы разрезать файл на куски. Существует также и avimerge, предназначенная для обратной процедуры, но сейчас не об этом.

Например нам нужно разрезать файл kino.avi на части по 700 мегабайт для записи на CD.

$ avisplit -i ~/kino.avi -s 700

Здесь после -i идет имя файла для резки, а после -s - размер частей в мегабайтах.

Или нужно разрезать полторачасовой фильм на части продолжительностью 1 час и 30 минут:

$ avisplit -i ~/kino.avi -t 0:0:0.0-1:0:0.0,1:0:0.0-1:30:0.0

Временные интервалы задаются после опции -t, в форме t1-t2,t3-t4..., где t1,t2,t3,t4 - время в формате hh:mm:ss.ms (милисекунды можно не указывать).

Ну и конечно man avisplit в помощь.

вторник, 10 сентября 2013 г.

Рецепт решения ошибки компиляции ядра из-за bfq

При попытке установить очередное ядро (версии 3.10.9), компиляция прервалась с ошибкой:

make[1]: *** Нет правила для сборки цели `block/bfq-iosched.o', требуемой для `block/built-in.o'.  Останов.
make: *** [block] Ошибка 2


Решение нашлось довольно быстро и оказалось довольно простым. Эти самые правила для сборки находились не там, где должны быть. Поэтому переходим в каталог с исходниками ядра:

# cd /usr/src/linux-3.10.9-calculate/

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

# cp b/block/bfq* block/

Пробуем компилировать ядро - все в порядке, по крайней мере с bfq.

воскресенье, 11 августа 2013 г.

Черезмерное выделение памяти (overcommit)

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

Сейчас в ядре два параметра, отвечающих за overcommit памяти:

vm.overcommit_memory (/proc/sys/vm/overcommit_memory) — отвечает за стратегию overcommit
vm.overcommit_ratio (/proc/sys/vm/overcommit_ratio) — отвечает за уровень в процентах overcommit

Стратегии у vm.overcommit_memory могут быть три:

OVERCOMMIT_ALWAYS (значение выставлено в 1) — ядро всегда удовлетворяет любые запросы на выделение памяти. Реально страницы памяти будут выделяться при первом обращении к ним.
OVERCOMMIT_GUESS (значение 0) — эвристический подход к распределению памяти. Используется по умолчанию, ибо подходит для большинства задач. Система будет отвергать только запросы, которые в принципе не могут быть удовлетворены, остальные — удовлетворять вне зависимости от наличия свободной памяти. На деле практически не отличим от OVERCOMMIT_ALWAYS.
OVERCOMMIT_NEVER (значение 2) — работа вообще без overcommit. Полный объём памяти, исходя из которого будут удовлетворяться или отвергаться запросы на выделение памяти, вычисляется как total_swap + total_ram * overcommit_ratio / 100. Значение параметра vm.overcommit_ratio имеет значение только при этой стратегии. Таким образом, при overcommit_ratio < 100, система всегда будет выделять память только если она подкреплена реальными страницами в ОЗУ или свопе. При overcommit_ratio > 100 мы получаем режим, схожий с OVERCOMMIT_GUESS, но с явно установленным «ограничителем».

Стоит заметить, что операционная система всегда резервирует около трех процентов памяти для процессов пользователя root.

Политики OVERCOMMIT_GUESS и OVERCOMMIT_ALWAYS приводит к ситуациям, когда суммарный размер виртуальной памяти приложений может намного превосходит реально имеющийся объем ОЗУ и свопа. В теории, когда реальная память заканчивается, в Linux срабатывает OOM Killer, убивающий лишние, самые «невыгодные» с точки зрения ядра, процессы. На практике же, OOM Killer отрабатывает далеко не всегда: система может уйти в длительный лаг или зависнуть.

Установим режим выделения памяти не больше, чем есть (OVERCOMMIT_NEVER), по умолчанию стоит выделять сколько запросит процесс (OVERCOMMIT_GUESS):

# sysctl vm.overcommit_memory=2
# sysctl vm.overcommit_ratio=80
Значение параметра vm.overcommit_ratio по-умолчанию равно 50. Чтобы изменения сохранились после перезагрузки пишем:

# echo 2 > /proc/sys/vm/overcommit_memory
# echo 80 > /proc/sys/vm/overcommit_ratio

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

вторник, 30 июля 2013 г.

Настройка /etc/fstab

В файле /etc/fstab перечислены все основные точки монтирования, файловые системы и их опции по умолчанию (обычно defaults). Точки монтирования заносятся в файл построчно. Формат строки следующий:
   
<file_system>   <mount_point>   <type>   <options>   <dump>   <pass>

Поле <file_system> представляет собой диск, раздел диска или файл как они представлены в системе. Т. е. это может быть путь к файлу (например, iso-образу) или файлу устройства (например: /dev/sda1 - первый раздел на первом SATA диске) от корня системы или идентификация устройсва по ID (файл в каталоге /dev/disk/by-id), по метке файловой системы (файл в каталоге /dev/disk/by-label), по UUID (файл в каталоге /dev/disk/by-uuid). Выбор - дело вкуса. Мне нравится вариант с UUID - это уникальные метки разделов, которые не изменяются даже когда меняется номер раздела. Метку и UUID раздела можно узнать с помощью команды blkid:
   
# blkid /dev/sda6
/dev/sda6: LABEL="CLD-12.0.3" UUID="ced7f6cb-7f14-40b6-b7ad-e544ce054dfc" TYPE="ext4"

Помимо файлов устройств аргументом поля <file_system> могут быть виртуальные файловые системы - shm, proc, tmpfs.

Поле <mount_point> представляет собой папку в которую монтируется устройство из поля <file_system>. Путь к папке укажывается абсолютный, начиная от корня.

Поле <type> - это тип файловой системы. Ядро Linux поддерживает множество файловых систем:

  • Ext2 - первая родная для Linux файловая система, не поддерживает журналирование, довольно хорошее быстродействие;
  • Ext3 - это Ext2 с журналированием, из-за чего страдает быстродействие;
  • Ext4 - эволюционное развитие Ext3, улучшены производительность и стабильность, добавлены опции;
  • ReiserFS - хорошая производительность, особенно с маленькими файлами;
  • JFS - хорошая производительность, низкое потребление ресурсов процессора;
  • XFS - хорошо работает с большими файлами и плохо - с  маленькими;
  • Btrfs - отличная производительность, но все еще в разработке (хоть и включена в ядро), когда станет стабильной - стоит попробовать;
  • vfat - Microsoft FAT16,FAT32, старые, нежурналируемые, но все еще широко распространены;
  • ntfs-3g - Microsoft NTFS, более новая и журналируемая ФС от одной мелко-мягкой компании;
  • swap - специальная ФС для раздела подкачки;
  • iso9660 - файловая система для оптических носителей CD/DVD.

Поле <options> представляет набор опций монтирования. Опции нужно вводить через запятую без пробелов. Все опции я описывать не буду, а перечислю только те, которые влияют на скорость работы файловых систем.

Примеры опций для некоторых ФС:

ReiserFS: noacl,user_xattr,noatime,nodiratime,notail,barrier=flush
Ext3: noacl,user_xattr,noatime,nodiratime,barrier=0
XFS: noatime,nodiratime,logbufs=8,logbsize=32k,biosize=16,allocsize=512m,barrier

   
Расшифровка значаений опций:
  • user_xattr - расширенные атрибуты файлов (используются для индексирования)
  • barrier - используя "шлагбаум"(barrier) файловая система запрещает запись блоков данных, пришедших после "шлагбаума", пока все предшествующие ему не будут перенесены на диск; таким образом достигается высокая надежность в ущерб быстродействию; отключая "шлагбаум" (barrier=0, nobarrier), мы ускоряем запись на раздел
  • noatime и nodiratime - отключение записи времени последнего доступа (для файлов/директорий), noatime включает в себя nodirtime
  • allocsize - размер заранее резервируемой области на диске. Высокое значение помогает избежать фрагментации
  • biosize - размер I/O-блоков по умолчанию
  • logbufs - количество встроенных буферов для ведения журнала
  • logbsize - размер буфера
  • notail - не упаковывать хвосты больших файлов — улучшает производительность — увеличивает используемое для хранения место(~5%) — для применения этой опции надо желательно перезаписать находящиеся на ней файлы
  • noexec - запрет запуска программ с этой ФС
  • nosuid - запрет на использование бита suid
  • nodev - запрет на символьные или блочные устройства
  • ro - монтирует фс в режиме "только чтение"
  • rw - монтирует фс в режиме "чтение/запись"
  • noauto - не монтировать устройство автоматически при загрузке
  • defaults - эквивалентно: rw,suid,dev,exec,auto,nouser,async
  • users - разрешает монтирование от лица любого пользователя, подразумевает параметры nosuid, noexec и nodev
  • noacl - отключить контроль доступа к файлам

Поле <dump> указывает нужно ли делать резервную копию. Считается устаревшим и, как правило, равно 0.

Поле <pass> - это порядок, в котором файловая система должна быть проверена. Значение:

0 - не проверять;
1 - проверяется, устанавливается для корня;
2 - проверяется, для остальных разделов.

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

UUID=ced7f6cb-7f14-40b6-b7ad-e544ce054dfc    /        ext4    noatime                            0 1
UUID=11ba9b21-4a1f-4329-a2f4-07299dd0af5f    /boot        ext2    noatime                            0 0
UUID=748569b2-68a0-41f1-9d8b-84ae26529d89    /home        ext4    noatime,nodiratime                    0 0
UUID=5f1cbcf1-10f9-47a9-a4d5-3d4498eb452f    none        swap    sw                            0 0
proc                        /proc        proc    defaults                        0 0
shm                        /dev/shm    tmpfs    nodev,nosuid,noexec                    0 0
tmpfs                        /tmp        tmpfs    defaults,nodev,nosuid,mode=1777                0 0
tmpfs                        /var/lock    tmpfs    defaults,nodev,nosuid,noexec,mode=1777,size=10m        0 0
tmpfs                        /var/run    tmpfs    defaults,nodev,nosuid,noexec,mode=0755,size=10m        0 0
tmpfs                        /var/calculate/tmp/portage tmpfs    noatime,mode=1777,nr_inodes=30M        0 0


Первые строки вполне понятны. В первой строке описывается монтирование корневой ФС, во второй строке - монтирование каталока /boot, далее /home и swap раздел. Далее идет монтирование proc и shm. Первое - виртальная ФС ядра, второе - нужно для многих программ. Остальные строки помещают временные данные в tmpfs - файловую систему для быстрого и ненадежного хранения данных (расположена в виртуальной памяти(RAM+swap). При монтировании tmpfs ограничивается 50% RAM, поэтому при большом количестве временных данных (например, при интенсивной сборке огромных программ или нескольких одновременно) верхний предел может быть увеличен с помощью опции size=n, где n - необходимый размер. Или же можно уменьшить максимально допустимое значение, как это сделано для директорий /var/lock и /var/run. Опция nr_inodes=30M увеличивает область для идентификаторов файлов - полезна когда создается очень много файлов (чтобы избежать ситуации, когда место для данных еще есть, а файл создать нельзя). После перезагрузки или перемонтирования данные в tmpfs стираются.

вторник, 23 июля 2013 г.

Заметки о weechat

Weechat - консольный irc-клиент для Linux, BSD, MacOS. Удобный, настраиваемый,мультипротокольный, поддерживает модули и скриптовые расширения на нескольких языках. Установка в Gentoo-подобных дистрибутивах производится командой:
# emerge net-irc/weechat

Запуск клиента производится командой:

$ weechat-curses

В дистрибутиве Calculate Linux клиент weechat идет преднастроенным на соединение с каналом #calculate-ru на сервере freenode. И при запуске weechat автоматически подключается к этому каналу. При подключении к каналу irc вы можете общаться в чате, но не можете видеть ответы на ввод управляющих команд. Для этого нужно переключиться на другой буфер(в моем случае alt+1), с помощью хоткеев alt+left/right_arrows либо F5/F6 на предыдущий/следующий буфер или с помощью сочетания alt+N, где N - номер буфера.

Что же такое буфер? Буфер - это компонент, содержащий данные, которые выводятся на экран. Обычно, переключение между буферами означает переключение между каналами. Получить список буферов можно командой /buffer. В свою очередь окно выводит содержимое буфера на экран. По умолчанию у вас будет одно окно. Получить список окон можно командой /window. Окна можно разделять: /window splith - по горизонтали; /window splitv - по вертикали - таким образом вы сможете в одном окне терминала видеть несколько чатов. Делить окна можно сколько угодно раз. Переключаться между разбитыми окнами можно или клавишами F7/F8 или командами /window up, /window down. Склеить два окна в одно можно командой /window merge. Подробнее - /help window.

Справку по всем командам можно получить с помощью команды /help. Например:
    /help set - справка по настройкам
    /help buffer - справка по работе с буферами
    /help filter - использование фильтров
   
Настройка weechat производится путем правки конфигов в папке ~/.weechat. Также можно все настройки делать из самого weechat с помощью команды /set. Возможны также регулярные выражения. Например, чтобы получить список всех настроек irc, пишем:

/set irc.*

и получаем простыню в моем случае со 144 опциями. Все настройки weechat сохраняются при выходе. Или можно использовать команду /save для немедленного сохранения. Если же вы редактируете конфигурационные файлы, то применить настройки можно командой /reload.

Добавить сервер можно командой /server. Например так

/server add oftc irc.oftc.net/6667

Подробнее в справке - /help server.

Подключиться к серверу можно командой /connect:

/connect oftc

Зайти на канал можно с помощью команды /join:

/join #calculate-ru

Выйти из текущего канала:

/leave

Установить статус away(отсутствия):

/away сообщение

Отправить личное сообщение:

/msg ник сообщение

Выход из программы:

/exit

У weechat много хоткеев. Вот наиболее употребительные из них:
    PageUp - скролл вверх
    PageDown - скролл вниз
    Alt-стрелки(или F5/F6) - навигация между буферами
    F7/F8 - навигация между окнами (если окна разбиты)
    F9/F10 - прокрутка топика
    F11/F12 - прокрутка списка пользователей
    alt+a - перейти в "активный" буфер
    alt+r - удалить все из командной строки
    alt+b - перейти на слово назад
    alt+f - перейти на слово вперед
    alt+u - перейти к непрочитанному сообщению
    ctrl+y - вставить текст из буфера обмена
    ctrl+r - поиск
    tab - завершить текст в строке ввода (как в командной оболочке)
   
Также можно назначить свои клавиши с помощью команды /key. Для поиска клавишных кодов можно воспользоваться комбинацией meta+k(alt+k).На пример, что бы назначить на meta-y (alt-y) команду /buffer close:

/key bind (press meta-k) (press meta-y) /buffer close

Команда должна выглядеть так:

/key bind meta-y /buffer close

Что бы удалить:

/key unbind meta-y

Хотелось бы еще сказать пару слов про фильтры. По умолчанию в чате вы видите все служебные сообщения (о входе и выходе пользователей в/из чата). Отключить отображение этих сообщений можно одной строкой, создав фильтр:
   
/filter add jpk * irc_join,irc_joined,irc_part,irc_quit *

соответственно будут отключены сообщения join, joined, part, quit. Подробнее о фильтрах - /help filter

четверг, 13 июня 2013 г.

Установка принтера в Linux

Решил подключить к нетбуку принтер - задача оказалась нетривиальной.
Дано: нетбук с Calculate Linux на борту и принтер Xerox Phaser 3117.
Задание: совместить два устройства до возможности печати с нетбука.

Начать стоит, конечно-же, с подключения принтера к нетбуку посредством USB кабеля.

Далее нужно было бы установить драйвер принтера через CUPS, но это требует подготовительных действий. CUPS - система печати для Linux (и прочих UNIX), поддерживаемая компанией Apple. Предполагается, что CUPS уже установлен. Дополнительно нужно доустановить парочку пакетов:

# emerge net-print/xerox-drivers net-print/splix

Здесь:
  • net-print/xerox-drivers - как ясно из названия пакета, драйвера для принтеров Xerox (линейки CopyCentre, DocuPrint, Phaser, WorkCentre) для системы печати CUPS;
  • net-print/splix - поддержка принтеров SPL (Samsung Printer Language) для CUPS (Xerox свои маленькие лазерники заказывает у Samsung, поэтому принтеры Xerox могут работать с драйверами Samsung);
   
Теперь можно настраивать CUPS. Настраивать будем через веб-интерфейс, для чего пишем в адресной строке браузера: localhost:631/admin. Открывается страница настройки CUPS. Жмем кнопку "Добавить принтер" (Add Printer). Откроется страница с выбором принтеров, где в списке локальных принтеров выбираем нужный и жмем продолжить. Следующая страница (настройки принтера) предлагает выбрать производителя (в данном случае Xerox), а потом модель принтера (Phaser 3117). В идеальном случае все должно заработать.

У меня идеального случая не вышло.

Принтер со своими драйверами работать не захотел. Были выбраны драйвера Samsung ML-1610. Всё работало нормально, пока не понадобилось распечатать из ОпенОфиса листик в альбомной ориентации - упорно печаталась портретная, никакие настройки не помогали. Решилось довольно просто: через пункт "Модификация принтера" в настройках принтера драйвер был заменен на Xerox Phaser 3117, т. е. на родной - и печать альбомных страниц нормализовалась.

среда, 12 июня 2013 г.

Как в Linux узнать сетевое имя коммпьютера

Чтобы узнать свое сетевое имя (hostname) существует как минимум 2 способа.

Первый из них - это воспользоваться командой uname с параметром -n:

$ uname -n
tolstiy

Та же команда, но с параметром -a выводит всю извесную ей информацию одной строкой:

$ uname -a
Linux tolstiy 3.9.4-calculate #1 SMP PREEMPT Sat Jun 8 04:28:26 EEST 2013 i686 Intel(R) Atom(TM) CPU N280 @ 1.66GHz GenuineIntel GNU/Linux

Второй способ узнать имя компьютера - это команда hostname. Введенная без параметров, она выведет искомое имя хоста:

$ hostname
tolstiy

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

Есть и еще более простой способ узнать hostname - обычно приглашение в командной строке содержит имя компьютера. Но это не обязательное правило - приглашение командной строки может меняться, а приведенные выше 2 способа работают всегда.