воскресенье, 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 отключен.

Настройка iptables для шлюза

В предыдущей заметке мы настроили сетевые интерфейсы на компьютере шлюзе. Сегодня сделаем возможным прохождение пакетов через шлюз к клиенту. Делается это с помощью встроенного в ядро Linux файервола iptables.

Умолчальные настройки нас не устраивают. На мой взгляд лучшее решение - собрать все настройки iptables в одном файле. И перво наперво этот файл нужно создать. Все дальнейшие действия выполняются под личиной Суперпользователя.

Создаем файл /etc/init.d/rc.firewall:

# touch /etc/init.d/rc.firewall

Наш файл является сценарием оболочки, поэтому делаем его исполняемым следующей командой:

# chmod 755 /etc/init.d/rc.firewall

Чтобы все работало после перезагрузки, помещаем наш скрипт автозагрузку при помощи команды:

# update-rc.d rc.firewall start 40 S . stop 89 0 6 .

Вместо непонятных буковок "start 40 S . stop 89 0 6 ." можно написать default, но так больше контроля.

Если в дальнейшем нам понадобится удалить скрипт из автозагрузки пишем следующее:


# update-rc.d -f rc.firewall remove

Теперь можно приступить к написанию самого скрипта:

# nano /etc/init.d/rc.firewall

Для начала сообщим ядру, что оно имеет дело со сценарием. Делается это добавлением в начало файла строки

#!/bin/sh

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

IPT="/sbin/iptables"    # переменная, задающая путь к файлу запуска iptables

INET_IFACE="eth0"    # ваш внешний сетевой интерфейс

Мы делаем крутую программу, поэтому реализуем возможность задавать параметры. Запихнем правила для iptables в функцию start_fw():


start_fw()
{             # начало функции

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

echo 1 > /proc/sys/net/ipv4/ip_forward

Сбросим правила и удалим цепочки:

$IPT -F
$IPT -X

Зададим политики по умолчанию:

$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT

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

Ну и наконец самое главное правило:

$IPT -A POSTROUTING -t nat -s 192.168.1.0/24 -o $INET_IFACE -j MASQUERADE
}         # конец функции start_fw()

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

Переходим к реализации параметров. Прийдется немного попрограммировать. Пишем:


case "$1" in

Для того, чтобы наш файервол можно было запустить командой /etc/init.d/rc.firewall start пишем следующую ветвь условия case:


start)   echo -n "Starting firewall"
            start_fw
            echo "."
            ;;

Чтобы можно было остановить файервол(когда возникнет такое желание) командой /etc/init.d/rc.firewall stop пишем:


stop)    echo -n "Stopping firewall"
            iptables -F
            iptables -X
            echo "."
            ;;

Ну и, на всякий случай, защита от неправильных параметров:


*)         echo "Usage: /etc/init.d/rc.firewall start | stop"
            exit 1
            ;;
esac    # закрываем условный оператор
exit 0   # успешное завершение

Вот и все. Простейший шлюз настроен. Полностью файл /etc/init.d/rc.firewall будет выглядеть так:


#!/bin/sh

IPT="/sbin/iptables"    # переменная, задающая путь к файлу запуска iptables
INET_IFACE="eth0"    # ваш внешний сетевой интерфейс

start_fw()
{             # начало функции

echo 1 > /proc/sys/net/ipv4/ip_forward

$IPT -F
$IPT -X

$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT

$IPT -A POSTROUTING -t nat -s 192.168.1.0/24 -o $INET_IFACE -j MASQUERADE
}         # конец функции start_fw()
  
case "$1" in

stop)    echo -n "Stopping firewall"
            iptables -F
            iptables -X
            echo "."
            ;;

stop)    echo -n "Stopping firewall"
            iptables -F
            iptables -X
            echo "."
            ;;

*)         echo "Usage: /etc/init.d/rc.firewall start | stop"
            exit 1
            ;;

esac    # закрываем условный оператор
exit 0   # успешное завершение

Следует также заметить, что если у вас в локальной сети не реализован DNS сервер, то в настройках клиента нужно указать DNS сервера провайдера, или, например, DNS сервер Google(8.8.8.8)

четверг, 13 сентября 2012 г.

Настройка Debian шлюза

Недавно мой сосед приобрел себе компьютер. А поскольку входной канал интернета только один(а второй заводить не резон), пришлось настраивать шлюз на домашнем компе(Debian). Решение временное, будет работать до покупки роутера.

Начинать следует с установки второй сетевой карты. Этот этап не должен вызвать затруднений: берем сетевую карту и совмещаем контактную планку с PCI разъемом материнской платы. Естественно это следует делать при отключенном электропитании ПК(глупые разработчики PCI порта не позаботились о горячем подключении :-) ).

Загружаемся и настраиваем сетевуху. Сетевая карта подключенная к Инету называется у меня eth0(адрес и настройки выдаются автоматически с привязкой к MAC адресу сетевой карты), а карта смотрящая в локальную сеть - eth1. Сетевые интерфейсы настраиваются в файле /etc/network/interfaces.

Вводим под рутом(суперпользователем, root): 

# nano /etc/network/interfaces

И приводим файл к виду:

auto lo  
iface lo inet loopback  

auto eth0 

auto eth1 
iface eth1 inet static 
address 192.168.1.1  
netmask 255.255.255.0 

Пояснения к содержимому:
  • lo, eth0, eth1 - сетевые интерфейсы: lo - интерфейс обратной связи(нам сейчас не нужен), eth0 - подключение к интернет, eth1 - в локальную сеть;
  • auto - означает, что интерфейс будет инициализирован при загрузке компьютера;
  • static - фиксированный ip-адрес(не динамический);
  • address - адрес, присваиваемый интерфейсу;
  • netmask - маска сети(для локальной сети самое оно).

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

# /etc/init.d/networking restart

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

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