Это старый пост, но следующая информация может быть полезна другим.
Существует способ, по общему признанию грубый, для выполнения не -жадного сопоставления RE в awk. Основная идея состоит в том, чтобы использовать строку match (, функцию RE )и постепенно уменьшать размер строки до тех пор, пока совпадение не завершится ошибкой, что-то вроде (untested):
if (match(string, RE)) {
rstart = RSTART
for (i=RLENGTH; i>=1; i--)
if (!(match(substr(string,1,rstart+i-1), RE))) break;
# At this point, the non-greedy match will start at rstart
# for a length of i+1
}
Причина проблемы в том, что unshare
пытается установить флаги распространения монтирования корневого каталога, что можно сделать только для точек монтирования. Корневой каталог среды chroot Jenkins не является точкой монтирования.
Например:
$ unshare -rm mount --make-rprivate /opt
mount: /opt: not mount point or bad option.
Полное воспроизведение:
#!/bin/bash
try() {
mount -t tmpfs t /mnt
mkdir /mnt/t
for i in /bin /lib* /sbin /usr /home /proc
do
mkdir "/mnt/t$i"
mount --rbind "$i" "/mnt/t$i"
done
chroot /mnt/t unshare -m echo OK
}
export -f try
unshare -rm bash -c try
Простой обходной путь, который не делает монтирования вне пространства имен монтирования. Он выходит из chroot, чтобы установить распространение монтирования, и предполагает, что команда mount доступна вне chroot :
.unshare --propagation unchanged -m sh -c \
'nsenter --mount=/proc/self/ns/mnt mount --make-rslave /; echo Do some mounts'
Или преобразовать chroot в pivot_root
окружение:
#define _GNU_SOURCE
#include <errno.h>
#include <error.h>
#include <fcntl.h>
#include <sched.h>
#include <stdio.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
static int pivot_root(const char *new_root, const char *put_old){
return syscall(SYS_pivot_root, new_root, put_old);
}
int main(int argc, char **argv) {
if (unshare(CLONE_NEWNS))
error(1, errno, "unshare");
int root = open("/", O_DIRECTORY | O_PATH | O_CLOEXEC);
if (root < 0) error(1, errno, "open /");
int ns = open("/proc/self/ns/mnt", O_RDONLY | O_CLOEXEC);
if (ns < 0) error(1, errno, "open mount namespace");
if (setns(ns, CLONE_NEWNS))
error(1, errno, "setns");
if (fchdir(root))
error(1, errno, "fchdir");
if (mount("/", "/", 0, MS_REC|MS_SLAVE, 0))
error(1, errno, "mount --make-rslave");
if (mount(".", "proc", 0, MS_REC|MS_BIND, 0))
error(1, errno, "mount --rbind");
if (chdir("proc"))
error(1, errno, "chdir");
if (pivot_root(".", "proc"))
error(1, errno, "pivot_root");
if (umount2("proc", MNT_DETACH))
error(1, errno, "umount");
execvp(argv[1], argv + 1);
error(1, errno, "exec");
}