Motivací k sepsání tohoto howto je přenos a záloha dat na modernějších distribucích Linuxu. Ačkoliv používám v práci z Linuxu čistě RedHat, tak mimo servery (desktopové stanice či NAS, vývojové desky) používám Debian. Ono je úplně jedno, co používáte, je to jenom Linux, aka kernel a userspace. Proto není limitace na distribuci. Na otázky flamewaru, jaký Linux je nejlepší, odpovídám : Linuxulator ve FreeBSD 😀
Tento článek si bere za úkol vysvětlit princip, ne zkrátit syntaxi na CLI, proto zkušený Linuxák zavře očko, nebo jde raději čísti jinam.
Co je potřeba
Podpora Atari layoutu partitions v Linux kernelu je asi základní předpoklad. Debian a ostatní distribuce mají volby jádra, s čím bylo jádro zkompilováno, běžně v adresáři /boot.
# grep -i atari /boot/conf*$(uname -r)
nebo v /proc:
# zgrep -i atari /proc/config.gz
a výsledek by měl být :
CONFIG_ATARI_PARTITION=y
Pokud máte n, tak váš kernel nepodporuje Atari partišny a možná je třeba si do KVM či VirtualBoxu doinstalovat jinou distribuci, pamětníci si refreshnou make menuconfig s dev tools. Alternativně použijete mtools ke všemu, ale tuto možnost tu pokrývat nebudu.
SW co budeme potřebovat je parted, mtools, binutils. Vše bude z příkazové řádky, doinstalujte potřebný SW. V Debian like distru :
# apt install parted mtools binutils
Příprava image
Nejdůležitější je pravidlo, že NIKDY nic neděláme na SD kartě, Compact Flashce nebo SCSI disku. Vše se dělá na kopii pořízené disk/data duplikatorem, tj. commandem dd. Syntaxe je jednoduchá … dd odkud kam, kde odkud je volba if (in file) a kam je volba of (out file). Nepoplésti, jinak bude ve vašem případě dd zkratka založena na ‚disk destroyer‘ významu.
# lsblk | grep mmc
# dd if=/dev/mmcblk0 of=/home/vášuživatel/ataristsd1.img
V případě, že je vaše zařízení typu scsi, tak lsscsi atd … lsblk ukáže všechny rozpoznaná bloková zařízení v systému.
Osobně doporučuji si udělat ještě kopii kopie se sufixem _orig, abychom se měli kam vrátit, když něco selže.
HDdriver, PPutnik driver, SCSI tools driver image
První věc je viditelnost partišen na Linuxu. Idea je taková, že si zjistíme osazení partišen v image a uděláme si z nich virtuální blokové zařízení, které následně připojíme k Linuxu, či z něho a na něj budeme kopírovat s mtools. V tomto máme práci jednodušší s PP driverem a nebo SCSI toolsama, HDdriver dodržuje při ukládaní dat endianitu. Endianita je, velice stručně, pořadí zápisu dat. Velký indián zapisuje zleva, malý indián zprava. Bohužel Linux většinou máme na malém indiánu (i686 a amd64), Motorola v Atárkách je však velký indián.
Zjistíme, zda vidíme partišny u PP … zadejte I jako ignore na všechny dotazy:
# parted ppdriver.img unit b print
Error: Can’t have a partition outside the disk!
Ignore/Cancel? I
Error: Can’t have a partition outside the disk!
Ignore/Cancel? I
Model: (file)
Disk /ppdriver.img: 2048901120B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 32256B 536894975B 536862720B primary fat16
2 536927232B 2049150975B 1512223744B extended lba
5 536959488B 1073822207B 536862720B logical fat16
6 1073886720B 1610749439B 536862720B logical fat16
7 1610813952B 2049118719B 438304768B logical fat16
Jak tedy rozumět struktuře. Čísla partišen 1 až 4 jsou rezervované pro partition table, tj. pokud je MSDOS či očesaný MSDOS, ATARI atd, tak umí jen 4 partišny. Chytré hlavy přišly na to, že je možné adresovat další prostor na disku s tabulkou partišen a pojmenovaly to extended partition table, ty musí začínat číslem 5 a výše. Takže tu máme jednu primární partišnu fat16 pod číslem 1. Pod číslem 2 se skrývá adresace extended partition table, pod číslem 5 se skrývá fat16 partišna, stejně jako pod číslem 6 a 7.
Důvod, proč jsme museli dát Ignore na otázky je, protože partišna 7 přetéká lehce diskovou kapacitu. Proto nikdy moc nevěřím poslední partišně.
Stejné to máme i u SCSI Tools.
HDDriver je však jiná pohádka :
# parted hddriver.img unit b print
Error: /hddriver.img: unrecognised disk label
Model: (file)
Disk /hddriver.img: 2048901120B
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:
Tak se pojdme podivat na header :
strings hddriver.img | less
MDrA
uN(,
„a@J
fL <2
/<?*
@H<0
DSSO.5
NM OANEM
/<?H
JVg@(
e<?I
NDHRDVIREYS
jW$J X
……
Vidím NDHRDVIREYS … N DH RD VI RE YS … když to otočím zrcadlově N HD DR IV ER SY aka N HDDRIVER SY. Takže máme opačný způsob zápisu, endianity … no, pomůžeme si opět převodem image přes dd s volbou swab, dle manuálu swap ‚every pair of input bytes‘.
# dd if=hddriver.img of=hddriver_littleendian.img conv=swab
Jestli budeme data nahrávat zpět, pak nezapomeneme upravenou image pro HDDriver opět konvertovat swabem na velkého indiána.
# parted hddriver_littleendian.img unit b print
Model: (file)
Disk /hddriver_littleendian.img: 2048901120B
Sector size (logical/physical): 512B/512B
Partition Table: atari
Disk Flags:
Number Start End Size Type File system Flags
1 1024B 512001023B 512000000B primary boot
2 512001024B 1024001023B 512000000B primary
3 1024001024B 1536001023B 512000000B primary
4 1536001024B 2048001023B 512000000B primary
To už vypadá lépe. Takže viditelné partišny máme v každém případě. Jdeme na loopy.
U nich jsou důležité 2 hodnoty. Start čísloB … a Size (Nikoliv End, ten budeme ignorovat).
Pro připojeni partišny 3 na HDDriveru tedy bude syntaxe (pod rootem) :
# losetup --find --offset 1024001024 --sizelimit 512000000 hddriver_littleendian.img
# losetup -a | grep hddriver_littleendian.img
/dev/loop29: [65024]:6166491 (hddriver_littleendian.img), offset 1024001024, sizelimit 512000000
/dev/loop29 je naše zařízení k mountu, je to tedy třetí partišna HDDriveru.
To samé u SCSI tools nebo u PPuntik driveru :
# parted ppdriver.img unit b print
Error: Can’t have a partition outside the disk!
Ignore/Cancel? I
Error: Can’t have a partition outside the disk!
Ignore/Cancel? I
Model: (file)
Disk ppdriver.img: 2048901120B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 32256B 536894975B 536862720B primary fat16
2 536927232B 2049150975B 1512223744B extended lba
5 536959488B 1073822207B 536862720B logical fat16
6 1073886720B 1610749439B 536862720B logical fat16
7 1610813952B 2049118719B 438304768B logical fat16
Tak tady si dáme třeba partišnu 6 :
# losetup --find --offset 1073886720 --sizelimit 536862720 ppdriver.img
# losetup -a | grep ppdriver.img
/dev/loop30: [65024]:6183858 (ppdriver.img), offset 1073886720, sizelimit 536862720
Tu máme loop30 obsazen.
Mountovani partišny a nebo mtools
Momentálně máme k dispozici PPutnik a HDDriver image a z každé partišnu na :
# losetup -a | grep ‚ppdriver.img\|hddriver_littleendian.img‘
/dev/loop29: [65024]:6166491 (hddriver_littleendian.img), offset 1024001024, sizelimit 512000000
/dev/loop30: [65024]:6183858 (ppdriver.img), offset 1073886720, sizelimit 536862720
Mount PPutnik image je naprosto bez problémů, čistá FATka :
# mount /dev/loop30 /mnt/a/
# grep loop30 /etc/mtab
/dev/loop30 /mnt/a vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0
# df -hP /mnt/a/
Filesystem Size Used Avail Use% Mounted on
/dev/loop30 512M 9.8M 503M 2% /mnt/a
# ls -la /mnt/a/
total 7092
drwxr-xr-x 4 root root 16384 Jan 1 1970 .
drwxr-xr-x 6 root root 4096 Jul 9 10:58 ..
-rwxr-xr-x 1 root root 341152 Feb 21 2016 CTTBETA.ZIP
-rwxr-xr-x 1 root root 2979563 Apr 9 2016 DEJ-SANS.ZIP
-rwxr-xr-x 1 root root 132577 Jan 17 2016 ELRAD4K.ZIP
-rwxr-xr-x 1 root root 125 Jan 30 2016 FTPD0000.TXT
…..
tradá, mountnuto RW, můžeme kopírovat, ničit, přidávat, zálohovat co hrdlo ráčí.
Mount HDDriveru a SCSI Tools image se nepovede :
# mount /dev/loop29 /mnt/b/
mount: /mnt/b: wrong fs type, bad option, bad superblock on /dev/loop29, missing codepage or helper program, or other error.
Úplně stejnou hlášku budete mít u SCSI Tools partišny. Tady přichází na pomoc mtools :
# mtools
Supported commands:
mattrib, mbadblocks, mcat, mcd, mclasserase, mcopy, mdel, mdeltree
mdir, mdoctorfat, mdu, mformat, minfo, mlabel, mmd, mmount
mpartition, mrd, mread, mmove, mren, mshowfat, mshortname, mtoolstest
mtype, mwrite, mzip
Tak zkusme -i device a zakončeno dvěma dvoutečkama, je to konvence driveru .. jako c:, jen mame ::
# mdir -i /dev/loop29 ::
Volume in drive : has no label
Volume Serial Number is 4D07-0C07
Directory for ::/
No files
511 836 160 bytes free
Hmm, prázdný disk, výběr partišny nebyl štastný, tak na něj zkusíme něco nakopírovat.
# echo Ahoj >> text.txt
# cat text.txt
Ahoj
# mcopy -i /dev/loop29 text.txt ::
# mdir -i /dev/loop29 ::
Volume in drive : has no label
Volume Serial Number is 4D07-0C07
Directory for ::/
text txt 5 2023-07-09 16:58
1 file 5 bytes
511 819 776 bytes free
Syntaxe je jednoduchá … odkud kam … tj, v tomto případě jsme kopírovali odkud (text.txt ) kam (::) za použití device -i /dev/loop29.
V případě, že chcete kopírovat adresáře, je nutno dodat před volbu -/ … například :
# mcopy -i /dev/loop0 -/ ::FBACKUP
Tady kopírujeme ze zařízení loop0 adresář FBACKUP s veškerým obsahem bez udání destinace … aka, zrovna do adresáře kde jsem. Volba -/ mi udává rekurzi a dvě dvojtečky mi říkají DRIVE:\FBACKUP jako zdroj.
Začištění a závěr
Až dokončíme kopírování, zálohy, přenos dat atd, ta je na čase umount, kde se nám povedl mount :
# mount | grep loop
/dev/loop30 on /mnt/a type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
# umount /mnt/a
U mtools nemusíme nic odmountovavat.
Zrušit loopy :
# losetup -a | grep ‚ppdriver.img|hddriver_littleendian.img‘
/dev/loop29: [65024]:6166491 (hddriver_littleendian.img), offset 1024001024, sizelimit 512000000
/dev/loop30: [65024]:6183858 (ppdriver.img), offset 1073886720, sizelimit 536862720
# losetup -d /dev/loop30
# losetup -d /dev/loop29
# losetup -a | grep ‚ppdriver.img|hddriver_littleendian.img‘
#
Nezapomeňte u HDDriveru zkonvertovat zpět endianitu, než vrátíte image zpět na CFku nebo SD card.
# dd if=hddriver_littleendian.img of=hddriver_bigendian.img conv=swab
A je to… už můžete dát image zpět :
# dd if=hddriver_bigendian.img of=/dev/mmcblk0
No, když to vezmu z pohledu uživatele, nejvyšší komfort mi nabízí PPutnik driver a má mé doporučení. I když pokulhává v adresaci, využíva extended partišny, netřeba mu přehazovat endianitu a jde rovnou mountout pod vfat na Linuxu, tj. naprosto pohodova práce s daty. SCSI Tools jsou někde uprostřed. Endianitu mají shodnou, ale přístup přes mtools je těžkopádný. HDDriver poskytuje na Linuxu velký zdroj frustrace. Jednoduché 4 primární partišny v obrácené endianitě s přístupem přes mtools, takže ohromný opruz. Alespoň filesystem by mohl být vfat, ale HDDriver nic nedaruje.
ICD driver nemám nikde nasazen, ani image, ale tipoval bych, že kombinací výše zmíněného se dopátráte konce.
P.S : Jasně, že jsem to mohl celé zkrátit a nemusím používat odděleně mount a losetup atd … účelem článku není edukovat zkušené linuxáře, ale běžné uživatele. Ukázky jsem prováděl na Debianu 11/amd64.