вторник, 13 ноября 2012 г.

Гибернация в Calculate Linux

Возвращаемся к теме спящего режима под Linux. После установки дистрибутива CLD Calculate Linux я столкнулся с проблемой неработоспособности спящего и ждущего режимов. А именно: комп как-будто бы уходил в сон, но при попытке просыпания тупо зависал не реагируя ни на какие мои действия (кроме, конечно, кнопочки перезагрузки на системнике :-)).

Все эти неприятности продолжались до обновления ядра до версии 3.6.6. Методом проб и ошибок была выявлена причина - ветка ядра 3.5 как-то хреново работает с питанием. По крайней мере 4 редакции были протестированы в процессе обновлений - все корявые. Конечно же правка ядра мне пока не под силу, поэтому я сильно порадовался переходу на ветку 3.6.

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

В Calculate для управления питанием используется pm-utils - набор скриптов для взаимодействия с подсистемой управления питанием ядра. Коллекция скриптов свободно модифицируема и позвляет довльно тонко управлять как всей системы так и отдельных модулей. Но в моем случае всех этих тонкостей не понадобилось. А понадобилось найти основной умолчальный конфиг - /usr/lib/pm-utils/defaults и отредактировать его изменив (или добавив) одну строчку:

# nano /usr/lib/pm-utils/defaults

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

HIBERNATE_MODE="shutdown"

По умолчанию эта опция установлена в "platform", который, по идее, и должен выключать комп, но в моей системе, видимо, какие-то странные настройки и при умолчальном значении происходит перезагрузка.

Мне кажется странным выбор умолчального местоположения конфига, тем более, что в каталоге /etc/pm/config.d/ могут быть расположены дополнительные файлы конфигурации. Но разрабам, конечно же, виднее :-)

По этой ссылке расположено чуть более подробное описание pm-utils.

воскресенье, 11 ноября 2012 г.

Вывод с заданной точностью в C++

Цель: вывести число с заданной точностью n стандартными средствами C++, т.е. не используя сишную библиотеку stdio.

Для начала установим режим вывода с фиксированной точкой, что делается модификатором std::fixed. Затем, с помощью модификатора std::setprecision(n), устанавливаем точность вывода n. Для работы последнего модификатора необходимо подключить заголовочный файл iomanip. Таким образом код будет выглядеть приблизительно так:
   
#include <iomanip>
//...
std::cout << std::fixed << std::setprecision(n) << something;

Или, чтобы не писать постоянно "std::", так:
   
#include <iomanip>
using namespace std;
//...
cout << fixed << setprecision(n) << something;

воскресенье, 7 октября 2012 г.

Проблемы с Х-ами после обновления

В одной из предыдущих заметок был описан процесс обновления системы Calculate Linux. Если во время этого процесса обновляется также и ядро, то необходимо проделать еще дополнительные действия.

В моем случае после обновления перестала загружаться графика. Это произошло потому, что драйвера для моей встроенной видеокарты Nvidia представлены в виде модуля ядра. Модуль был собран для предыдущей (не обновленной) версии ядра и с новым ядром перестал запускаться. В этом случае помогает пересборка модулей ядра, выполняемая командой:

# module-rebuild -X rebuild

Но такой фокус проходит не всегда. Например, для видеокарты intel (драйвера встроены в ядро) нужно пересобрать несколько пакетов: xorg-server, xorg-drivers и xf86-video-intel. Делается это командой:

# emerge -1 xorg-server xorg-drivers xf86-video-intel

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

Переустановка одного только драйвера xf86-video-intel ситуацию не исправляет.

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

суббота, 6 октября 2012 г.

Добавление Windows в меню загрузки Grub2

При очередной загрузке компьютера было обнаружено отсутствие пункта загрузки Windows в меню Grub. Встал вопрос - как его туда добавить.

После недолгих поисков было выяснено, что в дистрибутиве установлен Grub2. Как известно этот загрузчик не позволяет напрямую редактировать файл конфигурации (вообще-то позволяет, просто при очередном обновлении он его перезапишет) - он создает его автоматически с помощью скриптов, расположенных в каталоге /etc/grub.d. Посмотрим, что там есть:

# ls /etc/grub.d

00_header
10_linux
20_linux_xen  
30_os-prober
39_memtest86+
40_custom
41_custom

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

Скрипт 00_header считывает настройки из файла /etc/default/grub. Там содержатся общие настройки вроде разрешения экрана при загрузке, фоновой картинки и т.п.

Скрипт 10_linux проверяет какие есть ядра linux и добавляет их в меню загрузки. 20_linux_xen - специфический скрипт для систем, работающих с XEN виртуализацией.

Скрипт 30_os-prober проверяет наличие других операционных систем, таких как Windows (требует наличия установленного  sys-boot/os-prober), и добавляет их в меню.

Скрипт 39_memtest86+ добавляет в меню пункты для проверки памяти. Ну а номера 40 и 41 предназначены для дополнительных пользовательских скриптов.

Поскольку все скрипты на месте, то нам осталось только сгенерировать конфигурационный файл. Делается это командой:


# grub-mkconfig -o /boot/grub/grub.cfg

которая пересоздаст файл /boot/grub/grub.cfg. Это тот самый файл, который можно отредактировать и вручную, но прийдется это делать после каждого обновления. 

пятница, 5 октября 2012 г.

Обновление системы

Для поддержания системы в актуальном состоянии необходимо обновлять установленные программы. Для установки программ (равно как и их обновления) используется программа emerge. Но сначала необходимо обновить локальную базу прорграмм с помощью команды

# eix-sync

Эта команда выполняет последовательно обновление оверлеев, портежей и базы пакетов eix.

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

# eselect profile list

Она выдаст нумерованный список доступных профилей, где звездочкой помечен выбранный для нашей системы. Бинарные профили помечены "binary". Чтобы изменить профиль выполним команду

# eselect profile set X

где X - номер профиля.

Теперь можно обновлять систему. Запускаем команду

# emerge -uDNa --keep-going world

Флаг -u, собственно, и означает, что мы хотим обновить систему.

Флаг -D (или --deep) заставляет emerge обновлять не только явно установленные нами пакеты, но и их зависимости.

Если мы меняли USE-флаги, то нужно добавить флаг -N (или --newuse). Тогда Portage проверит требует ли изменение устрановки новых пакетов или перекомпиляции существующих.

Флаг -a (--ask) перед обновлением выведет список пакетов и спросит разрешения продолжить установку.

Обычно при установке если какой-нибудь пакет собирается с ошибкой, команда emerge выводит эту ошибку в консоль и завершается. Флаг --keep-going заставляет emerge пересчитать зависимости заново после ошибки и продолжить установку тех пакетов, для которых ошибочный пакет не является необходимым.

После обновления может случиться нарушение зависимостей. Чтобы найти и исправить их можно (или даже нужно) выполнить команду:

# revdep-rebuild

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

# dispatch-conf

После запуска программа будет выводить на экран содержимое подлежащего изменению файла с пометками "+", если эта строка добавлена в новом файле и "-", если строка в новом файле удалена. Чтобы согласится с изменениями и использовать новый конфигурационный файл нужно нажать "u", а чтобы пропустить изменение настроек - "z".

Источник здесь.

четверг, 4 октября 2012 г.

Оптимизация Calculate

На днях удалил Debian со своего домашнего копа и установил дистрибутив Calculate Linux 12.0.3 (номер версии не важен - у дистриба непрерывный цикл обновлений). Не потому, что Debian так уж плох, просто Gentoo-подобные дистрибутивы вызывают в моей душе больший трепет.

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

Начнем настройку производительности с инструкции на сайте дистрибутива.

Первым делом прописываем параметр rc_parallel="YES" в файле /etc/rc.conf, что позволит (как обещают разработчики) выиграть несколько секунд при загрузке благодаря "распараллеливанию" запуска процессов.
  
Добавляем PRELINKING="yes" в файл /etc/conf.d/prelink, но там уже все есть :-) Prelink - это механизм предварительного связывания пакетов.

И, наконец, самое главное - флаги компиляции. Это то, в чем вся сила Gentoo-подобных дистрибутивов - возможность влиять на зависимости, размер, доступные функции (и т. п.) устанавливаемого (точнее, компилируемого) ПО. В общем, вся та гибкость которую предоставляет Linux (свободное ПО). Начать стоит с настройки файла /etc/make.conf.

Для повышения быстродействия большое значение имеют параметры жесткого диска HDD. Здесь есть два пути. Первый - настройка таблицы разделов, файловых систем на разделах, и файла /etc/fstab. Второй - настройка параметров жесткого диска с помощью программы hdparm. Если у вас диск SSD, то настройка производится по другим правилам - многое не имеет смысла, что-то работает по другому, присутствуют параметры отсутствующие для HDD.

Следующий не менее важный, но самый сложный этап - настройка ядра.

Получаем слудующее оглавление:

  1. Настройка /etc/make.conf.
  2. Настройка HDD.
  3. Настройка ядра.

воскресенье, 16 сентября 2012 г.

Увеличение Swap'а

В определенный момент стало не хватать раздела подкачки объемом 2ГБ (это при 2 же ГБ оперативной памяти). Не хватать в основном при гибернации - не всегда удавалось удачно уйти в спящий режим. Решено было увеличить swap до 4 ГБ, как везде советуют удвоенный размер ОЗУ.

Возможности увеличения существующего раздела нет, поэтому создадим новый раздел (размером те же 2 ГБ). Я воспользовался для этого программой cfdisk:

# cfdisk /dev/sda

Команда покажет список разделов диска /dev/sda. Там у меня припасено порядка 60 ГБ свободного места в конце диска. Наводим выделение на свободное пространство (стрелочками "вверх", "вниз"). Выбираем в меню пункт "new" (стрелками "влево", "вправо") и указываем размер раздела в мегабайтах. После этого выбираем пункт меню "Write" для записи изменений на диск (соглашаемся вводом "yes"), а затем выбираем "Quit".

Теперь создадим раздел подкачки:

# mkswap /dev/sdaX

X - номер созданного раздела. Теперь можно подключить раздел:

# swapon /dev/sdaX

и проверяем подключен ли новый раздел:

# cat /proc/swaps

Команда покажет список подключенных swap разделов.

Ну и нелишним будет прописать раздел в файл /etc/fstab, чтобы подключался при загрузке:

# nano /etc/fstab

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


/dev/sdaX  none  swap  sw  0  0

Вместо /dev/sdaX можно (и даже нужно) указать UUID раздела. UUID раздела выдает команда mkswap при создании swap'а. Если этого не произошло, то можно воспользоваться командой blkid:


# blkid /dev/sdaX

Ну вот и все, задание выполнено.

Разборки с Гибернацией

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

На моей системе для спящего режима используется команда s2disk из пакета uswsusp. Судя по всему что-то не так в конфигурационном файле программы.

Настройки uswsusp хранятся в файле /etc/uswsusp.conf. Открываем его на редактирование в любимом редакторе с правами root'а:

# nano /etc/uswsusp.conf

Интересующая нас опция - shutdown method - задает действие, выполняемое после записи образа памяти на диск. По умолчанию значение опции - "platform". Нам нужно указать значение "shutdown":

shutdown method = shutdown

Теперь все в порядке компьютер нормально выключается.

Из полезных параметров конфигурационного файла стоит отметить еще resume device. Его значение  - это имя swap раздела, на который сохраняется образ оперативной памяти. В моей системе - это /dev/sda5:

resume device = /dev/sda5

Статья, натолкнувшая меня на написание сегодняшней заметки находится здесь. Ну и, конечно, главный источник справочной информации в Linux - команда man:

# man uswsusp.conf 

P. S. Через пару дней снова начались проблемы. Комп уходил в сон, но потом загружался с нуля. А еще через пару дней я снес дома Debian и поставил Calculate. Теперь наслаждаюсь перезагрузкой после сна вместе с отсутствием восстановления из спящего режима. Вобщем, в ближайшем будущем предстоят разборки теперь уже с pm-utils.

суббота, 15 сентября 2012 г.

Оптимизация подкачки

Работая в Linux я заметил, что раздел подкачки используется в том же объеме как и оперативная память. И это не смотря на то, что оперативной памяти еще много( приблизительно половина от имеющейся). Тогда у меня возник вопрос: как на это можно повлиять? Ну а то, что повлиять можно, я не сомневался - это же Линукс и здесь все можно настроить.

Вообще-то я не сильно заморачивался по этому поводу пока не встретил на форуме интересное замечание. Там была рекомендация выставить значение параметра vm.swappiness=10.

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

Значения параметра swappiness - это число от 0 до 100. Значение 0 означает, что своп не будет использован, пока физическая память не заполнится до предела. Значение 100 заставляет ядро агрессивно свопировать процессы на диск.

Чаще всего значение параметра по умолчанию устанавливается равным 60. Значение равное 10 представляется мне более оптимальным. А теперь о том, как это значение выставить.

Для начала узнаем каково же значение параметра выставленное по умолчанию:

# cat /proc/sys/vm/swappiness

Для того, чтобы установить значение параметра, открываем из под учетной записи root на редактирование файл /etc/sysctl.conf:

# nano /etc/sysctl.conf

и добавить в него строку:

vm.swappiness=10

После перезагрузки значение параметра изменится на указанное нами. Чтобы изменить значение до перезагрузки необходимо выполнить (под root) следующую команду:

# sysctl vm.swappiness=10

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

пятница, 14 сентября 2012 г.

Отключение IPv6 в ядре Debian Linux

Занимаясь настройкой шлюза на Debian машине ко мне пришло понимание, что у меня присутствует лишняя функциональность в виде поддержки протокола IPv6. Заметок в интернете по этому поводу существует довольно много, но все-таки и я решил внести свою лепту.

Итак цель - отключить поддержку IPv6 в ядре Linux. Способ подходит для владельцев ядер 2.6.31 и выше. В этих ядрах предусмотрена возможность отключить IPv6 опцией при загрузке. Однако сначала необходимо убедиться что IPv6 включен. Пишем в консоли под root'ом:


# ifconfig | grep inet6

Если указанная команда ничего не вывела на экран, значит IPv6 у вас не используется, иначе читаем далее.

Если у вас установлен загрузчик GRUB Legacy(не прогрессивный но понятный), то в конфигурационном файле /boot/grub/menu.lst в опциях загрузки ядра дописываем ipv6.disable=1.

Если же вы счастливый обладатель прогрессивного загрузчика GRUB2, тогда идем в /etc/default/grub и ищем строку с опциями загрузки ядра по умолчанию (что-то вроде "quiet splash"). Дописываем к имеющимся опцию ipv6.disable=1.
Затем запускаем от root'а:

# update-grub

Затем перезагружаем компьютер и проверяем настройки с помощью утилиты ifconfig. В выводе не должно быть IPv6 адресов. 
Еще один способ проверки:

# netstat -npl | grep -E "tcp6|udp6" | wc -l

Если в выводе команды "0", значит все в порядке и IPv6 отключен.