Portál AbcLinuxu, 9. května 2025 15:30
Blog Jefferai.org informuje o velkém narušení dat (data corruption) ke kterému došlo 22.3. a bylo rozšířeno i na mirrory tohoto serveru. Šťastnou náhodou byl jeden ze serverů v době narušení dat odstaven a zachoval tak neporušená data. Autor článku na tomto příkladu ukazuje, že git není tak bezpečný, jak jeho původní autor Linus uvádí. Na závěr autor uvádí nový způsob zabezpečení dat v KDE.
Tiskni
Sdílej:
git clone --mirror
se očekává kopie obsahu celého repozitáře. Zálohy zřejmě mají. Ten člověk se nebál o pár dní starý stav repozitářů, ale o jejich nejposlednější stav, který jaksi mirrory neřeší. A zřejmě objevil nebezpečný rozpor mezi tím, co tvrdí Linus a co se v Gitu při této akci skutečně děje.
V případě, že by se toto nechytilo, tak by to nebyla až taková trága, ale způsobilo by to hromadu nepříjemností ohledně nahánění aktuálního stavu projektu.
A zřejmě objevil nebezpečný rozpor mezi tím, co tvrdí Linus a co se v Gitu při této akci skutečně děje.A v cem vidis ten rozpor? To ze
git clone --mirror
neprovadi fsck
automaticky je snad dobre, trva to vecnost, a je na spravcich repositare zajistit integritu repository pred jejim naklonovanim.
A v cem vidis ten rozpor?V tom, že značně přehání, když říká, že se o to nikdy nemusíš starat, a že to Git vždy kontroluje sám.
To ze git clone --mirror neprovadi fsck automaticky je snad dobre, trva to vecnost, a je na spravcich repositare zajistit integritu repository pred jejim naklonovanim.To nerozporuju.
If you have disc corruption, if you have RAM corruption, if you have any kind of problems at all, git will notice them. It’s not a question of if. It’s a guarantee. You can have people who try to be malicious. They won’t succeed. You need to know exactly 20 bytes, you need to know 160-bit SHA-1 name of the top of your tree, and if you know that, you can trust your tree, all the way down, the whole history. You can have 10 years of history, you can have 100,000 files, you can have millions of revisions, and you can trust every single piece of it. Because git is so reliable and all the basic data structures are really really simple. And we check checksums.
git clone --mirror
dělá přesně to, co se od něj očekává. Proto není dobré mít zálohy Gitu přes git clone --mirror
.
Btw. nikdy jsem --mirror
nepoužíval. Nikdy jsem nepochopil, k čemu je dobré vypnout ochrany, které potom akorát způsobí, že vývojáři si takto propagované změny už třeba ani nepull
nou. Naopak, pokud mirror se zapnutými ochranami odmítne udělat pull
, ihned to upozorní, že někdo si hrál a rozbil main repository nebo že je tam vadný hardware (force push je zlo, správně se takové chyby opravují přes merge -s ours
). Celý systém s anongitem by měl navíc používat dvoustupňový clone: samotný mirror by měl být clonován bez --mirror
a teprve z něj by měl být anongit lokálně clonován s --mirror
.
Trochu to zní jako FUD, ale není to tak, Jeff to tam taky popisuje. git clone --mirror dělá přesně to, co se od něj očekává. Proto není dobré mít zálohy Gitu přes git clone --mirror.Pokud ho správně chápu, tak v tom není žádný problém, když se explicitně používá git fsck. Navíc Jeff zřejmě očekával od
--mirror
i tu kontrolu.
Btw. nikdy jsem --mirror nepoužíval.Bez
--mirror
se ti nekopírují všechny větve. Alternativou k němu je jen něco ve stylu rsync
(ten navíc kopíruje i konfiguraci repozitáře, což může a nemusí být to, co chceš).
Nikdy jsem nepochopil, k čemu je dobré vypnout ochrany, které potom akorát způsobí, že vývojáři si takto propagované změny už třeba ani nepullnou.V tomto případě se nejedná o vypnutí ochran, ale o jejich absenci.
Naopak, pokud mirror se zapnutými ochranamiČemu říkáš mirror se zapnutými ochranami?
odmítne udělat pull, ihned to upozorní, že někdo si hrál a rozbil main repository nebo že je tam vadný hardwareTady jsi úplně na jiné úrovni,
git pullpracuje s větvemi, ne s repozitáři.
Celý systém s anongitem by měl navíc používat dvoustupňový clone: samotný mirror by měl být clonován bez --mirror a teprve z něj by měl být anongit lokálně clonován s --mirror.Tak tohle už je pořádná blbost. Když uděláš klon s
--mirror
, tak přijdeš o data (ostatní větve). Následné použití --mirror
už ti je pochopitelně nevrátí.
Bez --mirror se ti nekopírují všechny větve. Alternativou k němu je jen něco ve stylu rsync (ten navíc kopíruje i konfiguraci repozitáře, což může a nemusí být to, co chceš).Ale zkopírují, pouze se nezaloží lokálně:
git pull From ssh://my.serv.er/git/project.git * [new branch] blabla -> origin/blabla Already up-to-date.Ale všechny commity jsou zkopírované a máte tedy kompletní zálohu.
V tomto případě se nejedná o vypnutí ochran, ale o jejich absenci.Jde o vypnutí. Při
git pull
, pokud repozitář nebyl založen pomocí git clone --mirror
, tam totiž jsou.
Čemu říkáš mirror se zapnutými ochranami?Mirror server vytvořený pomocí
git clone
místo git clone --mirror
.
pracuje s větvemi, ne s repozitářiNe,
git pull
sice aktualizuje jen aktuální lokální větev, ale z repozitářů stahuje všechny změny (ve výchozím nastavení). Ostatně je to napsané i v manuálu.
Tak tohle už je pořádná blbost. Když uděláš klon s --mirror, tak přijdeš o data (ostatní větve). Následné použití --mirror už ti je pochopitelně nevrátí.
git clone
naklonuje všechny větve i bez --mirror
, pouze je nezakládá lokálně. Ty větve ale pořád jsou stažené a jdou kdykoliv lokálně vytvořit pomocí git checkout větev
. Ten anongit by se teda musel udělat trochu jinak, aby se donutil zakládat lokálně větve z původního serveru: git clone --reference lokální_kopie --mirror originální_server
.
Ale zkopírují, pouze se nezaloží lokálně:A jo, pravda, ty commity se stáhnou, díky za upřesnění.
Jde o vypnutí. Při git pull, pokud repozitář nebyl založen pomocí git clone --mirror, tam totiž jsou.Ne. Ještě teď jsem si zkontroloval manuálovou stránku a u
--mirror
se nepíše nic o tom, že by sloužilo k vypínání jakýchkoli ochran a dokonce ani ten vedlejší efekt tam není popsaný. Takže skutečně nikoliv.
Ten anongit by se teda musel udělat trochu jinak, aby se donutil zakládat lokálně větve z původního serveru: git clone --reference lokální_kopie --mirror originální_server.Podle dokumentace je --reference jen optimalizace při použití více lokálních repozitářů, nic víc. Nejspíš by pomohlo, kdyby Git umožňoval alespoň volitelně kontrolovat stahované commity.
Ne. Ještě teď jsem si zkontroloval manuálovou stránku a u --mirror se nepíše nic o tom, že by sloužilo k vypínání jakýchkoli ochran a dokonce ani ten vedlejší efekt tam není popsaný. Takže skutečně nikoliv.it maps all refs (including remote-tracking branches, notes etc.) and sets up a refspec configuration such that all these refs are overwritten by a git remote update in the target repository Pokud to přepisování není povoleno, tak si ten mirror všimne, že nově stažená data historicky nenavazují na místní a odmítne se synchronizovat. Druhá možnost je zapnout
transfer.fsckObjects
.
Podle dokumentace je --reference jen optimalizace při použití více lokálních repozitářů, nic víc. Nejspíš by pomohlo, kdyby Git umožňoval alespoň volitelně kontrolovat stahované commity.Ano, a ten referencovaný repozitář, pokud nebude klonovaný s
git clone --mirror
, to už bude hlídat.
Pokud to přepisování není povoleno, tak si ten mirror všimne, že nově stažená data historicky nenavazují na místní a odmítne se synchronizovat.Nevidím souvislost.
Druhá možnost je zapnout transfer.fsckObjects.To zní jako řešení.
Ano, a ten referencovaný repozitář, pokud nebude klonovaný s git clone --mirror, to už bude hlídat.Drbání levou nohou za pravým uchem.
--mirror
Set up a mirror of the source repository. This implies --bare. Compared to --bare, --mirror not only maps local branches of the source to local branches of the target, it maps all refs (including remote-tracking branches, notes etc.) and sets up a refspec configuration such that all these refs are overwritten by a git remote update in the target repository.
--bare
Make a bare GIT repository. That is, instead of creating (directory) and placing the administrative files in (directory)/.git, make the (directory) itself the $GIT_DIR. This obviously implies the -n because there is nowhere to check out the working tree. Also the branch heads at the remote are copied directly to corresponding local branch heads, without mapping them to refs/remotes/origin/. When this option is used, neither remote-tracking branches nor the related configuration variables are created.
No spis to vypada ze "nove, uzasne" ext4 opet ztraci/nici data.Blabol, ext4 je OK. Z clanku neni jasne receno co je pricinou, jaky kernel ci HW pouzivaji a naopak z celeho pribehu kouka amaterismus spravcu KDE.
Ext systémy spoléhají na fyzické zařízení.Google pouziva na svych serverech ext4 (Irsko), ale pokud vim maji vyladeny custom firmware v discich; netusim v cem se lisi.
V tom je podle mě zakopaný pes. Ext systémy spoléhají na fyzické zařízení. Bohužel u virtualizace není pod souborovým systémem obvykle fyzické zařízení, ale nějaká jiná vrstva - i víc, na které ovšem nikdy nelze na 100% spoléhat.Jiste, jenomze to neni chyba Ext. To je chyba te vrstvy ktera tvrdi ze umi sync, a pritom ho neumi (plus chyba spravce ze na tydle veci spoliha a/nebo o jejich omezenich nevi). Kdyz vam blokova vrstva tvrdi ze neco provede a pak to neprovede, neudela s tim ext* vubec nic (stejne tak zfs nebo jakykoliv jiny *fs).
Data jsou obvykle poházená všude možně zajišťují konzistenci dat na více místech.LOL, pobavil.
fsck na ext systému opraví systém takovým způsobem, že poškozený git repozitář už nejde opravit.Pokud vam zacne selhavat HW a data proste nejsou na fyzickem zaznamovem mediu, tak vas nezachrani vubec nic. Faktem, ze btrfs vam v nekterych situacich muze pomoci, ale ani to neni panacea a hlavne to neni zatim v produkcnim stavu.
kupř. Btrfs, které duplikuje metadata.
..a hlavne to neni zatim v produkcnim stavu.Nemůžu si pomoci, ale za tu dobu, co bez problémů "experimentální" Btrfs používám, se u ext4 objevilo už několik dosti fatálních chyb, které mohly vést ke ztrátě dat. A je dost dobře možné, že některá z nich byla i v pozadí problému s ext4 v mém případě.
Proto taky KVM umí používat LVM a fyzické oddíly.+1 To je cesta.
Pokud vím tak raid 10 není nic víc než dvě pole typu raid1 spojené do raid 0Ano, dve raid 1 (mirroring) spojene do raid 0 (stripping) - a stripe of mirrors.
Tj. Z jednoho řadiče max 2 disky v jednom raid6 poli.
Aha, takže nejde ani tak o počet portů:
Dnes se prodávají desky co mají 8 sata portů celkem běžně.
Ale o počet řadičů. Ono totiž není problém mít všechny porty řízené jediným řadičem.
zkoušel jsem to ve virtuálu, jen mě zajímaly reálné limity.
v pytli
V záloze.
Že se problém vyřeší pokud se virtualizuje přímo nad fyzickým zařízením.To jsem nerekl. Podporil jsem tvrzeni, ze neni dobre vitualizovat nad file systemem, ale je treba pouzit primo partition.
Data jsou na polích typu raid6, což minimalizuje právě pravděpodobnost narušení dat ze strany problémového hardware.Raid 10.
The second bug was thinking that git clone --mirror behaves the way that we expect it to behave based on the man page.Co si tedy vlastne mysleli?
RAID/DRBD/Etc. I don’t really need to go here. These are useful for keeping your server up and running, not preventing corruption....
UPDATE: in fact, it appears that the problem was our testing methodology after the fact, where we should have used –local but instead used –no-hardlinks; the man page is consistent. However, there are still failure states you can hit when using mirrors that will cause git clone to exit with a status code of zero.Opet budu citovat manual:
--localTakze jsme opet na zacatku.
When the repository to clone from is on a local machine, this flag bypasses the normal "git aware" transport mechanism and clones the repository by making a copy of HEAD and everything under objects and refs directories. The files under .git/objects/ directory are hardlinked to save space when possible. If the repository is specified as a local path (e.g., /path/to/repo), this is the default, and --local is essentially a no-op. If the repository is specified as a URL, then this flag is ignored (and we never use the local optimizations). Specifying --no-local will override the default when /path/to/repo is given, using the regular git transport instead. To force copying instead of hardlinking (which may be desirable if you are trying to make a back-up of your repository), but still avoid the usual "git aware" transport mechanism, --no-hardlinks can be used.
--no-hardlinks
Optimize the cloning process from a repository on a local filesystem by copying files under .git/objects directory.
git clone môže vrátiť návratový kód 0, aj keď nastane nejaká chybaTo je problem.
ale správnosť dát sa nekontroluje.Ale proc by pri lokalnim kopirovani mela? Ocekavate takovou kontrolu od
cp
? Git nikdy nedelal vic nez nutne minimum a nastroje pro kontrolu repository jsou.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.