User Tools

Site Tools


wiki:os:linux:writable-snapshot-bez-lvm

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
wiki:os:linux:writable-snapshot-bez-lvm [2018/01/22 15:25]
root vytvořeno
wiki:os:linux:writable-snapshot-bez-lvm [2018/01/22 15:37] (current)
root
Line 1: Line 1:
 ====== Writable snapshot libovolného blokového zařízení bez LVM ====== ====== Writable snapshot libovolného blokového zařízení bez LVM ======
  
-  * **dmsetup** je user interface k **"dm"** (device mapper), což je velmi mocný low-level nástroj na translační mapování mezi blokovými zařízeními.+**"Dmsetup"** je user interface k **"dm"** (device mapper), což je velmi mocný low-level nástroj na translační mapování mezi blokovými zařízeními. 
 + 
 +Zjednodušeně řečeno se tím říká, co má kernel dělat při r/w přístupu k určitému LBA daného zařízení, od lineárního mapování do jiného zařízení, přes striping/mirroring po snapshoty a další. Device mapper je interní součástí kernelu, tedy "dmsetup" je podobný jako třeba příkazy "iptables" nebo "ip", nedělají přímo nic, jen zkonfigurují vnitřní tabulky v kernelu, který pro následující požadavky již dělá potřebná mapování. 
 + 
 +Využívá to např. LVM na vytváření/úpravy mapování LV do VG a VG do PV - např. triviálním několikařádkovým souborem s mapováním "linear" lze dosáhnout toho, že blokové zařízení bude na jiných zařízeních v nesouvislých úsecích (typický případ LVM po větším množství lvremove a lvcreate). Taková tabulka by mohla vypadat např. takhle: 
 + 
 +<code> 
 +0 8000 linear /dev/mapper/vg-main 60000 
 +8000 20000 linear /dev/mapper/vg-main 100000 
 +</code> 
 + 
 +(od začátku řádku to je "začátek v novém zařízení, počet sektorů, způsob mapování, původní zařízení (do nějž jsou přístupy k danému úseku mapovány), začátek na původním zařízení, jednotkou měření pozic je sektor - 512 byte) 
 + 
 +Existující tabulky od všeho v /dev/mapper lze vypsat příkazem "dmsetup table /dev/mapper/<name>" - pro studijní účely... 
 + 
 +:!: POZOR je to velmi nebezpečné, lze klidně udělat mapování do již zmapované oblasti a něco rozbít. Prostě něco jako dd, nic to nekontroluje a udělá to, co se tomu řekne... 
 + 
 +===== Příkazy ===== 
 +Tohle vypíše použitá loop zařízení (loop vyrábí blokové zařízení z úseku jiného blokového zařízení nebo souboru, jde o to, aby se v dalším postupu nepoužila již použitá loop zařízení). 
 +<code bash> 
 +losetup -l 
 +</code> 
 + 
 +Tohle vyrobí loop zařízení z daného úseku disku (tohle je potřeba, když je poškozená partition table a tedy systém nevidí např. /dev/sdb2). I tohle by se dalo udělat dmsetupem, tady to dělám kvůli "read only" mapování. 
 +<code bash> 
 +losetup -r -o 512006144 /dev/loop0 /dev/sdb 
 +</code> 
 + 
 +Tohle zjistí velikost blokového zařízení v sektorech (je to pravděpodobně to samé, co vypisuje fdisk na prvním řádku). 
 +<code bash> 
 +blockdev --getsize /dev/loop0 
 +</code> 
 + 
 +FIXME Tenhle řádek připraví soubor s definicí mapování typu "celé blokové zařízení". To "xtable" je jen jméno, může být libovolné. 
 +<code bash> 
 +xtable: 
 +0 975773156 linear /dev/loop0 0 
 +</code> 
 + 
 +Tohle vytvoří blokové zařízení /dev/mapper/base s výšeuvedeným xtable mapováním: 
 +<code bash> 
 +dmsetup create base xtable 
 +</code> 
 + 
 +Tohle vytvoří soubor dané velikosti (bude to odkládací prostor pro writable snapshot), pokud jde jen o dočasnost a vejde se to, dávám to do /dev/shm, velikost by měla být tak dvojnásobek předpokládaných úprav ve snapshotu - velikost těch úprav se odhaduje těžko, i jeden změněný sektor způsobí copy-on-write většího úseku. 
 +<code bash> 
 +dd if=/dev/zero of=fmodify bs=1M count=64 
 +</code> 
 + 
 +Tohle ze souboru vyrobí blokové zařízení (tady by to nešlo dmsetupem, protože ten umí pracovat jen s blokovými zařízeními): 
 +<code bash> 
 +losetup /dev/loop1 /root/disk/fmodify 
 +</code> 
 + 
 +FIXME Tohle je největší magie, vytvoří mapování typu copy-on-write snapshot, v podstatě to říká "při přístupu k novému zařízení (to se vytvoří v dalším kroku pomocí dmsetup create) použij daný úsek zařízení /dev/mapper/base, když tam někdo zapíše, tak změny ukládej do zařízení /dev/loop1 a to s granularitou 8 sektorů, tedy jakákoliv změna způsobí snapshot-mapping 4 kB (8*512B) bloku, ve kterém je ta změna. Při čtení to pak používá data z /dev/loop1, nejsou-li tam, pak z originálu, při zápisu jdou data vždy do /dev/loop1, pokud tam příslušné LBA už je, jen se přepíše, pokud není, udělá se nejdřív kopie bloku z originálu. 
 +<code bash> 
 +mtable: 
 +0 975773156 snapshot /dev/mapper/base /dev/loop1 p 8 
 +</code> 
 + 
 +Tohle vytvoří ten snapshot podle definiční tabulky: 
 +<code bash> 
 +dmsetup create snap mtable 
 +</code> 
 + 
 +Tohle už je jen příklad, co se s tím pak dá dělat - fsck a rw mount fungují, ale nezapíše to ani bajt na původní zařízení /dev/sdb. Pokud dojde ten "snapshot modify space", začne to hlásit "device is read only"
 +<code bash> 
 +reiserfsck --check /dev/mapper/snap 
 +mount -t reiserfs /dev/mapper/snap /x 
 +</code> 
 + 
wiki/os/linux/writable-snapshot-bez-lvm.1516631154.txt.gz · Last modified: 2018/01/22 15:25 by root