Orange Pi перестала загружаться, восстановление загрузки.

После очередного обновления системы Armbian , и последующей перезагрузки моя апельсинка с сайтом перестала загружаться. Так как сам сайт и база данных у меня на отдельной карте, я быстренько спас данные, и уже был готов переустановить Armbian заново. Но все же мне стало интересно можно ли восстановить загрузку, и я попросил помощи на форуме небезызвестного сайта http://www.4pda.ru

Итак, вот скриншот того что происходило при загрузке моей апельсинки:

фото с телефона

Как известно SD карта называется mmc0, а eMMC память  mmc1. Загрузка начинается с SD карты. Но если она не вставлена или на ней нет загрузчика, то должно все грузиться с eMMC памяти. Я установил на другую SD карту свежий Armbian. Теперь я мог работать с устройством mmcblk1 — то есть eMMC памятью. Пришлось подключить апельсинку через uart к компу, чтоб видеть полностью процесс загрузки.

Далее мне подсказали:

Там юбут ясно пишет что нет таблицы разделов, она или повреждена или стёрта установкой нового юбута поверх таблицы mbr.
Восстановить таблицу разделов можно, зная где находился первый раздел или же найдя отметку первого раздела, установите армбиан на сд карту, загрузитесь, потом с помощью sfdisk заново размете таблицу mbr зная где именно какой раздел находится и всё.

…таблица разделов повреждена, юбут не может её прочитать, её нужно переписать заново зная где находятся разделы и их размер. Но я не понимаю откуда там mmcblk1boot0 это чё у вас там GPT таблица? загрузитесь с флешки и наберите sfdisk -l /dev/mmcblk1 и сюда напишите что выдаст.

Вот что выдала эта команда:

root@orangepiplus2e:~# sfdisk -l /dev/mmcblk1
Disk /dev/mmcblk1: 14.6 GiB, 15634268160 bytes, 30535680 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x08cb672f

Device Boot Start End Sectors Size Id Type
/dev/mmcblk1p1 2048 30230303 30228256 14.4G 83 Linux

После этого мне посоветовали ввести такую команду:

sfdisk /dev/mmcblk1 <<EOF
2048,30228256,0×83,*
EOF

она прописывает в MBR заново таблицу раздела.

Теперь при попытке загрузки с eMMC картинка немножко поменялась:

Autoboot in 1 seconds, press <Space> to stop
switch to partitions #0, OK
mmc1(part 0) is current device
Scanning mmc 1:1…
Found U-Boot script /boot/boot.scr
3565 bytes read in 6 ms (580.1 KiB/s)
## Executing script at 43100000
U-boot loaded from eMMC or secondary SD
Boot script loaded from mmc
MMC: no card present
** Bad device mmc 0 **
MMC: no card present
** Bad device mmc 0 **
MMC: no card present
** Bad device mmc 0 **
MMC: no card present
** Bad device mmc 0 **
MMC: no card present
** Bad device mmc 0 **
Found legacy kernel configuration
MMC: no card present
** Bad device mmc 0 **
SCRIPT FAILED: continuing…
MMC: no card present

Я выложил это в тему форума и откликнувшийся гуру 🙂 ответил вот что:

Ну теперь файлы с раздела грузит, но пытается грузануть ядро с mmcblk0 (mmc 0) а нужно с mmcblk1 (mmc 1)
Надо редактировать /boot/boot.scr

И дал листинг файла :

# DO NOT EDIT THIS FILE
#
# Please edit /boot/armbianEnv.txt to set supported parameters
#

setenv load_addr «0x44000000»
setenv overlay_error «false»
# default values
setenv verbosity «1»
setenv console «both»
setenv disp_mem_reserves «off»
setenv disp_mode «1920x1080p60»
setenv rootfstype «ext4»
setenv docker_optimizations «on»
setenv devnum «0»
setenv rootdev «/dev/mmcblk${devnum}p1»

# Print boot source
itest.b *0x28 == 0x00 && echo «U-boot loaded from SD»
itest.b *0x28 == 0x02 && echo «U-boot loaded from eMMC or secondary SD»
itest.b *0x28 == 0x03 && echo «U-boot loaded from SPI»

# get PARTUUID of first partition on SD/eMMC it was loaded from
if test «${devtype}» = «mmc»; then
part uuid mmc ${devnum}:1 partuuid;
setenv devnum ${mmc_bootdev}
setenv rootdev «/dev/mmcblk${mmc_bootdev}p1»
fi

echo «Boot script loaded from ${devtype}»

if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then
load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt
env import -t ${load_addr} ${filesize}
fi

if test «${logo}» = «disabled»; then setenv logo «logo.nologo»; fi

if test «${console}» = «display» || test «${console}» = «both»; then setenv consoleargs «console=tty1»; fi
if test «${console}» = «serial» || test «${console}» = «both»; then setenv consoleargs «${consoleargs} console=ttyS0,115200»; fi

setenv bootargs «root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} hdmi.audio=EDID:0 disp.screen0_output_mode=${disp_mode} panic=10 consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} ubootsource=${devtype} ${extraargs} ${extraboardargs}»

if test «${disp_mem_reserves}» = «off»; then setenv bootargs «${bootargs} sunxi_ve_mem_reserve=0 sunxi_g2d_mem_reserve=0 sunxi_fb_mem_reserve=16»; fi
if test «${docker_optimizations}» = «on»; then setenv bootargs «${bootargs} cgroup_enable=memory swapaccount=1»; fi

load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd
load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}zImage

if test -e ${devtype} ${devnum} «${prefix}.next»; then
echo «Found mainline kernel configuration»
load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile}
fdt addr ${fdt_addr_r}
fdt resize 65536
for overlay_file in ${overlays}; do
if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/overlay/${overlay_prefix}-${overlay_file}.dtbo; then
echo «Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo»
fdt apply ${load_addr} || setenv overlay_error «true»
fi
done
for overlay_file in ${user_overlays}; do
if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then
echo «Applying user provided DT overlay ${overlay_file}.dtbo»
fdt apply ${load_addr} || setenv overlay_error «true»
fi
done
if test «${overlay_error}» = «true»; then
echo «Error applying DT overlays, restoring original DT»
load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile}
else
if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/overlay/${overlay_prefix}-fixup.scr; then
echo «Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)»
source ${load_addr}
fi
if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then
load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr
echo «Applying user provided fixup script (fixup.scr)»
source ${load_addr}
fi
fi
bootz ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
else
echo «Found legacy kernel configuration»
load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}script.bin
bootz ${kernel_addr_r} ${ramdisk_addr_r}
fi

# Recompile with:
# mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr

После перекомпиляции файла, и перезагрузке  все запустилось и заработало.

Я конечно тут положил все в сжатом виде и без разговоров на отвлеченные темы 🙂 кто хочет может ознакомиться со страницей на форуме.

После этого я сразу же настроил нормальный бекап сайта , потому что вытаскивать базу данных из раскрытой InnoDB еще та развлекуха.

Решил пусть пока работает. Как время будет все же переберусь на свежий релиз Armbian. Ядро осталось старым точно.