#!@BUILD_SHEBANG@ set -e fs="$1" GRUBFSTEST="@builddir@/grub-fstest" tempdir=`mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1 # This wrapper is to ease insertion of valgrind or time statistics run_it () { LC_ALL=C "$GRUBFSTEST" "$@" } range() { range_counter="$1" while test "$range_counter" -le "$2"; do echo "$range_counter" range_counter="$((range_counter + $3))" done } powrange() { range_counter="$1" while test "$range_counter" -le "$2"; do echo "$range_counter" range_counter="$((range_counter * 2))" done } run_grubfstest () { need_images= for i in $(range 0 $((NEED_IMAGES_N-1)) 1); do need_images="$need_images $FSIMAGEP${i}.img"; done run_it -c $NEED_IMAGES_N $need_images "$@" } # OS LIMITATION: GNU/Linux has no AFS support, so we use a premade image and a reference tar file. I.a. no multiblocksize test MINLOGSECSIZE=9 MAXLOGSECSIZE=9 case x"$fs" in xntfs*) MINLOGSECSIZE=8 MAXLOGSECSIZE=12;; xvfat*|xmsdos*) MINLOGSECSIZE=9 # OS LIMITATION: It could go up to 32768 but Linux rejects sector sizes > 4096 MAXLOGSECSIZE=12;; xext*) MINLOGSECSIZE=8 MAXLOGSECSIZE=12;; xbtrfs*) MINLOGSECSIZE=8 # OS LIMITATION: It could go up to 32768 but Linux rejects sector sizes > 4096 MAXLOGSECSIZE=12;; xxfs) MINLOGSECSIZE=9 # OS LIMITATION: GNU/Linux doesn't accept > 4096 MAXLOGSECSIZE=12;; xxfs_crc) MINLOGSECSIZE=9 # OS LIMITATION: GNU/Linux doesn't accept > 1024 MAXLOGSECSIZE=10;; xzfs*) # OS LIMITATION: zfs-fuse hangs when creating zpool with sectors <=256B. MINLOGSECSIZE=9 # OS LIMITATION: zfs-fuse fails with >= 32K sectors. # OS limitation: zfs-fuse always uses ashift=9 with loop devices MAXLOGSECSIZE=9;; esac for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do SECSIZE="$((1 << LOGSECSIZE))" MINBLKSIZE=512 MAXBLKSIZE=512 BLKSTEP=0 case x"$fs" in xntfs*) MINBLKSIZE=$SECSIZE MAXBLKSIZE=65536 if [ x"$SECSIZE" = x256 ]; then MINBLKSIZE=512 MAXBLKSIZE=32768 fi ;; xvfat* | xmsdos*) MINBLKSIZE=$SECSIZE MAXBLKSIZE=$((128*SECSIZE)) ;; xexfat*) MINBLKSIZE=$SECSIZE # It could go further but it requires more and more space MAXBLKSIZE=8286208 ;; xhfs) MINBLKSIZE=512 # OS LIMITATION: should be 1048576 but linux hangs on unmnount with # >= 524288 MAXBLKSIZE=262144 ;; xhfsplus | xhfsplus_casesens | xhfsplus_wrap) MINBLKSIZE=512 MAXBLKSIZE=1048576 ;; xnilfs2) # nilfs2 supports blocksizes from 1024 to 4096 # but non-4096 results in kernel oops in some cases, # avoid it. MINBLKSIZE=4096 MAXBLKSIZE=4096 ;; xsfs*) MINBLKSIZE=512 MAXBLKSIZE=4096 ;; xaffs | xaffs_intl) MINBLKSIZE=512 MAXBLKSIZE=4096 ;; xreiserfs*) MINBLKSIZE=512 # OS LIMITATION: 8192 isn't supported. MAXBLKSIZE=4096 ;; x"mdraid"*) MINBLKSIZE=4096 # OS LIMITATION: Linux oopses with >=32768K MAXBLKSIZE=$((16384*1024)) ;; x"lvm_raid1"* | x"lvm_raid4" | x"lvm_raid5" | x"lvm_raid6") # OS LIMITATION: Linux crashes with less than 16384 MINBLKSIZE=16384 # Could go further but what's the point? MAXBLKSIZE=$((65536*1024)) ;; x"lvm_mirrorall") MINBLKSIZE=2048 # Could go further but what's the point? MAXBLKSIZE=$((65536*1024)) ;; x"lvm_mirror1") MINBLKSIZE=4096 # Could go further but what's the point? MAXBLKSIZE=$((65536*1024)) ;; x"lvm_stripe") MINBLKSIZE=4096 # Could go further but what's the point? MAXBLKSIZE=$((65536*1024)) ;; x"lvm"*) MINBLKSIZE=1024 # Could go further but what's the point? MAXBLKSIZE=$((65536*1024)) ;; xext4_encrypt) # OS LIMITATION: Linux currently only allows the 'encrypt' feature # in combination with block_size = PAGE_SIZE (4096 bytes on x86). MINBLKSIZE=$(getconf PAGE_SIZE) MAXBLKSIZE=$MINBLKSIZE ;; xext*) MINBLKSIZE=1024 if [ $MINBLKSIZE -lt $SECSIZE ]; then MINBLKSIZE=$SECSIZE fi MAXBLKSIZE=4096 ;; xsquash*) MINBLKSIZE=4096 MAXBLKSIZE=1048576;; xxfs|xf2fs) MINBLKSIZE=$SECSIZE # OS Limitation: GNU/Linux doesn't accept > 4096 MAXBLKSIZE=4096;; xxfs_crc) # OS Limitation: GNU/Linux doesn't accept != 1024 MINBLKSIZE=1024 MAXBLKSIZE=1024;; xudf) MINBLKSIZE=1024 MAXBLKSIZE=4096;; xbfs) MINBLKSIZE=1024 MAXBLKSIZE=8192;; xufs*) MINBLKSIZE=4096 # OS Limitation: Linux rejects 65536 blocks. MAXBLKSIZE=32768;; xminix3) # OS LIMITATION: Linux rejects non-power-of-two blocks. # OS LIMITATION: Linux rejects > 4096. MINBLKSIZE=1024 MAXBLKSIZE=4096;; esac if test "$BLKSTEP" -eq 0; then blksizes="$(powrange "$MINBLKSIZE" "$MAXBLKSIZE")" else blksizes="$(range "$MINBLKSIZE" "$MAXBLKSIZE" "$BLKSTEP")" fi for BLKSIZE in $blksizes; do MAXDEVICES=1 MINDEVICES=1 export fs case x"$fs" in x"zfs_raidz" | x"zfs_stripe" | x"zfs_mirror" | xbtrfs_raid0 \ | xbtrfs_raid1 | x"mdraid"*"_raid4" | x"mdraid"*"_raid5" \ | x"mdraid"*"_linear" \ | x"mdraid"*"_raid10" | xlvm_raid1* | xlvm_mirror1 | xlvm_mirrorall) MINDEVICES=2 MAXDEVICES=7 ;; xbtrfs_raid10) MINDEVICES=4 MAXDEVICES=7 ;; x"zfs_raidz2"| xlvm_raid5 | xlvm_raid4) MINDEVICES=3 MAXDEVICES=7;; x"zfs_raidz3" | x"mdraid"*"_raid6") MINDEVICES=4 MAXDEVICES=7;; xlvm_raid6) MINDEVICES=5 MAXDEVICES=7;; x"mdraid"*"_raid0" | x"mdraid"*"_raid1" | x"lvm" | xlvm_stripe) MINDEVICES=1 MAXDEVICES=7;; esac for NDEVICES in $(range "$MINDEVICES" "$MAXDEVICES" 1); do export NDEVICES unset FSIMAGEP FSIMAGEP="${tempdir}/${fs}_${SECSIZE}_${BLKSIZE}_${NDEVICES}_" export FSIMAGEP unset NEED_IMAGES; case x$fs in # RAID 1 has to work with even one device of the set. xzfs_mirror | x"mdraid"*"_raid1" | xlvm_mirrorall | xlvm_raid1all) NEED_IMAGES_N=1;; # Degrade raidz by removing 3 devices xzfs_raidz3) NEED_IMAGES_N=$((NDEVICES-3));; # Degrade raidz by removing 2 devices xzfs_raidz2 | x"mdraid"*"_raid6" | x"lvm_raid6") NEED_IMAGES_N=$((NDEVICES-2));; # Degrade raidz and btrfs RAID1 by removing one device xbtrfs_raid1 | xbtrfs_raid10 | xzfs_raidz | x"mdraid"*"_raid4" \ | x"mdraid"*"_raid5" | x"mdraid"*"_raid10" | xlvm_mirror1 \ | x"lvm_raid1" | x"lvm_raid4" | x"lvm_raid5") NEED_IMAGES_N=$((NDEVICES-1));; *) NEED_IMAGES_N=$NDEVICES;; esac export NEED_IMAGES_N MNTPOINTRO="${tempdir}/${fs}_ro" MNTPOINTRW="${tempdir}/${fs}_rw" MOUNTOPTS="" MOUNTFS="$fs" MASTER="${tempdir}/master" FSLABEL="grub_;/testé莭莽茝😁киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewrewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfew" CFILESRC= for cand in /usr/share/dict/american-english /usr/share/dict/linux.words /data/data/com.termux/files/usr/share/hunspell/en_US.dic; do if test -f "$cand" ; then CFILESRC="$cand" break fi done if test "$CFILESRC" = "" ; then echo "Couldn't find compressible file" >&2 exit 1 fi case x"$fs" in # FS LIMITATION: 8.3 names xmsdos*) CFILE="american.eng";; xiso9660) CFILE="american_english";; *) CFILE="american-english";; esac # OS LIMITATION: Limited by NAME_MAX (usually 255) in GNU/Linux LONGNAME="qwertzuiopasdfghjklyxcvbnm1234567890qwertzuiopasdfghjklyxcvbnm1234567890oiewqfiewioqoiqoiurqruewqoiuwoieoiiuewqroreqiufieiuwrnureweriuvceoiroiewqoiricdsalkcndsakfirefoiwqeoircorejwoijfreoijojoiewjfwnfcoirenfoirefnreoifenoiwfnoi" rm -rf "$MASTER" case x"$fs" in # FS LIMITATION: HFS+ label is at most 255 UTF-16 chars # OS LIMITATION: Linux HFS+ tools check UTF-8 length and don't # handle out-of-BMP characters x"hfsplus" | x"hfsplus_casesens" | x"hfsplus_wrap") FSLABEL="grub_;/testé䏌䐓䏕киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoiq" ;; # FS LIMITATION: btrfs label is at most 255 UTF-8 chars x"btrfs"*) FSLABEL="grub_;/testé莭莽😁киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoi";; # FS LIMITATION: f2fs label is at most 512 UTF-16 chars x"f2fs") FSLABEL="grub_;/testé䏌䐓䏕киритiurewfceniuewruewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoirvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoircreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoiq";; # FS LIMITATION: exfat is at most 15 UTF-16 chars x"exfat") FSLABEL="géт ;/莭莽😁кир";; # FS LIMITATION: ntfs label is at most ?? UTF-16 chars x"ntfs"*) FSLABEL="grub_;/testéтi u莭😁茝кириrewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvniwnivrewiuvcrewvnuewvrrrewniureifiuewifjiww";; # FS LIMITATION: nilfs2 label is at most 80 UTF-8 characters x"nilfs2") FSLABEL="grub_;/testéтi u😁莽茝кириrewfceniuewruevrewnuuireurevueurnievrewfne";; # FS LIMITATION: afs and iso9660 label is at most 32 UTF-8 characters x"afs" | xiso9660 | xrockridge | xrockridge_joliet\ | xiso9660_1999 | xrockridge_1999 | xrockridge_joliet_1999) FSLABEL="gr_;/é莭莽😁кирит u";; # FS LIMITATION: bfs label is at most 32 UTF-8 characters # OS LIMITATION: bfs label can't contain ; or / x"bfs") FSLABEL="grub_é莭莽😁кирит u";; # FS LIMITATION: Joliet label is at most 16 UTF-16 characters # OS LIMITATION: xorriso doesn't handle out-of-BMP characters xjoliet | xjoliet_1999) FSLABEL="g;/_é䏌䐓䏕䎛䎾䏴кит u" #FSLABEL="g;/_é莭莽😁кит u" ;; # FS LIMITATION: reiserfs, extN and jfs label is at most 16 UTF-8 characters x"reiserfs_old" | x"reiserfs" | x"ext"* | x"lvm"* | x"mdraid"* | x"jfs" | x"jfs_caseins") FSLABEL="g;/éт 莭😁";; # FS LIMITATION: No underscore, space, semicolon, slash or international characters in UFS* in label. Limited to 32 UTF-8 characters x"ufs1" | x"ufs1_sun" | x"ufs2") FSLABEL="grubtest""ieurrucnenreeiurueurewf";; # FS LIMITATION: XFS label is at most 12 UTF-8 characters x"xfs"|x"xfs_crc") FSLABEL="géт 😁к";; # FS LIMITATION: FAT labels limited to 11 characters, no international characters or lowercase x"vfat"* | xmsdos*) FSLABEL="GRUBTEST ;_";; # FS LIMITATION: AFFS is latin1. At most 29 characters x"affs" | xaffs_intl) FSLABEL="grub_tt? #*w;/e£@¡¤½¾{[]}<>.,";; # FS LIMITATION: SFS is latin1. At most 30 characters x"sfs"*) FSLABEL="GRUB tt öäüé;/àèç åø¿ª©þð׫»µ¬";; # FS LIMITATION: HFS is Mac-Roman. At most 27 characters x"hfs") FSLABEL="grub_t;/estéàèèéie fiucnree";; # FS LIMITATION: UDF label is either up to 127 latin1 characters or 63 UTF-16 ones # OS LIMITATION: Linux UDF tools force ASCII label ... x"udf") FSLABEL="grub_;/testurewfceniuewruevrewnuuireurevueurnievr";; # FS LIMITATION: ZFS doesn't accept non-ASCII in label # FIXME: since this is used as a path component for mount it's very limited in length xzfs_* | xzfs) FSLABEL="grub_testieufiue r";; esac case x"$fs" in xmdraid*) DISKSIZE=314572800;; xlvm*) LVMBLKMUL=$(((5800 * 1048576) / (8 * BLKSIZE * NDEVICES))) DISKSIZE=$((8*BLKSIZE*LVMBLKMUL));; # FS LIMITATION: some fs have disk size limit x"vfat12" | xmsdos12) DISKSIZE=$((4000*BLKSIZE));; x"vfat12a" | xmsdos12a) if [ $BLKSIZE -ge 2048 ]; then DISKSIZE=$((2500*BLKSIZE)) else DISKSIZE=$((3000*BLKSIZE)) fi if [ $DISKSIZE -gt $((60000*SECSIZE)) ]; then DISKSIZE=$((60000*SECSIZE)) fi;; x"vfat16" | xmsdos16) DISKSIZE=$((65000*BLKSIZE));; x"vfat16a" | xmsdos16a) DISKSIZE=$((60000*SECSIZE)) ;; *) DISKSIZE=10737418240;; esac if [ $DISKSIZE -ge $(((5800/NDEVICES)*1048576)) ]; then DISKSIZE=$(((5800/NDEVICES)*1048576)) fi case x"$fs" in xvfat* | xmsdos* | xexfat* | xhfs | xhfsplus | xhfsplus_wrap | xaffs \ | xaffs_intl | xjfs_caseins | xsfs_caseins \ | xzfs_caseins | xiso9660) CASESENS=n;; *) CASESENS=y;; esac BIGBLOCKCNT=$((5000 * 1048576)) case x"$fs" in # FS LIMITATION: small filesystems x"vfat12" | xmsdos12) if [ $BLKSIZE -le 4096 ]; then BIGBLOCKCNT=0 elif [ $BLKSIZE = 8192 ]; then BIGBLOCKCNT=1500000 else BIGBLOCKCNT=$((2000*BLKSIZE)) fi ;; x"vfat12a" | xmsdos12a) if [ $BLKSIZE -le 4096 ] || [ $((128*SECSIZE)) = $BLKSIZE ]; then BIGBLOCKCNT=0 else BIGBLOCKCNT=700000 fi;; x"vfat16a" | xmsdos16a) if [ $((128*SECSIZE)) = $BLKSIZE ]; then BIGBLOCKCNT=0 else BIGBLOCKCNT=$((2500*SECSIZE)) fi ;; x"vfat16" | xmsdos16) BIGBLOCKCNT=$((25000 * BLKSIZE)) if [ $BIGBLOCKCNT -gt 4294967295 ]; then BIGBLOCKCNT=4294967295 fi ;; x"minix") BIGBLOCKCNT=30000000;; xexfat) # Big blocks waste really a lot of space. # Not much is left. if [ $BLKSIZE = 2097152 ]; then BIGBLOCKCNT=4500000000 fi if [ $BLKSIZE = 4194304 ]; then BIGBLOCKCNT=3500000000 fi ;; # FS LIMITATION: romfs image is limited to 4G. x"romfs") BIGBLOCKCNT=$((4000 * 1048576));; # FS LIMITATION: These FS have uint32 as file size field x"vfat"* | xmsdos* | x"cpio_crc" | x"cpio_newc" | x"cpio_bin" | x"cpio_hpbin" | xsfs*) BIGBLOCKCNT=4294967295;; # FS LIMITATION: These FS have int32 as file size field # FIXME: not so sure about AFFS # OS LIMITATION: minix2/minix3 could be formatted in a way to permit more. x"minix3" | x"minix2" | x"hfs"| x"affs" | xaffs_intl | xreiserfs_old | xext2_old) BIGBLOCKCNT=$((16#7fffffff));; # FS LIMITATION: redundant storage # We have only limited space. Mirroring multiplies it very effectively. xmdraid* | xlvm* | xzfs_mirror | xbtrfs_raid1) BIGBLOCKCNT=$((100 * 1048576));; # We already test the FS for big files separately. Save some time here. x"zfs_raid"* | x"zfs_stripe"* | x"zfs_mirror"* | x"btrfs_raid"*) BIGBLOCKCNT=$((100 * 1048576));; # OS LIMITATION: bfs_fuse bugs beyond that xbfs) BIGBLOCKCNT=$((800 * 1048576));; esac NOSYMLINK=n case x"$fs" in # FS LIMITATION: no symlinks on FAT, exFAT, HFS, plain ISO9660 and Joliet # OS LIMITATION: ntfs-3g creates interix symlinks which aren't real symlinks x"vfat"* | xmsdos* | x"hfs" | x"exfat" | x"ntfs"* \ | xiso9660 | xjoliet| xiso9660_1999 | xjoliet_1999) NOSYMLINK=y;; esac NOHARDLINK=n case x"$fs" in # FS LIMITATION: no hardlinks on BFS, exfat, fat, hfs and SFS xbfs | xexfat | x"vfat"* | xmsdos* | xhfs | xsfs | xsfs_caseins) NOHARDLINK=y;; # GRUB LIMITATION: no hardlink support on newc and hfs+ xcpio_crc | xcpio_newc | xhfsplus*) NOHARDLINK=y;; esac # FS LIMITATION: some filesystems limit file name size case x"$fs" in x"cpio_ustar") LONGNAME="`echo $LONGNAME |head -c 99`";; x"hfs") LONGNAME="`echo $LONGNAME |head -c 31`";; x"minix" | x"minix2" | x"affs" | xaffs_intl | xiso9660) LONGNAME="`echo $LONGNAME |head -c 30`";; x"sfs"*) LONGNAME="`echo $LONGNAME |head -c 105`";; x"minix3") LONGNAME="`echo $LONGNAME |head -c 60`";; x"udf") LONGNAME="`echo $LONGNAME |head -c 192`";; # GRUB LIMITATION: GRUB prefers Joliet over ISO9660:1999 xjoliet | xjoliet_1999) LONGNAME="`echo $LONGNAME |head -c 103`";; xiso9660_1999) LONGNAME="`echo $LONGNAME |head -c 207`";; # FS LIMITATION: 8.3 xmsdos*) LONGNAME="qwertzui.opa";; esac NOFILETIME=n NOFSTIME=n case x"$fs" in # FIXME: Not sure about BtrFS, NTFS, JFS, AFS, UDF and SFS. Check it. # FS LIMITATION: as far as I know those FS don't store their last modification date. x"jfs_caseins" | x"jfs" | x"xfs" | x"xfs_crc" | x"btrfs"* | x"reiserfs_old" | x"reiserfs" \ | x"bfs" | x"afs" | x"f2fs" \ | x"tarfs" | x"cpio_"* | x"minix" | x"minix2" \ | x"minix3" | x"ntfs"* | x"udf" | x"sfs"*) NOFSTIME=y;; # OS LIMITATION: Linux doesn't update fstime. # OS LIMITATION: Linux apparently uses localtime instead of UTC xhfs) NOFILETIME=y; NOFSTIME=y;; # GRUB LIMITATION: FAT and exFAT use localtime. Unusable for GRUB x"vfat"* | x"msdos"* | x"exfat") NOFILETIME=y; NOFSTIME=y;; # FS LIMITATION: romfs has no timestamps. x"romfs") NOFILETIME=y; NOFSTIME=y;; esac NOFSLABEL=n case x"$fs" in # FS LIMITATION: these filesystems have no label. x"cpio_"* | x"tarfs" | x"squash4_"* | x"minix" | x"minix2" \ | x"minix3" | xreiserfs_old) NOFSLABEL=y;; esac PDIRCOMPNUM=210 PDIR2COMPNUM=210 case x$fs in # OS LIMITATION: bfs_fuse bugs beyond that xbfs) PDIRCOMPNUM=10 PDIR2COMPNUM=10;; # OS LIMITATION: Linux supports only inline symlinks xudf) if [ $BLKSIZE = 1024 ]; then PDIR2COMPNUM=113 fi ;; # FS LIMITATION: at most 255 on path length # FS LIMITATION: at most 100 on symlink length xcpio_ustar) PDIRCOMPNUM=84 PDIR2COMPNUM=30;; # OS LIMITATION: Linux supports only symlink at most one block long on reiserfs xreiserfs | xreiserfs_old) if [ $BLKSIZE = 512 ]; then PDIR2COMPNUM=114 fi ;; # FS LIMITATION: SFS assumes that symlink # with header fit in one block. # FIXME: not sure about it. xsfs | xsfs_caseins) if [ $BLKSIZE = 512 ]; then PDIR2COMPNUM=147 fi ;; # FS LIMITATION: AFFS assumes that symlink # with rather larger header fit in one block. # FIXME: not sure about it. xaffs | xaffs_intl) if [ $BLKSIZE = 512 ]; then PDIR2COMPNUM=97 fi ;; esac PDIR="" # OS LIMITATION: Limited by PATH_MAX (usually 1024) for i in $(range 0 $((PDIRCOMPNUM-1)) 1); do PDIR="$PDIR/$i"; if test $((i%3)) = 0; then PDIR="$PDIR/" fi done PDIR2="" # OS LIMITATION: Limited by PATH_MAX (usually 1024) for i in $(range 0 $((PDIR2COMPNUM-1)) 1); do PDIR2="${PDIR2}/$i"; if test $((i%3)) = 0; then PDIR2="${PDIR2}/" fi done PFIL="p.img" unset LODEVICES GENERATED=n LODEVICES= MOUNTDEVICE= case x"$fs" in x"tarfs" | x"cpio_"*| x"ziso9660" | x"romfs" | x"squash4_"*\ | x"iso9660" | xjoliet | xrockridge | xrockridge_joliet \ | x"iso9660_1999" | xjoliet_1999 | xrockridge_1999 \ | xrockridge_joliet_1999) MNTPOINTRW="$MASTER" MNTPOINTRO="$MASTER" GENERATED=y mkdir -p "$MASTER";; # No mkfs for GNU/Linux. Just unpack preformatted empty image *) mkdir -p "$MNTPOINTRW" mkdir -p "$MNTPOINTRO" for i in $(range 0 $((NDEVICES-1)) 1); do dd if=/dev/zero of="$FSIMAGEP${i}.img" count=1 bs=1 seek=$((DISKSIZE-1)) &> /dev/null LODEVICE=$(losetup --find --show "$FSIMAGEP${i}.img") LODEVICES="$LODEVICES $LODEVICE" if test "$i" = 0; then MOUNTDEVICE="$LODEVICE" fi done ;; esac case x"$fs" in x"afs") ;; x"btrfs") "mkfs.btrfs" -s $SECSIZE -L "$FSLABEL" "${MOUNTDEVICE}" ;; x"btrfs_zlib" | x"btrfs_lzo" | x"btrfs_zstd") "mkfs.btrfs" -s $SECSIZE -L "$FSLABEL" "${MOUNTDEVICE}" MOUNTOPTS="compress=${fs/btrfs_/}," MOUNTFS="btrfs" ;; x"btrfs_raid0") "mkfs.btrfs" -s $SECSIZE -d raid0 -m raid0 -L "$FSLABEL" $LODEVICES MOUNTFS="btrfs" ;; x"btrfs_raid1") "mkfs.btrfs" -s $SECSIZE -d raid1 -m raid1 -L "$FSLABEL" $LODEVICES MOUNTFS="btrfs" ;; x"btrfs_raid10") "mkfs.btrfs" -s $SECSIZE -d raid10 -m raid10 -L "$FSLABEL" $LODEVICES MOUNTFS="btrfs" ;; x"btrfs_single") "mkfs.btrfs" -s $SECSIZE -d single -L "$FSLABEL" $LODEVICES MOUNTFS="btrfs" ;; x"exfat") "mkfs.$fs" -s $((BLKSIZE/512)) -n "$FSLABEL" "${MOUNTDEVICE}" MOUNTOPTS="iocharset=utf8," MOUNTFS="exfat-fuse";; x"minix") "mkfs.minix" "${MOUNTDEVICE}" ;; # mkfs.hfs and mkfs.hfsplus don't fill UUID. x"hfsplus") "mkfs.hfsplus" -b $BLKSIZE -v "$FSLABEL" "${MOUNTDEVICE}" dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#468)) conv=notrunc count=8 ;; x"hfsplus_wrap") "mkfs.hfsplus" -w -b $BLKSIZE -v "$FSLABEL" "${MOUNTDEVICE}" dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#468)) conv=notrunc count=8 MOUNTFS="hfsplus";; x"hfsplus_casesens") "mkfs.hfsplus" -s -b $BLKSIZE -v "$FSLABEL" "${MOUNTDEVICE}" dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#468)) conv=notrunc count=8 MOUNTFS="hfsplus";; x"hfs") "mkfs.hfs" -b $BLKSIZE -v "`echo $FSLABEL |recode utf8..macroman`" -h "${MOUNTDEVICE}" dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#474)) conv=notrunc count=8 MOUNTOPTS="iocharset=utf8,codepage=macroman," ;; x"vfat"*|xmsdos*) BITS="${fs/vfat/}" BITS="${BITS/msdos/}" if [ "x${BITS:2:1}" = xa ]; then A=-A else A= fi "mkfs.vfat" -a $A -S $SECSIZE -s $((BLKSIZE/SECSIZE)) -F "${BITS:0:2}" -n "$FSLABEL" "${MOUNTDEVICE}" MOUNTOPTS="iocharset=utf8,codepage=437," MOUNTFS="$(echo "$fs"|sed 's,[0-9]*a\?$,,')";; x"minix2") "mkfs.minix" -v "${MOUNTDEVICE}" MOUNTFS="minix";; x"minix3") "mkfs.minix" -B $BLKSIZE -3 "${MOUNTDEVICE}" MOUNTFS="minix";; x"ntfs"*) "mkfs.ntfs" -s "$SECSIZE" -c "$BLKSIZE" -L "$FSLABEL" -Q -q "${MOUNTDEVICE}" MOUNTOPTS="iocharset=utf8,compression," MOUNTFS="ntfs-3g";; x"udf") "mkudffs" --utf8 -b $BLKSIZE --lvid="$FSLABEL" "${MOUNTDEVICE}" MOUNTOPTS="iocharset=utf8,bs=$BLKSIZE,";; x"ufs2") "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 2 "${MOUNTDEVICE}" MOUNTOPTS="ufstype=ufs2," MOUNTFS="ufs";; x"ufs1") "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 1 "${MOUNTDEVICE}" MOUNTOPTS="ufstype=44bsd," MOUNTFS="ufs";; x"ufs1_sun") "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 1 "${MOUNTDEVICE}" MOUNTOPTS="ufstype=sun," MOUNTFS="ufs";; x"zfs") "zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}" sleep 1 "zfs" create "$FSLABEL"/"grub fs" sleep 1;; x"zfs_caseins") "zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}" sleep 1 "zfs" create -o casesensitivity=insensitive "$FSLABEL"/"grub fs" sleep 1;; x"zfs_lzjb" | xzfs_gzip | xzfs_zle) "zpool" create -O compression=${fs/zfs_/} -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}" sleep 1 "zfs" create -o compression=${fs/zfs_/} "$FSLABEL"/"grub fs" sleep 1;; x"zfs_raidz") "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz1 $LODEVICES sleep 1 "zfs" create "$FSLABEL"/"grub fs" sleep 1;; x"zfs_raidz2") "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz2 $LODEVICES sleep 1 "zfs" create "$FSLABEL"/"grub fs" sleep 1;; x"zfs_raidz3") "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz3 $LODEVICES sleep 1 "zfs" create "$FSLABEL"/"grub fs" sleep 1;; x"zfs_mirror") "zpool" create -R "$MNTPOINTRW" "$FSLABEL" mirror $LODEVICES sleep 1 "zfs" create "$FSLABEL"/"grub fs" sleep 1;; x"zfs_stripe") "zpool" create -R "$MNTPOINTRW" "$FSLABEL" $LODEVICES sleep 1 "zfs" create "$FSLABEL"/"grub fs" sleep 1;; x"tarfs" | x"cpio_"* | x"iso9660" | xjoliet | xrockridge | xrockridge_joliet | x"iso9660_1999" | xjoliet_1999 | xrockridge_1999 | xrockridge_joliet_1999 | x"ziso9660" | x"romfs" | x"squash4_"*) INSTDEVICE=/dev/null;; x"reiserfs") "mkfs.reiserfs" --format=3.6 -b $BLKSIZE -l "$FSLABEL" -q "${MOUNTDEVICE}" ;; x"reiserfs_old") "mkfs.reiserfs" --format=3.5 -b $BLKSIZE -l "$FSLABEL" -q "${MOUNTDEVICE}" MOUNTFS=reiserfs;; x"jfs") "mkfs.jfs" -L "$FSLABEL" -q "${MOUNTDEVICE}" MOUNTOPTS="iocharset=utf8,";; x"jfs_caseins") "mkfs.jfs" -O -L "$FSLABEL" -q "${MOUNTDEVICE}" MOUNTFS=jfs MOUNTOPTS="iocharset=utf8,";; x"mdraid"*) mdadm -C --chunk=$((BLKSIZE/1024)) --force -e "${fs:6:1}.${fs:7:1}" "/dev/md/${fs}_${NDEVICES}" --level="${fs:13}" --raid-devices="$NDEVICES" $LODEVICES MOUNTDEVICE="/dev/md/${fs}_${NDEVICES}" MOUNTFS=ext2 "mkfs.ext2" -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; x"lvm"*) for lodev in $LODEVICES; do pvcreate "$lodev" done vgcreate -s $((BLKSIZE/1024))K grub_test $LODEVICES if [ x$fs = xlvm ] ; then lvcreate -l "$((NDEVICES*7*LVMBLKMUL))" -n testvol grub_test elif [ x$fs = xlvm_stripe ] ; then lvcreate -l "$((NDEVICES*7*LVMBLKMUL))" -i "$NDEVICES" -n testvol grub_test elif [ x$fs = xlvm_mirror1 ] || [ x$fs = xlvm_raid1 ] ; then lvcreate -m 1 -l "$((NDEVICES*2*LVMBLKMUL))" --type "${fs/lvm_/}" -n testvol grub_test elif [ x$fs = xlvm_mirrorall ] ; then lvcreate -m "$((NDEVICES-1))" -l "$((6*LVMBLKMUL))" --type mirror -n testvol grub_test elif [ x$fs = xlvm_raid1all ] ; then # Until version 2.02.103 LVM counts metadata segments # twice when checking available space. Reduce segment # count to work around it. lvcreate -m "$((NDEVICES-1))" -l "$((6*LVMBLKMUL - 1))" --type raid1 -n testvol grub_test elif [ x$fs = xlvm_raid4 ] || [ x$fs = xlvm_raid5 ]; then lvcreate -l "$(((NDEVICES-1) * 5*LVMBLKMUL))" -i "$((NDEVICES-1))" --type "${fs/lvm_/}" -n testvol grub_test elif [ x$fs = xlvm_raid6 ]; then lvcreate -l "$(((NDEVICES-2) * 5*LVMBLKMUL))" -i "$((NDEVICES-2))" --type "${fs/lvm_/}" -n testvol grub_test fi MOUNTDEVICE="/dev/mapper/grub_test-testvol" MOUNTFS=ext2 "mkfs.ext2" -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; xf2fs) "mkfs.f2fs" -l "$FSLABEL" -q "${MOUNTDEVICE}" ;; xnilfs2) "mkfs.nilfs2" -L "$FSLABEL" -b $BLKSIZE -q "${MOUNTDEVICE}" ;; xext2_old) MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.ext2" -r 0 -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" MOUNTFS=ext2 ;; xext4_metabg) MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.ext4" -O meta_bg,^resize_inode -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" MOUNTFS=ext4 ;; xext4_encrypt) MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.ext4" -O encrypt -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" MOUNTFS=ext4 ;; xext*) MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.$fs" -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; xxfs) "mkfs.xfs" -m crc=0 -b size=$BLKSIZE -s size=$SECSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; xxfs_crc) MOUNTFS="xfs" "mkfs.xfs" -m crc=1 -b size=$BLKSIZE -s size=$SECSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; *) echo "Add appropriate mkfs command here" exit 1 ;; esac BASEFILE="1.img" NASTYFILE=".?*\\!\"#%@\$%&'()+ ,-.:;<=>^{_}[]\`|~." case x"$fs" in # FS LIMITATION: AFFS and SFS don't accept : xsfs*) NASTYFILE=".?*\\!\"#%@\$%&'()+ ,-.;<=>^{_}[]\`|~.";; # FS LIMITATION: AFFS is limited in file name length (30) x"affs" | xaffs_intl) NASTYFILE=".?*\\!\"#@\$'()+ ,-;<=>^{_}[]\`|~.";; # FS LIMITATION: hfs, minix and minix2 are limited in file name length (30 or 31) x"hfs" | x"minix" | x"minix2") NASTYFILE=".?*\\!\"#@\$&'()+ ,-:;<=>{}[]\`|~.";; # FS LIMITATION: FAT doesn't accept ?, *, \, ", :, <, >, | # FS LIMITATION: FAT discards dots at the end. x"vfat"* | x"exfat") NASTYFILE=".!#%@\$%&'()+ ,-.;=^{_}[]\`~";; # FS LIMITATION: 8.3 limitations apply x"msdos"*) NASTYFILE="!#%@\$%&.;=^";; # FS LIMITATION: No ' ', '*', '/', ':', ';', '?', '\\' in joliet # GRUB LIMITATION: GRUB prefers Joliet over ISO9660:1999 xjoliet | xjoliet_1999) NASTYFILE=".!\"#%@\$%&'()+,-.<=>^{_}[]\`|~.";; # FS LIMITATION: iso9660 accepts only [0-9A-Z_]*, 32 characters at most xiso9660) NASTYFILE="0123456789_acefghijknopqrvwxyz";; esac case x"$fs" in # FS LIMITATION: HFS, AFFS and SFS use legacy codepage (mac-roman or latin1) x"sfs"* | x"hfs" | x"affs" | xaffs_intl) IFILE="éàèüöäëñ" ISYM="ëñéüöäàè" ;; # FS LIMITATION: filename length limitation. x"minix" | x"minix2") IFILE="éàèüö😁ñкиΕλκά" ISYM="Ελκάкиéà😁öäëñ" ;; xminix3) IFILE="éàèüöäëñкирица莭茝Ελλικά😁😜😒" ISYM="Ελλικά😁😜😒莭茝кирицаéàèüöäëñ";; # GRUB LIMITATION: HFS+ uses NFD. GRUB doesn't handle NF conversion. # OS LIMITATION: Linux doesn't handle out-of-BMP characters for UTF-16 x"hfsplus" | x"hfsplus_casesens" | x"hfsplus_wrap") IFILE="éàèüöäëñкирилица䏌䐓䏕Ελληνικα̍䏌䐓䏕" ISYM="Ελληνικα̍кирилица䏌䐓䏕éàèüöäëñ䏌䐓䏕" ;; # GRUB LIMITATION: On case-insensitive ZFS isn't supported with non-uppercase characters xzfs_caseins) IFILE="ÉÀÈÜÖÄËÑКИРИЛИЦА莭莽茝ΕΛΛΗΝΙΚΆ😁😜😒" ISYM="ΕΛΛΗΝΙΚΆКИРИЛИЦА😁😜😒ÉÀÈÜÖÄËÑ莭莽茝";; # FS LIMITATION: 8.3 CP437 x"msdos"*) IFILE="éàèüöäëñ.éàè" ;; # FS LIMITATION: iso9660 is ASCII-only. x"iso9660") IFILE="abcdefghijkmmnop" ;; # OS LIMITATION: Linux doesn't handle out-of-BMP characters for UTF-16 # OS LIMITATION: xorriso doesn't handle out-of-BMP characters xjoliet | xjoliet_1999 | x"vfat"* | x"jfs"* | x"udf"*) IFILE="éàèüöäëñкирилица䏌䐓䏕Ελληνικά䏌䐓䏕" ISYM="Ελληνικάкирилица䏌䐓䏕éàèüöäëñ䏌䐓䏕";; *) IFILE="éàèüöäëñкирилица莭莽茝Ελληνικά😁😜😒" ISYM="Ελληνικάкирилица😁😜😒éàèüöäëñ莭莽茝";; esac BIGFILE="big.img" BASESYM="sym" BASEHARD="hard" SSYM="///sdir////ssym" USYM="///sdir////usym" LONGSYM="longsym" PSYM="psym" OSDIR="" GRUBDEVICE=loop0 case x"$fs" in xmdraid*) GRUBDEVICE="mduuid/`mdadm --detail --export $MOUNTDEVICE | grep MD_UUID=|sed 's,MD_UUID=,,g;s,:,,g'`";; xlvm*) GRUBDEVICE="lvm/grub_test-testvol";; esac GRUBDIR="($GRUBDEVICE)" case x"$fs" in x"zfs"*) OSDIR="grub fs/" GRUBDIR="($GRUBDEVICE)/grub fs@";; x"tarfs" | x"cpio_"* | x"iso9660" | xjoliet | xrockridge | xrockridge_joliet | x"iso9660_1999" | xjoliet_1999 | xrockridge_1999 | xrockridge_joliet_1999 | x"ziso9660" | x"romfs" | x"squash4_"* | xafs) ;; *) if ! mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRW" -o ${MOUNTOPTS}${SELINUXOPTS}rw ; then echo "MOUNT FAILED." for lodev in $LODEVICES; do while ! losetup -d "$lodev"; do sleep 1 done done for i in $(range 0 $((NDEVICES-1)) 1); do rm "$FSIMAGEP${i}.img" done exit 1; fi ;; esac case x"$fs" in # FS LIMITATION: redundant storage xmdraid* | xlvm*) BLOCKCNT=1048576;; x"zfs_raid"* | x"zfs_stripe"* | x"zfs_mirror"* | x"btrfs_raid"*) BLOCKCNT=1048576;; # FS LIMITATION: small filesystems x"vfat16a" | x"msdos16a") BLOCKCNT=65536;; x"vfat12a" | xmsdos12a) BLOCKCNT=32768;; xminix) BLOCKCNT=2621440;; xvfat16 | xmsdos16) if [ $BLKSIZE = 512 ] || [ $BLKSIZE = 1024 ]; then BLOCKCNT=1048576 else BLOCKCNT=5242880 fi ;; xvfat12 | xmsdos12) BLOCKCNT=$((100*BLKSIZE)) if [ $BLOCKCNT -gt 5242880 ]; then BLOCKCNT=5242880; fi ;; *) BLOCKCNT=5242880;; esac # Make sure file is not exact multiple of block size. This helps to force # tail packing in case of squash4. BLOCKCNT="$((BLOCKCNT-1))" case x"$fs" in x"ntfscomp") setfattr -h -v 0x00000800 -n system.ntfs_attrib_be "$MNTPOINTRW/$OSDIR";; esac # OS LIMITATION: No AFS support under GNU/Linux mkdir "$MNTPOINTRW/$OSDIR/sdir" mkdir -p "$MNTPOINTRW/$OSDIR/$PDIR" "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/sdir/2.img" "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$BASEFILE" "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$NASTYFILE" "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$IFILE" "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$LONGNAME" "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$PDIR/$PFIL" if [ $PDIR != $PDIR2 ]; then "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/${PDIR2}/$PFIL" fi "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/CaSe" if [ x$CASESENS = xy ]; then "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/cAsE" fi if (test x$fs = xvfat12a || test x$fs = xmsdos12a) && test x$BLKSIZE = x131072; then # With this config there isn't enough space for full copy. # Copy as much as we can cp "${CFILESRC}" "$MNTPOINTRW/$OSDIR/${CFILE}" &> /dev/null; else cp "${CFILESRC}" "$MNTPOINTRW/$OSDIR/${CFILE}"; fi if [ x$NOSYMLINK != xy ]; then ln -s "$BASEFILE" "$MNTPOINTRW/$OSDIR/$BASESYM" ln -s "2.img" "$MNTPOINTRW/$OSDIR/$SSYM" ln -s "../1.img" "$MNTPOINTRW/$OSDIR/$USYM" ln -s "$LONGNAME" "$MNTPOINTRW/$OSDIR/$LONGSYM" ln -s "${PDIR2}/$PFIL" "$MNTPOINTRW/$OSDIR/$PSYM" ln -s "$IFILE" "$MNTPOINTRW/$OSDIR/$ISYM" fi if [ x$NOHARDLINK != xy ]; then ln "$MNTPOINTRW/$OSDIR/$BASEFILE" "$MNTPOINTRW/$OSDIR/$BASEHARD" fi case x"$fs" in x"afs") ;; x"zfs"*) while ! zpool export "$FSLABEL" ; do sleep 1; done sleep 2 ;; x"tarfs") (cd "$MASTER"; tar cf "${FSIMAGEP}0.img" .) ;; x"cpio_"*) (cd "$MASTER"; find . | cpio -o -H "$(echo ${fs} | sed 's@^cpio_@@')" > "${FSIMAGEP}0.img" ) ;; x"ziso9660") FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); xorriso -compliance rec_mtime -set_filter_r --zisofs -- -zisofs default -as mkisofs -iso-level 3 -graft-points -R -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" -- -set_filter_r --zisofs -- -zisofs default -add /="$MASTER" ;; x"iso9660") FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; x"joliet") FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; x"rockridge") FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; x"rockridge_joliet") FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; x"iso9660_1999") FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; x"joliet_1999") FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; x"rockridge_1999") FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; x"rockridge_joliet_1999") FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; x"romfs") genromfs -V "$FSLABEL" -f "${FSIMAGEP}0.img" -d "$MASTER" ;; xsquash4_*) echo mksquashfs "$MASTER" "${FSIMAGEP}0.img" -always-use-fragments -comp "${fs/squash4_/}" -b $BLKSIZE mksquashfs "$MASTER" "${FSIMAGEP}0.img" -always-use-fragments -comp "${fs/squash4_/}" -b $BLKSIZE ;; x"bfs") sleep 1 fusermount -u "$MNTPOINTRW" ;; xlvm*) sleep 1 for try in $(range 0 20 1); do if umount "$MNTPOINTRW" ; then break; fi sleep 1; done UMOUNT_TIME=$(date -u "+%Y-%m-%d %H:%M:%S") sleep 1 vgchange -a n grub_test ;; xmdraid*) sleep 1 for try in $(range 0 20 1); do if umount "$MNTPOINTRW" ; then break; fi sleep 1; done UMOUNT_TIME=$(date -u "+%Y-%m-%d %H:%M:%S") sleep 1 mdadm --stop /dev/md/"${fs}_$NDEVICES" ;; *) sleep 1 for try in $(range 0 20 1); do if umount "$MNTPOINTRW" ; then break; fi sleep 1; done ;; esac sleep 1 case x"$fs" in x"zfs"*) "zpool" import -d /dev -R "$MNTPOINTRO" "$FSLABEL" ;; x"tarfs") ;; x"cpio_"*) ;; x"ziso9660") ;; xiso9660 | xrockridge | xjoliet | xrockridge_joliet) ;; xiso9660_1999 | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) ;; x"romfs") ;; xsquash4_*) ;; xlvm*) vgchange -a y grub_test sleep 1 mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRO" -o ${MOUNTOPTS}${SELINUXOPTS}ro ;; xmdraid*) mdadm --assemble /dev/md/"${fs}_$NDEVICES" $LODEVICES sleep 1 mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRO" -o ${MOUNTOPTS}${SELINUXOPTS}ro ;; *) mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRO" -o ${MOUNTOPTS}${SELINUXOPTS}ro ;; esac run_grubfstest ls -- -la case x"$fs" in x"zfs"*) LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/grub fs@/");; *) LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/");; esac if echo "$LSROUT" | grep -F " $BASEFILE" | grep "$BLOCKCNT" > /dev/null; then : else echo LIST FAIL echo "$LSROUT" TZ=UTC ls -l "$MNTPOINTRO" exit 1 fi if echo "$LSROUT" | grep -F " $NASTYFILE" | grep "$BLOCKCNT"> /dev/null; then : else echo NLIST FAIL echo "$LSROUT" TZ=UTC ls -lA "$MNTPOINTRO" exit 1 fi if echo "$LSROUT" | grep -F " $IFILE" | grep "$BLOCKCNT"> /dev/null; then : else echo ILIST FAIL echo "$LSROUT" TZ=UTC ls -l "$MNTPOINTRO" exit 1 fi if echo "$LSROUT" | grep -F " $LONGNAME" | grep "$BLOCKCNT"> /dev/null; then : else echo LONG LIST FAIL echo "$LSROUT" TZ=UTC ls -l "$MNTPOINTRO" exit 1 fi if [ x$NOFILETIME != xy ]; then filtime=$(TZ=UTC ls --time-style=+%Y%m%d%H%M%S -l -d "$MNTPOINTRO/$OSDIR/$BASEFILE"|awk '{print $6; }') if echo "$LSROUT" | grep -F "$filtime $BASEFILE" > /dev/null; then : else echo TIME FAIL echo "$LSROUT" TZ=UTC ls -l "$MNTPOINTRO" exit 1 fi filtime=$(TZ=UTC ls --time-style=+%Y%m%d%H%M%S -l -d "$MNTPOINTRO/$OSDIR/$LONGNAME"|awk '{print $6; }') if echo "$LSROUT" | grep -F "$filtime $LONGNAME" > /dev/null; then : else echo LONG TIME FAIL echo "$LSROUT" TZ=UTC ls -l "$MNTPOINTRO" exit 1 fi fi case x"$fs" in x"zfs"*) LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/grub fs@/.");; *) LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/.");; esac if echo "$LSROUT" | grep -F " $BASEFILE" | grep "$BLOCKCNT" > /dev/null; then : else echo DOT IN ROOTDIR FAIL echo "$LSROUT" TZ=UTC ls -l "$MNTPOINTRO" exit 1 fi case x"$fs" in x"zfs"*) ;; *) LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/.."); if echo "$LSROUT" | grep -F " $BASEFILE" | grep "$BLOCKCNT" > /dev/null; then : else echo DOTDOT IN ROOTDIR FAIL echo "$LSROUT" TZ=UTC ls -l "$MNTPOINTRO" exit 1 fi ;; esac case x"$fs" in x"zfs"*) LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/grub fs@/////sdir");; *) LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/////sdir");; esac if echo "$LSROUT" | grep -F " 2.img" | grep $BLOCKCNT > /dev/null; then : else echo SLIST FAIL echo "$LSROUT" TZ=UTC ls -l "$MNTPOINTRO/sdir" exit 1 fi case x"$fs" in x"zfs"*) LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/grub fs@/$PDIR");; *) LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/$PDIR");; esac if echo "$LSROUT" | grep -F " p.img" | grep $BLOCKCNT > /dev/null; then : else echo PLIST FAIL echo "$LSROUT" TZ=UTC ls -l "$MNTPOINTRO/$PDIR" exit 1 fi case x"$fs" in x"zfs"*) LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/grub fs@/sdir/.");; *) LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/sdir/.");; esac if echo "$LSROUT" | grep -F " 2.img" | grep $BLOCKCNT > /dev/null; then : else echo DOT IN SUBDIR FAIL echo "$LSROUT" TZ=UTC ls -l "$MNTPOINTRO/$OSDIR/sdir" exit 1 fi case x"$fs" in x"zfs"*) LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/grub fs@/sdir/../sdir");; *) LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/sdir/../sdir");; esac if echo "$LSROUT" | grep -F " 2.img" | grep $BLOCKCNT > /dev/null; then : else echo DOTDOT IN SUBDIR FAIL echo "$LSROUT" TZ=UTC ls -l "$MNTPOINTRO/$OSDIR/ssdir" exit 1 fi LSOUT=`run_grubfstest ls -- -l "($GRUBDEVICE)"` if [ x"$NOFSLABEL" = xy ]; then : elif echo "$LSOUT" | grep -F "Label \`$FSLABEL'" > /dev/null; then : else echo LABEL FAIL echo "$LSOUT" blkid "${MOUNTDEVICE}" exit 1 fi # Inconsistencies between GRUB and blkid. case x"$fs" in x"iso9660" | x"ziso9660" | xrockridge | xjoliet | xrockridge_joliet | x"iso9660_1999" | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) ;; x"zfs"*) for lodev in $LODEVICES; do FSUUID=$(printf "%016x\n" $(blkid -o export "$lodev" |grep -F UUID=|sed s,UUID=,,g)) if [ "$FSUUID" != 0000000000000000 ]; then break; fi done;; *) FSUUID=`blkid -o export "${MOUNTDEVICE}" |grep -F UUID=|sed s,UUID=,,g` ;; esac case x"$fs" in x"hfs"*) GRUBUUID="`run_grubfstest xnu_uuid "$GRUBDEVICE"`" if [ x"$GRUBUUID" = x"$FSUUID" ]; then : else echo UUID FAIL echo "$LSOUT" echo "$GRUBUUID" for lodev in $LODEVICES; do blkid "$lodev" done exit 1 fi ;; # FS LIMITATION: romfs, cpio, tar, squash4, minix, AFS, old reiserfs and minix2 # have no UUID. # GRUB LIMITATION: use creation date for squash4, AFFS and SFS? # GRUB LIMITATION: use tags serials on UDF? # GRUB LIMITATION: use root ctime on cpio, tar, minix*, UDF, reiserfs_old? # GRUB LIMITATION: Support Atari UUIDs x"romfs" | x"cpio_"* | x"tarfs" | x"squash4_"* | x"minix" \ | x"minix2" | x"minix3" | x"affs" | xaffs_intl \ | x"udf" | xvfat12a | xvfat16a | xmsdos12a | xmsdos16a | xafs | xsfs* \ | xreiserfs_old) ;; *) if [ x"$FSUUID" = x ]; then echo "Warning: blkid couldn't retrieve UUID" elif echo "$LSOUT" | grep -F 'UUID '"$FSUUID"' ' > /dev/null; then : else echo UUID FAIL echo "$FSUUID" echo "$LSOUT" blkid "${MOUNTDEVICE}" exit 1 fi ;; esac if [ x$NOFSTIME != xy ]; then case x$fs in xiso9660 | xziso9660 | xrockridge | xjoliet | xrockridge_joliet | xiso9660_1999 | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) FSTIME="$(date -d "$(echo ${FSUUID} | awk -F - '{ print $1"-"$2"-"$3" "$4":"$5":"$6 ;}')" '+%Y-%m-%d %H:%M:%S')";; xlvm*|xmdraid*) # With some abstractions like mdraid flushing to disk # may be delayed for a long time. FSTIME="$UMOUNT_TIME";; *) FSTIME="$(TZ=UTC ls --time-style="+%Y-%m-%d_%H:%M:%S" -l -d "${FSIMAGEP}0.img"|awk '{print $6; }'|sed 's,_, ,g')";; esac # With some abstractions like mdraid computing of UMOUNT_TIME # is not precise. Account for small difference here. FSTIMEM1="$(date -d "$FSTIME UTC -1 second" -u "+%Y-%m-%d %H:%M:%S")" FSTIMEM2="$(date -d "$FSTIME UTC -2 second" -u "+%Y-%m-%d %H:%M:%S")" FSTIMEM3="$(date -d "$FSTIME UTC -3 second" -u "+%Y-%m-%d %H:%M:%S")" if echo "$LSOUT" | grep -F 'Last modification time '"$FSTIME" > /dev/null || echo "$LSOUT" | grep -F 'Last modification time '"$FSTIMEM1" > /dev/null || echo "$LSOUT" | grep -F 'Last modification time '"$FSTIMEM2" || echo "$LSOUT" | grep -F 'Last modification time '"$FSTIMEM3" > /dev/null; then : else echo FSTIME FAIL echo "$FSTIME" echo "$LSOUT" exit 1 fi fi if [ x$NOHARDLINK != xy ]; then if run_grubfstest cmp "$GRUBDIR/$BASEHARD" "$MNTPOINTRO/$OSDIR/$BASEFILE" ; then : else echo HARDLINK FAIL exit 1 fi fi if [ x$NOSYMLINK != xy ]; then if run_grubfstest cmp "$GRUBDIR/$BASESYM" "$MNTPOINTRO/$OSDIR/$BASEFILE" ; then : else echo SYMLINK FAIL exit 1 fi if run_grubfstest cmp "$GRUBDIR/$LONGSYM" "$MNTPOINTRO/$OSDIR/$LONGNAME" ; then : else echo LONG SYMLINK FAIL exit 1 fi if run_grubfstest cmp "$GRUBDIR/$ISYM" "$MNTPOINTRO/$OSDIR/$IFILE" ; then : else echo INTL SYMLINK FAIL exit 1 fi if run_grubfstest cmp "$GRUBDIR/$SSYM" "$MNTPOINTRO/$OSDIR/////sdir/////2.img" ; then : else echo SDIR SYMLINK FAIL exit 1 fi if run_grubfstest cmp "$GRUBDIR/$USYM" "$MNTPOINTRO/$OSDIR/1.img" ; then : else echo SDIR SYMLINK FAIL exit 1 fi if run_grubfstest cmp "$GRUBDIR/$PSYM" "$MNTPOINTRO/$OSDIR/${PDIR2}/$PFIL" ; then : else echo PATH LONG SYMLINK FAIL exit 1 fi fi if run_grubfstest cmp "$GRUBDIR/$BASEFILE" "$MNTPOINTRO/$OSDIR/$BASEFILE" ; then : else echo READ FAIL exit 1 fi if run_grubfstest cmp "$GRUBDIR/$NASTYFILE" "$MNTPOINTRO/$OSDIR/$NASTYFILE" ; then : else echo NREAD FAIL exit 1 fi # Reference archive contains original name if run_grubfstest cmp "$GRUBDIR/$LONGNAME" "$MNTPOINTRO/$OSDIR/$LONGNAME" ; then : else echo LONG NAME READ FAIL exit 1 fi if run_grubfstest cmp "$GRUBDIR/////sdir/////2.img" "$MNTPOINTRO/$OSDIR/sdir/2.img" ; then : else echo LONG NAME READ FAIL exit 1 fi if run_grubfstest cmp "$GRUBDIR/$IFILE" "$MNTPOINTRO/$OSDIR/$IFILE" ; then : else echo IREAD FAIL exit 1 fi if run_grubfstest cmp "$GRUBDIR/$PDIR/$PFIL" "$MNTPOINTRO/$OSDIR/$PDIR/$PFIL" ; then : else echo PREAD FAIL echo cmp "$GRUBDIR/$PDIR/$PFIL" "$MNTPOINTRO/$OSDIR/$PDIR/$PFIL" exit 1 fi ok=true if ! run_grubfstest cmp "$GRUBDIR/${CFILE}" "$MNTPOINTRO/$OSDIR/${CFILE}" ; then ok=false; fi if test x$ok = xtrue; then : else echo CREAD FAIL exit 1 fi if [ x$CASESENS = xy ]; then if run_grubfstest cmp "$GRUBDIR/CaSe" "$MNTPOINTRO/$OSDIR/CaSe" ; then : else echo CASE1 READ FAIL exit 1 fi if run_grubfstest cmp "$GRUBDIR/cAsE" "$MNTPOINTRO/$OSDIR/cAsE" ; then : else exit 1 fi if cmp "$MNTPOINTRO/$OSDIR/cAsE" "$MNTPOINTRO/$OSDIR/CaSe" > /dev/null ; then exit 1 fi if test x$ok = xtrue; then : else echo CASE READ FAIL exit 1 fi else # OS LIMITATION: Linux make FAT (partially) case-sensitive... # ISO9660 is generated and master doesn't change case x$fs in xiso9660 | xvfat*) CASEX=CaSe;; *) CASEX=cAsE;; esac if run_grubfstest cmp "$GRUBDIR/CaSe" "$MNTPOINTRO/$OSDIR/${CASEX}" ; then : else echo CASE1 READ FAIL exit 1 fi if run_grubfstest cmp "$GRUBDIR/cAsE" "$MNTPOINTRO/$OSDIR/CaSe" ; then : else echo CASE2 READ FAIL exit 1 fi if ! cmp "$MNTPOINTRO/$OSDIR/CaSe" "$MNTPOINTRO/$OSDIR/${CASEX}" > /dev/null ; then echo CASE CMP READ FAIL exit 1 fi if test x$ok = xtrue; then : else echo CASE READ FAIL exit 1 fi fi case x"$fs" in x"zfs"*) while ! zpool export "$FSLABEL" ; do sleep 1; done sleep 5;; x"tarfs" | x"cpio_"* | xrockridge | xjoliet | xrockridge_joliet | x"ziso9660" | x"romfs" | x"squash4_"* | xiso9660 | xiso9660_1999 | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) rm -rf "$MNTPOINTRW";; x"afs") rm -rf "$MNTPOINTRO" ;; *) sleep 1 umount "$MNTPOINTRO" || true umount "$MNTPOINTRW" || true esac sleep 1 case x"$fs" in xmdraid*) mdadm --stop /dev/md/"${fs}_$NDEVICES" sleep 1 ;; xlvm*) vgchange -a n grub_test sleep 1 ;; esac case x"$fs" in x"tarfs" | x"cpio_"* | x"iso9660" | xrockridge | xjoliet | xrockridge_joliet | x"ziso9660" | x"romfs" | x"squash4_"* | x"iso9660_1999" | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) ;; *) for lodev in $LODEVICES; do while ! losetup -d "$lodev"; do sleep 1 done done;; esac for i in $(range 0 $((NDEVICES-1)) 1); do rm "$FSIMAGEP${i}.img" done if [ x"$fs" = x"zfs" ]; then rmdir "$MNTPOINTRW"/"grub fs" || true rmdir "$MNTPOINTRO"/"grub fs" || true fi rm -rf "$MNTPOINTRW" || true rm -rf "$MNTPOINTRO" || true done done done rmdir "${tempdir}"