mount, umount and mtab
Posted: | More posts about gsoc debian hurd |
This week was all about getting mount into shape, addind umount and hacking up a prototype for the mtab issue. With all my patches to mount the boot log looks like this:
INIT: version 2.88 booting Using makefile-style concurrent boot in runlevel S. Activating swap...done. Checking root file system...fsck from util-linux 2.20.1 hd2 : tray open or drive not ready hd2 : tray open or drive not ready hd2 : tray open or drive not ready hd2 : tray open or drive not ready end_request: I/O error, dev 02:00, sector 0 ext2fs_check_if_mount: Can't check if filesystem is mounted due to missing mtab file while determining whether /dev/hd0s1 is mounted. /dev/hd0s1: clean, 44101/181056 files, 283413/723200 blocks done. Cleaning up temporary files... /tmp. /etc/rcS.d/S06mtab.sh: 48: /etc/rcS.d/S06mtab.sh: cannot open /proc/mounts: No such file Activating lvm and md swap...(default pager): Already paging to partition hd0s5! done. Checking file systems...fsck from util-linux 2.20.1 hd2 : tray open or drive not ready hd2 : tray open or drive not ready end_request: I/O error, dev 02:00, sector 0 done. Mounting local filesystems...done. Activating swapfile swap...(default pager): Already paging to partition hd0s5! done. df: Warning: cannot read table of mounted file systems: No such file or directory Cleaning up temporary files.... Configuring network interfaces...inetutils-ifconfig: invalid arguments ifup: failed to open pid file /run/network/ifup-/dev/eth0.pid: No such file or directory Internet Systems Consortium DHCP Client 4.2.2 Copyright 2004-2011 Internet Systems Consortium. All rights reserved. For info, please visit https://www.isc.org/software/dhcp/ can't create /var/lib/dhcp/dhclient./dev/eth0.leases: No such file or directory Listening on Socket//dev/eth0 Sending on Socket//dev/eth0 DHCPDISCOVER on /dev/eth0 to 255.255.255.255 port 67 interval 7 DHCPREQUEST on /dev/eth0 to 255.255.255.255 port 67 DHCPOFFER from 10.0.2.2 DHCPACK from 10.0.2.2 can't create /var/lib/dhcp/dhclient./dev/eth0.leases: No such file or directory bound to 10.0.2.15 -- renewal in 42107 seconds. done. Cleaning up temporary files.... Setting up X socket directories... /tmp/.X11-unix /tmp/.ICE-unix. INIT: Entering runlevel: 2 Using makefile-style concurrent boot in runlevel 2. Starting enhanced syslogd: rsyslogd. Starting deferred execution scheduler: atd. Starting periodic command scheduler: cron. Starting system message bus: dbusFailed to set socket option"/var/run/dbus/system_bus_socket": Protocol not available. Starting OpenBSD Secure Shell server: sshd. GNU 0.3 (debian) (console) login:
As you can see, mountall.sh works fine now (it's the line about mounting local filesystems). This is a list of issues I tackled this week:
- Hurds mount lacks some command line flags:
- -O, --test-opts
- -t, --types: semantic difference to what Linux' and FreeBSDs mount does.
- Hurds mount -t auto does not work.
- needed for fstab entries with fstype=auto
- needed for d-i
- The hurd package does not provide an umount helper, needed for d-i.
- also needed for umountfs, umountnfs.sh
- required arguments -f, -v, -r, -d
- Patch series for all the issues above posted: http://lists.gnu.org/archive/html/bug-hurd/2013-07/msg00031.html
- Hurds swapon/swapoff lacks some command line flags:
- -v, --verbose: set if VERBOSE=yes is given in /etc/default/rcS.
- Patch posted: http://lists.gnu.org/archive/html/bug-hurd/2013-07/msg00055.html
Note that even though I've implemented umount, it doesn't actually work yet. That is because umount needs a mtab file or /proc/mounts to do anything, because you can either invoke umount with the mount point or the device and umount needs an mtab style file to figure out whether the argument is referring to the former or the latter.
So the next big issue is the mtab issue. There is some information about that in the Hurd wiki, it even is a gsoc project idea of its own: http://www.gnu.org/software/hurd/community/gsoc/project_ideas/mtab.html
But I need this now, this cannot wait for another gsoc. The implementation outlined by that page consists roughly of:
- In every translator, keep a list of translators (active and passive) being bound to nodes of the translator. Think of this as keeping a list of child-translators.
- Add a RPC procedure to query this list.
- Creating a mtab-translator that recursively queries translators starting from a given translator and collects all the information required for an mtab file.
If this hypothetical mtab translator is bound to say /proc/mounts this would solve all our problems:
% settrans -ca /proc/mounts /hurd/mtab /
As this involves adding a RPC procedure and keeping a list of passive and active translators, this involves some design decisions. As discussed in #hurd I hacked up a prototype and post it for review: http://lists.gnu.org/archive/html/bug-hurd/2013-07/msg00022.html
As soon as I get the necessary feedback on this issue, I will get the implementation up to speed. Until then, I will pick another item from my status list, most probably the ifupdown issue.
Speaking of feedback, all of my patches I sent last week were merged at the appropriate locations. That was really quick, many thanks for that :)
While working on the mount issues, I frequently looked at the implementation of Linux' and FreeBSD's mount to see how --types is handled there. I must admit that I was not to keen about the idea of writing c again, but I was positively surprised by the code I've seen from Hurd so far. As Hurd is the operating system of the GNU system, its code is free to use any GNU extension to libc and gcc including nice stuff like nested functions. If you look at the different mount implementations, you'll find the Hurd version to be the most modern and clean one imho:
- Linux
- http://sources.debian.net/src/util-linux/2.20.1-5.4/mount/mount.c
- FreeBSD
- http://sources.debian.net/src/freebsd-utils/9.0%2Bds1-11/sbin/mount/mount.c
- Hurd
- http://sources.debian.net/src/hurd/20130620-1/utils/mount.c
See you next week :)