Page 1 of 9 123 ... LastLast
Results 1 to 15 of 134

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

  1. #1
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805

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

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

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

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

    Итак, после проведенного на днях апгрейда hdd мой /etc/fstab выглядит таким образом:
    PHP Code:
    #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 выглядит так:
    PHP Code:
    #! /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>&| /usr/bin/logger -t e2fsck
    done 
    Здесь на основе /etc/fstab формируется список имеющихся ф.с. и они по очереди проверяются.

    Итак, что же мы получаем при загрузке если мы выполняем подобную проверку после обыкновенной перезагрузки. Для этого смотрим в syslog и видим примерно следующее (здесь приведена картинка для старой версии, но результат в syslog.log должен выглядеть подобным образом:
    PHP Code:
    /dev/discs/disc0/part2recovering journal
    /dev/discs/disc0/part2clean15942/245280 files102559/489982 blocks (check after next mount)
    /
    dev/discs/disc0/part3recovering journal
    /dev/discs/disc0/part3clean5141/1835008 files1148511/3664828 blocks (check in 5 mounts)
    /
    dev/discs/disc0/part4recovering journal
    /dev/discs/disc0/part4clean73/12517376 files3719155/25023245 blocks (check after next mount)
    /
    dev/discs/disc1/part2recovering journal
    /dev/discs/disc1/part2clean36785/2431680 files341863/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?...3&postcount=37 ):
    PHP Code:
    #! /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 
    Результат ---
    PHP Code:
    /dev/discs/disc0/part2clean15949/245280 files102570/489982 blocks
    /dev/discs/disc0/part3clean5134/1835008 files117343/3664828 blocks (check in 3 mounts)
    /
    dev/discs/disc0/part4clean1320/12517376 files5471367/25023245 blocks
    /dev/discs/disc1/part2 has been mounted 39 times without being checkedcheck forced.
    /
    dev/discs/disc1/part236782/2431680 files (7.5non-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 у меня вышел таким:
    PHP Code:
    #! /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??*`
    [ $
    "stop" ] && daemons=`echo $daemons | /usr/bin/tr " " "\n" | /usr/bin/sort -r`

    for 
    i in $daemons; do

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

         case 
    "$iin
            
    *.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:
    PHP Code:
    #! /bin/sh

    /opt/etc/init.d/rc.unslung start 
    А post-boot у меня стал тоже чрезвычайно изящным:
    PHP Code:
    #! /bin/sh

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

    PHP Code:
    #! /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 
    Система получилась вроде довольно стройная и я решил поделиться ею с остальными членами нашего Клуба в надежде, что для кого то это может оказаться полезной информацией, а кто-то сможет сделать полезные предложения по ее улучшению.
    Last edited by al37919; 26-02-2009 at 16:16.

  2. #2
    Join Date
    Dec 2003
    Location
    Russian Federation
    Posts
    8,356
    Есть утилита e2fsck. Её и нужно вызывать.

  3. #3
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    Соглашусь, альтернативный вариант pre-mount, который делает абсолютно то же самое и не требует установки e2fsprogs и лишних параметров в /etc/fstab будет выглядеть так (возможность одновременной проверки разделов, расположенных на разных дисках, которую предостваляет fsck за серьезное преимущество в нашем случае считать так и быть не будем ):
    PHP Code:
    #! /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 ИМХО суть одно и тоже.

  4. #4
    Интересная тема
    Буду пробовать, т.к. временами возникают проблемы с торрентами

  5. #5
    Quote Originally Posted by al37919 View Post
    PHP Code:
    for i in `cat /etc/fstab | sed -n /ext3/p | awk '{print($1)}'
    Такие вещи надо писать проще:
    PHP Code:
    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-подобных системах для включения/выключения демонов...

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

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

  7. #7
    Quote Originally Posted by zap View Post
    Такие вещи надо писать проще:
    PHP Code:
    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 добавить.

  8. #8
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    Quote Originally Posted by Mr_J View Post
    а почему не нужно проверять /opt?
    /opt проверять нужно. И во всех приведенных скриптах он проверяется, только в первом случае отдельно. Олег рекомендует использовать более простой вариант, который будет проверять все единым скопом и он приведен здесь: http://wl500g.info/showpost.php?p=75394&postcount=3

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

  9. #9
    Join Date
    Dec 2003
    Location
    Russian Federation
    Posts
    8,356
    Вот мой pre-mount:

    Code:
    #!/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 существует.

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

  10. #10
    Join Date
    Dec 2003
    Location
    Russian Federation
    Posts
    8,356
    Quote Originally Posted by al37919 View Post
    точно, идея как раз в том, чтобы сделать его более функциональным --- чтобы он не только стартовал приложения, но и культурно останавливал их когда надо перезагрузитсья/выключиться.
    Беда в том, что некоторые стартовые скрипты, которые есть в /opt/etc/init.d/ умеют только стартовать сервис. Уж и не знаю, почему так.

  11. #11
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    спасибо за еще один кусочек мудрости

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

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

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

  12. #12
    Будте добры поделитесь скриптами запуска рторрента после ребута роутера .

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

  13. #13
    Quote Originally Posted by Capture View Post
    Будте добры поделитесь скриптами запуска рторрента после ребута роутера .

    спасибо и если можно опишите пожалуйста в стиле ДЛЯ ЧАЙНИКОФФ
    А что сложного в файле 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 должны быть заранее установлены

  14. #14
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    В принципе и скрипт и описание уже давно есть здесь: http://wl500g.info/showpost.php?p=66875&postcount=19

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

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

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

  15. #15
    Спасибо за подробное описанние !

Page 1 of 9 123 ... LastLast

Similar Threads

  1. Replies: 586
    Last Post: 30-01-2016, 18:32
  2. Replies: 83
    Last Post: 11-12-2012, 18:31
  3. Установки MTU в последних прошивках от Олега
    By Uncle Sharic in forum Russian Discussion - РУССКИЙ (RU)
    Replies: 12
    Last Post: 08-06-2008, 18:05

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •