Obnova dat ve stylu MacGyvera - sranda z katastrofy
Představte si, že uděláte kritickou chybu. Takovou, která ohrožuje vaši obživu, osobní informace a duševní pohodu.
Instalaci Microsoft Windows.
Nedávno se stal incident. Nechal jsem Windows aktualizovat, a po restartu byla tabulka oddílů pryč.
Odkládal jsem aktualizace Windows tak dlouho, jak to jen šlo, role tohoto OS na mém počítači byla zcela sekundární - existuje pár videoher s anticheatem na úrovni rootkitu, velmi agresivním, které rád občas hraju s přáteli. Bohužel je nemohu hrát na Linuxu.
Je tu jeden obzvlášť závažný případ od společnosti, jejíž název začíná na R a končí na iot.
Takže možná jsem částečně vinen tím, že se všechno zhroutilo.
Aby to bylo ještě zajímavější, byl jsem daleko od domova, v podstatě v přerostlé vesnici, s pouze následující technologií k dispozici:
- Jeden USB disk s instalátorem OpenBSD
- Router/Modem na vrcholu police s pouze jedním velmi krátkým ethernetovým kabelem
- Můj telefon
- Laptop, který byl nyní efektivně mrtvý
V neposlední řadě jej používají hipsteři jako já.
Nemohl jsem tu sehnat druhý flash disk, protože byl víkend (pátek, což je nejhorší možný čas, samozřejmě).
Protože jsem nemohl naflashovat Linux na flash disk a provést obnovu dat klasickým způsobem, musel jsem trochu improvizovat.
Hm, kdo je MacGyver?
Pokud jste příliš mladí, abyste si pamatovali, MacGyver byl hrdina TV seriálu z 80. let, který dokázal vyřešit jakýkoli problém s kancelářskou sponkou, žvýkačkou a čistou vynalézavostí. Něco jako to, co my uživatelé Linuxu děláme, když Windows nevyhnutelně exploduje (mnoho takových případů - musel jsem si užívat rozbité ovladače eGPU přibližně jednou za 1-2 měsíce).
MacGyver byl před mou dobou, ale užíval jsem si sledování Richarda Deana Andersona po léta a léta v Stargate SG-1 a dalších.
Ale odbočuji. Zpět k našemu příběhu bídy a ztracených tabulek oddílů.
USB s OpenBSD bylo mou kancelářskou sponkou, protože to bylo něco, z čeho jsem mohl bootovat a připojit se k internetu.
Také jsem zjistil, že testdisk
byl k dispozici jako balíček pro OpenBSD. Nicméně,
instalátor není opravdu LiveCD, na jaké můžete být zvyklí z Linuxu - nemůže dočasně instalovat
balíčky.
- Obnovit smazané oddíly
- Přestavět boot sektory
- Obnovit smazané soubory z souborových systémů
- Kopírovat soubory ze smazaných souborových systémů
Hádejte, co jsem musel udělat?
Nainstalovat OpenBSD zpět na flash disk (instalátor se naštěstí načítá do RAM).
Nebyl to obtížný proces a musím pochválit vývojáře OpenBSD za to, že udělali instalátor velmi uživatelsky přívětivý.
Po instalaci jsem měl příjemné překvapení: OpenBSD je jedním z mála BSD, které má ovladače pro síťovou kartu, kterou jsem vložil do svého ThinkPadu - Intel AX200.
- Intel AC-7260, se kterým byl můj Thinkpad T480s dodán, se choval trochu podezřele a měl jsem podezření, že by mohl odejít. Mé podezření se potvrdilo o několik let později (minulý víkend), když jsem se ho pokusil znovu vložit, abych mohl mít DragonFly BSD s podporou Wifi. Neobjevil se ani jako zařízení v Linuxu, natož v BSD. Pak jsem také našel D-Link Wifi dongle s čipem Realtek, o kterém jsem si myslel, že je opravdu běžný. Znovu špatně, Dfly má ovladače pro mnoho, ne pro tento. Nejsou žádné ovladače pro AX-200. Kritický neúspěch u všech 3 možností bezdrátového připojení, které jsem měl. :)
- Četl jsem článek o Wifi 6 a myslel jsem si, že je to opravdu cool, a impulzivně jsem koupil router za 5k CZK, který k té kartě pasoval. Je to nejlepší router, který vlastním, velký úspěch.
To znamenalo, že jsem mohl pokračovat ve zbytku své cesty za obnovou vsedě.
Instalace testdisku na OpenBSD a znovuobjevení oddílů
Jsem kutil, takže jsem měl svůj hlavní Linux rozdělený na více oddílů, každý s jiným souborovým systémem (EXT4, F2FS, XFS, BTRFS)
- EXT4: Čtvrtý rozšířený souborový systém, běžně používaný v Linuxu
- F2FS: Flash-Friendly File System, navržený pro flash úložná zařízení
- XFS: Vysoce výkonný žurnálovací souborový systém
- BTRFS: B-tree File System, zaměřený na odolnost vůči chybám a snadnou správu
Opravdu jsem je chtěl všechny vyzkoušet, zjistit, jak fungují a experimentovat s nimi. A udělal jsem to, a bylo to skvělé. Nicméně, mezi tímto, sekundárním Linuxem, a Windows jsem měl na disku asi 16-18 oddílů. Ups, to je hodně.
Instalace testdisku
byla triviální, stačilo udělat
pkg_add testdisk
(což možná budete muset spustit s doas
, OpenBSD analogem sudo
)
Po několika okamžicích jsem mohl spustit testdisk
a byl jsem přivítán známou obrazovkou:
TestDisk 7.2, Data Recovery Utility, February 2024
Christophe GRENIER <grenier@cgsecurity.org>
https://www.cgsecurity.org
TestDisk je bezplatný software pro obnovu dat navržený k pomoci při obnově ztracených
oddílů a/nebo zprovoznění nespouštěných disků, když jsou tyto příznaky
způsobeny vadným softwarem, určitými typy virů nebo lidskou chybou.
Může být také použit k opravě některých chyb souborového systému.
Informace shromážděné během používání TestDisku mohou být zaznamenány pro pozdější
přezkoumání. Pokud se rozhodnete vytvořit textový soubor testdisk.log, bude
obsahovat možnosti TestDisku, technické informace a různé
výstupy; včetně názvů složek/souborů, které TestDisk použil k nalezení a
zobrazení na obrazovce.
Použijte šipky pro výběr, poté stiskněte klávesu Enter:
>[ Create ] Vytvořit nový log soubor
[ Append ] Připojit informace k log souboru
[ No Log ] Nezaznamenávat nic
Možná není nic sladšího než neděle, ale úvodní obrazovka testdisku je těsně druhá
TestDisk je můj spasitel, můj rytíř v zářivém brnění. Byl tu jen jeden malý problém: Nebyl zkompilován
s podporou pro všechny souborové systémy, které jsem používal. Přesto jsem byl nadšený, protože můj domovský oddíl byl EXT4
.
Obnova klíčů a dalších tajemství z mého /home oddílu
Věděl jsem, že oddíl tam je, a že mohu obnovit své SSH klíče (a další klíče) a další tajemství, takže jsem mohl
spustit testdisk
na NVME SSD, které je v mém notebooku, a voilà, měl bych být schopen získat všechno zpět.
Byl tu jeden malý problém:
- I když z továrny měl tento Thinkpad 256GB NVME SSD disk, hmm, trošku jsem to poupgradil. To, co bylo 256GB, je nyní 4TB Western Digital WD Black disk (měl jsem s nimi dobré zkušenosti a mám druhý, menší WD Black disk, který stále běží perfektně navzdory tomu, že trpěl mnohem větším zneužíváním)
- Procházení 4 terabajtů trvá dlouhou dobu
A tak jsem musel čekat a čekat. A čekat. Tato část procesu trvala asi 5 hodin.
Sike lol
Nový zábavný problém: testdisk
našel mnohem více oddílů, než jsem věděl, že existují. Moje teorie je, že buď vykopal oddíly z
dávné minulosti (což by neměl, tento disk je docela nový), nebo protože jsem měl bitové kopie disků uložené na SSD, rozpoznává
oddíly v nich.
Nicméně, testdisk
rozpoznal mnohem více oddílů, než měl.
Na chvíli jsem se obával.
Ale pak se opět projevila moje zvědavost a náklonnost k kutilství a začal jsem prohlížet oddíly. Podařilo se mi
identifikovat můj /home oddíl bez nejmenších pochybností, což mi umožnilo použít funkci individuální obnovy souborů
testdisku
ke zkopírování klíčů a tajemství.
Díky tomu bych mohl znovu pracovat.
Všechny své pracovní věci mám na rackovém serveru s AMD EPYC, takže mohu kompilovat všechny ty Rust programy dostatečně rychle. K tomuto serveru přistupuji přes SSH a vyvíjím přímo na serveru (editor
kakoune
funguje dostatečně dobře přes SSH)
Další kroky
Skutečnost, že jsem našel více oddílů, než by mělo být, mě inspirovala k tomu, abych k věcem přistupoval velmi opatrně. V tomto bodě jsem byl stále ještě na OpenBSD a chtěl jsem se vrátit k Linuxu, protože jsem tam znal nástroje lépe.
Na Linuxu mohu připojit oddíl bez tabulky oddílů takto:
sudo mount -t ext4 -o ro,offset=<offset oddílu> /dev/nvme0n1 /mnt/mujodil
pozor na jednotky - Bajty != Kilobajty != Bloky
Offset najdete pomocí fdisk
(na správně fungujících discích), nebo v našem případě pomocí testdisk
.
Proces na OpenBSD je o něco složitější:
vnconfig vnd0 /dev/rsd0c -o <offset>
mount -t ext2fs -o ro /dev/vnd0c /mnt/mujodil
Nejprve musíme deklarovat virtuální diskové zařízení na správném offsetu, pak ho můžeme připojit.
Měl jsem možnost rekonstruovat nějakou tabulku oddílů pomocí testdisk
. To by však neslo riziko
obnovení nesprávné tabulky oddílů a já jsem chtěl být v tomto ohledu velmi opatrný.
To mě vedlo k formulaci dalšího plánu:
- Vytvořit obraz celého 4TB disku
- Nahrát obraz na můj serverový stroj, který má další, zcela prázdný 10TB disk
- Vytáhnout oddíly jeden po druhém a prohlédnout si je
První část je nejjednodušší:
dd if=/dev/nvme0n1 of=/nekde/disk.img status=progress bs=1M
S offsety a velikostmi z testdisk
je poslední část velmi snadná.
Můžete znovu použít dd
:
dd if=puvodni_obraz_disku.img of=extrahovany_oddil.img bs=1 skip=$OFFSET count=$VELIKOST
na Linuxu můžete pro chuť přidat status=progress
. Pokud jsou velikost a offset vašeho oddílu v blocích, nepoužívejte bs=1
Překvapivě mnoho lidí neví, že dd
je v podstatě jen chytřejší cp
, a že
Linux opravdu dodržuje mantru “všechno je soubor”. Takže dd může brát soubory a zařízení jako kterýkoli parametr,
a může také brát vstup ze stdin (pokud nenastavíte if=
) nebo výstup do stdout (pokud nenastavíte of=
).
Toto jsou skutečné dvě výzvy, které jsem musel vyřešit:
- Kam uložím obraz? Bude mít 4TB
- Jak ho efektivně přenesu přes síť - disk byl poměrně nový a určitě by tam byly tuny nul, které by se
dobře komprimovaly
- Můj internet tady není nejrychlejší
K řešení prvního problému jsem se rozhodl objednat flash disk (abych mohl spustit Linux) a 5TB externí pevný disk. Ty by měly přijít v pondělí, tak jsem se mezitím šel dotknout trávy:
podívejte se na to, midjourney vygeneroval správný počet prstů, poprvé!
Trochu jsem si pohrál s OpenBSD. Jedna věc, kterou jsem shledal obzvláště zajímavou, je pledge()
. Je to
bezpečnostní opatření, které umožňuje procesu dobrovolně omezit zdroje, které používá, v podstatě se zavazujete, že
budete používat jen to, co říkáte.
Pokud ne, jádro vás zastřelí.
To je podobné Linuxovému seccomp, ale je to mnohem jednodušší na použití.
Zvažte pledge()
:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
// Zavazujeme se používat pouze stdio a rpath (pro čtení souborů)
if (pledge("stdio rpath", NULL) == -1) {
perror("pledge");
return 1;
}
FILE *file = fopen("/etc/hosts", "r");
if (file == NULL) {
perror("Chyba při otevírání souboru");
return 1;
}
char buffer[256];
while (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("%s", buffer);
}
fclose(file);
return 0;
}
versus přibližně ekvivalentní seccomp
:
#include <stdio.h>
#include <stdlib.h>
#include <seccomp.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
scmp_filter_ctx ctx;
ctx = seccomp_init(SCMP_ACT_KILL); // Ukončit proces, pokud provede nepovolené systémové volání
// Povolit nezbytná systémová volání
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(fstat), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0);
if (seccomp_load(ctx) < 0) {
perror("seccomp_load");
return 1;
}
FILE *file = fopen("/etc/hosts", "r");
if (file == NULL) {
perror("Chyba při otevírání souboru");
return 1;
}
char buffer[256];
while (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("%s", buffer);
}
fclose(file);
return 0;
}
Všimněte si, že abychom byli spravedliví, musíme přiznat, že seccomp je velmi jemný nástroj pro omezování systémových volání a
je velmi konfigurovatelný. Jen že vstupní náklady jsou výrazně vyšší než u pledge()
, a proto
ho většina vývojářů nepoužívá.
Závěr
Než jsem vytvořil 4TB kopii obrazu, stáhl jsem si iso Void Linuxu, naflashoval ho na druhý flash disk a přešel na Linux. Pár dní bych běžel z live prostředí.
Vytvoření 4TB obrazu na externím HDD trvalo téměř 3 dny čistého času. Použil jsem nejrychlejší USB port,
který jsem měl, a naformátoval jsem HDD jako ext4
(potřebuji souborový systém, který zvládne velké soubory, a byl co nejvíce univerzální a NE NTFS).
Tři dny nebyly tak špatný čas.
Jakmile to bylo hotovo, měl jsem HDD s obrazem mého původního disku a mohl jsem udělat dvě věci:
- Pracovat s obrazem
- Znovu nainstalovat věci na můj disk
A tak jsem zpět na Linuxu. Artix, s init systémem S6 a jádrem linux-cachyos-bore
.
V druhé části mého úkolu budeme psát program v Rustu pro obnovitelný přenos 4TB souboru s kompresí zstandard.