Results 1 to 15 of 134

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

Threaded View

Previous Post Previous Post   Next Post Next 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.

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
  •