Skip to content

Commit

Permalink
Synchronize initramfs and system hostid
Browse files Browse the repository at this point in the history
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 <[email protected]>
Closes #398
Closes #399

Signed-off-by: Brian Behlendorf <[email protected]>
  • Loading branch information
behlendorf committed Sep 30, 2011
1 parent 6ebd8ef commit e8753fb
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
11 changes: 10 additions & 1 deletion dracut/90zfs/module-setup.sh.in
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ install() {
inst_rules @udevruledir@/60-zvol.rules
inst @sysconfdir@/zfs/zdev.conf
inst @sysconfdir@/zfs/zpool.cache
inst @sysconfdir@/hostid
dracut_install @sbindir@/zfs
dracut_install @sbindir@/zpool
dracut_install @bindir@/zpool_layout
Expand All @@ -43,4 +42,14 @@ install() {
dracut_install hostid
inst_hook cmdline 95 "$moddir/parse-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

This comment has been minimized.

Copy link
@dajhorn

dajhorn Sep 30, 2011

Contributor

This line breaks dracut on DEB systems with a dash system shell because its built-in printf does not implement the hex format.

Suppose AA=12; BB=34; CC=56; DD=78. This results in a literal "\x04\x03\x02\x01" in the /etc/hostid file.

The fix is to call the external /usr/bin/printf or to change the whack-bang to bash.

This comment has been minimized.

Copy link
@behlendorf

behlendorf Sep 30, 2011

Author Contributor

Drat, I didn't test dash just sh. Do you have a few minutes to propose a clean fix?

This comment has been minimized.

Copy link
@dajhorn

dajhorn Oct 2, 2011

Contributor

Yes, I will submit a pull request when I get a moment at my workstation. The change should be trivial; just copied from the commit that you referenced in the ticket.

This comment has been minimized.

Copy link
@behlendorf

behlendorf Oct 5, 2011

Author Contributor

Which fix do you prefer for debian/ubuntu. Using bash or pulling /usr/bin/printf in to the initramfs... or both. Presumably there are already other consumers of bash in the ubuntu initramfs.

This comment has been minimized.

Copy link
@dajhorn

dajhorn Oct 5, 2011

Contributor

There are no bash consumers in a regular Ubuntu initrd, and I'm pretty sure that using bash in the boot stack is a Debian policy violation.

Using /usr/bin/printf is preferable because it is much smaller than /bin/bash. (48kB vice 932kB for Oneiric.)

This seemed like an easy job, but the general solution needs bench testing. Right now, I'm thinking that I should just patch it for Ubuntu in pkg-zfs to use whatever busybox provides.

This comment has been minimized.

Copy link
@behlendorf

behlendorf Oct 6, 2011

Author Contributor

Alright, I'm going to leave it as is for now. If you cook up a fix which works for Debian please let me know and I'll include it. I will we tagging an 0.6.0-rc6 in the next day or two.

inst_simple "$TMP" /etc/hostid
rm "$TMP"
}
8 changes: 6 additions & 2 deletions dracut/90zfs/parse-zfs.sh.in
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,13 @@
spl_hostid=`getarg spl_hostid=`
if [ "${spl_hostid}" != "" ] ; then
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
info "ZFS: Using hostid from /etc/hostid: `cat /etc/hostid`"
info "ZFS: Using hostid from /etc/hostid: `hostid`"
else
warn "ZFS: No hostid found on kernel command line or /etc/hostid. "
warn "ZFS: Pools may not import correctly."
Expand Down

2 comments on commit e8753fb

@Rudd-O
Copy link
Contributor

@Rudd-O Rudd-O commented on e8753fb Oct 11, 2011

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, so you're using the hostid file from the output of the hostid command.

Clever! This is clearly better than my work.

@haraldh
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why aren't you writing to "$initdir/etc/hostid" directly but use mktemp?

Please sign in to comment.