grub/tests/util/grub-fs-tester.in
2020-09-21 11:32:45 -04:00

1557 lines
50 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
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))
;;
xext*)
MINBLKSIZE=1024
if [ $MINBLKSIZE -lt $SECSIZE ]; then
MINBLKSIZE=$SECSIZE
fi
MAXBLKSIZE=4096
;;
xsquash*)
MINBLKSIZE=4096
MAXBLKSIZE=1048576;;
xxfs)
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; 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: 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"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 -f)"
LODEVICES="$LODEVICES $LODEVICE"
losetup "$LODEVICE" "$FSIMAGEP${i}.img"
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")
"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}" ;;
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
;;
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--))
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
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 [ x$NOFSTIME = xy ]; then
:
elif 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
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}"