Source: initramfs-tools Version: 0.137 Severity: wishlist Tags: patch Hi!
I've used this i-t patch to successfully (I think? I can log in and the system is usable, but I get an endless stream of > CIFS VFS: SMB signature verification returned error = -13 on the console, though I think that's unrelated to anything in this patch) boot an otherwise clean+cifs-utils+systemd sid i686 chroot off samba, mostly mirroring the NFS code. Note that Debian kernels don't set CONFIG_CIFS_ROOT, so "rootfs" is ignored [1], but AFAICT that's only used to change some socket parameters and error handling [2,3], so shouldn't affect much. Best, наб [1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs/cifs/connect.c?id=a0a3036b81f1f66fa3333559ecfe18f5bbfa5076#n1787 [2]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs/cifs/connect.c?id=a0a3036b81f1f66fa3333559ecfe18f5bbfa5076#n2754 [3]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs/cifs/connect.c?id=a0a3036b81f1f66fa3333559ecfe18f5bbfa5076#n3950 -- >8 -- Subject: Allow booting with root=/dev/cifs --- hook-functions | 1 + hooks/cifs | 7 +++ init | 15 ++++- scripts/cifs | 161 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 181 insertions(+), 3 deletions(-) create mode 100755 hooks/cifs create mode 100644 scripts/cifs diff --git a/hook-functions b/hook-functions index 7a82b9c..c932d46 100644 --- a/hook-functions +++ b/hook-functions @@ -566,6 +566,7 @@ auto_add_modules() modules="$modules btrfs ext2 ext3 ext4 f2fs" modules="$modules isofs jfs reiserfs udf xfs" modules="$modules nfs nfsv2 nfsv3 nfsv4" + modules="$modules cifs md4 cmac aes sha512" modules="$modules af_packet atkbd i8042 psmouse" modules="$modules virtio_pci virtio_mmio" diff --git a/hooks/cifs b/hooks/cifs new file mode 100755 index 0000000..5b0f8da --- /dev/null +++ b/hooks/cifs @@ -0,0 +1,7 @@ +#!/bin/sh + +. /usr/share/initramfs-tools/hook-functions + +if [ -x /sbin/mount.cifs ]; then + copy_exec /sbin/mount.cifs +fi diff --git a/init b/init index 43f6828..3438121 100755 --- a/init +++ b/init @@ -87,8 +87,11 @@ for x in $(cat /proc/cmdline); do ;; root=*) ROOT=${x#root=} - if [ -z "${BOOT}" ] && [ "$ROOT" = "/dev/nfs" ]; then - BOOT=nfs + if [ -z "${BOOT}" ]; then + case "$ROOT" in + "/dev/nfs") BOOT=nfs ;; + "/dev/cifs") BOOT=cifs ;; + esac fi ;; rootflags=*) @@ -109,6 +112,10 @@ for x in $(cat /proc/cmdline); do # shellcheck disable=SC2034 NFSROOT="${x#nfsroot=}" ;; + cifsroot=*) + # shellcheck disable=SC2034 + CIFSROOT="${x#cifsroot=}" + ;; initramfs.runsize=*) RUNSIZE="${x#initramfs.runsize=}" ;; @@ -234,10 +241,11 @@ run_scripts /scripts/init-premount maybe_break mount log_begin_msg "Mounting root file system" -# Always load local and nfs (since these might be needed for /etc or +# Always load local, nfs, and cifs (since these might be needed for /etc or # /usr, irrespective of the boot script used to mount the rootfs). . /scripts/local . /scripts/nfs +. /scripts/cifs . /scripts/${BOOT} parse_numeric "${ROOT}" maybe_break mountroot @@ -255,6 +263,7 @@ fi # Mount cleanup mount_bottom nfs_bottom +cifs_bottom local_bottom maybe_break bottom diff --git a/scripts/cifs b/scripts/cifs new file mode 100644 index 0000000..6f0ebe6 --- /dev/null +++ b/scripts/cifs @@ -0,0 +1,161 @@ +# CIFS filesystem mounting -*- shell-script -*- + +# FIXME This needs error checking + +cifs_top() +{ + if [ "${cifs_top_used}" != "yes" ]; then + [ "${quiet?}" != "y" ] && log_begin_msg "Running /scripts/cifs-top" + run_scripts /scripts/cifs-top + [ "$quiet" != "y" ] && log_end_msg + fi + cifs_top_used=yes +} + +cifs_premount() +{ + if [ "${cifs_premount_used}" != "yes" ]; then + [ "${quiet?}" != "y" ] && log_begin_msg "Running /scripts/cifs-premount" + run_scripts /scripts/cifs-premount + [ "$quiet" != "y" ] && log_end_msg + fi + cifs_premount_used=yes +} + +cifs_bottom() +{ + if [ "${cifs_premount_used}" = "yes" ] || [ "${cifs_top_used}" = "yes" ]; then + [ "${quiet?}" != "y" ] && log_begin_msg "Running /scripts/cifs-bottom" + run_scripts /scripts/cifs-bottom + [ "$quiet" != "y" ] && log_end_msg + fi + cifs_premount_used=no + cifs_top_used=no +} + +# parse cifs bootargs and mount cifs +cifs_mount_root_impl() +{ + configure_networking + + # get cifs root from dhcp + if [ "x${CIFSROOT}" = "xauto" ]; then + # check if server ip is part of dhcp root-path + if [ "${ROOTPATH#*//*/}" = "${ROOTPATH}" ]; then + CIFSROOT=//${ROOTSERVER}/${ROOTPATH#*/} + else + CIFSROOT=${ROOTPATH} + fi + + # cifsroot=//<server-ip>/<share>[,options] + elif [ -n "${CIFSROOT}" ]; then + # cifs options are an optional arg + if [ "${CIFSROOT#*,}" != "${CIFSROOT}" ]; then + CIFSOPTS="${CIFSROOT#*,}" + fi + CIFSROOT=${CIFSROOT%%,*} + if [ "${CIFSROOT#*//*/}" = "$CIFSROOT" ]; then + CIFSROOT=//${ROOTSERVER}/${CIFSROOT} + fi + fi + + cifs_premount + + if [ "${readonly?}" = y ]; then + roflag="-o ro" + else + roflag="-o rw" + fi + + # The redirexion displays the password prompt, if any, instead of just blocking + # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs/cifs/cifsroot.c?id=a0a3036b81f1f66fa3333559ecfe18f5bbfa5076#n18 + # shellcheck disable=SC2086 + mount.cifs ${roflag} -o "vers=1.0,cifsacl,mfsymlinks,rsize=1048576,wsize=65536,uid=0,gid=0,hard,rootfs,${CIFSOPTS}" "${CIFSROOT}" "${rootmnt?}" >/dev/console 2>&1 +} + +# CIFS root mounting +cifs_mount_root() +{ + cifs_top + + # For DHCP + modprobe af_packet + + wait_for_udev 10 + + # Default delay is around 180s + delay=${ROOTDELAY:-180} + + # loop until mount.cifs succeeds + cifs_mount_root_impl + ret=$? + cifs_retry_count=0 + while [ ${cifs_retry_count} -lt "${delay}" ] \ + && [ $ret -ne 0 ] ; do + [ "$quiet" != "y" ] && log_begin_msg "Retrying cifs mount" + sleep 1 + cifs_mount_root_impl + ret=$? + cifs_retry_count=$(( cifs_retry_count + 1 )) + [ "$quiet" != "y" ] && log_end_msg + done +} + +cifs_mount_fs_impl() +{ + configure_networking + + cifs_premount + + if [ "${readonly}" = y ]; then + roflag="-o ro" + else + roflag="-o rw" + fi + + read_fstab_entry "$1" + + # The redirexion displays the password prompt, if any, instead of just blocking + # shellcheck disable=SC2086 + mount.cifs ${roflag} -o "${CIFSOPTS}" -o "${MNT_OPTS}" "$MNT_FSNAME" "${rootmnt}${MNT_DIR}" >/dev/console 2>&1 +} + +cifs_mount_fs() +{ + cifs_top + + # For DHCP + modprobe af_packet + + wait_for_udev 10 + + # Default delay is around 180s + delay=${ROOTDELAY:-180} + + # Don't loop here; we can't sanely check if it worked like for + # the rootfs or /etc. + cifs_mount_fs_impl "$1" +} + +mountroot() +{ + cifs_mount_root +} + +mount_top() +{ + # Note, also called directly in case it's overridden. + cifs_top +} + +mount_premount() +{ + # Note, also called directly in case it's overridden. + cifs_premount +} + +mount_bottom() +{ + # Note, also called directly in case it's overridden. + cifs_bottom +} -- 2.20.1
signature.asc
Description: PGP signature