About nearly a year ago, I wrote the labSentinel project for my Nvidia Jetson AI Specialist certification. The basic idea of the project is to be able to supervise old Lab Equipment which does not poses any kind of log output or interface other than a graphical user interface, running on an Windows 3.11 / 95 / NT - maybe even XP system. I solved this issue by using a video grabber attached to a Jetson Nano and "out-of-band" grabbing the screen output of the experiment computer. I then learned good and bad system states via Nvidias Inference tools and finally got the system to report via MQTT as soon as something did go wrong. (As a "test system" I designed a flashy GUI application to try to mimic the old interfaces - specifically thinking about a lab power supply with multiple outputs - and the ability to simulate errors.)(https://developer.nvidia.com/embedded/community/jetson-projects#labsentinel / https://github.com/nmaas87/labsentinel)
While the project did work, there was still a lot left to be desired:
The system did capture the complete screen in full size. Running inference on a 1024x768 or even higher resolution picture is not efficient and has a high failure rate.
Training, testing and improving the model was time consuming and did not yield the precision and results I was hoping for.
The system could differentiate between "good" and "error" states - however if an error occurred, I would have loved to get more information - "reading the GUI" and its output. For example in the lab power supply use case, getting the specific voltages of the different lines to see which line failed or what is wrong - maybe even with the possibility to cross check if the detected error is an error in the first place
While the Nvidia Jetson Nano Development Board is an awesome tool for development, it is not hardend enough / suited for a lab or even factory floor environment.
These were all points I wanted to address, but as time was lacking - I did not take up the project again - until the start of this year Advantech and Edge Impulse started their Advantech Edge AI Challenge 2022. They wanted to know about specific use cases and how to solve them with factory hardend Jetson products (e.g. Advantechs AIR-020 series) and Edge Impulse Studio.
Well, that reminded me of the first labSentinel - and I thought I'd give it a try. As luck would have it, I actually was one of the two lucky guys who were picked to be able to realize their project. Advantech sent me one of their AIR-020X boards (review is here :)) and I was good to go:
Let me introduce you to labSentinel 2:
Build from the ground up, it does solve the above mentioned issues:
The actually GUI window is found and extracted from the "full size Desktop screenshots" via OpenCV 2 - and resized to 320x320 pixels to neatly fit the inference model
All model training, testing and optimization is done with Edge Impulse, which makes handling a breeze
If an error is detected and included OCR module using tesseract can extract text from predesignated / labeled areas on the non-resized GUI and sent this information along with the MQTT alert
The AIR-020X board is more than robust enough for all normal lab and factory floors
Since 2017 I have been using an Western Digital My Cloud Mirror Gen 2 which I bought at Amazons Black Friday (or similar) - because the included 2x 8 TB WD Red were even cheaper with the NAS than standalone. Using the NAS had been quite ok, especially the included Docker Engine and Plex Support were a nice to have, the included Backdoor in older Versions - not so much. Recently WD had their new "My Cloud OS 5" replace the old My Cloud OS 3 - and made things worse for a lot of people. As I don't want any more surprises - and more control over my hardware - I decided to finally go down the road and get Debian 11 with an LTS (5.15) Kernel running on the hardware. This is how it went.
Warning
Warning, these are just my notes on how to convert a My Cloud OS 3 / My Cloud Mirror Gen 2 device to a "real" Debian system. You will need to take your device fully apart, solder wires and lose the warranty. Additionally you will lose all your data and even brick the hardware if something goes wrong, I am taking in no way responsibility, neither can I give support. You're on your own now.
Step 0: Get Serial Console Access
Without a serial console, you will not be able to do anything here. You will need to completely disassembly the NAS and will lose all warranty. The plain motherboard will look like this. On the most right side you will see the pins for the UART interface you will need to solder to.
When you're done with that, connect your 3v3 TTL UART USB device like this:
... and connect to it via 115200 BAUD with Putty, TeraTerm Pro or any other software (Do not connect the 3v3 pin :)). It would be wise starting without the hard drives installed.
Step 1: Flashing U-Boot
The current U-Boot on the NAS is flawed, you need to replace it. I will be CyberPK here which did an awesome job explaining everything:
We have to prepare an usb drive formatted in Fat32, and extract the uboot at link into it and connect to usb port#2.
Connect the device to the serial adapter, poweron the device and start pressing '1' (one) during the boot until you can see the 'Marvell>>' Command Prompt press ctrl+c then
We will start here to change stuff and break stuff. But if I could give you one tip before you start: Please execute printenv once. Copy and paste all env variables and everything Uboots spits out. It could save your hardware one day. Thanks, Nico out!
usb start
bubt u-boot-a38x-GrandTeton_2014T3_PQ-nand.bin nand usb
reset
This will reboot the device. Access again the Command prompt and add the following envs, a modified version of the ones provided by bodhi at this post:
setenv set_bootargs_stock 'setenv bootargs root=/dev/ram console=ttyS0,115200'
setenv bootcmd_stock 'echo Booting from stock ... ; run set_bootargs_stock; printenv bootargs; nand read.e 0xa00000 0x500000 0x500000;nand read.e 0xf00000 0xa00000 0x500000;bootm 0xa00000 0xf00000'
setenv bootdev 'usb'
setenv device '0:1'
setenv load_image_addr '0x02000020'
setenv load_initrd_addr '0x2900000'
setenv load_image 'echo loading Image ...; fatload $bootdev $device $load_image_addr /boot/uImage'
setenv load_initrd 'echo loading uInitrd ...; fatload $bootdev $device $load_initrd_addr /boot/uInitrd'
setenv usb_set_bootargs 'setenv bootargs "console=ttyS0,115200 root=LABEL=rootfs rootdelay=10 $mtdparts earlyprintk=serial init=/bin/systemd"'
setenv bootcmd_usb 'echo Booting from USB ...; usb start; run usb_set_bootargs; if run load_image; then if run load_initrd; then bootm $load_image_addr $load_initrd_addr; else bootm $load_image_addr; fi; fi; usb stop'
setenv bootcmd 'setenv fdt_skip_update yes; setenv usbActive 0; run bootcmd_usb; setenv usbActive 1; run bootcmd_usb; setenv fdt_skip_update no; run bootcmd_stock; reset'
saveenv
reset
(This code was also modified by me to use the fatload instead of the ext2load)
Get all dependencies installed according to this repo, I installed it on a Debian 11 machine
Replace the file content of wdmc2-kernel/dts/armada-375-wdmc-gen2.dts with the content of the real and improved dts for the WDMCMG2 (original from this link, copy available here) - but keep the file name still armada-375-wdmc-gen2.dts
Replace the file content of wdmc2-kernel/config/linux-5.15.y.config with the file from here (please know this config ain't perfect, but it will get you running. You can always file a PR and help me out ;))
Start the build process in wdmc2-kernel with ./build.sh
Mark: Linux Kernel, Clean Kernel sources, Debian Rootfs, Enable ZRAM on rootfs
Kernel -> Kernel 5.15 LTS
Build initramfs -> Yes
Debian -> Bullseye
Fstab -> usb
Rootpw -> whateverYouWant
Hostname -> whateverYouWant
Locales -> no changes, accept (or whatever you want)
Default locale for system -> en_US.UTF-8 (or whatever you want)
Tzdata -> Your region
Now your kernel and rootfs will be build
While this is on-going, get yourself a nice USB 2.0 or USB 3.0 stick prepared with
partition table: msdos
1st partition: 192 MB, FAT32, label set to boot, boot flag enabled
2nd partition: rest, ext4, label set to rootfs
When the kernel is done compiling and your usb stick is done, copy all the files (sda is the name of my usb stick
tar -xvzf wdmc2-kernel/output/bullseye-rootfs.tar.gz --directory=/mnt/root/
rm -rf /mnt/root/etc/fstab
cp /mnt/root/etc/fstab.usb /mnt/root/etc/fstab // within /mnt/root/etc/fstab: // change all /dev/sdb to /dev/sdc if all two drive slots on the NAS are used <- this! // change all /dev/sdb to /dev/sda if no drive slots on the NAS are used
umount /mnt/boot /mnt/root
Step 3: First boot and getting things running
Insert the USB stick into the 2 slot of the NAS. Leave the drives still out and boot it up for the first time, watch it via terminal. Login at the end with root and your chosen password.
If it boots, you can shut it down again with shutdown -P now, unplug power, insert the drives and reboot.
First thing after the first boot with drives, your own initramfs / Ramdisk from your current setup:
cd /root/
./build_initramfs.sh
cp initramfs/uRamdisk /boot/boot/uInitrd
Second, install MDADM for the RAID:
apt update
apt install mdadm
mkdir /mnt/HD
edit your /etc/fstab and add a mount point for your md/raid. I used the old drives with my old data on it like this (depending on the fact as which mdX it launches...)
(You can change low temp and high temp in the /usr/sbin/fan-daemon.py to get the Fan to kick in later and also set DEBUG = True if you want to see some details in the systemctl status fan-daemon)
You need to be root (obviously) and its supported in bash environment - but not on all systems. You can also cat on the ports and use dns adresses. Its neat to just get a byte out :).
And if you need something more sophisicated, be sure to use the good old netcat ("nc")
If you're tired of the ClearType Fonts in Windows and long for a more Unix/Mac Style Font Rasterizer, you most probably have heard GDI++ and GDIPP. And as both projects are somehow dead (for 6+ years), someone started a new one, called MacType.
If you're in the NetOps/DevOps Teams, chances are high you need to develop code and use git. Well, on Windows Clients, I tended to use Atlassians Source Tree - however, that client became more and more buggy and unstable - unusable to say. Especially if I had to do an really big merge of my main to my deploy tag - it tended to crash most of the time.
So, without further ado: Enter Gitkraken. A nice, free, good looking and fast git client. Without dependencies.
Only downsides: It uses Electron - so it is basically a packaged Node JS server. It is - quite fast, however - and it does not need to install any other dependencies. The other "downside" is, if you want to use more than one GitHub Account, you need to pay for these kind of features.
However, as long as there is no "real" alternative to this product, I will remain using it :).
If you are downloading an Linux Image for i.e. Embedded Systems like Raspberry Pi, sometimes, the SSH Keys are still on the system and are not recreated.
To do that manually, just enter:
sudo rm /etc/ssh/ssh_host_*
sudo dpkg-reconfigure openssh-server
sudo service ssh restart
And now an nice tip by Darren Kitchen of Hak5!
( www.hak5.org )
HakTip: Multiplexing Screen Sessions
What’s more wicked than a screen session? Two screen sessions! As we’ve talked about recently the unix command Screen is a great way to maintain bash sessions from multiple SSH clients without losing your work. My favorite shortcut after invoking the “screen” command is CTRL+a followed by “S”, which splits the screen horizontally in two. Use CTRL+a then Tab to switch between the views. Debian users get the added sexyness of vertical split by hitting CTRL+a then Pipe.
Hello there, this a 5 Minute Tutorial to screen.
What Screen is?
Well screen is an old unix / linux terminal programm with which you can create multiple virtual "screens".
You can switch between these screens and also can disconnect from them.
Especially useful: If you start an daemon within screen and disconnect from it,
you can reconnect anytime and see what its doing.
Or you can setup a screen session, detach and close your SSH.
If you reconnect, it will still be running.
Oh, and it will be also there and running if your connection drops.
My little list of important Screen Commands:
screen // Create a Screen
screen -ls // List active Screen sessions
screen -r // Resume Screen, if multiple, enter Screen Number from ls after r
CTRL A C - create new tab
CTRL A P - previous
CTRL A N - next
CTRL A D - detach from Screen
To close and exit a screen, just type exit within the screen session.
To start an script in the same folder "daemon like": screen -A -m -d -S SCREENSESSIONNAME ./SCRIPTNAME.sh
- Install Debian
- Add following lines to /etc/apt/sources.list :
deb http://live.debian.net/ sid-snapshots main contrib non-free
deb-src http://live.debian.net/ sid-snapshots main contrib non-free
- apt-get install live-helper git git-core svn sudo
- mkdir /home/webconverger
- cd /home/webconverger
- git clone git://git.debian.org/git/debian-live/config-webc.git
- modify /home/webconverger/config-webc/webconverger/auto/config
( i.e. change
homepage=http://portal.webconverger.com to the one you want,
add Kioskrest every 10 Minutes after last use:
kioskresetstation=10
change bootlogo
change website to the one you want and add an bg.png to the account,
otherwise add noxbg to the boot to make the background blank )
- cd /home/webconverger/config-webc/webconverger
- lh config
- lh build
- /home/webconverger/config-webc/webconverger/binary-hybrid.iso
Clean to rebuild:
- cd /home/webconverger/config-webc/webconverger
- lh clean --purge
Loading Comments...
We use cookies to ensure that we give you the best experience on our website. If you continue to use this site we will assume that you are happy with it.Ok