switch-root: remount to MS_PRIVATE
The kernel does not allow switching roots if things are mounted MS_SHARED. As a work-around, remount things MS_PRIVATE before switching roots. This should be fixed in the kernel for good. https://bugzilla.redhat.com/show_bug.cgi?id=847418
This commit is contained in:
+8
-9
@@ -104,15 +104,14 @@ static int pivot_to_new_root(void) {
|
||||
return -errno;
|
||||
}
|
||||
|
||||
/*
|
||||
In case some evil process made "/" MS_SHARED
|
||||
It works for pivot_root, but the ref count for the root device
|
||||
is not decreasing :-/
|
||||
*/
|
||||
if (mount(NULL, "/", NULL, MS_REC|MS_PRIVATE, NULL) < 0) {
|
||||
log_error("Failed to make \"/\" private mount %m");
|
||||
return -errno;
|
||||
}
|
||||
/* Work-around for a kernel bug: for some reason the kernel
|
||||
* refuses switching root if any file systems are mounted
|
||||
* MS_SHARED. Hence remount them MS_PRIVATE here as a
|
||||
* work-around.
|
||||
*
|
||||
* https://bugzilla.redhat.com/show_bug.cgi?id=847418 */
|
||||
if (mount(NULL, "/", NULL, MS_REC|MS_PRIVATE, NULL) < 0)
|
||||
log_warning("Failed to make \"/\" private mount: %m");
|
||||
|
||||
if (pivot_root(".", "oldroot") < 0) {
|
||||
log_error("pivot failed: %m");
|
||||
|
||||
@@ -56,6 +56,15 @@ int switch_root(const char *new_root) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Work-around for a kernel bug: for some reason the kernel
|
||||
* refuses switching root if any file systems are mounted
|
||||
* MS_SHARED. Hence remount them MS_PRIVATE here as a
|
||||
* work-around.
|
||||
*
|
||||
* https://bugzilla.redhat.com/show_bug.cgi?id=847418 */
|
||||
if (mount(NULL, "/", NULL, MS_REC|MS_PRIVATE, NULL) < 0)
|
||||
log_warning("Failed to make \"/\" private mount: %m");
|
||||
|
||||
NULSTR_FOREACH(i, move_mounts) {
|
||||
char new_mount[PATH_MAX];
|
||||
struct stat sb;
|
||||
|
||||
Reference in New Issue
Block a user