Thursday, January 18, 2018

Rebuild Banana/Raspberry Pi OS after SD Card Corruption

My Banana Pi M1+ just suffered SD Card corruption, the OS simply won't boot. I have to plug the SD card to a Linux machine and run fsck:

fsck -f -y /dev/sda2
Funny thing is, it appears to be fixed at the first run, but after I run fsck again, more errors are popping up for fixing.
I have to run fsck few times until no more new errors come up.

Then, I booted up the system, after running it awhile, I saw kernel error messages firing everywhere, saying some issues about kernel modules and man (man pages) binary.
I am now quite sure that there is a SD card corruption which corrupted some system files. Mounting the SD card on a Linux machine again, I copied the whole /lib folder from the original image to my SD card OS partition, which hope fixes the kernel module issues.
Then, I mounted the FAT boot partition, and copied the original kernel and initrd to the SD card.
After booting to the OS, I immediately try to rebuild the system by reinstalling "base" packages:

First batch:
sudo apt-get install --reinstall adduser base-files base-passwd bash bsdutils coreutils dash debconf debianutils diffutils dpkg e2fslibs e2fsprogs findutils gcc-6-base grep gzip hostname init init-system-helpers initscripts insserv libacl1 libapparmor1 libattr1 libaudit-common libaudit1 libblkid1 libbz2-1.0 libc-bin libc6 libcap2 libcap2-bin libcomerr2 libcryptsetup4 libdb5.3 libdebconfclient0 libdevmapper1.02.1 libfdisk1 libgcc1 libgcrypt20 libgpg-error0 libkmod2 liblzma5 libmount1 libncurses5 libncursesw5 libpam-modules libpam-modules-bin libpam-runtime libpam0g libpcre3 libprocps4 libseccomp2 libselinux1 libsemanage-common libsemanage1 libsepol1 libsmartcols1 libss2 libsystemd0 libtinfo5 libudev1 libustr-1.0-1 libuuid1 locales login lsb-base makedev mawk mount multiarch-support ncurses-base ncurses-bin passwd perl-base procps sed sensible-utils systemd systemd-sysv sysv-rc sysvinit-utils tar tzdata util-linux
Second batch:
sudo apt-get install --reinstall apt apt-utils busybox-initramfs bzip2 console-setup console-setup-linux cpio cron debconf-i18n dh-python distro-info-data eject file gcc-5-base gnupg gpgv ifupdown initramfs-tools initramfs-tools-bin initramfs-tools-core iproute2 iputils-ping isc-dhcp-client isc-dhcp-common kbd keyboard-configuration klibc-utils kmod less libapt-inst2.0 libapt-pkg5.0 libatm1 libbsd0 libdns-export162 libestr0 libexpat1 libffi6 libfribidi0 libgmp10 libgnutls-openssl27 libgnutls30 libhogweed4 libidn11 libisc-export160 libjson-c2 libklibc liblocale-gettext-perl liblz4-1 libmagic1 libmnl0 libmpdec2 libnettle6 libnewt0.52 libnih1 libp11-kit0 libpcre3 libpng12-0 libpopt0 libpython3-stdlib libpython3.5-minimal libpython3.5-stdlib libreadline6 libslang2 libsqlite3-0 libssl1.0.0 libssl1.0.2 libstdc++6 libtasn1-6 libtext-charwidth-perl libtext-iconv-perl libtext-wrapi18n-perl libusb-0.1-4 libxtables11 linux-base locales logrotate lsb-release mime-support net-tools netbase netcat-openbsd python3 python3-minimal python3.5 python3.5-minimal readline-common resolvconf rsyslog sudo ubuntu-keyring ubuntu-minimal ucf udev ureadahead vim-common vim-tiny
Fixing manpage issues:
sudo rm -rf /var/cache/man/*
sudo apt-get install --reinstall man-db manpages

It seems the system is running great now.

Wednesday, January 17, 2018

ESP32 SSH Server

I was always wondering whether it is possible to start a SSH server on my little ESP32 board, and I don't want to implement the SSH protocol by myself.

There are several lightweight SSH library out there, however, most of them require POSIX support, which is quite messy to port them to the ESP32.

Upon more research, I found that WolfSSH does not require much POSIX stuff, so I decided to port that to ESP32.

WolfSSH: https://github.com/hopkinskong/wolfssh-esp32
WolfSSL: https://github.com/hopkinskong/wolfssl-esp32

Now, I did not use ESP32 Hardware Crypto Acceleration, only the HW RNG is used for the crypto functions. Also, using PuTTY will unable to connect to the server due to some invalid crypto keys presented to the server.

Proof of concept of SSH<->UART1:
https://github.com/hopkinskong/esp32-ssh-server
Images:
Connection to the ESP32 SSH Server, prompting login:

Logged in, shows my Banana Pi U-Boot command prompt as I have connected the ESP32 UART1 to my Banana Pi Serial Console:

Shows it is my Banana Pi's U-Boot:
Booting Linux, I can now remotely serial debug my Banana Pi:
Note that when using PuTTY, the server will actively close the connection due to some key issues: