Synchronize initramfs and system hostid

Relying on an /etc/hostid file which is installed in the system
image breaks diskless systems which share an image.  Certain
cluster infrastructure such as MPI relies on all nodes having
a unique hostid.  However, we still must be careful to ensure
the hostid is syncronized between the initramfs and system
images when using zfs root filesystems.

To accompish this the automatically created /etc/hostid file has
been removed from the spl rpm packaging.  The /etc/hostid file
is now dynamically created for your initramfs as part of the
dracut install process.  This avoids the need to install it in
the actual system images.

This change also resolves the spl_hostid parameter handling
for dracut.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #398
Closes #399

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
Brian Behlendorf 2011-09-30 10:33:26 -07:00
parent 6ebd8ef103
commit e8753fb4f0
2 changed files with 16 additions and 3 deletions

View File

@ -33,7 +33,6 @@ install() {
inst_rules @udevruledir@/60-zvol.rules inst_rules @udevruledir@/60-zvol.rules
inst @sysconfdir@/zfs/zdev.conf inst @sysconfdir@/zfs/zdev.conf
inst @sysconfdir@/zfs/zpool.cache inst @sysconfdir@/zfs/zpool.cache
inst @sysconfdir@/hostid
dracut_install @sbindir@/zfs dracut_install @sbindir@/zfs
dracut_install @sbindir@/zpool dracut_install @sbindir@/zpool
dracut_install @bindir@/zpool_layout dracut_install @bindir@/zpool_layout
@ -43,4 +42,14 @@ install() {
dracut_install hostid dracut_install hostid
inst_hook cmdline 95 "$moddir/parse-zfs.sh" inst_hook cmdline 95 "$moddir/parse-zfs.sh"
inst_hook mount 98 "$moddir/mount-zfs.sh" inst_hook mount 98 "$moddir/mount-zfs.sh"
# Synchronize initramfs and system hostid
TMP=`mktemp`
AA=`hostid | cut -b 1,2`
BB=`hostid | cut -b 3,4`
CC=`hostid | cut -b 5,6`
DD=`hostid | cut -b 7,8`
printf "\x$DD\x$CC\x$BB\x$AA" >$TMP
inst_simple "$TMP" /etc/hostid
rm "$TMP"
} }

View File

@ -6,9 +6,13 @@
spl_hostid=`getarg spl_hostid=` spl_hostid=`getarg spl_hostid=`
if [ "${spl_hostid}" != "" ] ; then if [ "${spl_hostid}" != "" ] ; then
info "ZFS: Using hostid from command line: ${spl_hostid}" info "ZFS: Using hostid from command line: ${spl_hostid}"
echo "${spl_hostid}" > /etc/hostid AA=`echo ${spl_hostid} | cut -b 1,2`
BB=`echo ${spl_hostid} | cut -b 3,4`
CC=`echo ${spl_hostid} | cut -b 5,6`
DD=`echo ${spl_hostid} | cut -b 7,8`
printf "\x$DD\x$CC\x$BB\x$AA" >/etc/hostid
elif [ -f /etc/hostid ] ; then elif [ -f /etc/hostid ] ; then
info "ZFS: Using hostid from /etc/hostid: `cat /etc/hostid`" info "ZFS: Using hostid from /etc/hostid: `hostid`"
else else
warn "ZFS: No hostid found on kernel command line or /etc/hostid. " warn "ZFS: No hostid found on kernel command line or /etc/hostid. "
warn "ZFS: Pools may not import correctly." warn "ZFS: Pools may not import correctly."