it:jednodeskove-pocitace:raspberry-pi-5-domaci-server

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
it:jednodeskove-pocitace:raspberry-pi-5-domaci-server [2025/02/15 01:24] Petr Nosekit:jednodeskove-pocitace:raspberry-pi-5-domaci-server [2025/02/16 00:07] (aktuální) – [Přidání disku do RAID] Petr Nosek
Řádek 96: Řádek 96:
 ===== UPS X728 ====== ===== UPS X728 ======
  
-UPS desku jsem kupoval ve verzi 2.5. +UPS desku jsem kupoval ve verzi 2.5. Je důležité si uvědomit, že **UPS X728 není určena k automatickému spuštění Raspberry Pi po obnovení napájení**. Její hlavní funkcí je zajistit nepřerušený provoz **během výpadku**, dokud je baterie dostatečně nabitá.  
  
 +Jakmile baterie klesne na **kritickou úroveň**, Raspberry Pi by mělo být **řízeně vypnuto**, aby se zabránilo náhlé ztrátě dat nebo poškození systému. **UPS však Raspberry Pi znovu automaticky nenastartuje**, i když je baterie plně nabitá.
 +
 +Pokud po zapnutí tlačítka na UPS svítí **červená LED dioda** na Raspberry Pi, znamená to, že deska je pod napětím, ale Raspberry Pi se samo nespustilo. Skutečné spuštění a běh systému indikují **jiné LED diody** na Raspberry Pi.
 ==== Specifikace ==== ==== Specifikace ====
  
Řádek 284: Řádek 287:
  
  
-set logging+Log interval 
 +LOG_INTERVAL = 300  # seconds 
 +last_power_state = None # Stores last power state 
 +last_log_time = 0 # Stores last log timestamp 
 + 
 + 
 +# Logging configuration
 logging.basicConfig(filename='/var/log/x728-battery.log', level=logging.INFO, format='%(asctime)s - %(message)s') logging.basicConfig(filename='/var/log/x728-battery.log', level=logging.INFO, format='%(asctime)s - %(message)s')
  
Řádek 316: Řádek 325:
  
 def readVoltage(bus): def readVoltage(bus):
 +    """Reads battery voltage from I2C bus."""
     address = I2C_ADDR     address = I2C_ADDR
     read = bus.read_word_data(address, 2)     read = bus.read_word_data(address, 2)
Řádek 323: Řádek 333:
  
 def readCapacity(bus): def readCapacity(bus):
 +    """Reads battery capacity from I2C bus."""
     address = I2C_ADDR     address = I2C_ADDR
     read = bus.read_word_data(address, 4)     read = bus.read_word_data(address, 4)
Řádek 332: Řádek 343:
  
 def print_power_status(): def print_power_status():
 +    """Monitors power status and logs changes."""
 +    global last_power_state, last_log_time
     state = pld_line.get_value()     state = pld_line.get_value()
 +    current_time = time.time()
 +
     if state == 1:     if state == 1:
-        print("Power Supply A/C Lost"+        print("Power Supply A/C Lost"# First detection of power loss 
-        logging.warning("Power Supply A/C Lost")+        if last_power_state != 1: 
 +            logging.warning("Power Supply A/C Lost") 
 +        elif current_time - last_log_time > LOG_INTERVAL: # Subsequent logging at intervals 
 +            logging.warning("Power Supply A/C Lost"
 +            last_log_time = current_time 
 + 
 +        # Activate buzzer to indicate power loss
         for _ in range(3):  # Buzzer alarm cycle         for _ in range(3):  # Buzzer alarm cycle
             buzzer_line.set_value(1)             buzzer_line.set_value(1)
Řádek 343: Řádek 364:
     else:     else:
         print("AC Power OK")         print("AC Power OK")
-        logging.info("AC Power OK")+        if last_power_state != 0: # First detection of power restoration 
 +            logging.info("AC Power OK") 
 +        elif current_time - last_log_time > LOG_INTERVAL: # Subsequent logging at intervals 
 +            logging.info("AC Power OK") 
 +            last_log_time = current_time
         buzzer_line.set_value(0)         buzzer_line.set_value(0)
 +
 +    last_power_state = state
 +    return state
 +
  
 try: try:
-    last_log_time = 0 
     while True:     while True:
         print("******************")         print("******************")
Řádek 355: Řádek 383:
         print(f"Battery: {capacity:.0f}%")         print(f"Battery: {capacity:.0f}%")
  
-        # log each 300 sec +        # Log battery voltage and capacity at intervals 
-        if time.time() - last_log_time > 300:+        if time.time() - last_log_time > LOG_INTERVAL:
             logging.info(f"Voltage: {voltage:.2f}V, Battery: {capacity:.0f}%")             logging.info(f"Voltage: {voltage:.2f}V, Battery: {capacity:.0f}%")
             last_log_time = time.time()             last_log_time = time.time()
 +
 +        # Monitor power loss detection
 +        power_status = print_power_status()
  
         if capacity == 100:         if capacity == 100:
Řádek 366: Řádek 397:
             print("Battery Low")             print("Battery Low")
  
-        if voltage < 3.00:+        # This condition ensures shutdown only if the battery is below 99% and the power is disconnected. 
 +        # This means that if the power is connected, the server will not shut down. 
 +        # Everyone should evaluate whether this is safe and adjust the condition if necessary. 
 +        if voltage < 3.00 and power_status == 1:
             print("Battery LOW!!!")             print("Battery LOW!!!")
             logging.critical("Battery LOW! Shutdown in 10 seconds")             logging.critical("Battery LOW! Shutdown in 10 seconds")
Řádek 375: Řádek 409:
             out_line.set_value(0)             out_line.set_value(0)
  
-        # Monitor power loss detection 
-        print_power_status() 
  
         time.sleep(2)         time.sleep(2)
Řádek 443: Řádek 475:
 sudo systemctl status x728-battery.service sudo systemctl status x728-battery.service
 </code> </code>
 +
 +
 +=== Použití logrotate pro rotaci logů na Raspberry Pi ===
 +
 +Na Raspberry Pi mi aplikace vytvořila nový logový soubor `/var/log/x728-battery.log`. Abych zajistil jeho pravidelnou rotaci a zabránil nadměrnému růstu, rozhodl jsem se použít **logrotate**. Tento nástroj už byl v systému nainstalován.
 +
 +== Jak přidat pravidlo do logrotate ==
 +
 +Nejprve jsem vytvořil nový konfigurační soubor v `/etc/logrotate.d/`:
 +
 +<code bash>
 +sudo nano /etc/logrotate.d/x728-battery
 +</code>
 +
 +Do souboru jsem přidal následující konfiguraci:
 +
 +<code>
 +/var/log/x728-battery.log {                           
 +        weekly                                        
 +        rotate 4                                      
 +        compress                                      
 +        missingok                                     
 +        notifempty                                    
 +        create 644 root root                          
 +        postrotate                                    
 +                systemctl restart x728-battery.service
 +        endscript                                     
 +}                                                     
 +</code>
 +
 +Bylo nutné přidat `postrotate` sekci, která restartuje službu `x728-battery.service`, protože jinak aplikace nepokračovala v logování do nového souboru.
 +
 +== Otestování konfigurace ==
 +
 +Pro kontrolu, zda logrotate soubor správně rozpoznává, jsem spustil:
 +
 +<code bash>
 +sudo logrotate -d /etc/logrotate.d/x728-battery
 +</code>
 +
 +(Debug mód `-d` pouze zobrazí, co by se stalo, ale skutečně rotaci neprovede.)
 +
 +Pokud konfigurace neobsahovala chyby, provedl jsem ruční rotaci:
 +
 +<code bash>
 +sudo logrotate -f /etc/logrotate.d/x728-battery
 +</code>
 +
 +Po této úpravě se logy správně rotují a starší soubory jsou automaticky komprimovány a spravovány.
 +
  
  
Řádek 597: Řádek 679:
  
 **Poznámka:** Pokud používáte jiný operační systém (například Ubuntu), je nutné nejprve nahrát Raspberry Pi OS, provést výše uvedené úpravy a teprve poté znovu nahrát požadovaný operační systém. **Poznámka:** Pokud používáte jiný operační systém (například Ubuntu), je nutné nejprve nahrát Raspberry Pi OS, provést výše uvedené úpravy a teprve poté znovu nahrát požadovaný operační systém.
 +
 +
 +=== Softwarové řízení nabíjení pomocí GPIO16 ===
 +
 +Od verze **X728 v2.5** je možné **softwarově řídit nabíjení baterie** pomocí **GPIO16**. Tato funkce je určena pouze pro **pokročilé uživatele**, kteří mají zkušenosti s Linuxem. Pokud si nejste jisti, doporučuje se ponechat jumper "CHG Ctrl" zkratovaný, což umožní **automatické nabíjení** při připojení napájecího adaptéru.
 +
 +**Možnosti nastavení "CHG Ctrl" jumperu:**
 +- **Jumper zkratovaný** → Baterie se **automaticky nabíjí**, pokud je připojen napájecí adaptér.
 +- **Jumper otevřený** → Nabíjení lze **ovládat přes GPIO16**:
 +  - **GPIO16 = HIGH** → Nabíjení povoleno.
 +  - **GPIO16 = LOW** → Nabíjení zakázáno.
 +
 +== Ovládání nabíjení pomocí GPIO16 ==
 +
 +Pro ruční ovládání nabíjení je nutné nejprve zjistit odpovídající GPIO pin:
 +
 +<code bash>
 +GPIO=16
 +
 +# Zjištění skutečného čísla GPIO pinu
 +GPIO=$(cat /sys/kernel/debug/gpio | grep "GPIO$GPIO" | awk -F'gpio-' '{print $2}' | awk -F' ' '{print $1}')
 +echo "$GPIO" > /sys/class/gpio/export
 +echo "out" > /sys/class/gpio/gpio$GPIO/direction
 +</code>
 +
 +**Povolení nabíjení:**
 +<code bash>
 +echo "1" > /sys/class/gpio/gpio$GPIO/value
 +</code>
 +
 +**Zakázání nabíjení:**
 +<code bash>
 +echo "0" > /sys/class/gpio/gpio$GPIO/value
 +</code>
 +
 +**Poznámka:** Nakonec jsem tuto funkci **nevyužil**, ale uvádím ji pro **kompletní dokumentaci**, pokud by bylo v budoucnu potřeba řídit nabíjení softwarově.
 +
 +
 +
 +===== Konfigurace softwarového RAIDu – zrcadlení =====
 +
 +Při konfiguraci jsem vycházel z těchto návodů, přičemž ani jeden není dokonalý pro moji situaci a musel jsem si návody přízpůsobit. Uvádím je pro úplnost jako zdroj:
 +
 +  * https://github.com/robertalexa/rpi-raid1-root-partition/blob/main/README.md
 +  * https://www.jeffgeerling.com/blog/2020/building-fastest-raspberry-pi-nas-sata-raid
 +  * https://gist.github.com/leandrofilipe/f9636be272f97d414652ce1f21e6b1f4
 +
 +==== Adresace disků ====
 +
 +Používám **Suptronics X1005 2280 M.2 NVMe Dual Shield** pro **Raspberry Pi 5**, který umožňuje připojení dvou disků.
 +
 +Na desce jsou viditelně označeny dva sloty:
 +  * **SSD1**
 +  * **SSD2**
 +
 +Při připojení jednoho disku do **SSD1**, systém jej rozpozná jako **nvme0n1**:
 +
 +<code bash>
 +lsblk 
 +NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
 +nvme0n1     259:   0  1,8T  0 disk 
 +├─nvme0n1p1 259:1    0  512M  0 part /boot/firmware
 +└─nvme0n1p2 259:2    0  1,8T  0 part /
 +</code>
 +
 +Po připojení druhého disku do **SSD2** došlo k nečekanému přeskupení číslování disků. Systém nyní rozpoznává:
 +
 +* Disk připojený v **SSD2** jako **nvme0n1**
 +* Disk připojený v **SSD1** jako **nvme1n1**
 +
 +Výstup příkazu `lsblk` po připojení druhého disku:
 +
 +<code bash>
 +lsblk 
 +NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
 +nvme0n1     259:   0  1,8T  0 disk 
 +nvme1n1     259:   0  1,8T  0 disk 
 +├─nvme1n1p1 259:2    0  512M  0 part /boot/firmware
 +└─nvme1n1p2 259:3    0  1,8T  0 part /
 +</code>
 +
 +Toto chování jsem nečekal, ale beru ho jako fakt a budu s ním dále pracovat obezřetně.
 +
 +
 +Abych si ušetřil problémy a následné zmatky, tak jsem raději disky prohodil. Tedy disk s operačním systémem jsem dal do slotu SSD2 a nový disk do slotu SSD1. Po změně zapojení vypadá výpis takto:
 +
 +<code bash>
 +NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS   
 +nvme0n1     259:   0  1,8T  0 disk               
 +├─nvme0n1p1 259:1    0  512M  0 part /boot/firmware
 +└─nvme0n1p2 259:2    0  1,8T  0 part /             
 +nvme1n1     259:   0  1,8T  0 disk               
 +</code>
 +
 +==== Vytvoření partition na novém disku před RAIDem ====
 +
 +Před vytvořením softwarového RAIDu je doporučeno **ručně vytvořit odpovídající partitiony na novém disku** (**nvme0n1**), aby odpovídaly rozdělení stávajícího disku (**nvme1n1**).  
 +RAID se obvykle vytváří nad existujícími partitionami, nikoliv nad celým diskem (i když je to možné, ale méně běžné).
 +
 +=== Jak vytvořit partitiony přesně podle původního disku? ===
 +
 +K tomu použijeme příkaz **sfdisk**, který umožňuje zkopírovat tabulku oddílů ze **nvme1n1** na **nvme0n1**.
 +
 +=== Krok 1: Záloha stávající partition tabulky ===
 +
 +Než cokoliv změníme, je vhodné **uložit stávající partition tabulku**, pokud by bylo potřeba ji obnovit:
 +
 +<code bash>
 +sudo sfdisk -d /dev/nvme0n1 > partition_backup.txt
 +</code>
 +
 +Tím se uloží rozložení oddílů do souboru **partition_backup.txt**, což umožní jejich případnou obnovu.
 +
 +=== Krok 2: Zkopírování partition schématu na nový disk ===
 +
 +Zkopíruj stejnou partition tabulku ze **nvme1n1** na **nvme0n1**:
 +
 +<code bash>
 +sudo sfdisk /dev/nvme1n1 < partition_backup.txt
 +</code>
 +
 +Tento příkaz vytvoří na **nvme1n1** stejnou strukturu jako na **nvme0n1**.
 +
 +=== Krok 3: Ověření správnosti nového rozdělení disku ===
 +
 +Po provedení předchozího příkazu je vhodné **ověřit, zda jsou partitiony nyní identické**:
 +
 +<code bash>
 +lsblk
 +fdisk -l /dev/nvme1n1
 +</code>
 +
 +Pokud se vše shoduje, můžeme pokračovat v nastavování RAIDu.
 +
 +
 +
 +==== Konfigurace RAID 1 pomocí mdadm ====
 +
 +Pro konfiguraci softwarového RAIDu pro zrcadlení (RAID 1) použijeme **mdadm**.
 +
 +Nejprve nainstalujeme potřebný balíček:
 +
 +<code bash>
 +sudo apt install mdadm
 +</code>
 +
 +Vzhledem k tomu, že RAID nastavujeme na běžícím systému, vytvoříme RAID **v degradovaném režimu**, tedy pouze s jedním diskem. Druhý disk přidáme později.
 +
 +=== Vytvoření RAID 1 v degradovaném režimu ===
 +
 +Místo dvou disků v RAIDu vytvoříme pole pouze s novým diskem (**nvme1n1p1** a **nvme1n1p2**).  
 +Druhý disk zatím nebude připojen (`missing`), což RAID umožňuje:
 +
 +<code bash>
 +sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/nvme1n1p1 missing --metadata=0.90
 +sudo mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/nvme1n1p2 missing
 +</code>
 +
 +✅ **Vysvětlení:**  
 +  * `missing` znamená, že druhý disk zatím není připojen, RAID poběží pouze s jedním diskem.
 +  * `--metadata=0.90` je doporučeno pro zaváděcí oddíly.
 +
 +Následujícím krokem je vytvoření souborového systému na nově vytvořeném RAIDu.
 +
 +=== Vytvoření souborových systémů ===
 +
 +Na nových RAID oddílech vytvoříme souborový systém:
 +
 +<code bash>
 +sudo mkfs.vfat /dev/md0
 +sudo mkfs.ext4 /dev/md1
 +</code>
 +
 +Nyní připojíme RAID a přeneseme systémové soubory.
 +
 +=== Přenos systémových souborů na RAID ===
 +
 +Nejprve připojíme bootovací oddíl RAID:
 +
 +<code bash>
 +mkdir /mnt/raid_boot
 +mount /dev/md0 /mnt/raid_boot
 +rsync -axv /boot/firmware/ /mnt/raid_boot/
 +</code>
 +
 +Poté připojíme hlavní oddíl a přeneseme systém:
 +
 +<code bash>
 +mkdir /mnt/raid_root
 +mount /dev/md1 /mnt/raid_root
 +rsync -axv / /mnt/raid_root --exclude=/mnt --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/tmp
 +</code>
 +
 +=== Úprava fstab pro použití RAIDu ===
 +
 +Otevřeme soubor **fstab** na novém RAIDu:
 +
 +<code bash>
 +nano /mnt/raid_root/etc/fstab
 +</code>
 +
 +Najdeme řádky obsahující `/dev/nvme0n1p1` a `/dev/nvme0n1p2` a upravíme je:
 +
 +<code>
 +/dev/md0  /boot/firmware vfat  defaults  0  2
 +/dev/md1  /              ext4  defaults,noatime,errors=remount-ro  0  1
 +</code>
 +
 +Tím zajistíme, že systém při bootu použije RAID.
 +
 +=== Aktualizace konfigurace mdadm ===
 +
 +Zjistíme UUID RAID polí:
 +
 +<code bash>
 +mdadm --detail --scan
 +</code>
 +
 +Výstup bude podobný tomuto:
 +
 +<code>
 +ARRAY /dev/md0 metadata=0.90 UUID=e11e72e6:cfe13794:c15f4f5c:b4c7de4f
 +ARRAY /dev/md1 metadata=1.2 name=server:1 UUID=6af6a5bd:b7fd9bcc:2cd91b19:bf09e0c3
 +</code>
 +
 +Tento výstup zapíšeme na konec souboru:
 +
 +<code bash>
 +nano /mnt/raid_root/etc/mdadm/mdadm.conf
 +</code>
 +
 +=== Úprava cmdline.txt pro bootování z RAIDu ===
 +
 +Otevřeme soubor bootovací konfigurace:
 +
 +<code bash>
 +nano /mnt/raid_boot/cmdline.txt
 +</code>
 +
 +Najdeme řádek obsahující:
 +
 +<code>
 +root=PARTUUID=aa235387-02
 +</code>
 +
 +A nahradíme jej:
 +
 +<code>
 +root=/dev/md1 rootfstype=ext4 fsck.repair=yes rootwait rootdelay=10 cfg80211.ieee80211_regdom=CZ
 +</code>
 +
 +✅ **Vysvětlení:**
 +  * `root=/dev/md1` – říká jádru, že root filesystem je na RAIDu.
 +  * `rootwait rootdelay=10` – umožňuje systému počkat na sestavení RAIDu.
 +  * `fsck.repair=yes` – umožní automatickou opravu souborového systému při bootu.
 +
 +=== Přidání RAID modulů do initramfs ===
 +
 +Aby jádro vědělo, že používáme RAID již při bootu, přidáme moduly do **initramfs**:
 +
 +<code bash>
 +nano /mnt/raid_root/etc/initramfs-tools/modules
 +</code>
 +
 +Přidáme tyto řádky:
 +
 +<code>
 +raid1
 +md_mod
 +ext4
 +</code>
 +
 +Aktualizujeme initramfs:
 +
 +<code bash>
 +umount /mnt/raid_boot
 +mount /dev/md0 /mnt/raid_root/boot/firmware/
 +
 +mkdir -p /mnt/raid_root/dev /mnt/raid_root/proc /mnt/raid_root/sys /mnt/raid_root/run
 +
 +mount --bind /dev /mnt/raid_root/dev
 +mount --bind /proc /mnt/raid_root/proc
 +mount --bind /sys /mnt/raid_root/sys
 +mount --bind /run /mnt/raid_root/run
 +
 +chroot /mnt/raid_root 
 +update-initramfs -u
 +</code>
 +
 +Tím jsme zajistili, že RAID bude dostupný již při startu systému.
 +
 +**Nyní jsem mohl Raspberry restartovat. Důležitá věc, musel jsem primární disk - tedy disk s RAID přesunout do slotu SSD2 na desce. Dokud jsem to neudělal, boot se nepodařil, systém byl zmatený. Tento krok je klíčový - prohodit disky ve slotech.**
 +
 +
 +==== Přidání disku do RAID ====
 +
 +Po prohození disků ve slotech (disk s nastaveným RAIDem musí být ve slotu **SSD2**) a nabootování systému je možné přidat druhý disk zpět do RAID pole.  
 +Stejný postup se použije i v případě, že se nějaký disk odpojí a pole je **degradované**, tedy běží pouze s jedním diskem.
 +
 +✅ **Klíčové pravidlo:**  
 +**Primární disk musí být ve slotu SSD2, aby systém správně nabootoval.**
 +
 +=== Stav RAID pole po nabootování ===
 +
 +Z výpisu je vidět, že v RAID poli je zatím pouze jeden disk:
 +
 +<code bash>
 +cat /proc/mdstat 
 +</code>
 +
 +**Výstup:**
 +<code>
 +Personalities : [raid1] [linear] [raid0] [raid6] [raid5] [raid4] [raid10] 
 +md0 : active raid1 nvme0n1p1[0]
 +      524224 blocks [2/1] [U_]
 +      
 +md1 : active raid1 nvme0n1p2[0]
 +      1952854080 blocks super 1.2 [2/1] [U_]
 +      bitmap: 4/4 pages [64KB], 65536KB chunk
 +</code>
 +
 +Nově připojený disk **nvme1n1** zatím není součástí RAID pole.
 +
 +=== Výpis připojených disků ===
 +
 +Podíváme se na aktuální stav připojených disků:
 +
 +<code bash>
 +lsblk
 +</code>
 +
 +**Výstup:**
 +<code>
 +NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
 +nvme0n1     259:   0   1,8T  0 disk  
 +├─nvme0n1p1 259:1    0   512M  0 part  
 +│ └─md0       9:   0 511,9M  0 raid1 /boot/firmware
 +└─nvme0n1p2 259:2    0   1,8T  0 part  
 +  └─md1       9:   0   1,8T  0 raid1 /
 +nvme1n1     259:   0   1,8T  0 disk  
 +├─nvme1n1p1 259:4    0   512M  0 part  
 +└─nvme1n1p2 259:5    0   1,8T  0 part  
 +</code>
 +
 +=== Detaily RAID pole ===
 +
 +Zkontrolujeme aktuální stav RAID pole:
 +
 +<code bash>
 +mdadm --detail /dev/md0
 +</code>
 +
 +<code>
 +/dev/md0:
 +           Version : 0.90
 +     Creation Time : Sat Feb 15 16:52:29 2025
 +        Raid Level : raid1
 +        Array Size : 524224 (511.94 MiB 536.81 MB)
 +     Used Dev Size : 524224 (511.94 MiB 536.81 MB)
 +      Raid Devices : 2
 +     Total Devices : 1
 +       Persistence : Superblock is persistent
 +
 +       Update Time : Sat Feb 15 19:15:46 2025
 +             State : clean, degraded 
 +    Active Devices : 1
 +   Working Devices : 1
 +    Failed Devices : 0
 +     Spare Devices : 0
 +
 +Consistency Policy : resync
 +
 +    Number   Major   Minor   RaidDevice State
 +           259        1        0      active sync   /dev/nvme0n1p1
 +                    0        1      removed
 +</code>
 +
 +Stejným způsobem můžeme zkontrolovat i hlavní RAID oddíl:
 +
 +<code bash>
 +mdadm --detail /dev/md1
 +</code>
 +
 +**Výstup ukazuje, že RAID pole je degradované – chybí druhý disk.**
 +
 +=== Přidání nového disku do RAID pole ===
 +
 +Nyní přidáme nový disk **nvme1n1** do RAID pole:
 +
 +<code bash>
 +mdadm --add /dev/md0 /dev/nvme1n1p1
 +mdadm --add /dev/md1 /dev/nvme1n1p2
 +</code>
 +
 +Po přidání zkontrolujeme stav RAIDu:
 +
 +<code bash>
 +cat /proc/mdstat 
 +</code>
 +
 +**Výstup ukazuje, že RAID začíná synchronizaci:**
 +<code>
 +Personalities : [raid1] [linear] [raid0] [raid6] [raid5] [raid4] [raid10] 
 +md0 : active raid1 nvme1n1p1[1] nvme0n1p1[0]
 +      524224 blocks [2/2] [UU]
 +      
 +md1 : active raid1 nvme1n1p2[2] nvme0n1p2[0]
 +      1952854080 blocks super 1.2 [2/1] [U_]
 +      [=>...................]  recovery =  5.3% (104572928/1952854080) finish=149.1min speed=206517K/sec
 +      bitmap: 4/4 pages [64KB], 65536KB chunk
 +</code>
 +
 +=== Sledování průběhu synchronizace ===
 +
 +Pro sledování průběhu synchronizace RAID pole můžeme použít:
 +
 +<code bash>
 +watch -n 1 cat /proc/mdstat
 +</code>
 +
 +✅ **RAID nyní probíhá synchronizace a disk bude plně zrcadlen po dokončení procesu.**
 +
 +
 +=== Priorita disků po odpojení a opětovném připojení ===
 +
 +Pokud dojde k **odpojení jednoho disku** a následně jej znovu připojíme, systém rozhodne, **který disk bude v RAIDu upřednostněn**, a to na základě několika faktorů.
 +
 +Nezáleží na tom, **že je disk ve slotu SSD2**, protože po připojení obou disků systém automaticky **vybere ten, který běžel jako poslední aktivní po rozpojení RAIDu**.
 +
 +=== Jak systém určuje, který disk bude upřednostněn? ===
 +
 +Systém rozhoduje na základě **poslední aktualizace metadat RAIDu**. Každý disk v RAIDu obsahuje **metadata (superblock)**, která uchovávají informace o změnách v poli.  
 +**Klíčový parametr je tzv. Event Count**, což je čítač změn.
 +
 +✅ **RAID vybere disk s nejvyšším Event Count jako platný.**  
 +Pokud má jeden disk vyšší Event Count než druhý, systém považuje tento disk za aktuální a použije jej jako primární.
 +
 +=== Jak zjistit, který disk má vyšší Event Count? ===
 +
 +Můžeš si ověřit, který disk má aktuálnější metadata pomocí příkazu:
 +
 +<code bash>
 +mdadm --examine /dev/nvme0n1p2 /dev/nvme1n1p2
 +</code>
 +
 +**Výstup bude obsahovat řádky podobné tomuto:**
 +
 +<code>
 +/dev/nvme0n1p2:
 +           Events : 405
 +
 +/dev/nvme1n1p2:
 +           Events : 392
 +</code>
 +
 +✅ **Disk s vyšším číslem „Events“ je považován za aktuální.**  
 +Pokud se **Event Count neshoduje**, mdadm automaticky označí **starší disk jako neaktuální** a vyřadí ho z RAID pole.
 +
 +=== Co se stane při neaktuálním disku? ===
 +
 +Pokud má jeden z disků nižší Event Count, systém jej při dalším spuštění považuje za **zastaralý** a označí jej jako neaktivní.  
 +RAID pak při připojení tohoto disku provede **resynchronizaci** dat.
 +
 +Proto je důležité po výpadku disku **zkontrolovat stav RAID
 +
  
  
  • it/jednodeskove-pocitace/raspberry-pi-5-domaci-server.1739582696.txt.gz
  • Poslední úprava: 2025/02/15 01:24
  • autor: Petr Nosek