Hi Dave,
On 09/05/2016:06:09:07 PM, Dave Young wrote:
Hi, Pratyush
On 05/09/16 at 01:47pm, Pratyush Anand wrote:
> kdumpctl passes --device argument if dump target is a raw device. It passes
> --mount argument if dump target is either mounted as nfs or as a bulk
> device. When dump target device is a root device then it does not pass any
> of the above two arguments.
>
> After kdumpctl restart, if there is any change in file system which needs
> different dracut arguments, then initramfs must be rebuild.
>
> Modification in filesystem for a raw target does not affect dracut
> arguments. So, we do not consider to check any modification if raw target
> was specified in kdump.conf.
>
> We might need to change dracut arguments if there is some changes in nfs
> and ssh target related files. However, we do not consider them in this
> patch.
>
> We mainly consider changes in bulk target specified in kdump.conf. We also
> consider changes in bulk and nfs file system, if there was no dump target
> specified in kdump.conf but dump path is mounting such file systems.
>
> So the initramfs must be rebuild if, either dump target's persistent path
> or it's mount point or its file system type changes. If there is no dump
> target specified then, both dump path and root path must mount same device,
> otherwise rebuild should be triggered.
>
> Some of the examples when we can need a rebuild:
>
> -- "dump target" is specified as one of ext[234], xfs or btrfs. But after
> kdump initramfs building its UUID is changed by reformatting.
> -- "dump target" is specified as file system type fs1 (say ext3). But
after
> kdump initramfs building, user change it to fs2 (say ext4), probably by
> a mkfs.ext4 executing on the target device.
> -- "dump target" is not specified, but "dump path" mounts a
device which
> is different than device for root path and either UUID or file system type
> is modified after kdump initramfs build.
> -- "dump target" is not specified, but "dump path" mounts a nfs
device and
> nfs host path changes after kdump initramfs build.
>
> Some testing:
>
> Initial conditions:
> -- No dump target specified
> -- dump path (/var/crash) and root(/) are on same device
> -- kdumpctl was already executed once after last modification in
> /etc/kdump.conf
>
> # kdumpctl restart
> No rebuild
> # mkfs.ext2 /dev/md0;mount /dev/md0 /var/crash/;kdumpctl restart
> Rebuilt because "Detected change in File System"
> # kdumpctl restart
> No rebuild
> # umount /var/crash/;kdumpctl restart
> Rebuilt because "Detected change in File System"
> # kdumpctl restart
> No rebuild
> # mount /dev/md0 /var/crash/;kdumpctl restart
> Rebuilt because "Detected change in File System"
> # umount /var/crash;mkfs.ext4 /dev/md0;
> # mount /dev/md0 /var/crash/;kdumpctl restart
> Rebuilt because "Detected change in File System"
>
> # umount /var/crash;mkfs.ext4 /dev/mapper/fedora-swap
> # mount /dev/mapper/fedora-swap /var/crash/
> # kdumpctl restart
> Rebuilt because "Detected change in File System"
> # umount /var/crash;mkfs.btrfs /dev/mapper/fedora-swap -f
> # mount /dev/mapper/fedora-swap /var/crash/
> # kdumpctl restart
> Rebuilt because "Detected change in File System"
> # kdumpctl restart
> No rebuild
> # umount /var/crash/;kdumpctl restart
> Rebuilt because "Detected change in File System"
> # mount /dev/mapper/fedora-swap /var/crash/;kdumpctl restart
> Rebuilt because "Detected change in File System"
>
> # umount /var/crash;mkfs.minix /dev/md0
> # mount /dev/md0 /var/crash/; kdumpctl restart
> Rebuilt because "Detected change in File System"
> # kdumpctl restart
> No rebuild
> # umount /var/crash/;kdumpctl restart
> Rebuilt because "Detected change in File System"
>
> # mount 192.168.1.16:/nfsroot /var/crash/;kdumpctl restart
> Rebuilt because "Detected change in File System"
> # umount /var/crash/;kdumpctl restart
> Rebuilt because "Detected change in File System"
> # mount 192.168.1.16:/nfsroot /var/crash/;kdumpctl restart
> Rebuilt because "Detected change in File System"
> # kdumpctl restart
> No rebuild
> # umount /var/crash;mount 192.168.1.12:/nfsroot /var/crash/
> # kdumpctl restart
> Rebuilt because "Detected change in File System"
> # umount /var/crash/;kdumpctl restart
> Rebuilt because "Detected change in File System"
>
> Added "raw /dev/md0" in /etc/kdump.conf
> # kdumpctl restart
> Rebuilt because "Detected change in /etc/kdump.conf"
> # mkfs.ext4 /dev/md0 ;kdumpctl restart
> No rebuild
>
> Added "ext4 /dev/md0" in /etc/kdump.conf
> # mkfs.ext4 /dev/md0;mount /dev/md0 /mnt
> # mkdir /mnt/var;mkdir /mnt/var/crash; kdumpctl restart
> Rebuilt because "Detected change in /etc/kdump.conf"
> # umount /mnt;mkfs.ext4 /dev/md0;mount /dev/md0 /mnt
> # mkdir /mnt/var;mkdir /mnt/var/crash; kdumpctl restart
> Rebuilt because "Detected change in /etc/kdump.conf"
>
> Most of the credits for this patch goes to Xunlei Pang <xpang(a)redhat.com>
> for suggesting several improvements.
>
> Signed-off-by: Pratyush Anand <panand(a)redhat.com>
> ---
> kdumpctl | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 74 insertions(+)
>
> diff --git a/kdumpctl b/kdumpctl
> index 2ce7651bcc62..34b64f33ac40 100755
> --- a/kdumpctl
> +++ b/kdumpctl
> @@ -359,6 +359,74 @@ check_files_modified()
> return 0
> }
>
> +check_dump_fs_modified()
> +{
> + local _old_dev _old_mntpoint _old_fstype
> + local _new_dev _new_mntpoint _new_fstype
> + local _target _path _dracut_args
> +
> + # No need to check in case of raw target.
> + # Currently we do not check also if ssh/nfs target is specified
> + if is_ssh_dump_target || is_nfs_dump_target || is_raw_dump_target; then
> + return 0
> + fi
> +
> + _target=$(get_user_configured_dump_disk)
> +
> + if [[ -n "$_target" ]]; then
> + _target=$(to_dev_name $_target)
> + _new_fstype=$(blkid $_target | awk -F"TYPE=" '{print $2}' | cut
-d '"' -f 2)
> + else
> + _path=$(get_save_path)
> + set -- $(df -T $_path 2>/dev/null | tail -1 | awk '{ print $1, $2}')
> + _target=$(to_dev_name $1)
> + _new_fstype=$2
> + if [[ -z "$_target" || -z "$_new_fstype" ]];then
> + echo "Dump path $_path does not exist"
> + return 2
> + fi
> + fi
> +
> + if [[ $(expr substr $_new_fstype 1 3) = "nfs" ]];then
> + _new_dev=$_target
> + else
> + _new_dev=$(get_persistent_dev $_target $_new_fstype)
> + if ! findmnt $_target >/dev/null; then
> + echo "Dump target $_target is probably not mounted."
> + return 2
> + fi
> + fi
> +
> + if ! findmnt $_target >/dev/null; then
> + echo "Dump target $_target is probably not mounted."
> + return 2
> + fi
> + _new_mntpoint="/kdumproot/$(get_mntpoint_from_target $_target)"
the _new_mntpoint is for the real mount target dir name, we do not need to
care about it?
Actually mntpoint is also passed as an argument to Dracut. So, we do the rebuild
if there is a change needed into that.
For example:
# egrep -v "^#" /etc/kdump.conf
ext4 /dev/md0
path /var/crash
core_collector makedumpfile -l --message-level 1 -d 31 -F
# mount /dev/md0 /mnt/
# lsinitrd /boot/initramfs-4.5.0-302.fc24.x86_64+debugkdump.img | grep
"Arguments"
Arguments: --hostonly -o 'plymouth dash resume ifcfg' --mount
'/dev/disk/by-uuid/d249a4ec-0603-49d0-8d6b-a19314081f35 /kdumproot//mnt ext4
rw,relatime,seclabel,stripe=256,data=ordered,x-initrd.mount' -f
Now mount /dev/md0 to another directory.
# umount /mnt;mount /dev/md0 /dump/;kdumpctl restart
# lsinitrd /boot/initramfs-4.5.0-302.fc24.x86_64+debugkdump.img | grep
# "Arguments"
Arguments: --hostonly -o 'plymouth dash resume ifcfg' --mount
'/dev/disk/by-uuid/d249a4ec-0603-49d0-8d6b-a19314081f35 /kdumproot//dump ext4
rw,relatime,seclabel,stripe=256,data=ordered,x-initrd.mount' -f
So, here we did not do any change in kdump.conf, however when mount target dir
is changed, dracut is passed with different arguments (if rebuild).
So, IMHO we should rebuild if any condition is triggered which may cause change
in mntpoint dracut argument.
~Pratyush
>
> Thanks
> Dave
>
> > +
> > + _dracut_args=$(lsinitrd $TARGET_INITRD | grep "^Arguments:" | head
-1)
> > + if [[ -z "$_dracut_args" ]];then
> > + echo "Warning: No dracut arguments found in initrd"
> > + return 0
> > + fi
> > +
> > + # if --mount argument present then match old and new target, mount
> > + # point and file system. If any of them mismatches then rebuild
> > + echo $_dracut_args | grep "\-\-mount" &> /dev/null
> > + if [[ $? -eq 0 ]];then
> > + set -- $(echo $_dracut_args | awk -F "--mount '" '{print
$2}' | cut -d' ' -f1,2,3)
> > + _old_dev=$1
> > + _old_mntpoint=$2
> > + _old_fstype=$3
> > + [[ $_new_dev = $_old_dev && $_new_mntpoint = $_old_mntpoint
&& $_new_fstype = $_old_fstype ]] && return 0
> > + # otherwise rebuild if target device is not a root device
> > + else
> > + [[ "$_target" = "$(get_root_fs_device)" ]] &&
return 0
> > + fi
> > +
> > + echo "Detected change in File System"
> > + return 1
> > +}
> > +
> > # returns 0 if system is not modified
> > # returns 1 if system is modified
> > # returns 2 if system modification is invalid
> > @@ -374,6 +442,12 @@ check_system_modified()
> > return $ret
> > fi
> >
> > + check_dump_fs_modified
> > + ret=$?
> > + if [ $ret -ne 0 ]; then
> > + return $ret
> > + fi
> > +
> > return 0
> > }
> >
> > --
> > 2.5.5
> >