Arbiel a écritUne telle modification n'est pas à la portée de tout un chacun.
Oh que si!
Debian intègre automatiquement fsck dans l'image initiale via un script hook visible en /usr/share/initramfs-tools/hooks/fsck dont voici le contenu;
#!/bin/sh
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
fstab_files()
{
echo /etc/fstab
if [ -d /etc/fstab.d ]; then
ls -1 /etc/fstab.d | grep '\.fstab$' | sed -e 's;^;/etc/fstab.d/;'
fi
}
# Find a specific fstab entry
# $1=mountpoint
# $2=fstype (optional)
_read_fstab_entry () {
# Not found by default.
echo "MNT_FSNAME="
echo "MNT_DIR="
echo "MNT_TYPE="
fstab_files | while read file; do
if [ -f "$file" ]; then
while read MNT_FSNAME MNT_DIR MNT_TYPE MNT_OPTS MNT_FREQ MNT_PASS MNT_JUNK; do
case "$MNT_FSNAME" in
""|\#*)
continue;
;;
esac
if [ "$MNT_DIR" = "$1" ]; then
if [ -n "$2" ]; then
[ "$MNT_TYPE" = "$2" ] || continue;
fi
echo "MNT_FSNAME=$MNT_FSNAME"
echo "MNT_DIR=$MNT_DIR"
echo "MNT_TYPE=$MNT_TYPE"
echo "MNT_PASS=$MNT_PASS"
break 2
fi
MNT_DIR=""
done < "$file"
fi
done
}
# Find a specific fstab entry and print its type (if found, and pass != 0)
# $1=mountpoint
get_fsck_type_fstab () {
eval "$(_read_fstab_entry "$1")"
# Not found by default.
if [ "$1" = "$MNT_DIR" ] && [ "$MNT_PASS" != 0 ]; then
# Ignore filesystem type for /, as it is not available and
# therefore never used at boot time
if [ "${MNT_DIR}" = "/" ] || [ "${MNT_TYPE}" = "auto" ]; then
MNT_FSNAME="$(resolve_device "${MNT_FSNAME}")"
alias fstype="/usr/lib/klibc/bin/fstype"
get_fstype "${MNT_FSNAME}"
unalias fstype
else
echo "${MNT_TYPE}"
fi
fi
}
get_fsck_types() {
get_fsck_type_fstab /
get_fsck_type_fstab /usr
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
if [ ! -x /sbin/fsck ]; then
exit 0
fi
. /usr/share/initramfs-tools/scripts/functions
. /usr/share/initramfs-tools/hook-functions
fsck_types="$(get_fsck_types | sort | uniq)"
if [ -z "$fsck_types" ]; then
exit 0
fi
copy_exec /sbin/fsck
copy_exec /sbin/logsave
for type in $fsck_types; do
if [ "$type" = "unknown" ] ; then
echo "Warning: couldn't identify filesystem type for fsck hook, ignoring."
continue
fi
if prog="$(command -v fsck.${type})"; then
copy_exec "$prog"
else
echo "Warning: /sbin/fsck.${type} doesn't exist, can't install to initramfs, ignoring."
fi
done
En clair dès qu'un système de fichiers ext est détecté dans /etc/fstab le programme fsck ad hoc est intégré à l'image initiale.
Le problème est que la plupart des gens ignorent comment utiliser le mode commande de l'image initiale.
Autre exemple, contenu partiel d'une image initiale Archlinux qui utilise initcpio:
[aspire7730z@asus-arch boot]$ lsinitcpio /mnt/boot/initramfs-linux.img |grep fsck
usr/bin/fsck
usr/bin/fsck.ext3
usr/bin/fsck.ext2
usr/bin/fsck.ext4
usr/bin/btrfsck
[aspire7730z@asus-arch boot]$
Les programmes fsck sont intégrés suivant le même principe que Debian.
Je ne sais plus si Ubuntu a le même comportement.
Vous devriez pouvoir contrôler la présence des programmes fsck via la commande lsinitcpio (je ne peux pas dire quel paquet Ubuntu installe cette commande) en balayant l'arborescence de l'image initiale, exemple d'une image Debian:
[aspire7730z@asus-arch boot]$ lsinitcpio initrd.img-4.9.0-3-amd64 |less
qui donne pour la première page:
.
bin
bin/kmod
bin/btrfs
bin/btrfs-zero-log
bin/udevadm
bin/ntfs-3g
bin/chroot
bin/fstype
bin/halt
bin/ipconfig
bin/losetup
bin/minips
bin/nfsmount
bin/nuke
bin/pivot_root
bin/poweroff
bin/reboot
bin/resume
bin/run-init
conf
conf/conf.d
conf/conf.d/zz-resume-auto
:
Vous pouvez utiliser la recherche de caractères de la commande less en saisissant par exemple /fsck ou /cequevousvoulez au prompt :