2a005961a4
These days most disk drivers will probe for devices asynchronously. This means it's possible that when you zfs init script runs all the required block devices may not yet have been discovered. The result is the pool may fail to cleanly import at boot time. This is particularly common when you have a large number of devices. The fix is for the init script to block until udev settles and we are no longer detecting new devices. Once the system has settled the zfs modules can be loaded and the pool with be automatically imported.
84 lines
2.2 KiB
Bash
84 lines
2.2 KiB
Bash
#!/bin/bash
|
|
#
|
|
# zfs This shell script takes care of starting (mount) and
|
|
# stopping (umount) zfs shares.
|
|
#
|
|
# chkconfig: 35 60 40
|
|
# description: ZFS is a filesystem developed by Sun, ZFS is a
|
|
# combined file system and logical volume manager
|
|
# designed by Sun Microsystems. Made available to Linux
|
|
# using SPL (Solaris Porting Layer) by zfsonlinux.org.
|
|
# probe: true
|
|
|
|
case $1 in
|
|
start) echo "$1ing ZFS filesystems"
|
|
|
|
# Delay until all required block devices are present.
|
|
udevadm settle
|
|
|
|
if ! grep "zfs" /proc/modules > /dev/null; then
|
|
echo "ZFS kernel module not loaded yet; loading...";
|
|
if ! modprobe zfs; then
|
|
echo "Failed to load ZFS kernel module...";
|
|
exit 0;
|
|
fi
|
|
fi
|
|
|
|
if ! [ `uname -m` == "x86_64" ]; then
|
|
echo "Warning: You're not running 64bit. Currently native zfs in";
|
|
echo " linux is only supported and tested on 64bit.";
|
|
# should we break here? People doing this should know what they
|
|
# do, thus i'm not breaking here.
|
|
fi
|
|
|
|
# mount the filesystems
|
|
while IFS= read -r -d $'\n' dev; do
|
|
mdev=$(echo "$dev" | awk '{ print $1; }')
|
|
echo -n "mounting $mdev..."
|
|
if `zfs mount $mdev`; then
|
|
echo -e "done";
|
|
else
|
|
echo -e "failed";
|
|
fi
|
|
done < <(zfs list -H);
|
|
|
|
|
|
;;
|
|
|
|
stop) echo "$1ping ZFS filesystems"
|
|
|
|
if grep "zfs" /proc/modules > /dev/null; then
|
|
# module is loaded, so we can try to umount filesystems
|
|
while IFS= read -r -d $'\n' dev; do
|
|
mdev=$(echo "$dev" | awk '{ print $1 }');
|
|
echo -n "umounting $mdev...";
|
|
if `zfs umount $mdev`; then
|
|
echo -e "done";
|
|
else
|
|
echo -e "failed";
|
|
fi
|
|
# the next line is, because i have to reverse the
|
|
# output, otherwise it wouldn't work as it should
|
|
done < <(zfs list -H | tac);
|
|
|
|
# and finally let's rmmod the module
|
|
rmmod zfs
|
|
|
|
|
|
else
|
|
# module not loaded, no need to umount anything
|
|
exit 0
|
|
fi
|
|
|
|
;;
|
|
|
|
restart) echo "$1ing ZFS filesystems"
|
|
$0 stop
|
|
$0 start
|
|
;;
|
|
|
|
*) echo "Usage: $0 {start|stop|restart}"
|
|
;;
|
|
|
|
esac
|