mirror of
https://github.com/topjohnwu/Magisk
synced 2025-09-06 02:25:12 +00:00
Refactor magic mount to support overlayfs
Previously, magic mount creates its own mirror devices and mount mirror mount points. With these mirror mount points, magic mount can get the original files and directory trees. However, some devices use overlayfs to modify some mount points, and thus after magic mount, the overlayed files are missing because the mirror mount points do not contain the overlayed files. To address this issue and make magic mount more compatible, this patch refactors how magic mount works. The new workflows are as follows: 1. make MAGISKTMP a private mount point so that we can create the private mount points there 2. for mirror mount points, we instead of creating our own mirror devices and mount the mirror mount points, we "copy" the original mount points by recursively mounting / 3. to prevent magic mount affecting the mirror mount points, we recursively set the mirror mount points private 4. to trace the mount points we created for reverting mounts, we again make the mirror mount points shared, and by this way we create a new peer group for each mirror mount points 5. as for tracing the newly created tmpfs mount point by magic mount, we create a dedicated tmpfs mount point for them, namely worker mount point, and obviously, it is shared as in a newly created peer group for tracing 6. when reverting mount points by magic mount, we can then trace the peer group id and unmount the mount points whose peer group ids are created by us The advantages are as follows: 1. it is more compatible, (e.g., with overlayfs, fix #2359) 2. it can mount more partitions for which previous implementation cannot create mirror mount points (fix #3338)
This commit is contained in:
@@ -32,7 +32,7 @@ class root_node;
|
||||
|
||||
template<class T> static bool isa(node_entry *node);
|
||||
static int bind_mount(const char *reason, const char *from, const char *to) {
|
||||
int ret = xmount(from, to, nullptr, MS_BIND, nullptr);
|
||||
int ret = xmount(from, to, nullptr, MS_BIND | MS_REC, nullptr);
|
||||
if (ret == 0)
|
||||
VLOGD(reason, from, to);
|
||||
return ret;
|
||||
@@ -623,7 +623,9 @@ void magic_mount() {
|
||||
|
||||
if (!system->is_empty()) {
|
||||
// Handle special read-only partitions
|
||||
for (const char *part : { "/vendor", "/product", "/system_ext" }) {
|
||||
for (const char *part : { "/vendor", "/vendor_dlkm","/product",
|
||||
"/system_ext", "/system_dlkm",
|
||||
"/odm", "/odm_dlkm" }) {
|
||||
struct stat st{};
|
||||
if (lstat(part, &st) == 0 && S_ISDIR(st.st_mode)) {
|
||||
if (auto old = system->extract(part + 1)) {
|
||||
@@ -669,15 +671,6 @@ static void prepare_modules() {
|
||||
close(mfd);
|
||||
rm_rf(MODULEUPGRADE);
|
||||
}
|
||||
|
||||
// Setup module mount (workaround nosuid selabel issue)
|
||||
auto src = MAGISKTMP + "/" MIRRDIR MODULEROOT;
|
||||
auto dest = MAGISKTMP + "/" MODULEMNT;
|
||||
xmkdir(dest.data(), 0755);
|
||||
bind_mount("mod_mnt", src.data(), dest.data());
|
||||
|
||||
restorecon();
|
||||
chmod(SECURE_DIR, 0700);
|
||||
}
|
||||
|
||||
template<typename Func>
|
||||
|
Reference in New Issue
Block a user