4aaa6b639d
On such a filesystem, inodes may have EXT4_ENCRYPT_FLAG set. For a regular file, this means its contents are encrypted; for a directory, this means the filenames in its directory entries are encrypted; and for a symlink, this means its target is encrypted. Since GRUB cannot decrypt encrypted contents or filenames, just issue an error if it would need to do so. This is sufficient to allow unencrypted boot files to co-exist with encrypted files elsewhere on the filesystem. (Note that encrypted regular files and symlinks will not normally be encountered outside an encrypted directory; however, it's possible via hard links, so they still need to be handled.) Tested by booting from an ext4 /boot partition on which I had run 'tune2fs -O encrypt'. I also verified that the expected error messages are printed when trying to access encrypted directories, files, and symlinks from the GRUB command line. Also ran 'sudo ./grub-fs-tester ext4_encrypt'; note that this requires e2fsprogs v1.43+ and Linux v4.1+. Signed-off-by: Eric Biggers <ebiggers@google.com>
1567 lines
51 KiB
Text
1567 lines
51 KiB
Text
#!@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)
|
||
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: 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
|
||
;;
|
||
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--))
|
||
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}"
|