1 (edytowany przez tinware 2020-07-15 07:17:21)

Temat: Skrypt automatyzyjący dla ExtRoot'a

Cześć,

Krótki temat... Zaczyna brakować mi miejsca na soft i myślę o ext root. W routerze mam slot na kartę microSD i chcę go wykorzystać. Mam tez skrypt hotplug, który po podłączeniu czegokolwiek pod usb/gniazdo sdcard robi mi taki symlink:

/dev/sdcard1 -> /dev/sdc1

Potrzebuję to wrzucić w własny kompilowany system i zastanawiam się na dwiema kwestiami:

1. Czy wrzucić wpis w /etc/config/fstab - chodzi, czy system poradzi sobie z podmontowaniem partycji jako symlink

uci set fstab.overlay="mount"
uci set fstab.overlay.device="/dev/sdcard1"
uci set fstab.overlay.target="/overlay"

2. Jeśli nie, będę musiał napisać skrypt, który przy pierwszym uruchomieniu i obecności tej karty microSD w tym slocie routera sprawdzi mi UUID takiej karty i ją sformatuje smile

UUID=$( block info "/dev/sdcard1" | grep -o -e "UUID=\S*" )

... następnie wpiszę w konfigurację:

uci set fstab.overlay="mount"
uci set fstab.overlay.uuid="${UUID}"
uci set fstab.overlay.target="/overlay"

Co jeśli wyjmę potem kartę? Router uruchomi się w defaulcie 192.168.1.1? Dobrze rozumuję?

2

Odp: Skrypt automatyzyjący dla ExtRoot'a

1. Albo używasz /dev/sda1 czy cokolwiek takiego, wtedy każda włożona karta z pierwszą partycją będzie używana jako extroot
2. Albo używasz uuid karty, wtedy tylko ta konkretna włożona będzie extrootem inne nie.

Pomijam fakt że kartę możesz sklonować/nadać jej taki sam uuid. Więc jak wolisz i zależy to od tego gdzie i co  i jak chcesz zrobić. Jeżeli to jeden router i karta w nim zostanie to zrób to przez uuid.

Jeżeli wyjmiesz kartę to router uruchomi się bez extroota z tym co ma we flash.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3

Odp: Skrypt automatyzyjący dla ExtRoot'a

Ok, ale czy mogę użyć takiej opcji montowania w fstab:

uci set fstab.overlay.device="/dev/sdcard1"

Czy partycja /overlay podmontuję się prawidłowo?

Chodzi o to czy podczas uruchamiania się systemu najpierw montuje się /overlay czy najpierw są wykonywane skrypty hotplug?
Jeśli najpierw jest montowany /overlay, to system nie będzie jeszcze wiedział, że /dev/sdcard1 to tak naprawdę np. /dev/sdh1

4

Odp: Skrypt automatyzyjący dla ExtRoot'a

Najpierw montowany jest extroot.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5 (edytowany przez tinware 2020-07-14 13:01:09)

Odp: Skrypt automatyzyjący dla ExtRoot'a

Widzisz, czyli nie mogę tego użyć, nie mogę użyć również /dev/sdX1, bo będzie się montował z losowego urządzenia, musiałbym napisać skrypt, który przy uruchomieniu routera sprawdzi czym jest /dev/sdcard1 (jeśli jest zainstalowana karta), wyjdzie że np. /dev/sdh1, następnie wyciągnie mi UUID tej karty, sformatuje ją, UUID wprowadzi do /etc/config/fstab i zrobi reboot.

Rozwiązanie musi być uniwersalne, działać na routerze, w którym zainstaluje taką kartę.

To czeka mnie fajna zabawa, założenia mam takie:
1. Bez włożenia karty /overlay działa na flashu routera
2. W każdym momencie po włożeniu karty i reboocie, system ma zrobić overlay na karcie, zrebutować się i uruchamiać /overlay z sdcard
3. W każdym momencie po wyjęciu karty i reboocie, system ma zrobić overlay na flashu, zrebutować się i uruchomić /overlay z sdcard
4. Jeśli to karta niepochodząca z routera, nie ma odpowiedniej struktury pierwszych folderów - ma ją sformatować
5. Kartę ext root można wymieniać pomiędzy routerami, aby router A stał się routerem B, a B stał się routerem A

6 (edytowany przez tinware 2020-07-14 16:42:01)

Odp: Skrypt automatyzyjący dla ExtRoot'a

Cześć, karta SD zgłasza się w systemie dosyć wyjątkowo jako:

# ls /dev/mmc*
/dev/mmcblk0    /dev/mmcblk0p1

Teraz pytanie, co musiałbym zrobić, aby pojawiło mi się inne urządzenie mmcblk1?
Pytam dlatego, że chce wykluczyć możliwość podmontowania złej partycji od innego urządzenia przez podłączenie do urządzenia innego urządzenia, które mogłoby się zgłosić jako właśnie mmcblkX.

Router to oczywiście UniElec u7621-06. Dodam, że inne sloty karty SD np. z modemu Huawei e3372h-153 oraz ta karta o której mowa, tylko zainstalowana prze adapter do USB zgłaszają się w systemie jako sdX.

Czy dobrze rozumiem, że nie ma szans, aby uzyskać w jakiś sposób urządzenie mmcblk1 w systemie?

https://images92.fotosik.pl/396/5f65731d7973cccegen.png

https://images90.fotosik.pl/395/5ae509aef8804aee.png

7

Odp: Skrypt automatyzyjący dla ExtRoot'a

Nie pojawi się. Jest jeden interfejs do karty SD, więc jest jedno urządzenie /dev/mmcblk0. p1 itd to partycje.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

8 (edytowany przez tinware 2020-07-15 00:19:28)

Odp: Skrypt automatyzyjący dla ExtRoot'a

To problem rozwiązał się sam, będę montował na:

uci set fstab.overlay.device="/dev/mmcblk0p1"

Więc tak:

1. W /etc/config/fstab dopisuje taki wpis:

config mount 'overlay'
    option enabled '1'
    option device '/dev/mmcblk0p1'
    option target '/overlay'

2. I teraz plik /etc/rc.local dopisuje taki skrypt, jeszcze testuje w nim wszystkie przypadki, może masz sugestie jakiś zależności:

DEVICE="/dev/mmcblk0"
PARTITION="/dev/mmcblk0p1"
if [ -b "${DEVICE}" ] && \
( [ ! "$( /sbin/block info "${PARTITION}" | /bin/grep -o -e "TYPE=\S*" )" = "TYPE=\"ext4\"" ] || \
[ "$( /bin/ls "${DEVICE}"* | /usr/bin/wc -l )" -ne 2 ] || \ 
[ "$( /sbin/uci -q get fstab.overlay.device )" = "${PARTITION}" ] ); then
  echo "timer" > "/sys/class/leds/u7621-06:green:led4/trigger"
  echo "100" > "/sys/class/leds/u7621-06:green:led4/delay_on"
  echo "100" > "/sys/class/leds/u7621-06:green:led4/delay_off"
  /bin/dd if="/dev/zero" of="${DEVICE}" count=2049 2&>1 > /dev/null
  echo -e "o\nn\np\n1\n\n\nw" | /usr/sbin/fdisk "${DEVICE}" 2&>1 > /dev/null
  yes | /usr/sbin/mkfs.ext4 "${PARTITION}" 2&>1 > /dev/null
  echo "none" > "/sys/class/leds/u7621-06:green:led4/trigger"
  echo "1" > "/sys/class/leds/u7621-06:green:led4/brightness"
  reboot
fi

Skrypt ma rozwalić tabele partycji na karcie microSD, utworzyć jedną partycję vfat i następnie nagrać na nią system plików ext4 jeśli:
1. karta SD włożona jest do gniazda
2. wystąpi przynajmniej jedna z poniższych zależności:
A. pierwsza partycja karty sd nie ma systemu pliku ext4
B. jeśli karta sd nie ma jednej partycji (nie ma jej wcale lub ma więcej niż jedną)
C. jeśli system uruchomi się bez ExtRoota, mimo że karta jest zainstalowana, w razie jakiejś awarii router będzie resetował się w kółko, dzięki temu też jeśli karta trafi z innego routera też powinna zostać sformatowana, tak mi się wydaje

Problem jest następujący:
jeśli użyję kartę sformatowaną już w ten sposób przez inny router i mam tego IFa 2C, to router wkoło się resetuje, jeśli go wyrzucę ze skryptu, to router uruchamia się bez ExtRoota.
Jeśli nie ma IFa 2C i karta jest pusta, ExtRoot zapina się prawidłowo.

9

Odp: Skrypt automatyzyjący dla ExtRoot'a

Wywal reboot ze skryptu, zrób sobie wynik każdego polecenia do pliku i sprawdzaj czego nie uwzględniłeś w skrypcie skoro się resetuje cały czas.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

10 (edytowany przez tinware 2020-07-15 07:48:02)

Odp: Skrypt automatyzyjący dla ExtRoot'a

Dobra, skrypt jest już prawie doszlifowany...

DEVICE="/dev/mmcblk0"
PARTITION="/dev/mmcblk0p1"
if [ -b "${DEVICE}" ] && [ "$( /bin/df -h | /bin/grep ""${DEVICE}".*/overlay" )" = "" ] && \
[ "$( /sbin/uci -q get fstab.overlay.enabled )" = "1" ] && \
( [ ! "$( /sbin/block info "${PARTITION}" | /bin/grep -o -e "TYPE=\S*" )" = "TYPE=\"ext4\"" ] || \
[ "$( /bin/ls "${DEVICE}"* | /usr/bin/wc -l )" -ne 2 ] ); then
  #
  # Działania formatujące kartę sd
  # 
fi

Wykonaj skrypt jeśli:
1. Karta SD jest w gnieździe
2. Po uruchomieniu /overlay zamontował się na flashu, zamiast na karcie sd
3. W /etc/config/fstab poprzez enabled=0 mogę ręcznie wyłączać automatyczne montowanie ExtRoota
4A. Pierwsza partycja na karcie sd nie ma systemu plików EXT4
4B. Karta SD nie ma partycji lub ma ich więcej niż jedną

I następujący problem, pomijając już działanie tego skryptu:
Instaluje firmware, robie extroota, działa, następnie znowu instaluję firmware, to po tym system nie chce się już uruchomić na takiej starej karcie - dlaczego? Tutaj właśnie powinienem zrobić punkt 4C, ale nie wiem jaki jest mój punkt zaczepienia... Dlatego więc, w przypadku jeśli używam stare karty w jednej wersji skryptu notorycznie resetuje router, a w drugiej wersji skryptu wcale go nie formatuje i nie montuje.
Brakuje więc dyrektywy: jeśli karta jest stara / z innej instalacji systemu / z innego routera, mimo że ma jedną partycję EXT4 to router musi ją formatować.

11

Odp: Skrypt automatyzyjący dla ExtRoot'a

etc/.extroot-uuid się nie zgadza? To w logach zobaczysz podczas startu systemu.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

12

Odp: Skrypt automatyzyjący dla ExtRoot'a

/etc/.extroot-uuid jest na overlay flasha czy overlay karty sd?

13

Odp: Skrypt automatyzyjący dla ExtRoot'a

Na karcie znajdź czy istnieje taki plik. Jak jest to zawiera uuid z routera, i nie zamontuje się jak jest inny.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

14 (edytowany przez tinware 2020-07-15 08:43:47)

Odp: Skrypt automatyzyjący dla ExtRoot'a

Dobra, czyli będąc na flash muszę podmontować /dev/mmcblk0p1 na np. /tmp/extroot (aby było mało inwazyjnie) i odczytać /etc/.extroot-uuid. Z którą partycją uuid na flash mam to porównywać będąc uruchomionym na flash?

15

Odp: Skrypt automatyzyjący dla ExtRoot'a

Ja bym nie porównywał tylko po prostu usuń plik jak jest i zrestartuj. Będzie wtedy uważał że to jego i ją zamontuje.

Oczywiście pod warunkiem że jesteś pewien że to pochodzi z tego co trzeba routera/wersji itd. Bo żeby nie było że wsadzisz pierwszą lepszą kartę z extroota i zamontuje się z całkiem innego systemu.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

16 (edytowany przez tinware 2020-07-15 09:30:41)

Odp: Skrypt automatyzyjący dla ExtRoot'a

Cezary napisał/a:

Ja bym nie porównywał tylko po prostu usuń plik jak jest i zrestartuj. Będzie wtedy uważał że to jego i ją zamontuje

Właśnie, a wolałbym aby taką kartę jednak formatował, bo jest ona niezgodna.


Czyli coś takiego, maksimum uniwersalności:

DEVICE="/dev/mmcblk0"
PARTITION="/dev/mmcblk0p1"

# Jest karta w gnieździe
# System uruchomiony z Flash
# ExtRoot w ogóle włączony w konfiguracji, abym mógł też to gniazdo SD wykorzystywać do czego innego
if [ -b "${DEVICE}" ] && \
[ "$( /bin/df -h | /bin/grep ""${DEVICE}".*/overlay" )" = "" ] && \
[ "$( /sbin/uci -q get fstab.overlay.enabled )" = "1" ]; then
  
  # Nowa karta (nie ma jednej partycji EXT4)
  if ( [ ! "$( /sbin/block info "${PARTITION}" | /bin/grep -o -e "TYPE=\S*" )" = "TYPE=\"ext4\"" ] || \
  [ "$( /bin/ls "${DEVICE}"* | /usr/bin/wc -l )" -ne 2 ] ); then
    FORMAT="true"
    
  # Stara karta (na karcie /etc/.extroot-uuid nie jest taki sam jak na routerze, ale z czym dokładnie mam to porównać?)
  elif ( ??? ); then
    FORMAT="true"
    
  else
    FORMAT="false"
    
  fi
  
  if ( "$FORMAT" = "true" ); then
    # 
    # Działania formatujące kartę sd
    # Reboot
    # 
  fi
  
fi

17

Odp: Skrypt automatyzyjący dla ExtRoot'a

Czy mam sprawdzić na karcie /etc/.extroot-uuid i porównać to do uci show fstab.overlay.uuid na flashu ?
Obecnie uruchamiam kartę SD mając w konfiguracji uci show fstab.overlay.uuid > /dev/mmcblk0p1

18

Odp: Skrypt automatyzyjący dla ExtRoot'a

cat /overlay/etc/.extroot-uuid
block info | grep "/rom"

Da ci ten sam uuid jak to jest jego extroot.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

19 (edytowany przez tinware 2020-07-15 20:04:24)

Odp: Skrypt automatyzyjący dla ExtRoot'a

/etc/config/fstab

config mount 'overlay'
        option device '/dev/mmcblk0p1'
        option target '/overlay'
        option enabled '1'

/etc/rc.local

# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

# Extention Root na karcie microSD
DEVICE="/dev/mmcblk0"
PARTITION="/dev/mmcblk0p1"
LED="leds/u7621-06:green:led4"
if [ -b "${DEVICE}" ] && [ "$( /bin/df -h | /bin/grep ""${DEVICE}".*/overlay" )" = "" ] && \
[ "$( /sbin/uci -q get fstab.overlay.enabled )" = "1" ]; then
  UUID_ROM=$( /sbin/block info | /bin/grep "/rom" | /usr/bin/head -n 1 | \
  /usr/bin/awk -F 'UUID="' '{print $2}' | /usr/bin/awk -F '"' '{print $1}' )
  /bin/mkdir -p "/tmp/extroot"
  /bin/mount "${PARTITION}" "/tmp/extroot" 2&>1 > /dev/null
  UUID_SDCARD=$( /bin/cat "/tmp/extroot/etc/.extroot-uuid" 2&>1 )
  if ! ( [ "$UUID_ROM" = "$UUID_SDCARD" ] ); then
    echo "timer" > "/sys/class/"$LED"/trigger"
    echo "100" > "/sys/class/leds/"$LED"/delay_on"
    echo "100" > "/sys/class/leds/"$LED"/delay_off"
    /bin/dd if="/dev/zero" of="${DEVICE}" count=2049 2&>1 > /dev/null
    echo -e "o\nn\np\n1\n\n\nw" | /usr/sbin/fdisk "${DEVICE}" 2&>1 > /dev/null
    yes | /usr/sbin/mkfs.ext4 "${PARTITION}" 2&>1 > /dev/null
    /bin/rm -R "/tmp/extroot/lost+found" 2&>1 > /dev/null
    /bin/cp -a -f "/overlay/." "/tmp/extroot" 2&>1 > /dev/null
    echo -n "${UUID_ROM}" > "/tmp/extroot/upper/etc/.extroot-uuid"
    /bin/rm -R "/overlay/." 2&>1 > /dev/null
    echo "none" > "/sys/class/leds/"$LED"/trigger"
    echo "1" > "/sys/class/leds/"$LED"/brightness"
    reboot
  fi
  /bin/umount "${PARTITION}" 2&>1 > /dev/null
fi

exit 0

No to czas na testy... Na początku widzę problem z sekcją dd i fdisk, nie zawsze prawidłowo to działa i router kilka razy się resetuje, przez co nie wykonuje się prawidłowo backup /overlay z pamięci flash na kartę SD. Pod Debianem pracowałem na parted, ale w repozytorium OpenWRT nie widzę tego oprogramowania.

20

Odp: Skrypt automatyzyjący dla ExtRoot'a

Brakuje mi jeszcze jednej rzeczy: UUID jest zawsze ten sam dla tego samego firmware, czy dałbym radę zmienić UUID, aby został wylosowany przy pierwszej instalacji firmware?

21

Odp: Skrypt automatyzyjący dla ExtRoot'a

Nie.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

22 (edytowany przez tinware 2020-07-16 07:57:01)

Odp: Skrypt automatyzyjący dla ExtRoot'a

Zastanawiam się, czy jestem w stanie wychwycić w logu, że firmware jest właśnie nagrywany, wtedy na podstawie takiej informacji mógłbym również formatować taką kartę

23

Odp: Skrypt automatyzyjący dla ExtRoot'a

Nie, ale możesz lekko zmienić skrypt sysupgrade żeby najpierw coś zrobił twojego.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.