Raspberry Pi 3 i start z dysku/pendrive USB

Dzień dobry.
’Do odważnych świat należy', jak to mówią.
Do tej pory Raspberry startowałem z karty SD, później system był już ładowany z dysku HDD (http://blog.asobczak.pl/2018/01/31/przechodzimy-na-malinie-z-karty-sd-na-dysk-hdd-ssd/). Skoro jednak podjąłem decyzję o przejściu z Domoticz na Home Assistant, a po zmianie w bartopie na Raspberry Pi 4 została mi jedna wolna malinka w wersji trzeciej – 'raz kozie śmierć!' pomyślałem i wykonałem jeden wpis w /boot/config.txt. Znamienny. 
Oczywiście żarty żartami, żadnych poważnych reperkusji to nie powoduje. Priorytetem jest zawsze karta SD i jeżeli znajdzie się w gnieździe – Raspberry wystartuje najpierw z niej.
Jak wcześniej napisałem – w /boot/config.txt dopisujemy jedną linię:
program_usb_boot_mode=1
i to w zasadzie cała filozofia. Przestawiany jest bit tak zwany OTP – One-time programmable, czyli taki, którego zawartość można zmienić wyłącznie raz. Nie można operacji odwrócić. Z tego co pamiętam w Raspberry Pi 3b+ jest już ustawiany domyślnie, fabrycznie.

Po wykonaniu komendy
vcgencmd otp_dump | grep 17:
ujrzymy informację po 17:. Jeżeli jest inna niż 3020000a znaczy to, że bit nie jest przestawiony. Czyli tak jak poniżej, przed restartem.

Ok, wpis w config.txt mamy, sprawdziliśmy czy już nie był ustawiony, robimy restart.
Bang, po chwili możemy sprawdzić, czy udało się poprawnie to zrobić:

3020000a jest zapisane, można wyjąć kartę i startować z SSD/USB/HDD. Działa, sprawdzałem. Tak przez pewien czas miałem uruchomiony Home Assistant. Aż do momentu gdy przeszedłem na Intel NUC 😉

Instalujemy Home Assistant na Intel NUC i Ubuntu

Dzień dobry.
Jakoś tak się złożyło, że wpadł w moje ręce Intel NUC NUC7CJYH z 4GB RAM oraz 120 GB dyskiem SSD. Nie mogąc się oprzeć urokowi tego sprzętu musiałem go sprawdzić i do tego wykorzystać przy instalacji Home Assistant. Zdecydowanie było warto – to sprzęt bardzo mocny, w dobrej konfiguracji, cichy, ładnie wyglądający i do tego niewielki.
Korzystając ze strony https://ubuntu.com/download/intel-nuc-desktop pobrałem wersję, którą następnie trzeba zgrać na przykład na pendrive według instrukcji (https://ubuntu.com/tutorials/tutorial-create-a-usb-stick-on-ubuntu#1-overview). Proste na tyle, że i bez niej można sobie poradzić korzystając z programu Rufus, który stworzy dla nas uruchamialny pendrive. 
Uruchamiamy go,
Wskazujemy plik naszego systemu,

Zatwierdzamy,

Pendrive wkładamy do Intel NUC, włączamy, 

Wybieramy Restore entire hard drive,

I, voila, po chwili jesteśmy w systemie.

WAŻNE! 
Aby Intel NUC włączył się sam po zaniku napięcia, trzeba włączyć tę opcję w BIOS – 
F2 przy starcie -> Advanced -> Power -> Secondary Power Settings -> After Power Failure -> Power On.
Warto również włączyć Bluetooth, może się przydać do Xiaomi Mi Flora 😉
Później już z poziomu terminala kilka instrukcji, instalacja według standardu dostępnego w sieci, u mnie wersja Home Assistant Supervised – czyli jak nazwa wskazuje z Supervisor’em. Doinstalowałem sobie od razu server SSH aby łączyć się już później bezpośrednio z terminalem.
sudo apt update
sudo apt install openssh-server
sudo add-apt-repository universe
sudo -i
apt-get update
apt-get upgrade
apt-get install -y software-properties-common apparmor-utils apt-transport-https avahi-daemon ca-certificates curl dbus jq network-manager socat 
systemctl disable ModemManager
systemctl stop ModemManager 
curl -fsSL get.docker.com | sh 
curl -sL „https://raw.githubusercontent.com/home-assistant/supervised-installer/c674830d8ddc6af9d618755a7995af939dd73fde/installer.sh” | bash -s
Po chwili mamy dostęp do Home Assistant! Logowanie błyskawiczne, dociągnięcie potrzebnych komponentów jest natychmiastowe, czuć moc Intel NUC w stosunku nawet Raspberry Pi 4, nie mówiąc już o RPi3.
Odzyskanie bazy było formalnością dzięki zapisowi poprzednich kopii w chmurze Google: http://blog.asobczak.pl/2019/11/23/hass-io-i-google-drive-backup/

Przechodzimy na Malinie z karty SD na dysk HDD/SSD…

Nadeszła pora…

Pora na zmianę głównego miejsca systemu Raspberry Pi. Wiele dobrego mogę powiedzieć o Raspberry Pi, ale na pewno nie to, że używanie kart pamięci (szczególnie przy wielu zapisach do loga, bazy danych, itp.) pozwala na bezstresową pracę. Ostatnio odzyskiwałem backup karty praktycznie co tydzień.

Jakoś tak się stało, że leżał mi mały dysk talerzowy 80GB ze starej PS3. Gdzieś, kiedyś w promocji kupiłem również aktywny hub USB. Niestety, napięcie na portach USB z Raspberry (nie chciałem modyfikować zmiennej max_usb_current) niby zasilało dysk, ale bardzo niestabilnie. Podłączyłem dysk do huba, hub do USB, podpiąłem zasilanie, ruszyło. Pierwszy sukces.

Na początku warto sprawdzić jak nasz dysk przestawia się w systemie, żeby przez przypadek nie sformatować czego, czego zdecydowanie nie chcemy 😉

sudo fdisk -l

Ok, jak widać mój dysk 80GB znalazł się pod /dev/sdb/. Pod /sda/ jest pendrive na którego zapisywane są backupy i leży część danych, na przykład z bajkami dla dzieci. Tak w sumie to warto będzie to niedługo przenieść na dysk, a backupy wypchnąć albo na FTP, albo w chmurę. Może kiedyś…

Skoro wiemy jaki dysk mamy sformatować, bierzemy się do pracy.

sudo fdisk /dev/sdb

I teraz po kolei komendy (po każdej literze Enter):

d – wyczyść dysk

n – new

 p – utwórz domyślną partycję

 1 – podaj numer partycji

w – zapisz zmiany

Po kolei (dinozaury może jeszcze pamiętają to wszystko ze starych komputerów, kiedy jeszcze nie było Windows i dyski trzeba było formatować z linii poleceń 😀 ):
1. Wymazaliśmy partycje z dysku, jeżeli jakieś były
2. Utworzyliśmy partycję domyślną
3. Podaliśmy dane domyślne – dla uproszczenia, oczywiście partycji można zrobić więcej, zmienić ich rozmiar…
4. Zapisaliśmy zmiany

Pora sformatować dysk.

sudo mkfs.ext4 /dev/sdb

Póżniej musimy dysk sparować z Raspberry Pi:

sudo mount /dev/sdb /mnt

I teraz sedno, synchronizacja naszej karty SD z dyskiem. rsync zachowuje wszystkie uprawnienia, restrykcje, itp.

sudo rsync -axv / /mnt

Kilka minut i mamy kopię karty na dysku.

Wypadałoby również powiadomić Raspberry Pi, że karta SD jest potrzebna tylko i wyłącznie do 'bootowania', cały system jest już na dysku twardym.

To ważna różnica! Raspberry Pi 3 ma opcję jednorazowego przeprogramowania bitu OTP, aby bootowanie odbywało się bez użycia karty SD, ale osobiście się na to jeszcze nie zdecydowałem – po kilku tygodniach testów możliwe, że tak zrobię. Obciążenie karty SD jest jednak teraz minimalne i znacznie zwiększa bezawaryjność systemu.

Najpierw kopia

sudo cp /boot/cmdline.txt /boot/cmdline.txt.bak

I zmieniamy plik cmdline.txt

sudo nano /boot/cmdline.txt

Zmieniamy wartość przy root i dodajemy na końcu rootdelay

root=/dev/sdb i na końcu rootdelay=5

Efekt:

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/sdb rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait rootdelay=5

Brawo! Teraz pora wyedytować fstab, aby nasz dysk zawsze się mapował i system wiedział, że 'rootfs' jest na HDD. Czyli używamy karty tylko na moment startu Raspberry Pi, później już wszystko odbywa się na HDD.

sudo nano /mnt/etc/fstab

Zamieniamy wpis przy karcie SD na nasz HDD, stary komentujemy:

/dev/sdb       /               ext4    defaults,noatime  0       1

U mnie wygląda to tak:
proc            /proc           proc    defaults          0       0
/dev/sdb       /               ext4    defaults,noatime  0       1
PARTUUID=376f54aa-01  /boot           vfat    defaults          0       2
#PARTUUID=376f54aa-02  /               ext4    defaults,noatime  0       1
Cudnie! Teraz 
sudo reboot
Chwila stresu i powinniśmy wystartować z dysku. Jak to informatycy piszą: 'U mnie działa'.
Mam nadzieję, że teraz żadnych rozjazdów w systemie nie będę już miał.
W przyszłości przejdę na dysk SSD, gdy uda mi się kupić coś fajnego, małego w dobrej cenie.