Linux Slackware Энциклопедия от А до Я
Сайт посвящен свободно распространяемому ПО и Linux Slackware в частности.
Разделы:
Раздел/Тема
Главная -> Оптимизация -> Причёсываем скрипты в Слаке
Патрик конечно Бох, но всё предусмотреть невозможно, да и просчёты бывают поэтому несколько его скриптов требуют доработки напильником :). Первый кандидат в очереди /etc/profile. Всё дело в том как он заполняет переменную PATH:
  • Если юзверь рут то ему добавляют пути /sbin и /usr/sbin
  • В другом случае не добавляют :(
И всё бы ничего, но когда вы используете sudo, то начинаютя проблемы с автодополнением, что естественно т.к. ваш шелл не находит нужных исполняемых файлов. Я изменил файл /etc/profile таким образом чтобы пути /sbin и /usr/sbin добавлялись также для всех пользователей находящихся в группе wheel (группа для привелигерованых пользователей sudo). # For root users, ensure that /usr/local/sbin, /usr/sbin, and /sbin are in # the $PATH. Some means of connection don't add these by default (sshd comes # to mind). grep wheel /etc/group 2>/dev/null | grep '\<'$USER'\>' 1>/dev/null 2>/dev/null if [ $? = 0 ]; then echo $PATH | grep /usr/local/sbin 1> /dev/null 2> /dev/null if [ ! $? = 0 ]; then PATH=/usr/local/sbin:/usr/sbin:/sbin:$PATH fi fi Тут есть одна тонкость: используемая переменная USER вещь достаточно специфичная и например в некоторых вариантах работы zsh её не существует однако переопределить её не составляет труда. Для этого надо добавить в начало скрипта такую строку. USER=`id -nu' Следущий больной вопрос это /etc/rc.d/rc.inet1. В общем это не баг, но для меня вопрос оказался существенным. Дело в том, что выше указанный скрипт предусматривает только два варианта настройки сетевых устройств: с помощью DHCP и ручками. Но я бы хотел, чтобы сначала использовался DHCP, а потом, если не получилось, вручную забивался статический адрес. Мне это необходимо для того чтобы таскать ноут на работу: там DHCP, а дома статика (ради одного ноута подымать DHCP нет смысла - Keep it simple and stupid :)). Вот что я изменил в функции подъёма интерфейсов. # 30 seconds should be a reasonable default DHCP timeout. 60 was too much. :-) echo "/etc/rc.d/rc.inet1: /sbin/dhcpcd -d -t ${DHCP_TIMEOUT[$i]:-30} ${DHCP_OPTIONS} ${1}" | $LOGGER /sbin/dhcpcd -d -t ${DHCP_TIMEOUT[$i]:-30} ${DHCP_OPTIONS} ${1} fi ls /etc/dhcpc | grep dhcpcd-${1}.pid 1>/dev/null 2>/dev/null if [ ! $? = 0 ]; then echo "DCHP fail. Tray to use static IP." | $LOGGER if [ ! "${IPADDR[$i]}" = "" ]; then # skip unconfigured interfaces # Determine broadcast address from the IP address and netmask: BROADCAST[$i]=`/bin/ipmask ${NETMASK[$i]} ${IPADDR[$i]}|cut -f1 -d' '` # Set up the network card: echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} ${IPADDR[$i]} broadcast ${BROADCAST[$i]} netmask ${NETMASK[$i]}" | $LOGGER /sbin/ifconfig ${1} ${IPADDR[$i]} broadcast ${BROADCAST[$i]} netmask ${NETMASK[$i]} else if [ "$DEBUG_ETH_UP" = "yes" ]; then echo "/etc/rc.d/rc.inet1: ${1} interface is not configured in /etc/rc.d/rc.inet1.conf" | $LOGGER fi fi fi Как видно из скрипта для определения поднялся ли интерфейс используется тот факт, что в случае если dhcpd отхватил адрес, то он создаёт процесс для слежения и обновления этого адреса на устройстве. При этом создаётся pid файл с именем /etc/dhcpc/dhcpcd-interface_name.pid. Разумеется, что статический адрес должен быть прописан в /etc/rc.d/rc.inet1.conf # Config information for eth0: IPADDR[0]="192.168.4.2" NETMASK[0]="255.255.255.0" USE_DHCP[0]="yes" DHCP_HOSTNAME[0]="darkstar" Кроме того надо переписать ещё и функцию которая "кладёт" интерфейсы, иначе интерфейс сконфигуреный ручками не будет ложится нормально. if_down() { # Determine position 'i' of this interface in the IFNAME array: i=0 while [ $i -lt $MAXNICS ]; do [ "${IFNAME[$i]}" = "${1}" ] && break i=$(($i+1)) done if grep `echo ${1}: | cut -f 1 -d :`: /proc/net/dev 1> /dev/null ; then ls /etc/dhcpc | grep dhcpcd-${1}.pid 1>/dev/null 2>/dev/null if [ $? = 0 ]; then echo "/etc/rc.d/rc.inet1: /sbin/dhcpcd -k -d ${1}" | $LOGGER /sbin/dhcpcd -k -d ${1} 2> /dev/null || /sbin/ifconfig ${1} down sleep 1 else echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} down" | $LOGGER /sbin/ifconfig ${1} down fi Вот то, что мне не понравилось в скриптах на данный момент. Кстати востановить оригинальные скрипты можно из пакетов a/etc и n/network-scripts соответственно. Yoda 16.12.2007