|
Патрик конечно Бох, но всё предусмотреть невозможно, да и просчёты бывают поэтому несколько его скриптов требуют доработки напильником :).
Первый кандидат в очереди /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
|