FAT32-es file-rendszert kellett nézegetnem windows-os gépen. Van egy "gyári" 4 GB-os SD kártyám, amin FAT32 van. A CPAN-on találtam egy csomagot (FileSystem::LL::FAT), amivel nézegetni lehet egy már létrehozott FAT32 partíciót. A gyári FAT32 alapján próbáltam a "dos"-os format-tal létrehozni egy ugyanolyat, de azzal egy csomó minden nem lehet beállítani, így azzal nem tudtam ugyanolyan FAT32-es file-rendszer létrehozni (pl. hidden sectors beállítás).
Ezért cygwin alatt próbálkoztam valamit csinálni. Nézegettem, de a Linux-tól jól ismert /usr/sbin/mkfs.vfat.exe nincs, sem /usr/sbin/fsck.vfat.exe. Nézegettem a cygwin.com-on, de ott sem találtam semmiféle hivatkozást ezekre. Nem találtam doksit sem, hogy miért nincs. Hosszas böngészés után végül találtam egy oldalt, amin említés történik az mkdosfs programra. No ezen a nyomon elindultam. Egy honlapon találtam egy hivatkozást a dosfstool (v2.11) csomagra amiben megtalálhatóak az mkdosfs és a dosfsck programok. Ennek installálásáról szól ez a történet.
Naszóval... 7z-vel kicsomagoltam a cuccost (dosfstool-2.11 könyvtárba), majd ráengedtem a make-t. Erre dobott egy csomó hibát. Szépen-fokozatosan kiszűrtem a beállítási problémákat. Pár linux-os header file-t az internetről kellett levadászni, párnál pedig a hivatkozás path-át kellett átírni jellemzően "linux/"-ről "cygwin/"-re. Bocs, hogy nem "diff -ur"! >>Érdemes végigolvasni, mert a végén vannak patch file-ok is!<<
- Makefile
OPTFLAGS = -O2 -fomit-frame-pointer -D_FILE_OFFSET_BITS=64 -D_WIN32
- dosfsck/fd.h header file-t levadásztam a netről (//From: http://kernelhistory.sourcentral.org/linux-1.1.3/S/102.html). Nem akartam a /usr/include alá pakolgatni a leszedett file-okat, ezért inkább beraktam a dosfsck/fd.h alá.
- dosfsck/msdos_fs.h header-t innen szedtem le: //From: http://www.kneuro.net/cgi-bin/lxr/http/source/include/linux/msdos_fs.h?a=m68k#L72
- mkdosfs/mkdosfs.c
#include <winioctl.h>
+ #include <mingw/fcntl.h>
- dosfsck/io.c
#include <fcntl.h>
- #include <linux/fd.h>
+ #include "fd.h"
- dosfsck/file.c
+ #ifndef _WIN32
#include <linux/version.h>
...
#endif
+ #endif
- #include <linux/msdos_fs.h>
+ #include <asm/types.h>
+ #include "msdos_fs.h"
- dosfsck/dosfsck.h
+ #ifndef _WIN32
#include <linux/version.h>
...
#endif
+ #endif
+
- #include <linux/msdos_fs.h>
+ #include <cygwin/fs.h>
+ #include <asm/types.h>
+ #include "msdos_fs.h"
- dosfsck/common.h
+ #ifndef _WIN32
#include <linux/version.h>
...
#endif
+ #endif
Ezekkel a módosításokkal sikerült leforgatnom. Az elkészült mkdosfs.exe-t és a dosfsck.exe-t átraktam a ~/bin-be (ne felejtsük el a PATH-hoz hozzáadni!). Az mkdosfs.8 és dosfsck.8-at a ~/man/man8-ba (ne felejtsük el a MANDIR-hoz hozzáadni!) másoltam.
Az elérhető partíciókat a "cat /proc/partitions" paranccsal lehet megnézegetni. Sajnos az nem mérvadó, hogy a windows melyik drive-ra map-pel fel az SD kártyát. Viszont ha kihúzzuk az SD kártyát a kártya olvasóból, akkor az adott drive eltűnik a /proc/partitions-ból. Ez jól használható, ha ellenőrizni szeretnénk, hogy van-e kártya az adott olvasóban. Ha csak egy partíció van, akkor a /dev/sd[a-z]1-et tudjuk használni. A perl csomag is tud erre hivatkozni.
"dosfsck.exe -v /dev/sdd1"-re elég részletes leírást adott...
Érdekes, hogy az mkdosfs nem fogadja el a cygwin-es device-t, csak a DOS-os betűjelzést:
$ mkdosfs -F 32 /dev/sdd1
mkdosfs 2.11 (12 Mar 2005)
Win32 port by Jens-Uwe Mager <jum@anubis.han.de>
/dev/sdd1: The system cannot find the path specified.
$ mkdosfs -F 32 -v G:
./mkdosfs 2.11 (12 Mar 2005)
Win32 port by Jens-Uwe Mager <jum@anubis.han.de>
\\.\G: has 255 heads and 63 sectors per track,
logical sector size is 512,
using 0xf8 media descriptor, with 7733248 sectors;
file system has 2 32-bit FATs and 8 sectors per cluster.
FAT size is 7538 sectors, and provides 964767 clusters.
Volume ID is 4cf8add6, no volume label.
(...kicsit később...) Nézegettem az mkdosfs.c-t és azt hiszem, hogy kár volt elcsábulni a _WIN32 definiálásával. Ezért nem tudom a /dev/sd[a-z]1 megadásával formázni! Nekiugrok a Linux-os kódnak a __CYGWIN__ macro-val. Csináltam hát egy patch file-t, amivel meg lehet hákolni hogy cygwin alatt is menjen. Így már szebb lett:
- dosfstool (v2.11) letölt
- 7z x -tzip dosfstools-2.11.src.zip
- dosfstools-2.11.cygwin.patch.txt letölt. A *.txt azért kell a végére, mert különben nem tudom a blog File-kezelőjébe feltenni.
- patch -p0 -i dosfstools-2.11.cygwin.patch.txt
Ez a "dosfstools-2.11" könyvtárat foltozza meg. Előtte érdemes lehet egy dos2unix-ot kiadni a patch file-ra!
- cd dosfstools-2.11
- make
- Bemásolhatjuk a file-okat egy megfelelő helyre. Én ezt tettem:
cp -i dosfsck/dosfsck.exe ~/bin
cp -i mkdosfs/mkdosfs.exe ~/bin
cp -i mkdosfs/mkdosfs.8 ~/man/man8/
cp -i dosfsck/dosfsck.8 ~/man/man8/
Persze előtte érdemes a man/man8-at legyártani a home könyvtárunk alatt. Így (ha elég okos a -bash_proofile-ünk), akkor egy kiláb-visszalép (vagy .bash_profile futtatás után) leérhetjük a progikat és a man page-eket is.
Egy warningot nem javítottam ki a kódban (mkdosfs.c:1814: warning: 'cblocks' might be used uninitialized in this function), de megnéztem a kódot és ez nem okozhat gondot. Így marad.
[2013-04-04] Később a gcc (GCC) 4.5.3 már felokosodott és egy csomó warningot szór. De ettől még fordul a kód. Megnéztem a dosfsck.exe -v /dev/sdd1 nem jól írja ki a "Serial No", "Volume name" és "FAT name" értékeket. Pedig a Total Commander látja a Volume Name-et.[/]
Most már rendesen működik Cygwin alatt is:
$ mkdosfs -F 32 -v -s 64 -R 6304 -n "@123456789A" /dev/sdd1
Ami hiányzik: nem lehet megadni, hogy hány HEAD legyen. Bár szerintem ezt senki nem használja, de pont ugyanolyan kártyát szerettem volna csinálni, mint a "gyári" kártya és ott 128 head volt. Hozzá hákoltam hát egy -H opciót is, amivel az is megadható... A folt (dosfstools-2.11.heads.patch.txt) az előző folt után alkalmazandó, ugyanúgy. A man page nincs javítva. Majd nagyon egyszer!
A dosfsck-t is megfoltoztam, hogy kiírja a FAT32-es adatokat is (volume name, fat name, serial number, miazmás). Az itt érhető el: dosfstools-2.11.fat32.patch.txt. A heads folttal együtt, de nélküle is alkalmazható!
(Most vettem észre, hogy C++-os // megjegyzéseket használtam. Akinek ez gondot okoz a fordításnál, annál bocs!)
Uno, DOS, tres...
Számoljunk minden nap!
+jegyzések