Данная тема уже неоднократно всплывает. Уже не раз я и сам хотел перенести систему на флешку, чтобы она монтировалась как 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)