Portál AbcLinuxu, 26. října 2025 19:38
mtd zapisovat.
Pripravil jsem si k tomu 2 skripty . Prvni nakopiruje pres ssh potrebne soubory a spusti druhy skript na cilovem stroji. V tomto druhem skriptu mam cast, ktera ma provest kontrolu, jestli se jedna o spravny typ routeru a az pak zacne provadet zapis. Zde je cele zneni skriptu, vcetne popisu funkce a toho kde na ni nastava problem:
#!/bin/sh
workdir=$PWD
firmware=$PWD/firmware.mtd1.bin
boardinfo=$(cat /proc/cpuinfo | grep machine)
model="Archer C6 v3"
## Kontrola, jestli je pripraven soubor s firmware pro obnovu.
if [ -f "$firmware" ]; then
echo "Nalezen soubor pro instalaci."; else
echo "Soubor nenalezen. Spustte znovu skript router_setup.sh" && exit
fi
sleep 2
## Flash samotneho obrazu s konfiguraci a balicky
echo "Bude provedena obnova konfigurace."
read -p $'Press enter to continue...\n'
echo "##################################"
echo "### ###"
echo "### PROBIHA OBNOVA KONFIGURACE ###"
echo "### ! NEVYPINEJTE NAPAJENI ! ###"
echo "### ###"
echo "##################################"
## Kontrola retezce "Archer C6 v3" v /proc/cpuinfo (testovaci, nedestruktivni cast na overeni spravne funkce kontroly). <-- Selhava na tom, ze tzv. "here redirection <<<" neni v OpenWrt shellu "ash" podporovana.
## Psalo mi to "<<< unknown operand". V BASH na linuxu nebo ZSH na OSX vsak funkce normalne funguje
if grep -q "$model" <<< "$boardinfo"; then
echo "TEST OK"; else
echo "NOT OK"
fi
## Kontrola retezce "Archer C6 v3" a flash balicku s upravenym firmware
## if grep -q "$model" <<< "$boardinfo"; then
## mtd write $firmware firmware; else
## echo "Balicek neni urcen pro tento model a revizi"
## echo "Pouzijte odpovidajici balicek"
## fi
## Kontrola retezce "Archer C6 v3" v /proc/cpuinfo pomoci "if []" <-- Taky neni funkcni, dostavam chybu ":: unknown operand".
## Zjisteno ze chyba nastane hned na prvnim radku nasledujici funkce:
if [ $boardinfo = $model ]; then
echo "TEST OK"; else
echo "NOT OK"
fi
Pro jistotu jsem si skript nechal zkontrolovat pomoci utility shellcheck, chybu podle nej nemam, myslim si vsak, ze bude nastavat nekde chyba v parsovani vystupu z /proc/cpuinfo. Nicmene i po delsim hledani na google a zkoumani jak napsat test sekvenci, kontrolujici retezec, si dale uz nevim rady a budu rad, kdyz me navedete, kde delam chybu..
Diky za vas cas a odpovedi.
cat /proc/cpuinfo | grep machineked mozem dat rovno:
grep machine /proc/cpuinfoK problemu - skus:
if echo "$boardinfo" | grep "$model" >/dev/null; then ...
UUoC vzniká logicky z „cat soubor... sakra to je dlouhé, ještě potřebuju grep/less - šipka nahoru, |grep aaa“. UUoC je použitelnější, protože „cat soubor|grep foo... sakra potřebuju hledat bar, ne foo - šipka nahoru, ←←←, bar“. UUoC brání překvapivému a nečekanému chování u nástrojů pracujících inplace (gzip a bzip2 co smažou originální soubor pokud si na to člověk nevzpomene a nedá -k). UUoC brání nahodilému přepsání při neoscapování grep "Jenda>" irc.logA jinak je problém v uvozovkách a může snadno nastat i v bashi (si představ že v té proměnné bude napsáno
-o 1 -eq 1, což bude každý [ interpretovat jako or).
A jinak já do openwrt dávám bash pokud si můžu dovolit spotřebovat asi 300 kB nebo kolik má. Naštěstí máme všude Mikrotiky s 16MB flash, takže můžu.
if [ "$boardinfo" = "$model" ]; then ..
binwalk nebo Firmware mod kit (https://github.com/openwrt-stuff/firmware-mod-kit), mi v tomto moc nepomohly.
Jinak dnes jsem si overil ze mtd kontroluje, jestli je image kompletni. Pri dnesnim flashovani jednoho routeru jsem omylem nahral prazdny soubor se jmenem toho firmware a mtd vyhodil chybu ze soubor je chybny (nevim ted presne cele zneni, ale bylo tam cosi o chybe CRC) a dale odmitl pokracovat, takze toto je osetreno. Co osetreno neni je to, ze pokud by nahodou nekdo flashnul soubor s upravenym FW treba do starsi revize Archer C6, ktera ma Atheros chipset, tak by ji tim bricknul, proto ta kontrola na retezec modelu.
sestavi to image z predbuildenejch balicku, ty si pouze urcis:
#/bin/bash
profile="tplink_archer-c6-v3"
target="ramips"
subtarget="mt7621"
file="openwrt-imagebuilder-${target}-${subtarget}.Linux-x86_64.tar.xz"
dir="${file/.tar.xz}"
[[ -d ${dir} ]] || {
[[ -f "${file}" ]] && rm "${file}"
wget "https://downloads.openwrt.org/snapshots/targets/${target}/${subtarget}/${file}"
tar xf "${file}"
exit
}
cd ${dir}
ln -f bin/targets/${target}/${subtarget} -s OUT
mkdir -p ADD
package_enable="luci luci-i18n-base-cs luci-theme-material bash openssh-client openssh-server openssh-sftp-server"
package_disable="-dropbear"
files_add="ADD"
make image PROFILE=${profile} PACKAGES="${package_enable} ${package_disable}" FILES="${files_add}"
echo "Result image's in ${dir}/OUT dir..."
s tim ze do adresare ADD pridas soubory v adresarove strukture jak ma byt v /
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.