You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
2.7 KiB
128 lines
2.7 KiB
#!/bin/bash
|
|
|
|
# This is the script that was used to create the image.gz in this directory.
|
|
|
|
set -e -u
|
|
|
|
BLOCKSIZE=4096
|
|
|
|
do_debugfs() {
|
|
umount mnt
|
|
debugfs -w "$@" image
|
|
mount image mnt
|
|
}
|
|
|
|
do_tune2fs() {
|
|
umount mnt
|
|
tune2fs $@ image
|
|
mount image mnt
|
|
}
|
|
|
|
symlink() {
|
|
local len=$1
|
|
local src=$2
|
|
local target=$(perl -e 'print "A" x '$len)
|
|
ln -s $target $src
|
|
stat -c %i $src
|
|
}
|
|
|
|
# Overwrite the length in the header of the encrypted symlink target
|
|
set_encrypted_symlink_len() {
|
|
local ino=$1
|
|
local len=$2
|
|
|
|
echo "zap_block -f <$ino> -p $((len%256)) -o 0 -l 1 0"
|
|
echo "zap_block -f <$ino> -p $((len/256)) -o 1 -l 1 0"
|
|
}
|
|
|
|
create_symlinks() {
|
|
local dir=$1
|
|
local encrypted=${2:-false}
|
|
local overhead=0
|
|
local ino
|
|
|
|
if $encrypted; then
|
|
overhead=2
|
|
fi
|
|
|
|
mkdir -p $dir
|
|
|
|
{
|
|
ino=$(symlink 1 $dir/empty)
|
|
echo "set_inode_field <$ino> i_size 10"
|
|
echo "set_inode_field <$ino> block[0] 0"
|
|
|
|
symlink 1 $dir/fast_min > /dev/null
|
|
|
|
ino=$(symlink 10 $dir/fast_isize_too_small)
|
|
echo "set_inode_field <$ino> i_size 1"
|
|
|
|
ino=$(symlink 10 $dir/fast_isize_too_large)
|
|
echo "set_inode_field <$ino> i_size 20"
|
|
|
|
symlink $((59 - overhead)) $dir/fast_max > /dev/null
|
|
|
|
symlink $((60 - overhead)) $dir/slow_min > /dev/null
|
|
|
|
ino=$(symlink 100 $dir/slow_isize_too_small)
|
|
echo "set_inode_field <$ino> i_size 80"
|
|
|
|
ino=$(symlink 100 $dir/slow_isize_too_large)
|
|
echo "set_inode_field <$ino> i_size 120"
|
|
|
|
symlink $((BLOCKSIZE - 1 - overhead)) $dir/slow_max > /dev/null
|
|
|
|
ino=$(symlink $((BLOCKSIZE - 1 - overhead)) $dir/one_too_long)
|
|
echo "set_inode_field <$ino> i_size $BLOCKSIZE"
|
|
echo "zap_block -f <$ino> -p 65 0"
|
|
if $encrypted; then
|
|
set_encrypted_symlink_len $ino $((BLOCKSIZE - overhead))
|
|
fi
|
|
|
|
ino=$(symlink $((BLOCKSIZE - 1 - overhead)) $dir/too_long)
|
|
echo "set_inode_field <$ino> i_size $((BLOCKSIZE + 1000))"
|
|
echo "zap_block -f <$ino> -p 65 0"
|
|
if $encrypted; then
|
|
set_encrypted_symlink_len $ino $((BLOCKSIZE + 1000 - overhead))
|
|
fi
|
|
|
|
} >> debugfs_commands
|
|
do_debugfs < debugfs_commands
|
|
}
|
|
|
|
create_encrypted_symlinks() {
|
|
local dir=$1 link
|
|
|
|
mkdir $dir
|
|
echo | e4crypt add_key $dir
|
|
create_symlinks $dir true
|
|
|
|
# Move symlinks into an unencrypted directory (leaving their targets
|
|
# encrypted). This makes the fsck output consistent.
|
|
mv $dir ${dir}~encrypted
|
|
mkdir $dir
|
|
mv ${dir}~encrypted/* $dir
|
|
}
|
|
|
|
mkdir -p mnt
|
|
umount mnt &> /dev/null || true
|
|
dd if=/dev/zero of=image bs=1024 count=600
|
|
|
|
mke2fs -O 'encrypt,^extents,^64bit' -b $BLOCKSIZE -I 256 image
|
|
mount image mnt
|
|
|
|
create_symlinks mnt/default
|
|
create_encrypted_symlinks mnt/encrypted
|
|
|
|
do_tune2fs -O extents
|
|
create_symlinks mnt/extents
|
|
create_encrypted_symlinks mnt/extents_encrypted
|
|
|
|
do_debugfs -R 'feature inline_data'
|
|
create_symlinks mnt/inline_data
|
|
|
|
rm -rf debugfs_commands mnt/*~encrypted
|
|
umount mnt
|
|
rmdir mnt
|
|
gzip -9 -f image
|