1

Тема: Последовательность монтирования двух USB накопителей

День добрый.
Имеется китнетик ультра. В него вставлена USB флшка, на которой находится система (opkg т.п.).
Флэшка монтируется как DISK_A1. Также есть внешний жесткий диск. При подключении его во второй USB порт кинетика (при работающем маршрутизаторе) он монтирется соответственно как DISK_B1.
НО если перезагрузить кинетик с подключенными с нему флэшкой и диском, то уже флэшка станет диском B1, а веник - A1. Соответственно пропадает доступ по ссш и все прочите настройки. Проблема в том, что есть необходимость иногда забирать жесткий диск, или подключать на его место другие. Можно ли как-нибудь принудительно задать чтобы флэшка всегда монтировалась как DISK_A1?

P.S. Пытался подключать флэшку и диск в разные разъемы USB, вне зависимости от этого жесткий диск всегда монтируется первым (как DISK_A1).

P.P.S. И жесткий диск и флэшка в ext3.

Спасибо.

2

Re: Последовательность монтирования двух USB накопителей

Лучше не подключать несколько носителей. Если очень нужно - идея тут - http://forum.zyxmon.org/post5266.html#p5266
Доводите до ума и публикуйте в этой теме или пишите статью в wiki.

3

Re: Последовательность монтирования двух USB накопителей

Костыль с использованием симлинков
http://forum.zyxmon.org/post4083.html#p4083
Продолжение здесь и на следующей странице
http://forum.zyxmon.org/post5207.html#p5207
И еще продолжение
http://forum.zyxmon.org/post14627.html#p14627

4

Re: Последовательность монтирования двух USB накопителей

laforsh, спасибо, что исправили.

5

Re: Последовательность монтирования двух USB накопителей

laforsh, Zyxmon, Спасибо, почитаю.

6

Re: Последовательность монтирования двух USB накопителей

Добавлю и я пять копеек.
По скрипту laforsh конфигурация, как и у автора поста,
отказалась монтироваться..
Проблема была найдена.
Оказалось, что система по блк флешку не воспринимает.
Скрипт был модифицирован:
#!/bin/sh

MNT="/storage/system/bin/mount"
UMNT="/storage/system/bin/umount"
PNT_SYS="/media/DISK_A1"
PNT_DATA1="/media/DISK_B1"
UID_SYS="bb62c27e-d2b8-4523-b156-65d85f8d04b1"
UID_DATA1="2A8CE1D38CE19A19"
DROPBEAR="/media/DISK_A1/system/usr/sbin/dropbear"

start()
{
    if [ -f /media/DISK_B1/autorun.inf ]; then
        logger "Disk with opkg system is found in /media/DISK_A1.Exit"
    else
        logger "!!! WARNING !!! Disk with opkg system NOT FOUND in /media/DISK_A1 !!! Now we are starting procedure sorting mount points all disks."
         killall -9 $DROPBEAR transmissiond  2> /dev/null
     swapoff -a
         $UMNT $PNT_SYS                  # /storage/system/bin/umount /media/DISK_A1
         $UMNT $PNT_DATA1                # /storage/system/bin/umount /media/DISK_B1
         $MNT UUID="$UID_SYS" $PNT_SYS
         $MNT UUID="$UID_DATA1" $PNT_DATA1
    fi
#    /media/DISK_A1/system/bin/ext_init.sh start
#    /media/DISK_A1/system/bin/ext_firewall.sh
    logger "Disks mount points sorting complete."
}

stop()
{
      $UMNT $PNT_DATA1
      $UMNT $PNT_SYS
    echo "Stop section"
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        ;;
esac

И еще, каждое формтирование меняет блк дивайса.

7

Re: Последовательность монтирования двух USB накопителей

Данная тема уже неоднократно всплывает. Уже не раз я и сам хотел перенести систему на флешку, чтобы она монтировалась как DISK_A1, а жесткий диск подключить как DISK_B1, чтобы его можно было без проблем оторвать в случае чего. Но, почитав, что это не рекомендуется все не решался.

Но вот, вооружившись вашими подсказками, провернул все это дело, о чем сейчас и напишу. Прошу понять правильно, это не пошаговый мануал, а просто вариант развития идеи.
Отправной точкой является установка busybox с dropbear в /storage.
Как это делается можно найти по ссылкам (выше).

Поскольку нам нужен, в первую очередь, запуск именно из /storage, то с помощью команды (flash set EXTINIT_FROM_.....    1|0) устанавливаем системные переменные вот так:
EXTINIT_FROM_STORAGE_ENABLED="Enabled"
EXTINIT_FROM_DISK_ENABLED="Disabled"
Это заставит систему вызывать ext_init только из /storage. Если же вы что то испортите, и система не стартует, всегда можно выставить эти переменные обратно через telnet.

Еще один важный момент, это то, как система вызывает ext_init.sh:
при обнаружении USB диска (например устройства /dev/sda1), система автоматически монтирует его, и после этого вызывает
ext_init.sh start automount
Поэтому, при наличие в USB разъемах двух дисков ext_init.sh start automount будет вызвана 2 раза.
параллельно с этим идут и другие системные процессы, так что в разных случаях ext_init может быть вызвана и с другими параметрами, например ext_init.sh link_up
Можно самостоятельно исследовать поведение своего Кинетика добавив в ext_init строчку logger -t "$0" "($@)"
В моем случае последним выполняется:
ext_init.sh restart init
Именно от него я и отталкиваюсь, т.к. другие вызовы, например потеря соединения, или отключение диска меня не интересуют:

/storage/system/bin/ext_init.sh  Кстати, если вам не нужен резервный запуск dropbear из /storage скрипт можно значительно сократить, но пока оставил так:

#!/bin/sh

MOUNT="/storage/system"
INITD="$MOUNT/etc/init.d"
INIT_DISK="/media/DISK_A1/system/bin"


logger -t "$0" "($@)"

export PATH=$MOUNT/bin:$MOUNT/sbin:$MOUNT/usr/bin:$MOUNT/usr/sbin:/sbin:/usr/sbin:/bin:/usr/bin
export LD_LIBRARY_PATH=$MOUNT/lib:$MOUNT/usr/lib:/lib:/usr/lib

for_each() {
        for prog in `ls $INITD/S??*`; do
                $prog $*
        done
}

if [ "$1" == "restart" ] && [ "$2" == "init" ]; then
    ext_remount.sh
    $INIT_DISK/ext_init.sh start
    for_each start
    exit
fi


/storage/system/bin/ext_remount.sh


#!/bin/sh

#Если "ext_init" находится не на DISK_A1
#меняем местами точки монтирования, так чтобы "ext_init" оказался на DISK_A1

DISK_LIST=`mount | grep "media/DISK" | cut -f3 -d" " | cut -f3 -d"/" | grep DISK            `

swap_mountpoints(){
    SYSTEM_DISK="DISK_A1"
    ANOTHER_DISK=$1
    SYSTEM_DEVICE=`mount | grep $ANOTHER_DISK | cut -f1 -d" "`
    ANOTHER_DEVICE=`mount | grep $SYSTEM_DISK | cut -f1 -d" "`
    logger -t "$0" "swap mounpoints now: $SYSTEM_DEVICE <--> $ANOTHER_DEVICE"

    umount  /media/$SYSTEM_DISK
    umount  /media/$ANOTHER_DISK
    mount  $SYSTEM_DEVICE  /media/$SYSTEM_DISK
    mount  $ANOTHER_DEVICE /media/$ANOTHER_DISK
}

for DISK in $DISK_LIST; do
    if [ -f /media/$DISK/system/bin/ext_init.sh ] && [ "$DISK" != "DISK_A1" ]; then
        swap_mountpoints $DISK
        break
    fi
done

/storage/system/bin/ext_firewall.sh


#!/bin/sh

MOUNT="/storage/system"
FWD="$MOUNT/etc/firewall.d"
INIT_DISK="/media/DISK_A1/system/bin"


logger -t "$0" "($@)"

export PATH=$MOUNT/bin:$MOUNT/sbin:$MOUNT/usr/bin:$MOUNT/usr/sbin:/sbin:/usr/sbin:/bin:/usr/bin
export LD_LIBRARY_PATH=$MOUNT/lib:$MOUNT/usr/lib:/lib:/usr/lib

start() {
        for prog in `ls $FWD`; do
            $FWD/$prog
        done
        $INIT_DISK/ext_firewall.sh
}

start


Вот и все. Если restart init у вас как и у меня - последний вызов, диск с системой обязательно смонтируется в A1 и система запустится с него.

Подводя итог хочу рассказать какие плюсы и минусы получаются при такой схеме запуска.
+ Дисковая система нагружается более равномерно. Это как если бы на рабочем ПК стоял небольшой SSD под систему, и большой HDD под медиа-хранилище. На Кинетике получается то же самое в миниатюре.
+ Теперь можно безнаказанно оторвать жесткий диск в случае необходимости. Предварительно, конечно, нужно позаботиться об остановке DLNA, торрентов, и прочих сервисов, которые завязаны на DISK_B1. Также можно размонтировать DISK_B1 и запускать его проверку на ошибки. Планирую сделать запуск такой проверки по ночам через cron.
+ Запуск внешних служб происходит один раз при старте системы, что ускоряет их загрузку и делает журнал системы более информативным.

- Главный и единственный пока для меня минус - большинство родных служб Кинетика (minidlna, samba...), не понимает настройку через Web-морду на каталоги, расположенные на DISK_B1. Приходится отключать их в интерфейсе и запускать уже из /media/DISK_A1 с собственными конфигами.

Отредактировано SkyKilla (2013-12-13 10:30:48)

8

Re: Последовательность монтирования двух USB накопителей

SkyKilla, запуск с параметром restart может быть раньше, чем с параметром start - это зависит от множества разных факторов: холодный или горячий запуск, скорость инициализации и раскручивания шпинделя hdd и т.д.

9

Re: Последовательность монтирования двух USB накопителей

Zyxmon, понятно. Теоретически, значит может не взлететь (хотя тестировал много раз уже). Нужно будет поискать альтернативный способ однократного запуска, т.к. мне не нравится эти "старт - стоп - рестарт"  на запуске.
И еще кажется странным, что HDD у меня стартует, а значит и монтируется раньше флэшки, где ничего раскручивать не надо, но это происходит постоянно, даже в холодный запуск.

10

Re: Последовательность монтирования двух USB накопителей

SkyKilla, это у всех по разному. У меня очень редко но бывает restart раньше чем start и только при горячем перезапуске. Иногда после перепрошивки бывают интересные глюки со стартами, но не всегда.

11

Re: Последовательность монтирования двух USB накопителей

Zyxmon, какие тогда есть варианты? После первого запуска оставлять файл-флаг в /var/run и проверять его наличие при повторном. Но на момент первого запуска может так случиться что диски не инициализированы и не готовы к перемонтированию?

12

Re: Последовательность монтирования двух USB накопителей

SkyKilla, самый правильный вариант - один hdd  big_smile
PS Скрипт посмотрю позже. Можно для себя любимого скрипт составить, но нельзя утверждать, что он у всех будет работать - см. тему по двойному старту.

13

Re: Последовательность монтирования двух USB накопителей

Обнаружил еще один минус !  sad
Если диск перемонтировался скриптом по UUID то он подключается как
/dev/scsi/host0/bus0/target0/lun0/part1  вместо /dev/sda1
--
При этом драйвер туксеры при файловых операциях дает ошибки:
tntfs error (device sda1, pid 3): ntfs_end_buffer_async_read(): Buffer I/O error, logical block 0x300100.
Перемонтировал DISK_B1 через /dev/sda1 вручную - ошибки пропали.
--
Так что теперь чешу репу, как сделать без UUID. Протестирую вариант и выложу.

PS: Кстати сам /bin/automount.sh назначает букву диска DISK_?1 как раз выдергивая ее из /dev/sda1

Отредактировано SkyKilla (2013-11-29 07:42:10)

14

Re: Последовательность монтирования двух USB накопителей

У меня другой вопрос - при перезагрузке роутера все что работает с usb сначала завершается/отмонтируется и потом роутер перезагружается или на накопители ему плевать и перезагружается как есть? Пару раз выхватывал проблемы с флешкой при reboot в ssh и хочу понять - это потому что тупо всё ребутится по жесткому или нет? И как, если что, проверить файловую систему флешки до полной загрузки роутера (это было бы бесценно) как на полноценных Linux/FreeBSD? Способа, видимо нет, но есть-ли мысли? Теоретически, не получится, ведь в штатном комплекте прошивки такого не предусмотрено, а если запускать с флешки, то она уже примаунчена и прочекать нельзя. А если подумать над созданием двух разделов? Один чисто для аварии, чтобы при загрузке починить главный?
Главный минимальный для запуска всего что на главном-драгоценном. И чтобы можно было отмаунтить главный и воспользоваться средствами с этого маленького но нужного раздела.
Извиняюсь, что без абзацев - волновался)

Например, в dd-wrt прошивке есть фишка сначала всё завершить, потом отмаунтить и потом перезагрузиться, если делать это через веб и если включить+настроить такую тему - команды на завершение. Так как тут нету, предлагаю подумать как сделать.
Перенесите в правильную или новую тему, если не туда написал.

Отредактировано sirota202 (2013-11-29 08:02:51)

15

Re: Последовательность монтирования двух USB накопителей

sirota202, устанавливайте e2fsprogs в /storage - размонтируйте и проверяйте. Потом можно и автоматизацию придумать.

16

Re: Последовательность монтирования двух USB накопителей

Zyxmon, вопрос, как раз, больше об автоматизации, а ещё больше о корректном отмонтировании носителя, а не о том, как его можно починить потом.

17

Re: Последовательность монтирования двух USB накопителей

sirota202 :

Zyxmon, вопрос, как раз, больше об автоматизации, а ещё больше о корректном отмонтировании носителя, а не о том, как его можно починить потом.

UPD:
Вывел вызовы ext_init.sh в
echo  "$0 ($@)" >>  /storage/log.txt

Пару раз перегрузил из dropbear и из Web интерфейса. И что оказалось? Никаких вызовов ext_init.sh с параметром stop не обнаружил. А вот если дернуть, или остановить внешний диск, в журнал кидается stop automount. Это конечно не есть хорошо, но всегда можно написать свой reboot.sh

Отредактировано SkyKilla (2013-11-30 17:58:33)

18

Re: Последовательность монтирования двух USB накопителей

Кстати, e2fsprogs уже не влезают на /storage на последней прошивке 1.11 Giga II. Ставится то он без проблем, но e2sfsck требует либу libext2fs.so.2.4 и еще какую то, которые уже никак не влезают.

Это еще один повод расположиться на двух дисках. Можно запланировать ночную проверку хотя бы диска с данными DISK_B1 с предварительным отмонтированием.

19

Re: Последовательность монтирования двух USB накопителей

SkyKilla :

Обнаружил еще один минус !  sad
Если диск перемонтировался скриптом по UUID то он подключается как
/dev/scsi/host0/bus0/target0/lun0/part1  вместо /dev/sda1
--
При этом драйвер туксеры при файловых операциях дает ошибки:
tntfs error (device sda1, pid 3): ntfs_end_buffer_async_read(): Buffer I/O error, logical block 0x300100.
Перемонтировал DISK_B1 через /dev/sda1 вручную - ошибки пропали.
--
Так что теперь чешу репу, как сделать без UUID. Протестирую вариант и выложу.

PS: Кстати сам /bin/automount.sh назначает букву диска DISK_?1 как раз выдергивая ее из /dev/sda1

А скрипт выше почитать ?

20

Re: Последовательность монтирования двух USB накопителей

moonlight, вы говорите загадками. Но если я правильно понял, в вашем скрипте, который  выше UIDы используются. В моем решении используются имена устройств и mount непосредственно из прошивки. Кроме, того он будет работать на неограниченном количестве устройств DISK_A1 .. DISK_N1.
--
И еще, в процессе тестирования обнаружил, что драйвер ntfs выдает ошибки в любом случае. Ну кривой он по своей природе.

PS:
Обновил пост http://forum.zyxmon.org/post16612.html#p16612 - выложил скрипты и упростил текст.

Отредактировано SkyKilla (2013-11-30 17:52:35)

21

Re: Последовательность монтирования двух USB накопителей

всем доброго времени суток smile имеется желание сделать системную флешку как A1 а хард как B1, но так как в линуксе я пока чайник, прошу объяснить если я не правильно понял, что куда затолкать и что где включить smile

я так понял сначала надо

создать txt-файлы в utf-8 с именами ext_init, ext_remount, ext_firewall и расширением *.sh и затолкать в них код скриптов из соответствующий спойлеров и положить их в папку /storage/system/bin/ на флешке

после чего послать через telnet команды

flash set EXTINIT_FROM_STORAGE_ENABLED="Enabled"
flash set EXTINIT_FROM_DISK_ENABLED="Disabled"

?

22

Re: Последовательность монтирования двух USB накопителей

BackMan :

имеется желание сделать

Оставьте это желание другим. Ставьте все на хард.

23

Re: Последовательность монтирования двух USB накопителей

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

ну хоть ткните в нужном направлении, что не так я понял ?

24

Re: Последовательность монтирования двух USB накопителей

BackMan :

ну хоть ткните в нужном направлении, что не так я понял ?

положить их в папку /storage/system/bin/ на флешке

/storage - это папка не на флешке(внешней), а внутренняя флешь-память роутера. Т.е. скрипты надо помещать во внутреннюю память роутера, о том, как это можно сделать есть соответствующая тема

P.S.
Но вообще, новичку лучше в такие дебри не соваться - какбы не совсем безопасно это...

Отредактировано Dr.Acid (2014-03-25 13:09:32)

25

Re: Последовательность монтирования двух USB накопителей

Dr.Acid :

какбы не совсем безопасно это...

Если пакет на флешке - можно ее вытащить. Если в памяти - нажать кнопку reset. От пакетов ничего не останется. Ничего опасного. Не надо тут пугать бабой-ягой!