initial commit of partman-btrfs

This is untested and unlikely to work without parted support.
Committing what I have since I don't trust btrfs to preserve the data. ;-)

Note to translators: Probably not worth wasting your time with this yet.
Have not run debconf-updatepo.

r62090
This commit is contained in:
Joey Hess 2010-01-27 20:14:29 +00:00
commit 0eb02adc27
28 changed files with 539 additions and 0 deletions

10
TODO Normal file
View file

@ -0,0 +1,10 @@
* Support for multi-volume btrfs filesystems
* Support for other mkfs.btrfs options, if any are useful.
* Support for btrfs snapshots / using existing btrfs?
* Check if errors=remount-ro makes sense to use.
* mountoptions is missing a few options that may be worth supporting,
including degraded, and all optionds that require a parameter.
* mountoptions contains nobarrier, which is an unsafe option. Remove? Warn?
* parted support needed for filesystem detection #567176
* Resizing?
* Allow forcing use of btrfs for /boot (would probably work with eg, lilo)

View file

@ -0,0 +1 @@
45 btrfs

70
active_partition/btrfs/choices Executable file
View file

@ -0,0 +1,70 @@
#!/bin/sh
. /usr/share/debconf/confmodule
set -e
dev=$1
id=$2
part=$dev/$id
cd $dev
[ -f $part/method -a -f $part/acting_filesystem ] || exit 0
filesystem=$(cat $part/acting_filesystem)
case "$filesystem" in
btrfs)
:
;;
*)
exit 0
;;
esac
choice_mountpoint () {
case "$filesystem" in
btrfs)
if [ -f $part/mountpoint ]; then
mp=$(cat $part/mountpoint)
else
db_metaget partman-basicfilesystems/text/no_mountpoint description
mp="$RET"
fi
db_metaget partman-btrfs/text/specify_mountpoint description
printf "mountpoint\t%s\${!TAB}%s\n" "$RET" "$mp"
;;
esac
}
choice_options () {
db_metaget partman-basicfilesystems/text/options description
printf "options\t%s\${!TAB}%.45s\n" "$RET" "$(get_mountoptions $dev $id)"
}
choice_label () {
# allow to set label only if the partition is to be formatted
[ -f $part/format ] || return 0
[ ! -f $part/formatted \
-o $part/formatted -ot $part/method \
-o $part/formatted -ot $part/filesystem ] || return 0
case "$filesystem" in
btrfs)
if [ -f $part/label ]; then
label=$(cat $part/label)
else
db_metaget partman-basicfilesystems/text/none description
label=$RET
fi
db_metaget partman-basicfilesystems/text/specify_label description
printf "label\t%s\${!TAB}%s\n" "$RET" "$label"
;;
esac
}
choice_mountpoint
choice_options
choice_label

View file

@ -0,0 +1,41 @@
#!/bin/sh
. /lib/partman/lib/base.sh
dev=$2
id=$3
part=$dev/$id
cd $dev
[ -f $part/method -a -f $part/acting_filesystem ] || return 0
filesystem=$(cat $part/acting_filesystem)
case $1 in
mountpoint)
if select_mountpoint $dev $id; then
update_partition $dev $id
fi
;;
options)
select_mountoptions $dev $id
;;
label)
label=''
if [ -f $part/label ]; then
label=$(cat $part/label)
fi
db_set partman-basicfilesystems/choose_label "$label"
db_input critical partman-basicfilesystems/choose_label || true
db_go || exit 1
db_get partman-basicfilesystems/choose_label
if [ "$RET" ]; then
echo "$RET" >$part/label
else
rm -f $part/label
fi
db_reset partman-basicfilesystems/choose_label
;;
esac
exit 0

2
check.d/_numbers Normal file
View file

@ -0,0 +1,2 @@
09 nomountpoint_btrfs
05 no_btrfs_boot

32
check.d/no_btrfs_boot Executable file
View file

@ -0,0 +1,32 @@
#!/bin/sh
# grub and other bootloaders that read the filesystem do not support /boot
# on btrfs. (lilo should work). Detect and warn.
. /lib/partman/lib/base.sh
get_btrfs_root_boot () {
(for i in /lib/partman/fstab.d/*; do
[ -x "$i" ] || continue
$i
done) |
while read fs mp type options dump pass; do
if [ "$mp" = / ]; then
echo root_type=$type
elif [ "$mp" = /boot ]; then
echo boot_type=$type
fi
done
}
eval "$(get_btrfs_root_boot)"
if [ "$boot_type" = btrfs ]; then
db_input critical partman-btrfs/btrfs_boot || true
db_go || exit 1
exit 1
fi
if [ "$boot_type" = "" ] && [ "$root_type" = btrfs ]; then
db_input critical partman-btrfs/btrfs_root || true
db_go || exit 1
exit 1
fi

37
check.d/nomountpoint_btrfs Executable file
View file

@ -0,0 +1,37 @@
#!/bin/sh
. /lib/partman/lib/base.sh
for dev in $DEVICES/*; do
[ -d "$dev" ] || continue
cd $dev
partitions=
open_dialog PARTITIONS
while { read_line num id size type fs path name; [ "$id" ]; }; do
[ "$fs" != free ] || continue
partitions="$partitions $id,$num"
done
close_dialog
for part in $partitions; do
id=${part%,*}
num=${part#*,}
[ -f $id/method ] || continue
[ -f $id/acting_filesystem ] || continue
filesystem=$(cat $id/acting_filesystem)
case "$filesystem" in
btrfs)
[ ! -f "$id/mountpoint" ] || continue
db_subst partman-btrfs/no_mount_point PARTITION "$num"
db_subst partman-btrfs/no_mount_point FILESYSTEM "$filesystem"
db_subst partman-btrfs/no_mount_point DEVICE $(humandev $(cat device))
db_input critical partman-btrfs/no_mount_point || true
db_go || exit 1
db_get partman-btrfs/no_mount_point
if [ "$RET" = true ]; then
exit 1
fi
;;
esac
done
done

1
commit.d/_numbers Normal file
View file

@ -0,0 +1 @@
50 format_btrfs

81
commit.d/format_btrfs Executable file
View file

@ -0,0 +1,81 @@
#!/bin/sh
. /lib/partman/lib/base.sh
enable_swap
for dev in $DEVICES/*; do
[ -d "$dev" ] || continue
cd $dev
partitions=
open_dialog PARTITIONS
while { read_line num id size type fs path name; [ "$id" ]; }; do
[ "$fs" != free ] || continue
partitions="$partitions $id,$num"
done
close_dialog
for part in $partitions; do
id=${part%,*}
num=${part#*,}
[ -f $id/method -a -f $id/format \
-a -f $id/acting_filesystem ] || continue
filesystem=$(cat $id/acting_filesystem)
case $filesystem in
btrfs)
if [ -f $id/formatted ] && \
[ $id/formatted -nt $id/method ] && \
([ ! -f $id/filesystem ] || \
[ $id/formatted -nt $id/filesystem ]); then
continue
fi
log "Try to create file system for $dev/$id"
if [ -f $id/mountpoint ]; then
template=partman-basicfilesystems/progress_formatting_mountable
db_subst $template MOUNT_POINT "$(cat $id/mountpoint)"
else
template=partman-basicfilesystems/progress_formatting
fi
open_dialog PARTITION_INFO $id
read_line x1 x2 x3 x4 x5 device x6
close_dialog
RET=''
db_metaget partman/filesystem_short/"$filesystem" description || RET=''
[ "$RET" ] || RET="$filesystem"
db_subst $template TYPE "$RET"
db_subst $template PARTITION "$num"
db_subst $template DEVICE $(humandev $(cat device))
db_progress START 0 3 partman/text/formatting
db_progress INFO $template
db_progress SET 1
label=''
if [ -f $id/label ]; then
label=$(cat $id/label | \
sed 's/\(............\).*/\1/g')
fi
code=0
# Ensure label is quoted correctly
log-output -t partman --pass-stdout \
mkfs.btrfs ${label:+-L "$label"} \
$device >/dev/null || code=$?
sync
db_progress STOP
if [ "$code" != 0 ]; then
db_subst partman-btrfs/create_failed PARTITION "$num"
db_subst partman-btrfs/create_failed DEVICE $(humandev $(cat device))
db_input critical partman-btrfs/create_failed || true
db_go || true
#disable_swap
exit 1
fi
>$id/formatted
;;
esac
done
done
#disable_swap

6
debian/changelog vendored Normal file
View file

@ -0,0 +1,6 @@
partman-btrfs (1) UNRELEASED; urgency=low
* Took partman-xfs and s/xfs/btrfs/, essentially.
* Added error messages if /boot is on btrfs.
-- Joey Hess <joeyh@debian.org> Thu, 4 Mar 2004 12:42:40 -0500

1
debian/compat vendored Normal file
View file

@ -0,0 +1 @@
7

14
debian/control vendored Normal file
View file

@ -0,0 +1,14 @@
Source: partman-btrfs
Section: debian-installer
Priority: standard
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Uploaders: Anton Zinoviev <zinoviev@debian.org>, Joey Hess <joeyh@debian.org>
Build-Depends: debhelper (>= 7.0.8), dh-di, po-debconf (>= 0.5.0)
Vcs-Svn: svn://svn.debian.org/d-i/trunk/packages/partman/partman-btrfs
Package: partman-btrfs
XC-Package-Type: udeb
Architecture: all
Depends: ${misc:Depends}, btrfs-tools-udeb, btrfs-modules, partman-basicfilesystems (>= 59), partman-base (>= 124)
Provides: partman-filesystem
Description: Add to partman support for btrfs

4
debian/copyright vendored Normal file
View file

@ -0,0 +1,4 @@
This package is under the GNU GPL version 2, or any later
version at your option.
On Debian system, the GPL is available in
/usr/share/common-licenses/GPL-2

7
debian/di-numbers vendored Normal file
View file

@ -0,0 +1,7 @@
active_partition lib/partman
valid_filesystems lib/partman
init.d lib/partman
check.d lib/partman
commit.d lib/partman
finish.d lib/partman
mount.d lib/partman

3
debian/install vendored Normal file
View file

@ -0,0 +1,3 @@
mountoptions lib/partman
fstab.d lib/partman
parted_names lib/partman

73
debian/partman-btrfs.templates vendored Normal file
View file

@ -0,0 +1,73 @@
Template: partman-btrfs/progress_checking
Type: text
# :sl2:
_Description: Checking the btrfs file system in partition #${PARTITION} of ${DEVICE}...
Template: partman-btrfs/check_failed
Type: boolean
# :sl2:
_Description: Go back to the menu and correct errors?
The test of the file system with type btrfs in partition #${PARTITION}
of ${DEVICE} found uncorrected errors.
.
If you do not go back to the partitioning menu and correct these errors,
the partition will not be used at all.
Template: partman-btrfs/create_failed
Type: error
# :sl2:
_Description: Failed to create a file system
The btrfs file system creation in partition
#${PARTITION} of ${DEVICE} failed.
Template: partman-btrfs/no_mount_point
Type: boolean
# :sl2:
_Description: Do you want to return to the partitioning menu?
No mount point is assigned for the btrfs file system in partition
#${PARTITION} of ${DEVICE}.
.
If you do not go back to the partitioning menu and assign a mount point
from there, this partition will not be used at all.
Template: partman-btrfs/text/specify_mountpoint
Type: text
# :sl2:
# This is an item in the menu "Partition settings"
_Description: Mount point:
Template: partman-btrfs/text/btrfs
Type: text
# :sl2:
# File system name (untranslatable in many languages)
_Description: btrfs
Template: partman/filesystem_long/btrfs
Type: text
# :sl2:
# File system name
_Description: btrfs journaling file system
Template: partman/filesystem_short/btrfs
Type: text
# :sl1:
# Short file system name (untranslatable in many languages)
_Description: btrfs
Template: partman-btrfs/btrfs_root
Type: error
# :sl2:
_Description: btrfs root file system not supported without separate /boot
Your root file system is a btrfs file system. This is not supported
by the boot loader used by default by this installer.
.
You should use a small /boot partition with another file system, such as ext3.
Template: partman-btrfs/btrfs_boot
Type: error
# :sl2:
_Description: btrfs file system not supported for /boot
You have mounted a btrfs file system as /boot. This is not supported
by the boot loader used by default by this installer.
.
You should use another file system, such as ext3, for the /boot partition.

3
debian/rules vendored Executable file
View file

@ -0,0 +1,3 @@
#! /usr/bin/make -f
%:
dh --with d-i $@

1
finish.d/_numbers Normal file
View file

@ -0,0 +1 @@
70 aptinstall_btrfs

27
finish.d/aptinstall_btrfs Executable file
View file

@ -0,0 +1,27 @@
#!/bin/sh
. /lib/partman/lib/base.sh
btrfs=no
for dev in $DEVICES/*; do
[ -d "$dev" ] || continue
cd $dev
partitions=
open_dialog PARTITIONS
while { read_line num id size type fs path name; [ "$id" ]; }; do
[ "$fs" != free ] || continue
[ -f $id/method -a -f $id/acting_filesystem ] || continue
filesystem=$(cat $id/acting_filesystem)
case $filesystem in
btrfs)
btrfs=yes
;;
esac
done
close_dialog
done
if [ "$btrfs" = yes ]; then
apt-install btrfs-tools || true
fi

39
fstab.d/btrfs Executable file
View file

@ -0,0 +1,39 @@
#!/bin/sh
. /lib/partman/lib/base.sh
for dev in $DEVICES/*; do
[ -d $dev ] || continue
cd $dev
open_dialog PARTITIONS
while { read_line num id size type fs path name; [ "$id" ]; }; do
[ $fs != free ] || continue
[ -f "$id/method" ] || continue
[ -f "$id/acting_filesystem" ] || continue
method=$(cat $id/method)
filesystem=$(cat $id/acting_filesystem)
case "$filesystem" in
btrfs)
[ -f "$id/mountpoint" ] || continue
mountpoint=$(cat $id/mountpoint)
# due to #249322, #255135, #258117:
if [ "$mountpoint" = /tmp ]; then
rm -f $id/options/noexec
fi
options=$(get_mountoptions $dev $id)
if [ "$mountpoint" = / ]; then
if [ "$options" = defaults ]; then
options="errors=remount-ro"
else
options="${options},errors=remount-ro"
fi
pass=1
else
pass=2
fi
echo "$path" "$mountpoint" btrfs $options 0 $pass
;;
esac
done
close_dialog
done

1
init.d/_numbers Normal file
View file

@ -0,0 +1 @@
03 kernelmodules_btrfs

20
init.d/kernelmodules_btrfs Executable file
View file

@ -0,0 +1,20 @@
#!/bin/sh
mkdir -p /var/lib/partman
cat /proc/modules |
while read module_name x; do
if [ "$module_name" = btrfs ]; then
>/var/lib/partman/btrfs
exit 0
fi
done
if modprobe btrfs >/dev/null 2>/dev/null; then
>/var/lib/partman/btrfs
exit 0
fi
if grep -q btrfs /proc/filesystems; then
>/var/lib/partman/btrfs
fi

1
mount.d/_numbers Normal file
View file

@ -0,0 +1 @@
70 btrfs

20
mount.d/btrfs Executable file
View file

@ -0,0 +1,20 @@
#!/bin/sh
set -- $1
fs=$1
mp=$2
type=$3
options=$4
dump=$5
pass=$6
case $type in
btrfs)
mount -t btrfs ${options:+-o "$options"} $fs /target$mp || exit 1
echo "umount /target$mp"
exit 0
;;
esac
exit 1

17
mountoptions/btrfs Normal file
View file

@ -0,0 +1,17 @@
noatime
relatime
nodev
nosuid
noexec
ro
sync
usrquota
grpquota
nodatasum
nodatacow
nobarrier
compress
ssd
noacl
notreelog
flushoncommit

1
parted_names/btrfs Normal file
View file

@ -0,0 +1 @@
btrfs

View file

@ -0,0 +1 @@
25 btrfs

25
valid_filesystems/btrfs Executable file
View file

@ -0,0 +1,25 @@
#!/bin/sh
dev=$1
id=$2
property=$3
[ -f /var/lib/partman/btrfs ] || exit 0
case $property in
formatable)
echo btrfs
;;
existing)
[ -f $id/detected_filesystem ] || exit 0
fs=$(cat $id/detected_filesystem)
case "$fs" in
btrfs)
echo btrfs
;;
esac
;;
esac