forked from ungleich-public/cdist
[explorer/machine_type] Implement chroot detection using /proc/.../mountinfo
This commit is contained in:
parent
5af1317c29
commit
05c2a62191
1 changed files with 43 additions and 21 deletions
|
@ -165,30 +165,52 @@ has_chroot_procfs() {
|
||||||
test -d /proc/
|
test -d /proc/
|
||||||
}
|
}
|
||||||
|
|
||||||
check_chroot_procfs() {
|
check_chroot_procfs() (
|
||||||
|
is_chroot=false # default
|
||||||
if test -e /proc/1/root && ! files_same /proc/1/root /
|
if test -e /proc/1/root && ! files_same /proc/1/root /
|
||||||
then
|
then
|
||||||
# try to determine where the chroot has been mounted
|
is_chroot=true
|
||||||
(
|
|
||||||
rootdev=$(LC_ALL=C df -P / | awk 'NR==2{print $1}')
|
|
||||||
|
|
||||||
if test -e "${rootdev}"
|
|
||||||
then
|
|
||||||
# escape chroot to determine where the device containing the
|
|
||||||
# chroot's / is mounted
|
|
||||||
rootdevmnt=$(LC_ALL=C chroot /proc/1/root df -P "${rootdev}" | awk 'NR==2{print $6}')
|
|
||||||
|
|
||||||
# shellcheck disable=SC2012
|
|
||||||
root_ino=$(ls -1di / | awk '{print $1}')
|
|
||||||
|
|
||||||
# Get mount point
|
|
||||||
chroot /proc/1/root find "${rootdevmnt}" -xdev -type d -inum "${root_ino}"
|
|
||||||
fi
|
|
||||||
)
|
|
||||||
return 0
|
|
||||||
fi
|
fi
|
||||||
return 1
|
if test -e /proc/1/mountinfo -a -e /proc/self/mountinfo
|
||||||
}
|
then
|
||||||
|
has_mountinfo=true
|
||||||
|
cmp -s /proc/1/mountinfo /proc/self/mountinfo || is_chroot=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ${is_chroot}
|
||||||
|
then
|
||||||
|
# try to determine where the chroot has been mounted
|
||||||
|
rootdev=$(LC_ALL=C df -P / | awk 'NR==2{print $1}')
|
||||||
|
|
||||||
|
if test -e "${rootdev}"
|
||||||
|
then
|
||||||
|
# escape chroot to determine where the device containing the
|
||||||
|
# chroot's / is mounted
|
||||||
|
rootdevmnt=$(LC_ALL=C chroot /proc/1/root df -P "${rootdev}" | awk 'NR==2{print $6}')
|
||||||
|
|
||||||
|
# shellcheck disable=SC2012
|
||||||
|
root_ino=$(ls -1di / | awk '{print $1}')
|
||||||
|
|
||||||
|
# escape chroot and find mount point by inode
|
||||||
|
chroot /proc/1/root find "${rootdevmnt}" -xdev -type d -inum "${root_ino}"
|
||||||
|
elif ${has_mountinfo}
|
||||||
|
then
|
||||||
|
while read -r mntid _ _ _ cmntpnt _
|
||||||
|
do
|
||||||
|
read -r _ _ _ _ hmntpnt _ <<-EOF
|
||||||
|
$(grep -e "^$((mntid)) " /proc/1/mountinfo)
|
||||||
|
EOF
|
||||||
|
printf '%s\n' "${hmntpnt%${cmntpnt}}"
|
||||||
|
done </proc/self/mountinfo \
|
||||||
|
| sort -u \
|
||||||
|
| head -n 1 # just take the first...
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
|
||||||
# Check for container
|
# Check for container
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue