PDA

Bekijk de volledige versie : Размышления об использовании файлов pre-* и post-* в новых прошивках Олега



al37919
01-01-2008, 18:04
В последних версиях прошивки Олега было сделано много усилий, чтобы сделать процесс загрузки более прозрачным. В частности в версии 1.9.2.7-8.7 появился новый файл --- pre-mount. На мой взгляд поддержка fstab не отражена в имеющихся основных тьториалах по первичной настройке, а она дает очень гибкий и мощный инструмент для осмысленного управления дисковой подсистемой. К тому же, в новых прошивках эти файлы стали чрезвычайно лаконичными и я бы даже сказал изящными :)

Сразу отмечу, что настройку post-firewall здесь рассматривать не буду.

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

Итак, после проведенного на днях апгрейда hdd мой /etc/fstab выглядит таким образом:

#device Mountpoint FStype Options Dump Pass#
/dev/discs/disc0/part1 none swap sw 0 0
/dev/discs/disc0/part2 /opt ext3 rw,noatime 1 1
/dev/discs/disc0/part3 /opt/home ext3 rw,noatime 1 1
/dev/discs/disc0/part4 /home ext3 rw,noatime 1 1
/dev/discs/disc1/part2 /mnt ext3 rw,noatime 1 1

К счастью, по крайней мере в моем 2 диска, подключенные через внешний USB2 hub определяются всегда в одном и том же порядке, так что /etc/fstab --- это просто статический файл.

Идея разбиения на несколько разделов такова:
/opt --- программы
/home --- архив
/opt/home --- файловая система для текущих закачек и т.д.
/mnt --- прежний винчестер, который со временем будет удален
В идеале надо было бы добавить отдельную файловую систему /var (или /opt/var) и сделать доступ к /opt только для чтения, но это наверное буду пробовать теперь уже при следующем апгрейде. Наиболее рискованная ф.с. с точки зрения потенциальной потери данных --- /opt/home (потому она и вынесена в отдельный раздел не очень большого размера). По завершении закачек файлы из этого раздела планируется перемещать в /home , а если необходимо что-то расшарить, то создать симлинки.

[Замечание: если Вы планируете использовать /opt/home в качестве точки монтирования как это написано у меня, то не забудьте ее создать: mkdir /opt/home ]

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

Рекомендуемый на данный момент вариант файла pre-mount выглядит так:

#! /bin/sh

swapon -a

for i in `/usr/bin/awk '/ext3/{print($1)}' /etc/fstab`
do
/bin/grep -q $i /proc/mounts || /sbin/e2fsck -p $i 2>&1 | /usr/bin/logger -t e2fsck
done
Здесь на основе /etc/fstab формируется список имеющихся ф.с. и они по очереди проверяются.

Итак, что же мы получаем при загрузке если мы выполняем подобную проверку после обыкновенной перезагрузки. Для этого смотрим в syslog и видим примерно следующее (здесь приведена картинка для старой версии, но результат в syslog.log должен выглядеть подобным образом:

/dev/discs/disc0/part2: recovering journal
/dev/discs/disc0/part2: clean, 15942/245280 files, 102559/489982 blocks (check after next mount)
/dev/discs/disc0/part3: recovering journal
/dev/discs/disc0/part3: clean, 5141/1835008 files, 1148511/3664828 blocks (check in 5 mounts)
/dev/discs/disc0/part4: recovering journal
/dev/discs/disc0/part4: clean, 73/12517376 files, 3719155/25023245 blocks (check after next mount)
/dev/discs/disc1/part2: recovering journal
/dev/discs/disc1/part2: clean, 36785/2431680 files, 341863/4857654 blocks (check in 2 mounts)
Интересное наблюдение, что все файловые системы при перезагрузке оказались не совсем в порядке. Скорее всего, повреждения минимальны, но все равно как то неприятно. Однако ведь у нас есть файл pre-shutdown.

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

У меня не получились следующие действия:
mount -a -r
mount -a -o remount,ro
mount -t ext3 -r
mount -t ext3 -o remount,ro

Однако, перемонтирование ф.с. по одной работает без проблем, а ведь у нас есть полный список в файле /etc/fstab ! Заодно отключим и swap

У меня файл pre-shutdown вышел таким ( более свежая версия от 2/2009 описана здесь: http://www.wl500g.info/showpost.php?p=134183&postcount=37 ):

#! /bin/sh

/opt/etc/init.d/rc.unslung stop

for i in `awk '/ext3/{print($1)}' /etc/fstab`
do
mount -o remount,ro $i
done

swapoff -a

sleep 5s

Результат ---

/dev/discs/disc0/part2: clean, 15949/245280 files, 102570/489982 blocks
/dev/discs/disc0/part3: clean, 5134/1835008 files, 117343/3664828 blocks (check in 3 mounts)
/dev/discs/disc0/part4: clean, 1320/12517376 files, 5471367/25023245 blocks
/dev/discs/disc1/part2 has been mounted 39 times without being checked, check forced.
/dev/discs/disc1/part2: 36782/2431680 files (7.5% non-contiguous), 341863/4857654 blocks

Выглядит гораздо приятнее --- все файловые системы чистые. Надо отметить, что особенностью файловых систем unix является то, что в них имеется счетчик числа монтирований, который выполняет принудительную проверку состояния ф.с. после определенного числа монтирований даже "чистой" ф.с. Таким образом, в приведенном примере на ф.с. /dev/discs/disc1/part2 была проведена принудительная проверка, которая затянула загрузку минуты на 2-3. Однако, как известно чистота --- залог здоровья и ИМХО вполне допустимо иногда иметь долгие загрузки, однако иметь больше уверенности в целостности данных.

Теперь насчет файла rc.unslung, который также задействован в файле pre-shutdown. Цивилизованный запуск демонов с диска традиционно производится путем вызова из post-boot файла /opt/etc/init.d/rc.unslung , который в свою очередь запускал все файлы в директории /opt/etc/init.d , которые начинались с заглавной буквы S . Эти файлы туда устанавливались инсталляторами приложений, либо могли быть добавлены вручную. Однако, если запуск производится стандартизованным путем, то почему же остановку запущенных демонов не производить также цивилизованным путем, т.е. через тот же rc.unslung (причем еще и в обратном порядке, чтобы S01syslogd был прибит последним и процесс отключения процессов был бы запротоколирован)? Как минимум для rtorrent такое отключение просто чрезвычайно полезно, т.к. если его отрубать без предупреждения, то он не успевает цивилизованно отключиться от треккера и после следующего включения надсадно хеширует все имеющиеся файлы. Некоторые файлы S??* пришлось подредактировавть, чтобы заставить их принимать стандартные аргументы start|stop.

В общем обновленный /opt/etc/init.d/rc/unslung , который теперь принимает один параметр --- либо start либо stop у меня вышел таким:

#! /bin/sh

# Start/stop all init scripts in /opt/etc/init.d
# starting them in numerical order and
# stopping them in reverse numerical order
#
if [ $# -ne 1 ]; then
printf "Usage: $0 {start|stop}\n" >&2
exit 1
fi

daemons=`echo $(/usr/bin/dirname $0)/S??*`
[ $1 = "stop" ] && daemons=`echo $daemons | /usr/bin/tr " " "\n" | /usr/bin/sort -r`

for i in $daemons; do

# Ignore dangling symlinks (if any).
[ ! -f "$i" ] && continue

case "$i" in
*.sh)
# Source shell script for speed.
(
trap - INT QUIT TSTP
set $1
. $i
)
;;
*)
# No sh extension, so fork subprocess.
$i $1
;;
esac
done
На мой взгляд теперь более подходящее место для запуска этих демонов --- файл post-mount:

#! /bin/sh

/opt/etc/init.d/rc.unslung start

А post-boot у меня стал тоже чрезвычайно изящным:

#! /bin/sh

dropbear

Остался неосвещенным еще файл pre-boot. В нем у меня запускается ipt_recent, который используется для контроля доступа к ssh порту из wan (в последней прошивке этот модуль также прописался во внутренней флеши):


#! /bin/sh

#Both these lines are required/recommended for protection against unwanted multiple ssh logins based on ipt_recent ( http://wl500g.info/showpost.php?p=69660&postcount=53 )
#date 010101012000
#insmod /usr/local/lib/ipt_recent.o

insmod ipt_recent

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

Oleg
01-01-2008, 19:07
Есть утилита e2fsck. Её и нужно вызывать. :)

al37919
01-01-2008, 20:17
Соглашусь, альтернативный вариант pre-mount, который делает абсолютно то же самое и не требует установки e2fsprogs и лишних параметров в /etc/fstab будет выглядеть так (возможность одновременной проверки разделов, расположенных на разных дисках, которую предостваляет fsck за серьезное преимущество в нашем случае считать так и быть не будем :) ):

#! /bin/sh

for i in `cat /etc/fstab | sed -n /ext3/p | awk '{print($1)}'`
do
e2fsck -p $i > /tmp/e2fsck.log 2>&1
done
Результат будет все одно един, т.к. fsck.ext3 и e2fsck ИМХО суть одно и тоже.

Mr_J
04-01-2008, 00:51
Интересная тема
Буду пробовать, т.к. временами возникают проблемы с торрентами

zap
04-01-2008, 03:13
for i in `cat /etc/fstab | sed -n /ext3/p | awk '{print($1)}'`

Такие вещи надо писать проще:

for i in `awk '/ext3/{print($1)}' /etc/fstab`

А в идеале хорошо было бы иметь какой-нибудь /opt/etc/init.d и соотвествтенно /opt/etc/rc{0,1,2,3,4,5,6}.d, откуда при старте бы автоматически запускались скрипты запуска демонов. А в ipk пакетах бы лежали сразу соответствующий файл запуска демона. И программу типа chkconfig в RH-подобных системах для включения/выключения демонов...

Что-то я раззмечтался сегодня.

Mr_J
04-01-2008, 14:56
а почему не нужно проверять /opt?
Ага, сам нашел "Однако у нас проверка /opt вынесена в отдельную комманду, поэтому в строке с /opt этот параметр равен 0."

djet
04-01-2008, 15:06
Такие вещи надо писать проще:

for i in `awk '/ext3/{print($1)}' /etc/fstab`

А в идеале хорошо было бы иметь какой-нибудь /opt/etc/init.d и соотвествтенно /opt/etc/rc{0,1,2,3,4,5,6}.d, откуда при старте бы автоматически запускались скрипты запуска демонов. А в ipk пакетах бы лежали сразу соответствующий файл запуска демона. И программу типа chkconfig в RH-подобных системах для включения/выключения демонов...

Что-то я раззмечтался сегодня.

Есть же, /opt/etc/init.d/rc.unslung. Нужно только его в post-mount добавить.

al37919
04-01-2008, 15:44
а почему не нужно проверять /opt?
/opt проверять нужно. И во всех приведенных скриптах он проверяется, только в первом случае отдельно. Олег рекомендует использовать более простой вариант, который будет проверять все единым скопом и он приведен здесь: http://wl500g.info/showpost.php?p=75394&postcount=3


Есть же, /opt/etc/init.d/rc.unslung
точно, идея как раз в том, чтобы сделать его более функциональным --- чтобы он не только стартовал приложения, но и культурно останавливал их когда надо перезагрузитсья/выключиться.

Oleg
04-01-2008, 16:36
Вот мой pre-mount:


#!/bin/sh
/bin/grep -q /dev/discs/disc0/part3 /proc/mounts || \
/sbin/e2fsck -p /dev/discs/disc0/part3 2>&1 | /usr/bin/logger -t e2fsck


Обратите внимание - перед тем, как чекать, я проверяю, не смонтирована ли фс уже. Здесь важно то, что pre-mount может вызываться несколько раз. По хорошему ещё надо проверять, что disc0/part3 существует. :)

А результат сыпется в лог.

Oleg
04-01-2008, 16:39
точно, идея как раз в том, чтобы сделать его более функциональным --- чтобы он не только стартовал приложения, но и культурно останавливал их когда надо перезагрузитсья/выключиться.
Беда в том, что некоторые стартовые скрипты, которые есть в /opt/etc/init.d/ умеют только стартовать сервис. Уж и не знаю, почему так. :confused:

al37919
04-01-2008, 17:20
спасибо за еще один кусочек мудрости :)

В принципе не для всех сервисов важно graceful завершение, но те для кого важно обычно имеют и старт и стоп функции. Другое дело, что большая часть темных пользователей предпочитает стартовать тот же rtorrent не с помощью стартового скрипта, а путем простого запуска от рута... :(

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

Впрочем повторюсь, что реальные бенефиты от нормального завершения вижу пока только у rtorrent

Capture
05-01-2008, 22:14
Будте добры поделитесь скриптами запуска рторрента после ребута роутера .

спасибо и если можно опишите пожалуйста в стиле ДЛЯ ЧАЙНИКОФФ

sergicus
06-01-2008, 07:57
Будте добры поделитесь скриптами запуска рторрента после ребута роутера .

спасибо и если можно опишите пожалуйста в стиле ДЛЯ ЧАЙНИКОФФ

А что сложного в файле nano /usr/local/sbin/post-mount
пишите это

/opt/bin/start_rtorrent

потом создаете тот файл на который сослались выше
например при помощи тексторвого редактора nano
вот содержание

#!/bin/sh
cd /tmp/local/root
/opt/bin/screen -dmS rtorrent_zakachka /opt/bin/rtorrent -n -o import=/tmp/local/root/.rtorrent.rc

делайте его исполняемым chmod +x /opt/bin/start_rtorrent

и перезагружайтесь командой reboot

вроде все описал

да вот еще nano и screen должны быть заранее установлены

al37919
06-01-2008, 10:04
В принципе и скрипт и описание уже давно есть здесь: http://wl500g.info/showpost.php?p=66875&postcount=19

Да и тот файл S99rtorrent, который идет в комплекте с rtorrent из репозитория тоже рабочий, только для него должен быть установлен bash и также создан юзер.

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

Подробная дискуссия насчет неправильного (но вполне рабочего) способа запуска rtorrent была здесь: http://wl500g.info/showpost.php?p=60438&postcount=187 и далее по теме

Capture
06-01-2008, 10:20
Спасибо за подробное описанние !

dimaka
06-01-2008, 11:22
Не получается заставить монтировать как указано в fstab, все равно второй диск монтируется в /tmp/mnt/disc0_2
Прошивка - последняя 1.9.2.7-8.8, что уже не делал и фтп сервер в оболочке включал/выключал и в post-boot загружал модули и веб-интерфейсе в Advanced Services Configuration включал Enable USB Storage - все равно роутер делает по-своему :(
Содержимое fstab

/dev/discs/disc1/part1 swap swap
/dev/discs/disc0/part1 /opt ext3 noatime,nodiratime 1 0
/dev/discs/disc0/part2 /opt/home ext3 noatime,nodiratime 1 1
своп включается нормально.
Где копать?

Oleg
06-01-2008, 11:44
Почему не работает я могу только догадываться.

Но хочу задать такой вопрос: а почему бы не монтировать в /home?

И ещё: nodiratime не имеет смысла при использовании noatime.

al37919
06-01-2008, 11:46
потому что чтобы использовать /opt/home в качестве точки монтирования нужно ее создать
mkdir /opt/home

dimaka
06-01-2008, 12:16
al37919
да... клиника...
наверное надо еще меньше праздновать, спасибо за совет, это оно и было :)

Oleg

а почему бы не монтировать в /home?
У меня /home read only

И ещё: nodiratime не имеет смысла при использовании noatime.
т.е. noatime действует также и на папки и дублирует nodiratime?

al37919
06-01-2008, 12:18
У меня /home read only
чушь какая то --- /home --- это такая же точка монтирования как /opt , /mnt , /opt/home и т.д. Если туда что-то смонтировать, то будет rw

dimaka
06-01-2008, 12:28
чушь какая то --- /home --- это такая же точка монтирования как /opt , /mnt , /opt/home и т.д. Если туда что-то смонтировать, то будет rw

Да, так и есть :)
это не чушь, это пробелы в знаниях, просто выглядит как чушь :)
Спасибо еще раз!

BlackKovu
21-01-2008, 21:30
Заметил такую фишку - поскольу к моменту запуска pre-mount время может еще не обновитстся что первые несколько раз у чекера сьезжала крыша и он писал что диск не проверялся много лет.
:)

Mr_J
21-01-2008, 21:47
Заметил такую фишку - поскольу к моменту запуска pre-mount время может еще не обновитстся что первые несколько раз у чекера сьезжала крыша и он писал что диск не проверялся много лет.
:)

у меня тоже так было, "вылечил" принудительной паузой в пост-буте (sleep 5s)

Mr_J
21-01-2008, 21:55
/dev/discs/disc1/part1 swap swap
/dev/discs/disc0/part1 /opt ext3 noatime,nodiratime 1 0
/dev/discs/disc0/part2 /opt/home ext3 noatime,nodiratime 1 1
своп включается нормально.
Где копать?

У Вас своп на отдельном диске?

dimaka
22-01-2008, 08:42
У Вас своп на отдельном диске?

Да, на то время своп был на флешке, уже от этой идеи отказался :)

angel_il
22-01-2008, 09:19
от свопа на флэшке пока не отказался, вот только думаю где бы еще набрать небольших флэшек на 32-128 Мб прозапас.

al37919
22-01-2008, 09:27
я уже советовал одному коллеге --- делать своп небольшого размера (32Мб скорее всего хватит) на одном из концов флехи (можно приготовить сразу 3 раздела про запас :) )

BlackKovu
22-01-2008, 09:33
у меня тоже так было, "вылечил" принудительной паузой в пост-буте (sleep 5s)

Это не поможет если вдруг не доступен инет (и время соотв не обновиться). Надо будет покумекать на счет проверки текущего времени, и если в течении тех же 5s обновления нет то не делать чекинг диска.

angel_il
22-01-2008, 09:34
я уже советовал одному коллеге --- делать своп небольшого размера (32Мб скорее всего хватит) на одном из концов флехи (можно приготовить сразу 3 раздела про запас :) )

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

al37919
22-01-2008, 09:53
как он себя поведет --- понятно --- рухнет (причем не сразу после загрузки). Тут скорее как быстро понять что он рухнул от этого.

Может в pre-mount добавить mkswap -c /path , чтобы при каждой перезагрузке проверять раздел на плохие блоки? Если результат проверки отрицательный, то берем следующий раздел из списка swap разделов и апдейтим /etc/fstab

angel_il
22-01-2008, 11:10
как он себя поведет --- понятно --- рухнет (причем не сразу после загрузки). Тут скорее как быстро понять что он рухнул от этого.

Может в pre-mount добавить mkswap -c /path , чтобы при каждой перезагрузке проверять раздел на плохие блоки? Если результат проверки отрицательный, то берем следующий раздел из списка swap разделов и апдейтим /etc/fstab

тоже вариант, надо подумать.

Serge_K
22-01-2008, 12:28
Это не поможет если вдруг не доступен инет (и время соотв не обновиться). Надо будет покумекать на счет проверки текущего времени, и если в течении тех же 5s обновления нет то не делать чекинг диска.
Я тут на форуме честно спер строчку для post-boot:

ntpclient -c3 -i$(nvram get ntp_interval_x) -h$(nvram get ntp_server0) -s

Синхронизирует время еще до "штатного" запроса.У меня - Стрим и все успешно работает.
А у Корбины, насколько я знаю, есть свой NTP-сервер ntp.corbina.net. Так может если его в настройках указать и к нему маршрут прописать, то не дожидаясь поднятия ВПН вышеуказанная строчка будет отрабатывать?

BlackKovu
22-01-2008, 13:10
Я тут на форуме честно спер строчку для post-boot:

ntpclient -c3 -i$(nvram get ntp_interval_x) -h$(nvram get ntp_server0) -s

Синхронизирует время еще до "штатного" запроса.У меня - Стрим и все успешно работает.
А у Корбины, насколько я знаю, есть свой NTP-сервер ntp.corbina.net. Так может если его в настройках указать и к нему маршрут прописать, то не дожидаясь поднятия ВПН вышеуказанная строчка будет отрабатывать?

для VPN не знаю что выйдет а для нормального соединения наверное должно отработать нечто подобное
ntpclient -c3 -i$(nvram get ntp_interval_x) -h$(nvram get ntp_server0) -s || exit 0
for i in `/usr/bin/awk '/ext3/{print($1)}' /etc/fstab`
...

Contemplator
31-01-2008, 18:59
al37919, посмею заметить, но по моему в Вашем описании затесалась несущественная, но все же ошибка:

#! /bin/sh

/opt/etc/init.d.base/rc.unslung start

base???

al37919
31-01-2008, 20:33
Исправил. Спасибо за _осмысленную_ поправку ;) Удачи!

Contemplator
31-01-2008, 21:45
ага, осмысливать приходится то чем зарекался никогда не заниматься :rolleyes:
предложеный Вами метод действительно IMHO получился очень правильный. ФС монтируется настолько быстро, что даже при директ подключении к инету часики иногда не успевают обновится, результат -
Jan 1 02:00:17 e2fsck: /dev/discs/disc0/part1 has gone 35801 days without being checked, check forced.
Кажется здесь http://wl500g.info/showpost.php?p=60934&postcount=5 описывался метод как это "подправить", но я никак не догоню как оно работает и возможно ли применить этот метод к WL500gP...

BlackKovu
01-02-2008, 10:08
Мы 3-я сообщениями выше обсуждали эту проблему. На 500-ке IMHO есть три варианта.
1) Получить время принудительно перед запускам чекера
2) сделать sleep на 5-30s (мне этот способ совсем не понравился)
3) если времени еще нет то пропускам чекер (я остановился на этом)

al37919
01-02-2008, 14:18
тут проблема в том, что время мы получаем из внешней сети, и вопрос что будет сделано раньше --- установлено соединение и обновлено время или дойдем до проверки дисков pre-mount . У себя в логах я вижу, что PPPoE соединение, обычно, устанавливается первым. Потом запускается ddns клиент, который, похоже и обновляет время. После этого запускается pre-mount, и только после этого ntp получает время и далее каждые 2 часа...

В общем универсальных решений я не вижу.

Вариант 3 из предыдущего поста плох тем, что возможно проверки не будет никогда. Тогда зачем весь этот огород городить.

От себя предлагаю четвертый вариант:

создать файл с текущей датой (и естественно сохранить его в flashfs):

/bin/date "+%m%d%H%M%Y" > /usr/local/etc/date

Добавить в pre-boot:

/bin/date `cat /usr/local/etc/date`

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

Возможен и еще вариант. У себя я давно вместо flashfs save && flashfs commit использую скрипт, который выполняет дополнительные действия (например на всякий случай сохраняет последнее состояние flashfs и nvram перед перезагрузкой). Так что первой комманде место как раз в этом файле.

Contemplator
01-02-2008, 14:34
От себя предлагаю четвертый вариант:

создать файл с текущей датой (и естественно сохранить его в flashfs):

/bin/date "+%m%d%H%M%Y" > /usr/local/etc/date

Добавить в pre-boot:

/bin/date `cat /usr/local/etc/date`

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

Возможен и еще вариант. У себя я давно вместо flashfs save && flashfs commit использую скрипт, который выполняет дополнительные действия (например на всякий случай сохраняет последнее состояние flashfs и nvram перед перезагрузкой). Так что первой комманде место как раз в этом файле.

или поручить это cron`у? ведь завершение работы и перезагрузка не всегда бывают корректными (гипотетически ;)) а на скрипт можно посмотреть?

al37919
01-02-2008, 14:48
положим, нас интересует не перезагрузка, а действие, которое надо выполнить перед сохранением flashfs


cat /usr/local/bin/flashsav
#! /bin/sh

LASTCOPYDIR=/opt/tmp/save/fs/last

/bin/date "+%m%d%H%M%Y" > /usr/local/etc/date

flashfs save && \
cp /tmp/flash.tar.gz $LASTCOPYDIR && \
nvram show > $LASTCOPYDIR/nvram.txt 2> /dev/null && \
echo "Copies of the latest content of flashfs and nvram are saved in $LASTCOPYDIR" && \
flashfs commit && \
rm /tmp/flash.tar.gz

exit $?

а в ~/.profile:

alias flashsave="flashsav && reboot"

djet
01-02-2008, 19:44
Вопрос, который давно меня волнует: как из bash'a запустить перезагрузку, сохранив при этом историю команд? Проблема в том, что ~/.bash_history обновлятся после выхода из bash'a.

angel_il
01-02-2008, 20:16
Вопрос, который давно меня волнует: как из bash'a запустить перезагрузку, сохранив при этом историю команд? Проблема в том, что ~/.bash_history обновлятся после выхода из bash'a.

http://www.opennet.ru/cgi-bin/opennet/man.cgi?category=1&topic=bash

history [-c] [n]
history -anrw [имя_файла]
history -p аргумент [аргумент ...]
history -s аргумент [аргумент ...]
Если опции не указаны, выдает список истории команд с номерами строк. Строки, для которых указана звездочка (*), были изменены. При указании аргумента n выдаются только последние n строк. Если указано имя_файла, список истории берется из этого файла; если файл не указан, используется значение переменной HISTFILE. Опции имеют следующие значения: -a Добавлять "новые" строки истории (строки истории, введенные с начала текущего сеанса bash) в файл истории.
-n Читать строки истории, еще не прочитанные из файла истории, в текущий список истории команд. Речь идет о строках, добавленных в файл истории с начала текущего сеанса bash.
-r Читать содержимое файла истории и использовать его в качестве текущего списка истории выполнения команд.
-w Записывать текущий список истории команд в файл истории, переписывая его текущее содержимое.
-c Очистить список истории выполнения команд, удаляя все записи.
-p Выполнить подстановку из списка истории для последующих аргументов и выдать результат в стандартный выходной поток. Результат не запоминается в списке истории. Для отключения обычной подстановки из списка истории, необходимо маскировать (брать в кавычки) каждый аргумент.
-s Сохранить аргументы в списке истории как одну запись. Последняя команда в списке истории удаляется перед добавлением аргументов.


Возвращается значение 0, если не передана недопустимая опция или при попытке чтения или записи файла истории не произошла ошибка.

angel_il
01-02-2008, 20:27
может имеет смысл и время сохранять во флэше, точнее текущее время + 20 секунд, у меня перезагрузка идет гдето секунд 15. и сразу после загрузки обновлять в сервера времени.

djet
01-02-2008, 21:06
Так ведь скрипт выполняется не в текущем шелле, а в новом.

А, придумал: ". save".

save у меня выглядит так:

#!/bin/sh
history -w
flashfs save > /dev/null 2>&1 && flashfs commit && flashfs enabled
cp /tmp/flash.tar.gz /opt/backup
nvram show > /opt/backup/nvram.txt
sync
nvram commit

Ещё есть reload :)

#!/bin/sh
echo 'Reload requested..'
source save
sleep 3
echo 'Reloading now.'
reboot


может имеет смысл и время сохранять во флэше, точнее текущее время + 20 секунд, у меня перезагрузка идет гдето секунд 15. и сразу после загрузки обновлять в сервера времени.
Тоже об этом подумал. По логу, у меня первым стартует post-firewall на 6-7 секунде.

BlackKovu
01-02-2008, 21:09
IMHO смысла нет. Все равно в стабильном режиме там даже дата будет неверной (отставать на 1-2-3 недели).

А вообще хороший вариант, у меня такая мысль промелькивала но до дела не довел и остановился на более простой проверке (тем более что в меня в 80% дата уже еспевается обновитсся (кабельный модем без всяких VPN)). Но мне нравиться - имлеменитрую у себя похожую схему.

al37919
01-02-2008, 21:17
вообще то, вот это:
/bin/date "+%m%d%H%M%Y" > /usr/local/etc/date
сохраняет и дату и время ;) 20 секунд ИМХО непринципиальны.

А вот сохранение flashfs при каждой перезагрузке --- дискуссионный вопрос. Иной раз бывает желательно забыть то что там наваял.

Contemplator
02-02-2008, 19:53
А давайте попросим Oleg`a в следущей прошивке добавить переменную в NVRAM time_date (чч:мм:дд:мм:гггг) и "flashfs" останется "flashfs"-ом.

al37919
02-02-2008, 20:38
после выполнения nvram set требуется выполнять nvram commit
Так что --- что с flashfs, что с nvram --- выходит получаются те же яйца, но только вид в профиль. Просто разные области одного и того же флаша требуется перезаписывать.

Contemplator
02-02-2008, 21:24
те же, да не совсем, не важно где эти области расположены физически, важно то, что они разные и преназначения у них тоже разные. я бы даже предложил создать еще одну область (урезав nvram, его и так с избытком) и назвать ее eeprom, где бы хранились не критически важные переменные, например предложенная time_date (или date_time? ;)), в результате выполняя eeprom commit мы совершенно не рискуем повредить переменные хранящиеся с nvram

Contemplator
02-02-2008, 21:37
вот только гложут меня смутные сомненья...
у любой flash памяти имеется ресурс циклов перезаписи (а Spansion :eek: никогда не отличалась качеством), так что стоит задуматься о том с какой периодичностью перезаписывать этот участок памяти. Думаю оптимально будет переписывать time_date из pre-shutdown, а если уж будет суждено перезагрузится рутеру (электричество к примеру отключили) предварительно не сохранив время и дату - значит так ему и надо пусть чекает диски. а можно cron`у поручить, раз в сутки или даже в неделю, пусть каждый решает для себя сам.

З.Ы. вот бы еще UPS (бесперебойник) с интерфейсом к нему прикрутить, то вообще была бы песня, но это совсем другая тема....

angel_il
02-02-2008, 23:34
З.Ы. вот бы еще UPS (бесперебойник) с интерфейсом к нему прикрутить, то вообще была бы песня, но это совсем другая тема....
вот тут вот процесс настройки ups неплохо изложен
http://www.opennet.ru/base/sys/smart_ups_nut.txt.html

как нибудь сегодня поищу шнурок и попробую подключить управление. года 4 назад настраивал на своем инет серваке когда еще был админом ;). все прекрасно работало.

Contemplator
04-02-2008, 12:50
тут проблема в том, что время мы получаем из внешней сети, и вопрос что будет сделано раньше --- установлено соединение и обновлено время или дойдем до проверки дисков pre-mount . У себя в логах я вижу, что PPPoE соединение, обычно, устанавливается первым. Потом запускается ddns клиент, который, похоже и обновляет время. После этого запускается pre-mount, и только после этого ntp получает время и далее каждые 2 часа...

В общем универсальных решений я не вижу.

Вариант 3 из предыдущего поста плох тем, что возможно проверки не будет никогда. Тогда зачем весь этот огород городить.

От себя предлагаю четвертый вариант:

создать файл с текущей датой (и естественно сохранить его в flashfs):

/bin/date "+%m%d%H%M%Y" > /usr/local/etc/date

Добавить в pre-boot:

/bin/date `cat /usr/local/etc/date`

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

Возможен и еще вариант. У себя я давно вместо flashfs save && flashfs commit использую скрипт, который выполняет дополнительные действия (например на всякий случай сохраняет последнее состояние flashfs и nvram перед перезагрузкой). Так что первой комманде место как раз в этом файле.

/bin/date `cat /usr/local/etc/date` из командной строки работает, а из pre-boot нет. И по моему pre-boot вообще не обрабатывается, прошивка WL500gp-1.9.2.7-8.12.trx

Contemplator
04-02-2008, 16:11
/bin/date 020400492008 из командной строки работает, а из pre-boot нет. :mad: прошивка WL500gp-1.9.2.7-8.12.trx
да и по pre-shutdown не все ясно, а где shutdown или как он должен выглядеть?

BlackKovu
04-02-2008, 20:11
Проверить несложно
logger "pre-boot: started"

Если запусить вручную pre-boot - работает? Может шелл неверное прописан.

al37919
04-02-2008, 20:52
это как раз не способ, т.к. pre-boot запускается до syslogd, следовательно в логе ничего не будет.

Я знаю, что он у меня запускается, например, потому, что там прописан insmod ipt_recent и после загрузки я вижу ipt_recent с помощью lsmod

Contemplator
04-02-2008, 21:54
Ну понятно, опять не получится часики вправить, pre-boot слишком рано, а post-boot слишком поздно, т.к. к моменту запуска pre-boot /bin еще не подмонтирован.
ipt_recent отрабатывает потому что (спасибо Олегу) он уже в прошивке.

al37919
04-02-2008, 22:07
ну что ж, возможно, что и так, однако, все равно не соглашусь насчет /bin: echo и awk отрабатывают успешно. Хотя date действительно не срабатывает.

al37919
04-02-2008, 22:29
Батенька Contemplator --- а Вы, однако, в заблуждение вводите. Не запускается ipt_recent сам без ручного прописывания в pre-boot... Вот так то.

Contemplator
05-02-2008, 01:15
al37919, ладно я не так выразился, а Вы не так поняли:
"ipt_recent отрабатывает из pre-boot потому, что (спасибо Олегу), он уже в прошивке"
я это хотел сказать.
И awk в /bin нету - он в ядре и echo там же...
И вообще где Олег? :eek: без него часы полюбому не победить...:D

al37919
05-02-2008, 07:29
Вы свои бредовые идеи держите лучше при себе :)
В /bin есть busybox, а echo, awk и date --- это апплеты бизибокса. Кроме того, ipt_recent я гружу из /usr/local/lib

Итого, объективные факты:
1) pre-boot выполняется
2) squashfs (содержащая /bin /sbin /usr/bin /usr/sbin итд), а также ramfs к этому моменту доступны
3) date 010101012000 > /tmp/date.log 2>&1 выполняется и выводит в /tmp/date.log следующее: Sat Jan 1 01:01:00 MSK 2000
4) Однако, несмотря на все это --- время не меняется.
5) Время меняется после отработки ddns update:

Jan 1 03:00:13 ddns: ddns update ok
Feb 5 01:48:55 pre-mount: 59f/c41/0 started.
6) ntp client запускается существенно позже во время запуска демонов из rc.unslung и не делает никакой полезной работы.

Почему наблюдается пункт 4 --- неясно.

А с пунктом 5 мне просто повезло, т.к. PPPoE через ADSL устанавливается очень быстро --- где-то на 8й секунде, так что описываемой проблемы с кривым временем во время выполнения e2fsck у меня нет.

P.S. А еще бывает вот так:

Jan 1 03:00:13 ddns: ddns update ok
Jan 1 03:00:18 dnsmasq[75]: DHCPDISCOVER(br0) 00:0e:35:15:ec:4b
Jan 1 03:00:18 dnsmasq[75]: DHCPOFFER(br0) 192.168.1.60 00:0e:35:15:ec:4b
Jan 1 03:00:18 dnsmasq[75]: DHCPREQUEST(br0) 192.168.1.60 00:0e:35:15:ec:4b
Jan 1 03:00:18 dnsmasq[75]: DHCPACK(br0) 192.168.1.60 00:0e:35:15:ec:4b hp-lcpm
Jan 1 03:00:18 pre-mount: 59f/c41/0 started.
Feb 5 09:43:08 e2fsck: /dev/discs/disc0/part2: clean, 17145/245280 files, 116278/489982 blocks
Так что почему ddns (если это он время получает --- а почему бы и нет) ждет 5 сек чтобы его применить...? А может не он?

andyqp
05-02-2008, 11:46
Извините, если что не понял - я в этой сфере тотальный чайник: проблема в том, что какие-то с файлсистемой связанные процессы должны запускаться после того, как установилось время? Из трэда понял (по дискуссиям, на какой секунде время поправляется), что установка времени происходит асинхронно с процессом монтирования.
Тогда почему нельзя просто (?) написать цыкл (с ограничением на, скажем, минуту), который в нужном месте ждет, пока не установится date?
Если идея годится - киньте сюда результат пожалуйста. Я пока еще сам не сумею красиво написать (см. начало).

Спасибо,
Andris

Contemplator
05-02-2008, 12:21
Соглашаюсь, я отчаявшийся дилетант, а Вы славно потрудились и разложили все по полочкам. Но, тем е менее вопрос остается открытым и думаю без в вмешательства Олега врядли разрешится...
Сорри за флуд.

P.S. Для себя проблему решил проще - sleep 1 первой строкой в pre-mount:

Jan 1 02:00:06 dhcp client: deconfig: lease is lost
Jan 1 02:00:06 udhcpc[94]: Lease of 91.149.xxx.9 obtained, lease time 86400
Feb 5 14:01:51 dnsmasq[73]: read /etc/hosts - 5 addresses
Feb 5 14:01:51 dnsmasq[73]: reading /tmp/resolv.conf
Feb 5 14:01:51 dnsmasq[73]: using nameserver 213.184.238.25#53
Feb 5 14:01:51 dnsmasq[73]: using nameserver 213.184.238.6#53
Feb 5 14:01:52 dhcp client: bound IP : 91.149.xxx.9 from 91.149.xxx.1
Feb 5 14:01:52 dropbear[114]: Running in background
Feb 5 14:01:54 kernel: usb_control/bulk_msg: timeout
Feb 5 14:01:54 kernel: usb.c: USB device not accepting new address=2 (error=-145)
Feb 5 14:01:54 kernel: hub.c: new USB device 01:03.2-3, assigned address 3
Feb 5 14:01:54 kernel: scsi0 : SCSI emulation for USB Mass Storage devices
Feb 5 14:01:54 kernel: Vendor: USB-HS Model: HITACHI_DK23DA-3 Rev: 0.01
Feb 5 14:01:54 kernel: Type: Direct-Access ANSI SCSI revision: 02
Feb 5 14:01:54 kernel: Attached scsi disk sda at scsi0, channel 0, id 0, lun 0
Feb 5 14:01:55 kernel: SCSI device sda: 58605120 512-byte hdwr sectors (30006 MB)
Feb 5 14:01:55 kernel: Partition check:
Feb 5 14:01:55 kernel: p1 p2 p3
Feb 5 14:02:01 ntp client: Synchronizing time with pool.ntp.org ...
Feb 5 14:02:03 e2fsck: /dev/discs/disc0/part1: clean, 83/3476160 files, 1042621/6948112 blocks

так кто ж все-таки время получает?....

Oleg
05-02-2008, 12:50
Есть простой вариант: нужно просто отключить проверку по прохождению "слишком большого времени" (это нам не актуально, вряд ли у кого-то аптайм роутера будет год). И всё.

Посмотреть текущие настройки можно так:
tune2fs -l /dev/discs/disc0/part1

Запретить подобную проверку:
tune2fs -i 0 /dev/discs/disc0/part1

al37919
05-02-2008, 19:56
О! Ядреныть! Хотели Олега --- получайте: http://wl500g.info/showpost.php?p=81358&postcount=54

Vofik
14-02-2008, 17:29
Дайте пожалуйста скрипт для проверки диска (автопроверка, для cron)
1. pre-shutdown
2. отмонтировать disk0_1
3. проверить диск
4. если проверка прошла успешно, то смонтировать обратно disk0_1 и выполнить post-mount
5. если нет - мигать диодом питания (прога pwrled)

ВСЕ опирации должны иметь ЛОГИ, желательно в /tmp/proverka

Кто напишет сей чудный чудный скрипт?;)

Serge_K
14-02-2008, 18:29
Дайте пожалуйста скрипт для проверки диска (автопроверка, для cron)
1. pre-shutdown
2. отмонтировать disk0_1
3. проверить диск
4. если проверка прошла успешно, то смонтировать обратно disk0_1 и выполнить post-mount
5. если нет - мигать диодом питания (прога pwrled)

ВСЕ опирации должны иметь ЛОГИ, желательно в /tmp/proverka

Кто напишет сей чудный чудный скрипт?;)

Лучше всего все сделать по образу и подобию того, как описал наш Гуру:
http://wl500g.info/showthread.php?t=12221&highlight=%F0%E0%E7%EC%FB%F8%EB%E5%ED%E8%FF

Serge_K
17-02-2008, 18:23
У меня файл pre-shutdown вышел таким:

#! /bin/sh

/opt/etc/init.d/rc.unslung stop

for i in `awk '/ext3/{print($1)}' /etc/fstab`
do
mount -o remount,ro $i
done

swapoff -a

sleep 5s

А не правильнее здесь /proc/mounts вместо /etc/fstab ?

al37919
17-02-2008, 19:06
вероятно, да. В принципе, полагаю, что проблемы в любом случае нет, т.к. даже если мы будем пытаться перемонтировать какую то строку из fstab, которая на самом деле не смонтирована, то будет выдано сообщение об ошибке и продолжится выполнение остального. Однако, поскольку /proc/mount содержит список реально смонтированных на данный момент фс, то его использование в данном контексте действительно должно быть более корректным.

angel_il
17-02-2008, 19:44
кстати, mount который ставится из ipk пакета в opt, он использует /etc/mtab а так как /opt/bin идет первым в PATH то пришлось сделать символическую ссылку с этим именем на /proc/mounts иначе mount из opt ругается на отсутствие mtab

ABATAPA
22-02-2008, 13:20
кстати, mount который ставится из ipk пакета в opt, он использует /etc/mtab а так как /opt/bin идет первым в PATH то пришлось сделать символическую ссылку с этим именем на /proc/mounts иначе mount из opt ругается на отсутствие mtab

Этот mount еще и неправильно отображает информацию о смонтированных с опцией '--bind' разделах, например, после
$ mount --bind /tmp/mnt/disc0_1/opt /opt
он показывает:
$ mount
...
/dev/discs/disc0/part1 on /tmp/mnt/disc0_1 type ext3 (rw,noatime)
/dev/discs/disc0/part1 on /opt type ext3 (rw,noatime)

Тогда как "взрослый" mount умеет показывать так (после mount --bind /etc /tmp/etc):
/etc on /tmp/etc type none (rw,bind)
хотя `cat /proc/mounts` тоже показывает
/dev/sda2 /tmp/etc ext3 rw,data=ordered 0 0
т.е. не упоминает 'bind'.

boby7
09-03-2008, 22:43
После всех манипуляций описаных в первых постах , у логе появляется сообжение


Mar 10 00:31:09 kernel: Out of Memory: Killed process 129 (e2fsck).

Как исправить?

al37919
09-03-2008, 22:53
каков объем диска?

а вообще в pre-mount перед циклом проверок добавить swapon -a

boby7
09-03-2008, 23:12
каков объем диска?

а вообще в pre-mount перед циклом проверок добавить swapon -a

250G ____________________

boby7
10-03-2008, 20:47
каков объем диска?

а вообще в pre-mount перед циклом проверок добавить swapon -a

Спасибо, вроте получилось

al37919
10-03-2008, 20:56
где то до 140-150 Мб проверка проходит успешно без подключения свопа. Потом отваливается. Я это не сразу понял, т.к. у меня 120Гб. Теперь подновил первый пост.

Serge_K
17-03-2008, 11:40
Заметил такую фишку - поскольу к моменту запуска pre-mount время может еще не обновитстся что первые несколько раз у чекера сьезжала крыша и он писал что диск не проверялся много лет.
:)
Подумалось тут: коль скоро этот вопрос у многих возникает, может это как-то в скрипте обработать? Сам не сделаю - не от ленности, а от нехватки знаний.:( Но мысли есть: мы же можем перед запуском чекера получить текущий год в системе? Как-нибудь вот так:
date | awk '{print $6}'
Далее: если год = 1970, то время не успело синхронизироваться, и чекер не запускаем, если не равен 1970 - синхронизировалось и запускаем чекер.

al37919
17-03-2008, 11:58
Я думаю оптимальное решение предложил (как обычно) Олег:
http://wl500g.info/showpost.php?p=81358&postcount=54

Я пытался менять дату в pre-boot и еще где то --- она не хочет меняться... Чтобы синхронизироваться нужно наличие инета. Если там что-то отвалилось, то роутер вообще не загрузится. Тогда еще нужна проверка по таймауту... В общем, сложно все это получается. f.s. подкрутить гораздо проще получается.

Serge_K
17-03-2008, 12:14
Я думаю оптимальное решение предложил (как обычно) Олег:
http://wl500g.info/showpost.php?p=81358&postcount=54

Я пытался менять дату в pre-boot и еще где то --- она не хочет меняться... Чтобы синхронизироваться нужно наличие инета. Если там что-то отвалилось, то роутер вообще не загрузится. Тогда еще нужна проверка по таймауту... В общем, сложно все это получается. f.s. подкрутить гораздо проще получается.
И то верно. Пропустил. Спасибо!

Cranch
24-03-2008, 21:03
Вот мой pre-mount:


#!/bin/sh
/bin/grep -q /dev/discs/disc0/part3 /proc/mounts || \
/sbin/e2fsck -p /dev/discs/disc0/part3 2>&1 | /usr/bin/logger -t e2fsck


Я так и не понял, каким образом у уважаемого Олега такой per-mount проверяет /opt?

У меня второй раздел смонтирован на
/dev/discs/disc0/part2 988244 170748 767296 18% /opt

В логе только чек третьего:


Mar 24 22:42:49 e2fsck: /dev/discs/disc0/part3: clean, 47/60866560 files, 2688108/121718480 blocks

подскажите, плз., как я должен модифицировать pre-mount, чтобы проверялись все разделы?

Oleg
24-03-2008, 21:13
Так это просто пример был. :) Добавьте такую же строчку, заменив part3 на part2 (где у Вас /opt) и будет счастье.

al37919
24-03-2008, 21:32
а в чем проблема то --- в первом посте приводится пример, как это проделать в цикле для всех ф.с. поименованных в fstab. Что именно не работает?

Или нас clean не устраивает ;)

Cranch
25-03-2008, 10:13
Так это просто пример был. :) Добавьте такую же строчку

Вот что у меня получилось:


#!/bin/sh
swapon -a
/bin/grep -q /dev/discs/disc0/part2 /proc/mounts || \
/sbin/e2fsck -p /dev/discs/disc0/part2 2>&1 | /usr/bin/logger -t e2fsck
/bin/grep -q /dev/discs/disc0/part3 /proc/mounts || \
/sbin/e2fsck -p /dev/discs/disc0/part3 2>&1 | /usr/bin/logger -t e2fsck
chmod +x /usr/local/sbin/pre-mount


В логе тоже самое - как будто к моменту исполнения pre-mount /opt уже смонтировался, и проверка послана, а /disc0_3 не смонтировался, и она исполнена.

Cranch
25-03-2008, 10:24
а в чем проблема то --- в первом посте приводится пример

В первом посте или в третьем посте? Или с поправками из пятого поста?

Слишком многа букаф, половину из которых я ниа... т.е. я остановился на варианте Олега, потому-что он мне по крайней мере понятен. Да и как работает fstab, мне не ясно - монтирование происходит независимо от имеющихся разделов, сообразно таблице?

А в pre-mount происходит чек этой таблицы? Но ведь swap не чекается? В общем, я буду благодарен, если вы скажете, каким же вариантом мне пользоваться и как часто будет срабатывать e2fschk - потому-что полная проверка полутерабайтника утомительна.

Проверки по левому периоду времени (по совету Олега) отключил для обоих разделов - да у меня и ntp.pool.org успевает отработать... я там sleep'ов понабил везде.:)

al37919
25-03-2008, 12:31
в первом. А как часто срабатывать будет зависеть от успешной настройки pre-shutdown, кроме того, рутинная проверка проводится после определенного числа монтирований, настраивается так же с помощью tune2fs

Cranch
25-03-2008, 15:40
в первом.

У меня вообще не срабатывает ваш pre-mount, потому-что мой fstab лежит в /tmp/local/etc и прекрасно там себя чувствует, ни на что не влияя и ни за что не отвечая - копирование же его вверх в /etc живет только до перезагрузки.

Посмотрите, пож., синтаксис в моем посте к Олегу - почему не выполняется e2fsck в отношении part2?

dimaka
25-03-2008, 15:53
копирование же его вверх в /etc живет только до перезагрузки.


нужно создать в tmp/local/ файл .files
и в нем написать /etc/fstab
после сохраниться как обычно

Cranch
25-03-2008, 18:37
Спасибо:)

Теперь ситуация такова: fstab лег в /etc, pre-mount камрада al37919 срабатывает, но чекается все равно только /part3:


Jan 1 03:00:05 kernel: Attached scsi disk sda at scsi0, channel 0, id 0, lun 0
Jan 1 03:00:05 kernel: SCSI device sda: 976773168 512-byte hdwr sectors (500108 MB)
Jan 1 03:00:05 kernel: Partition check:
Jan 1 03:00:12 kernel: p1 p2 p3
Jan 1 03:00:12 kernel: USB Mass Storage support registered.
Jan 1 03:00:13 dropbear[100]: Running in background
Jan 1 03:00:13 kernel: kjournald starting. Commit interval 5 seconds
Jan 1 03:00:13 kernel: EXT3 FS 2.4-0.9.19, 19 August 2002 on sd(8,2), internal journal
Jan 1 03:00:13 kernel: EXT3-fs: mounted filesystem with ordered data mode.
Mar 25 20:12:25 ntp client: Synchronizing time with pool.ntp.org ...
Mar 25 20:12:26 kernel: Adding Swap: 506008k swap-space (priority -1)
Mar 25 20:12:26 e2fsck: /dev/discs/disc0/part3: clean, 48/60866560 files, 2688109/121718480 blocks
Mar 25 20:12:26 kernel: kjournald starting. Commit interval 5 seconds
Mar 25 20:12:26 kernel: EXT3 FS 2.4-0.9.19, 19 August 2002 on sd(8,3), internal journal
Mar 25 20:12:26 kernel: EXT3-fs: mounted filesystem with ordered data mode.
Mar 25 20:12:26 USB storage: ext3 fs at /dev/discs/disc0/part3 mounted to /tmp/mnt/disc0_3


fstab таков:



#device Mountpoint FStype Options Dump Pass#
/dev/discs/disc0/part1 none swap sw 0 0
/dev/discs/disc0/part2 /opt ext3 rw,noatime 1 1
/dev/discs/disc0/part3 /tmp/mnt/disc0_3 ext3 rw,noatime 1 1

Serge_K
25-03-2008, 20:19
Ну сделайте уже pre-mount такого вида:


/sbin/swapon -a
for i in `/usr/bin/awk '/ext3/{print($1)}' /etc/fstab`
do
/bin/grep -q $i /proc/mounts || /sbin/e2fsck -p $i 2>&1 | /usr/bin/logger -t e2fsck
done

Cranch
25-03-2008, 23:45
Ну сделайте уже pre-mount такого вида

Дык я же написал, что после забития fstab'а в /etc у меня pre-mount именно от al37919:



#! /bin/sh
swapon -a
for i in `/usr/bin/awk '/ext3/{print($1)}' /etc/fstab`
do
/bin/grep -q $i /proc/mounts || /sbin/e2fsck -p $i 2>&1 | /usr/bin/logger -t e2fsck
done
chmod +x /usr/local/sbin/pre-mount


И именно с ним тот кусок лога, где e2fsck отрабатывает один раз. Ведь чекатются только несмонтированные в данный момент разделы? Вот мне и кажется, что на момент проверки /part2 aka /opt уже смонтирован и не проверяется.

Я хочу понять, как сделать правильно (ну, напр., в post-boot'е изменить порядок монтирования или в нем же заsleep'ить монтирование). В конце концов, меня не ломает и ручками проверить раздел раз в неделю, но хочется понять, где накосячил ... в fstab ... в pre-mount?

al37919
26-03-2008, 00:17
а что в post-boot? Рекомендованное содержимое см. в первом посте

Cranch
26-03-2008, 13:55
а что в post-boot?

Ну у вас он какой-то совсем коротенький - у меня вот:


#!/bin/sh
# Start SSH-Server
dropbear
# test if USB disc has been attached
if [ ! -d /dev/discs ]
then
insmod scsi_mod && insmod sd_mod && insmod usb-storage && sleep 20s
fi
#
#mount of /opt
mount /dev/discs/disc0/part2 /opt && sleep 5s
#
#mount of /tmp/mnt/disc0_3
mount /dev/discs/disk0/part3 /tmp/mnt/disc0_3 && sleep 2s
#
#Run all active services - active means starts with S
/opt/etc/init.d/rc.unslung
chmod +x /usr/local/sbin/post-boot

Oleg
26-03-2008, 14:06
И после этого Вы спрашиваете, почему /opt не проверяется в pre-mount? :D

Вы же его сами смонтировали, ручками.

Пассаж с insmod scsi_mod && insmod sd_mod && insmod usb-storage && sleep 20s

тоже не нужен, если USB Storage разрешён в веб-интерфейсе...

Cranch
26-03-2008, 15:34
Вы же его сами смонтировали, ручками

Теперь ясно - но я точно также смонтировал /disc0_3, а он проверяется. В чем разница?

Пассаж закомментирую.

Убил все, кроме dropbear и rc.unslung - долгожданный результат:


Mar 26 17:33:36 e2fsck: /dev/discs/disc0/part2: clean, 9748/125696 files, 46641/251015 blocks
Mar 26 17:33:36 e2fsck: /dev/discs/disc0/part3: clean, 55/60866560 files, 2693050/121718480 blocks


Если учесть, что scsi-stop у меня работает, кодировку по вашему совету я подоткнул 1251, теперь вот за файловую систему спокоен, mc поднят, осталась только одна задача - написать smb.conf, чтобы уйти от просмотра всей сеткой всех шар... уж больно не хочется самому сидеть без самбы только потому, чтобы не вывешивать свое файло всем.

К сожалению, п.10 у OlegI конкретно сбивает с толку - его пример smb.conf разительно отличается от моего, автосгенеренного - а чем заканчивается слепое переписывание FAQ'ов, вы мне сами только что показали: post-boot был от wengi, а ведь его "настройку" хвалят как гораздо более толковую, чем OlegI'шную. Две трети кода - лишние. :(

Oleg
26-03-2008, 15:36
Теперь ясно - но я точно также смонтировал /disc0_3, а он проверяется. В чем разница?

Пассаж закомментирую.

:D

/dev/discs/disk0/part3

В опечатке.

Вообще уберите это из post-boot.

Cranch
26-03-2008, 15:59
Извините, вы раньше ответили, чем я перезагрузился:) Прочитайте, пож., пост выше.

Oleg
26-03-2008, 17:01
У wengi старый туториал, который не расчитан на 1.9.2.7-9.

Что касается самбы - её вообще не стоит светить наружу. Для этого предназначен ftp сервер.

Вы добавляли правила в фаервол что-ли, чтобы открыть самбе порты наружу?

Cranch
26-03-2008, 17:19
Что касается самбы - её вообще не стоит светить наружу. Для этого предназначен ftp сервер

Да нет, именно в свою локалку не хочу показывать то, что расшариваю для себя: юзверям юзверево - но функционал в вебморде усечен, и понятно почему ... придется все-таки просить у кого-нибудь рабочий cmb.conf под вашу последнюю сборку самбы, ну а adduser я поставил, что писать в .files, понял. ;)

Ну и бессмертное:



Чего их там поднимать? Сказать только
/usr/sbin/smbd -D
/usr/sbin/nmbd -D

:D

Кстати, у меня есть хороший совет камрадам-виндусятникам, каcающийся перевода строки <CR><LF> vs <LF> во всех наших файлах - но не знаю, в какую тему кинуть, чтобы не потерялся.

piezomotor
03-04-2008, 17:45
А у меня файл fstab вообще отсутствует в папке /etc


ls
MACHINE.SID ethers ipkg.conf nsswitch.conf protocols services
TZ group ld.so.cache passwd resolv.conf smb.conf
dnsmasq.conf hosts ld.so.conf profile rpc


В чем это может быть дело?

Contemplator
03-04-2008, 17:49
А у меня файл fstab вообще отсутствует в папке /etc


ls
MACHINE.SID ethers ipkg.conf nsswitch.conf protocols services
TZ group ld.so.cache passwd resolv.conf smb.conf
dnsmasq.conf hosts ld.so.conf profile rpc


В чем это может быть дело?

его надо создать и не забыть прописать в .files ну и flashfs save && flashfs commit

Partos
13-05-2008, 16:13
От себя предлагаю четвертый вариант:

создать файл с текущей датой (и естественно сохранить его в flashfs):

/bin/date "+%m%d%H%M%Y" > /usr/local/etc/date

Добавить в pre-boot:

/bin/date `cat /usr/local/etc/date`




Я не совсем пойму, а почему нельзя добавить

/bin/date "+%m%d%H%M%Y" > /usr/local/etc/date

в pre-shutdown, а в pre-boot, как и предлагалось:

/bin/date `cat /usr/local/etc/date`

Такая комбинация сохранения времени не заработает?

rrrakim
25-09-2008, 10:14
WL-HDD с usb-flash

post-boot
mount /tmp/mnt/disc0_1/opt /opt
mkdir /var/tmp/mycfg
mkdir /var/tmp/mycfg/etc
cp /opt/mpcs.conf /var/tmp/mycfg/etc
cp /opt/mpcs.user /var/tmp/mycfg/etc
cp /opt/mpcs.server /var/tmp/mycfg/etc
cp /opt/mpcs /var/tmp/mycfg

при загрузке папки создаются а файлы не копируются
скорее всего из-за того что флешка неуспела смонтироваться
если post-boot запустить в ручную то всё ок.
Объясните пожалуйста на пальцах что надо ещё дописать
а то всё читаю-читаю никак не врублюсь

Cd_spb
25-09-2008, 11:34
sleep 10
В секундах

rrrakim
25-09-2008, 11:57
sleep 10
В секундах

Спасибо получилось

euseller
06-11-2008, 00:51
вроде сделал себе fstab, прописал шотдаун и загрузку...а в логе ничего нет - как были строчки так все и осталось...а нет лога - как искать ошибку?



Jan 1 03:00:07 kernel: kjournald starting. Commit interval 5 seconds
Jan 1 03:00:07 kernel: EXT3-fs warning: mounting fs with errors, running e2fsck is recommended
Jan 1 03:00:07 kernel: EXT3 FS 2.4-0.9.19, 19 August 2002 on sd(8,2), internal journal
Jan 1 03:00:07 kernel: EXT3-fs: recovery complete.
Jan 1 03:00:07 kernel: EXT3-fs: mounted filesystem with ordered data mode.
Jan 1 03:00:08 kernel: Adding Swap: 506008k swap-space (priority -1)
Jan 1 03:00:08 kernel: usb.c: deregistering driver usblp
Jan 1 03:00:16 dropbear[153]: Child connection from ::ffff:192.168.1.4:53715
Nov 6 02:38:46 dropbear[153]: exit before auth: Timeout before auth
Nov 6 02:38:47 kernel: kjournald starting. Commit interval 5 seconds
Nov 6 02:38:47 kernel: EXT3-fs warning: mounting fs with errors, running e2fsck is recommended
Nov 6 02:38:47 kernel: EXT3 FS 2.4-0.9.19, 19 August 2002 on sd(8,3), internal journal
Nov 6 02:38:47 kernel: EXT3-fs: recovery complete.
Nov 6 02:38:47 kernel: EXT3-fs: mounted filesystem with ordered data mode.
Nov 6 02:38:47 USB storage: ext3 fs at /dev/discs/disc0/part3 mounted to /tmp/mnt/disc0_3

al37919
06-11-2008, 06:50
надо вручную прогнать e2fsck, т.к. e2fsck -p насколько я помню исправляет не все ошибки, а только то, что можно исправить на лету. О чем собственно и говорит это сообщение:

Jan 1 03:00:07 kernel: EXT3-fs warning: mounting fs with errors, running e2fsck is recommended
Кстати, своп, по идее, должен подключаться до монтирования и проверки дисков

euseller
06-11-2008, 11:19
может не успевает своп...я делал давно по туториалу олега вроде...
а вручную прогнать да расмонтировать не могу, я бы прогнал, так никак.

Danya0w
18-11-2008, 23:01
делал по первому посту, немного поправив под себя. в итоге вот что получилось.

ДО:


Nov 17 22:51:42 kernel: kjournald starting. Commit interval 5 seconds
Nov 17 22:51:42 kernel: EXT3 FS 2.4-0.9.19, 19 August 2002 on sd(8,0), internal journal
Nov 17 22:51:42 kernel: EXT3-fs: recovery complete.
Nov 17 22:51:42 kernel: EXT3-fs: mounted filesystem with ordered data mode.
Nov 17 22:51:42 USB storage: ext3 fs at /dev/discs/disc0/disc mounted to /tmp/mnt/disc0


ПОСЛЕ того как прочекал флешку e2fsck -p и ребутнул девайс, то стало так:


Jan 1 03:00:22 kernel: kjournald starting. Commit interval 5 seconds
Jan 1 03:00:22 kernel: EXT3 FS 2.4-0.9.19, 19 August 2002 on sd(8,0), internal journal
Jan 1 03:00:22 kernel: EXT3-fs: mounted filesystem with ordered data mode.
Jan 1 03:00:22 USB storage: ext3 fs at /dev/discs/disc0/disc mounted to /tmp/mnt/disc0


судя по отсутствию записи recovery complete финт заработал как я понял?
да и e2fsck -p больше не ругается некоторыми процентами non-contiguous,
но то, что говорит что восстановил журнал - это нормально?
а вот fstab почему то не хочет сохраняться в /etc - в чем фишка?

userouter
19-11-2008, 02:28
нашёл вот такой код для настройки rtorrent

/usr/local/sbin/pre-shutdown

#!/bin/sh
# This one is simple. I send signal INT to rtorrent
# to tell it to do a graceful shutdown that will make
# it save its hashes and full status. (You need to
# enable sessions with session=dir in rtorrent.rc
# for this to work!):
/bin/kill -INT $(/bin/pidof rtorrent) &
# Then I wait for 10 seconds to be sure it died
# gracefully. The rtorrent docs say it dies in 5,
# I just wanna make extra sure.
/bin/sleep 10

меня интересует строка /bin/sleep 10
и строка в этой теме sleep 5s в одноимённом скрипте
Вопрос: эти команды одинаковы?
можно написать sleep 10s ?
короче я хочу объединить оба варианта кода в один

Alexander B.
19-11-2008, 07:42
меня интересует строка /bin/sleep 10
и строка в этой теме sleep 5s в одноимённом скрипте
Вопрос: эти команды одинаковы?
можно написать sleep 10s ?
короче я хочу объединить оба варианта кода в один

Из man sleep (находится гуглем):

SYNOPSIS
sleep NUMBER[SUFFIX]...
sleep OPTION

DESCRIPTION
Pause for NUMBER seconds. SUFFIX may be `s' for seconds (the default), `m' for minutes, `h' for hours or `d' for days. Unlike most implementations that require NUMBER be an integer, here NUMBER may be an arbitrary floating point number.

Cd_spb
19-11-2008, 11:28
нашёл вот такой код для настройки rtorrent
меня интересует строка /bin/sleep 10
и строка в этой теме sleep 5s в одноимённом скрипте
Вопрос: эти команды одинаковы?
можно написать sleep 10s ?
короче я хочу объединить оба варианта кода в один

Одинаковые, если их запускать из телнета. При запуске из pre- и post- обязательно давать полные пути. Т.е. /bin/sleep (значение в секундах)

userouter
19-11-2008, 11:43
Одинаковые, если их запускать из телнета. При запуске из pre- и post- обязательно давать полные пути. Т.е. /bin/sleep (значение в секундах)

тогда почему в первом посте в коде написано просто sleep ??

Alexander B.
19-11-2008, 11:46
Одинаковые, если их запускать из телнета. При запуске из pre- и post- обязательно давать полные пути. Т.е. /bin/sleep (значение в секундах)

Хм... опыт показывает, что PATH в этих скриптах все-таки определен. По крайне мере, вот это успешно работает:

[user@router ~]$ sudo cat /usr/local/sbin/post-boot
#!/bin/sh
dropbear

т.е. даже в /usr/sbin находит программу без указания пути.

Alexander B.
19-11-2008, 11:49
тогда почему в первом посте в коде написано просто sleep ??
Потому что если указать имя исполняемого файла без пути, то он ищется во всех каталогах, указанных в переменной среды PATH (механизм, кстати, и в виндах ровно такой же, так что для понимания этого не надо быть линуксоидом). Поскольку уверенности, что эта самая PATH уже определена на момент исполнения скрипта, нет, то лучше указывать полный путь. Хотя опыт подсказывает, что все нормально - см. мой предыдущий пост, но лучше перестраховаться.

angel_il
19-11-2008, 18:20
но лучше перестраховаться.

в том то и дело что есть бизибоксовые утилиты а есть поставленные из pkg и отдавать на откуп железке выбор того откуда пускать в некоторых случаях никак нельзя.

al37919
22-11-2008, 22:07
дело действительно в том, что находится в переменной PATH в момент выполнения скрипта. Проблема в том, что при выполнении скрипта из pre-*/post-* и просто из консоли в PATH скорее всего будут разные значения, что сильно затрудняет отладку таковых скриптов.

чтобы разобраться что там находится в любой момент времени, полезно в начале файла добавить что то типа

set > "/tmp/set.log"

Для того, чтобы исключить неуверенность можно либо в начале файла добавить строку

PATH=...
т.е. прописать PATH в явном виде (что, на самом деле, проще всего), либо прописывать полные пути ко всем выполняемым утилям.

Однако, на самом деле, элемент случайности отсутствует, ибо при запуске во время старт-апа (а также, скажем, вызываемые из крона, который запущен процессом №1) --- имена утилит без путей вызывают на выполнение встроенные комманды, а при ручном запуске из коммандной строки резолвинг имен будет производиться в том порядке, в котором пути прописаны в PATH, объявленной вероятно в ~/.profile

Так что, я не считаю, что примеры из первого поста являются неправильными --- они просто максимально упрощены. Однако, в реальной жизни после некоторых изысканий я создал файл /usr/local/sbin/.vars следующего содержания:

PATH=/opt/local/bin:/opt/sbin:/opt/bin:/sbin:/bin:/usr/sbin:/usr/bin
LANG="ru_RU.UTF-8"
TZ="MSK-3MSD,M3.5.0,M10.5.0/3"
export PATH LANG TZ
и вставляю его во все файлы из /usr/local/sbin после #!/bin/sh коммандой:

. .vars

katso
21-12-2008, 13:33
Ну а итог всего поста каков? :confused:
Есть готовое решение или пообсуждали и разошлись? Кто-нить скомпилировал всё что обсуждали?
Суть данного получить что-то более внятное, способное помочь обычному пользователю.

cipipi
19-01-2009, 20:46
Вопрос знатокам:
Есть ли однозначная связь между линком и директорией:


/dev/discs/disci
/dev/scsi/hostj/bus0/target0/lun0/

Т.е. когда образуется линк на директорию устройства i=j?

Для чего надо? (для проверки целостности не смонтированных разделов)
df - узнаю подмонтированные разделы
fdisk -l - узнаю вообще какие разделы есть.

Файлом fstab пользоваться не могу, т.к. разделы гуляют (использую USB хаб)
Вообще хотел реализовать скрипт на основе этого
http://www.wl500g.info/showpost.php?p=75820&postcount=9

Только в этом затык остался... А так уже разрулил все загрузки в rc.unslug, причесал все пост и пре файлы... Не использовал автоматический rc.unslug, который самостоятельно запускает ВСЕ службы... А стартую и останавливаю служы в разделах case start stop reload списком + зависимости запуска служб от наличия или отсутствия папок + тамже открываю порты в iptables для этих сервисов. Все равно служб не десятки как на большой тачке, и контролировать запуск легче...

cipipi
24-01-2009, 17:05
Вот скриптецы.
Проблема со временем не устанена.
Но т.к. это не очень быстрые скрипты, то время успевает установиться.

pre-boot


#!/bin/sh

echo 128 > /proc/sys/net/ipv4/ip_default_ttl
insmod ipt_ttl
insmod ipt_TTL


post-boot


#!/bin/sh

export TERMINFO="/opt/share/terminfo"
export TERM="linux"

dropbear >/dev/null 2>&1

insmod scsi_mod
insmod sd_mod
insmod usb-storage

killall telnetd


pre-mount


#!/bin/sh


ECHO="/bin/echo"
DF="/bin/df"
GREP="/bin/grep"
AWK="/usr/bin/awk"
FDISK="/sbin/fdisk"
FREE="/usr/bin/free"
MKSWAP="/sbin/mkswap"
SWAPON="/sbin/swapon"
LOGGER="/usr/bin/logger"
E2FSCK="/sbin/e2fsck"
LS="/bin/ls"

DEVDIR="/dev/discs/"

SWAPDSK=$($FDISK -l | $GREP swap | $AWK '{print $1}')
if [ $($FREE | $GREP Swap | $AWK '{print($2)}') = "0" ]; then
for i in $SWAPDSK; do
if $MKSWAP -c $i > /dev/null 2>&1
then
$SWAPON $i
$ECHO "swap $i is on " | $LOGGER -t e2fsck
break
else
$ECHO "swap $i with badblocks" | $LOGGER -t e2fsck
fi
done
fi




MNTINODES=$($LS -i1 $($DF | $GREP $DEVDIR | $AWK '{print $1}') | $AWK '{print $1}')
DEV=$( $FDISK -l | $GREP part | $GREP -v swap | $GREP -v Extended | $AWK '{print($1)}')
for i in $DEV; do
if [ $($LS -1iR $i | $AWK '{print(index(MNT,$1))}' MNT="$MNTINODES") = "0" ]; then
$E2FSCK -p $i | $LOGGER -t e2fsck
fi
done


post-mount


#!/bin/sh

#Скрипт автоматического монтирования от Mam(O)n (искать на этом форуме)
AMOUNT="/tmp/local/sbin/amount"
RCUNSLUG="/opt/etc/init.d/rc.unslug"


$AMOUNT
$RCUNSLUG start


pre-shutdown


#!/bin/sh
GREP="/bin/grep"
MOUNT="/bin/mount"
AWK="/usr/bin/awk"
SWAPOFF="/sbin/swapoff"
DEVDIR="/dev/discs/"
RCUNSLUG="/opt/etc/init.d/rc.unslug"


$RCUNSLUG stop


for i in $($DF | $GREP $DEVDIR | $AWK '{print $6}')
do
$MOUNT -o remount,ro $i
done

$SWAPOFF -a
sleep 5s


PS... Ах да, выше писал про другой rc.unslug, вот пример



#! /bin/sh

LOGGER="/usr/bin/logger"
PRINTF="/usr/bin/printf"
PIDOF="/bin/pidof"
CAT="/bin/cat"
MV="/bin/mv"
LN="/bin/ln"
KILL="/bin/kill"
KILLALL="/usr/bin/killall"
TEST="/usr/bin/test"
ARPING="/opt/bin/arping"
IPTABLES="/usr/sbin/iptables"

LOCALIP="192.168.0.1"

FTPDIR=""
TORRENTDIR=""
INITDIR="/opt/etc/init.d"


case "$1" in
start)

$INITDIR/S05syslogd start
$INITDIR/S10cron start


if [ -d $FTPDIR ]; then
[ ! -n "`$PIDOF vsftpd`" ] && $IPTABLES -t nat -A VSERVER -p tcp -m tcp --dport 20:21 -j DNAT --to-destination $LOCALIP
$INITDIR/S60vsftpd start
fi

if [ -d $TORRENTDIR ]; then
if [ ! -n "`$PIDOF rtorrent`" ]; then
$IPTABLES -t nat -A VSERVER -p tcp -m tcp --dport [диапазон открываемых портов] -j DNAT --to-destination $LOCALIP
$IPTABLES -t nat -A VSERVER -p udp -m udp --dport [диапазон открываемых портов] -j DNAT --to-destination $LOCALIP
fi
$INITDIR/S80lighttpd start
$INITDIR/S99rtorrent start
fi
;;
stop)


$IPTABLES -t nat -D VSERVER -p tcp -m tcp --dport [диапазон открываемых портов] -j DNAT --to-destination $LOCALIP
$IPTABLES -t nat -D VSERVER -p udp -m udp --dport [диапазон открываемых портов] -j DNAT --to-destination $LOCALIP
$INITDIR/S99rtorrent stop
$INITDIR/S80lighttpd stop
$IPTABLES -t nat -D VSERVER -p tcp -m tcp --dport 20:21 -j DNAT --to-destination $LOCALIP
$INITDIR/S60vsftpd stop
$INITDIR/S10cron stop
$INITDIR/S05syslogd stop

;;
*)
$PRINTF "Usage: $0 {start|stop}\n" >&2
exit
;;
esac


exit 0

alex7912
19-05-2009, 15:39
помогите доработать pre-shutdown.
по приведенному здесь в начале скрипту флешка (на /opt) не перемонтировалась.
Я думал, что это из-за quagga, который запускается командой из post-mount (т.к. могу сделать стартовый скрипт для unslung). Но кажется есть и другие причины. Я просто тупо модифицировал скрипт таким образом

#! /bin/sh

/opt/etc/init.d/rc.unslung stop

/bin/sleep 6

if [ -n "`lsof -t /opt/data`" ]; then
lsof -t /opt/data |sort -n | xargs kill -9
fi
sleep 1;
if [ -n "`lsof -t /opt`" ]; then
lsof -t /opt |sort -n | xargs kill -9
fi
sleep 2;

for i in `awk '/ext3/{print($1)}' /etc/fstab`
do
mount -o remount,ro $i
done

swapoff -a

sleep 5s
т.е. добавил принудительное убитие процессов. После этого все заработало, но по видимому не совсем правильно, т.к.

$ pre-shutdown
Stopping web server: lighttpd
kill: cannot kill pid 309: No such process
kill: cannot kill pid 311: No such process
Killed
помогите пожалуйста доработать данный скрипт.

ryzhov_al
20-05-2009, 08:40
Всё в порядке.

lsof -t /opt/data - выдаёт список pid'ов, которые имеют на /opt/data открытые файлы. Сюда включены pid'ы дочерних процессов.
Далее каждому процессу из полученного списка полсылается сигнал kill -9.
Допустим, родительский процесс завершился, завершив несколько дочерних процессов. Получится, что для уже несуществующих pid'ов в цикле будет выполнена команда kill -9. Вывод сообщения
kill: cannot kill pid 309: No such process как раз указывает на этот случай.

У меня pre-shutdown проще:

#!/bin/sh
/opt/etc/init.d/rc.unslung stop
echo Killing PIDs with opened /opt/ ...
lsof -t /dev/discs/disc0/part1 | xargs kill -9

echo Killing PIDs with opened /tmp/harddisk ...
lsof -t /dev/discs/disc0/part2 | xargs kill -9
sleep 20;

echo Way to unmount /opt and /tmp/harddisk ...
umount /opt
umount /tmp/harddisk
sleep 2

mount -t ext3 -o remount,ro /dev/discs/disc0/part1
mount -t ext3 -o remount,ro /dev/discs/disc0/part2
sleep 1

1) Нет проверки на наличие процессов с открытыми файлами (if [ -n "`lsof -t /opt...), предполагается, что они всегда есть.
2) Нет сортировки pid'ов по возрастанию,
3) Пауза в 20 секунд перед отмонтированием дисков обязательна. Во-первых, rtorrent'у по документации надо до десяти секунд для корректного завершения работы. Во-вторых, при 128Мб бОльшая часть памяти занята под буфера ввода-вывода. При скорости записи на флешку 3Мб/c, требуется 20 секунд, чтобы слить на диск 60 мегабайтный буфер.
4) Делается попытка отмонтировать диск. Если это не удаётся, то...
5) Делается попытка перемонтировать разделы в режим r/о.

Флешка не перемонтировалась, скорее всего, из-за недостаточной паузы между сигналом kill -9 и командой mount -o remount,ro или из-за того, что не был поставлен пакет lsof.

al37919
20-05-2009, 09:09
в первом посте темы есть ссылка на мой более свежий вариант pre-shutdown с использованием lsof

alex7912
20-05-2009, 15:54
в первом посте темы есть ссылка на мой более свежий вариант pre-shutdown с использованием lsof


извините, но я не нахожу ее :confused:

Less
20-05-2009, 15:59
извините, но я не нахожу ее :confused:

http://www.wl500g.info/showpost.php?p=134183&postcount=37

karim
20-02-2010, 00:27
прошивка 1.9.2.7-10
та же фигня, не грузятся ни один из скриптов из sbin
хотя в ручную без проблем... куда копать?

почему могут не отрабатывать скрипты pre-boot и post-boot, вернее ни один из папки sbin?:confused:

karim
21-02-2010, 00:38
Up!

подскажите пожалуйста, уже весь форум перерыл...

Power
21-02-2010, 00:59
Up!

подскажите пожалуйста, уже весь форум перерыл...

Покажите, что говорят команды


ls -al /usr/local/sbin/
cd /usr/local/sbin/ && for i in * .* ; do [ -f "$i" ] && { echo "$i" ; hexdump -vC "$i" ;} ; done

karim
21-02-2010, 01:05
С юбилейным =)

[admin@wl500g root]$ ls -al /usr/local/sbin/
drwxr-xr-x 1 admin root 0 Jan 1 1970 .
drwxr-xr-x 1 admin root 0 Jan 1 2000 ..
-rwxr-xr-x 1 admin root 195 Feb 20 16:16 post-boot
-rwxr-xr-x 1 admin root 213 Feb 20 00:54 post-firewall
-rwxr-xr-x 1 admin root 187 Feb 20 00:54 post-mount
-rwxr-xr-x 1 admin root 138 Feb 18 20:27 pre-mount
-rwxr-xr-x 1 admin root 241 Feb 20 00:55 pre-shutdown



[admin@wl500g root]$ cd /usr/local/sbin/ && for i in * .* ; do [ -f "$i" ] && { echo "$i" ; hexdump -vC "$i" ;} ; done
post-boot
00000000 23 21 2f 62 69 6e 2f 73 68 0a 0a 6c 6f 67 66 69 |#!/bin/sh..logfi|
00000010 6c 65 3d 22 2f 6f 70 74 2f 76 61 72 2f 6c 6f 67 |le="/opt/var/log|
00000020 2f 72 6f 75 74 65 72 2e 6c 6f 67 22 0a 65 63 68 |/router.log".ech|
00000030 6f 20 22 70 6f 73 74 62 6f 6f 74 22 20 7c 20 74 |o "postboot" | t|
00000040 65 65 20 2d 61 20 22 24 6c 6f 67 66 69 6c 65 22 |ee -a "$logfile"|
00000050 20 3e 26 32 0a 0a 64 72 6f 70 62 65 61 72 20 3e | >&2..dropbear >|
00000060 20 2f 64 65 76 2f 6e 75 6c 6c 20 32 3e 26 31 0a | /dev/null 2>&1.|
00000070 63 68 6d 6f 64 20 37 37 37 20 2f 74 6d 70 0a 2f |chmod 777 /tmp./|
00000080 73 62 69 6e 2f 69 6e 73 6d 6f 64 20 73 63 73 69 |sbin/insmod scsi|
00000090 5f 6d 6f 64 0a 2f 73 62 69 6e 2f 69 6e 73 6d 6f |_mod./sbin/insmo|
000000a0 64 20 73 64 5f 6d 6f 64 0a 2f 73 62 69 6e 2f 69 |d sd_mod./sbin/i|
000000b0 6e 73 6d 6f 64 20 75 73 62 2d 73 74 6f 72 61 67 |nsmod usb-storag|
000000c0 65 0a 0a |e..|
000000c3
post-firewall
00000000 23 21 2f 62 69 6e 2f 73 68 0a 0a 6c 6f 67 66 69 |#!/bin/sh..logfi|
00000010 6c 65 3d 22 2f 6f 70 74 2f 76 61 72 2f 6c 6f 67 |le="/opt/var/log|
00000020 2f 72 6f 75 74 65 72 2e 6c 6f 67 22 0a 65 63 68 |/router.log".ech|
00000030 6f 20 22 70 6f 73 74 66 69 72 65 77 61 6c 6c 22 |o "postfirewall"|
00000040 20 7c 20 74 65 65 20 2d 61 20 22 24 6c 6f 67 66 | | tee -a "$logf|
00000050 69 6c 65 22 20 3e 26 32 0a 0a 23 20 70 6f 72 74 |ile" >&2..# port|
00000060 20 54 77 6f 6e 6b 79 4d 65 64 69 61 0a 69 70 74 | TwonkyMedia.ipt|
00000070 61 62 6c 65 73 20 2d 49 20 49 4e 50 55 54 20 2d |ables -I INPUT -|
00000080 73 20 36 33 2e 32 34 31 2e 33 31 2e 31 34 34 20 |s 63.241.31.144 |
00000090 2d 69 20 70 70 70 30 20 2d 6a 20 44 52 4f 50 20 |-i ppp0 -j DROP |
000000a0 0a 69 70 74 61 62 6c 65 73 20 2d 49 20 4f 55 54 |.iptables -I OUT|
000000b0 50 55 54 20 2d 6f 20 70 70 70 30 20 2d 64 20 36 |PUT -o ppp0 -d 6|
000000c0 33 2e 32 34 31 2e 33 31 2e 31 34 34 20 2d 6a 20 |3.241.31.144 -j |
000000d0 44 52 4f 50 0a |DROP.|
000000d5
post-mount
00000000 20 23 21 2f 62 69 6e 2f 73 68 0a 0a 6c 6f 67 66 | #!/bin/sh..logf|
00000010 69 6c 65 3d 22 2f 6f 70 74 2f 76 61 72 2f 6c 6f |ile="/opt/var/lo|
00000020 67 2f 72 6f 75 74 65 72 2e 6c 6f 67 22 0a 65 63 |g/router.log".ec|
00000030 68 6f 20 22 50 6f 73 74 6d 6f 75 6e 74 22 20 7c |ho "Postmount" ||
00000040 20 74 65 65 20 2d 61 20 22 24 6c 6f 67 66 69 6c | tee -a "$logfil|
00000050 65 22 20 3e 26 32 0a 0a 2f 6f 70 74 2f 65 74 63 |e" >&2../opt/etc|
00000060 2f 69 6e 69 74 2e 64 2f 72 63 2e 75 6e 73 6c 75 |/init.d/rc.unslu|
00000070 6e 67 20 73 74 61 72 74 20 20 0a 73 6c 65 65 70 |ng start .sleep|
00000080 20 31 35 73 0a 2f 6f 70 74 2f 65 74 63 2f 73 65 | 15s./opt/etc/se|
00000090 6e 64 73 6d 73 2f 73 65 6e 64 2e 70 68 70 20 37 |ndsms/send.php 7|
000000a0 39 32 37 34 32 33 31 38 31 38 20 d0 ee f3 f2 e5 |9274231818 .....|
000000b0 f0 20 e7 e0 e3 f0 f3 e6 e5 ed 0a |. .........|
000000bb
pre-mount
00000000 23 21 2f 62 69 6e 2f 73 68 0a 6c 6f 67 66 69 6c |#!/bin/sh.logfil|
00000010 65 3d 22 2f 6f 70 74 2f 76 61 72 2f 6c 6f 67 2f |e="/opt/var/log/|
00000020 72 6f 75 74 65 72 2e 6c 6f 67 22 0a 65 63 68 6f |router.log".echo|
00000030 20 22 50 6f 73 74 2d 6d 6f 75 6e 74 20 42 65 67 | "Post-mount Beg|
00000040 69 6e 22 20 7c 20 74 65 65 20 2d 61 20 22 24 6c |in" | tee -a "$l|
00000050 6f 67 66 69 6c 65 22 20 3e 26 32 0a 0a 65 63 68 |ogfile" >&2..ech|
00000060 6f 20 22 50 6f 73 74 2d 6d 6f 75 6e 74 20 45 6e |o "Post-mount En|
00000070 64 22 20 7c 20 74 65 65 20 2d 61 20 22 24 6c 6f |d" | tee -a "$lo|
00000080 67 66 69 6c 65 22 20 3e 26 32 |gfile" >&2|
0000008a
pre-shutdown
00000000 23 21 2f 62 69 6e 2f 73 68 0a 0a 6c 6f 67 66 69 |#!/bin/sh..logfi|
00000010 6c 65 3d 22 2f 6f 70 74 2f 76 61 72 2f 6c 6f 67 |le="/opt/var/log|
00000020 2f 72 6f 75 74 65 72 2e 6c 6f 67 22 0a 65 63 68 |/router.log".ech|
00000030 6f 20 22 70 72 65 73 68 75 74 64 6f 77 6e 22 20 |o "preshutdown" |
00000040 7c 20 74 65 65 20 2d 61 20 22 24 6c 6f 67 66 69 || tee -a "$logfi|
00000050 6c 65 22 20 3e 26 32 0a 0a 0a 2f 6f 70 74 2f 65 |le" >&2.../opt/e|
00000060 74 63 2f 69 6e 69 74 2e 64 2f 72 63 2e 75 6e 73 |tc/init.d/rc.uns|
00000070 6c 75 6e 67 20 73 74 6f 70 0a 73 6c 65 65 70 20 |lung stop.sleep |
00000080 31 30 73 0a 66 6f 72 20 69 20 69 6e 20 60 63 61 |10s.for i in `ca|
00000090 74 20 2f 70 72 6f 63 2f 6d 6f 75 6e 74 73 20 7c |t /proc/mounts ||
000000a0 20 61 77 6b 20 27 2f 65 78 74 33 2f 7b 70 72 69 | awk '/ext3/{pri|
000000b0 6e 74 28 24 31 29 7d 27 60 20 3b 20 64 6f 0a 6d |nt($1)}'` ; do.m|
000000c0 6f 75 6e 74 20 2d 6f 20 72 65 6d 6f 75 6e 74 2c |ount -o remount,|
000000d0 72 6f 20 24 69 0a 64 6f 6e 65 0a 73 77 61 70 6f |ro $i.done.swapo|
000000e0 66 66 20 2d 61 0a 73 6c 65 65 70 20 31 73 20 20 |ff -a.sleep 1s |
000000f0 0a |.|
000000f1

Power
21-02-2010, 01:15
Файлы вроде ok. А как вы определяете, что они не выполняются? Если по записи в "/opt/var/log/router.log", то скорее всего /opt не смонтирован.

karim
21-02-2010, 01:19
после перезагрузки не запускаются нужные процессы (torrent, twonky, lighttpd)

а log начал писать от безысходности...

Power
21-02-2010, 01:28
после перезагрузки не запускаются нужные процессы (torrent, twonky, lighttpd)

а log начал писать от безысходности...

Тогда лучше вставьте такую строчку (после #!/bin/sh) во все эти файлы, сохраните, перезагрузите роутер и покажите лог (тот который system log)


logger -t "`basename "$0"`[$$]" "[$*]"

Power
21-02-2010, 01:43
Файлы вроде ok.

Только сейчас заметил: у вас в файле post-mount самым первым символом идёт пробел. Его надо стереть. Из-за него, видимо, и не работает.

karim
21-02-2010, 01:47
Feb 21 02:23:13 kernel: hub.c: new USB device 00:03.1-1.1.4, assigned address 6
Feb 21 02:23:13 post-firewall[138]: [ppp0 10.228.4.75 br0 192.168.1.11 vlan1 ]
Feb 21 02:23:13 kernel: scsi1 : SCSI emulation for USB Mass Storage devices
Feb 21 02:23:13 kernel: Vendor: USB 2.0 Model: USB Flash Drive Rev: 0.00
Feb 21 02:23:13 kernel: Type: Direct-Access ANSI SCSI $
Feb 21 02:23:13 kernel: Attached scsi removable disk sdb at scsi1, channel 0, i$
Feb 21 02:23:13 kernel: SCSI device sdb: 3948544 512-byte hdwr sectors (2022 MB)
Feb 21 02:23:13 kernel: sdb: Write Protect is off
Feb 21 02:23:14 kernel: p1 p2
Feb 21 02:23:14 kernel: HTB init, kernel part version 3.16
Feb 21 02:23:14 kernel: HTB: quantum of class 10001 is big. Consider r2q change.
Feb 21 02:23:14 dropbear[153]: Running in background
Feb 21 02:23:14 kernel: HTB: quantum of class 10011 is big. Consider r2q change.
Feb 21 02:23:14 kernel: HTB init, kernel part version 3.16
Feb 21 02:23:14 kernel: printer.c: usblp0 Device ID string [143/max 1552]='MFG:$
Feb 21 02:23:14 kernel: printer.c: Parsing USBLPID...
Feb 21 02:23:15 kernel: HTB: quantum of class 10001 is big. Consider r2q change.
Feb 21 02:23:15 kernel: HTB: quantum of class 10011 is big. Consider r2q change.
Feb 21 02:23:15 PPPoE: connect to ISP
Feb 21 02:23:22 ntp client: Synchronizing time with pool.ntp.org ...
Feb 21 02:23:23 pre-mount[170]: [1307/165/100]
Feb 21 02:23:23 kernel: Adding Swap: 506008k swap-space (priority -1)
Feb 21 02:23:23 kernel: kjournald starting. Commit interval 5 seconds
Feb 21 02:23:23 kernel: EXT3-fs warning: maximal mount count reached, running e$
Feb 21 02:23:23 kernel: EXT3 FS 2.4-0.9.19, 19 August 2002 on sd(8,18), interna$
Feb 21 02:23:23 kernel: EXT3-fs: mounted filesystem with ordered data mode.
Feb 21 02:23:23 kernel: kjournald starting. Commit interval 5 seconds
Feb 21 02:23:23 kernel: EXT3-fs warning: maximal mount count reached, running e$
Feb 21 02:23:23 kernel: EXT3 FS 2.4-0.9.19, 19 August 2002 on sd(8,1), internal$
Feb 21 02:23:23 kernel: EXT3-fs: mounted filesystem with ordered data mode.
Feb 21 02:23:23 USB storage: ext3 fs at /dev/discs/disc0/part1 mounted to /tmp/$
Feb 21 02:23:24 exportfs[185]: No options for /opt/share/ : suggest (sync) to a$
Feb 21 02:23:24 exportfs[185]: /etc/exports [2]: No 'sync' or 'async' option sp$
Feb 21 02:23:56 dropbear[187]: Child connection from ::ffff:192.168.1.240:58657
Feb 21 02:23:57 dropbear[187]: password auth succeeded for 'admin' from ::ffff:$



увидел только premount

Power
21-02-2010, 01:53
Feb 21 02:23:13 post-firewall[138]: [ppp0 10.228.4.75 br0 192.168.1.11 vlan1 ]
Feb 21 02:23:23 pre-mount[170]: [1307/165/100]


увидел только premount

post-firewall есть, pre-mount есть, где-то выше должен быть post-boot (так как запустился dropbear). А про post-mount я уже написал выше.

karim
21-02-2010, 02:28
огромно спасибо за помощь!!!!
дело было в лишнем пробеле