Как вернуть старый корень после того, как `chroot (2 )`присвоил ему некоторый файловый дескриптор?

Я, в отличие от других ответивших, использую exFAT. Я не слишком серьезный пользователь, но необходимость устанавливать exfat-fuseпри новой установке немного раздражает.

Дополнительным преимуществом NTFS является полная поддержка в лучшем менеджере разделов, gParted. Узнайте больше наhttps://gparted.org/features.php

Вот почему я скоро перейду на NTFS для своего внутреннего общего раздела объемом 150 ГБ, к которому мне нужен доступ из дистрибутивов Linux и Windows 10.

Что касается EXT4, Ext2Fsd не является моим любимым инструментом, и им непросто пользоваться.

Одна проблема с NTFS, однако, fsck. ntfsfixдалеко не так хорош в NTFS, и, в конце концов, вы получаете головную боль с платным проприетарным программным обеспечением в Windows

1
08.03.2021, 17:31
1 ответ

Я вижу три проблемы:

  • вы используете chdir(2)в файловом дескрипторе. Правильный системный вызов должен бытьfchdir(2).

    Хотя вполне возможно, что Python достаточно умен, чтобы использовать вместо него fchdir().

  • После использования fchdir(2)вы должны chroot(2)снова chroot(2), чтобы ваш текущий каталог снова находился внутри "известного пространства" текущего корневого дерева.

  • Вы не можете отличить результат с getcwd(). В обоих случаях вы получите /, даже если это не одно и то же /. Например, вы можете отобразить номер инода (, предполагая, что это одна и та же файловая система, поэтому сравнение означает )или что-то еще, что может отличаться.

Здесь, с указанными выше изменениями, из debian bullseye/sid я выполняю chroot внутри корня контейнера LXC buster. Я отображаю содержимое /etc/debian_versionдважды:

import os

print(f'cwd: {os.getcwd()}')

fd = os.open('/', os.R_OK, os.X_OK)

os.chroot('.')
os.chdir('/')

print(f'cwd: {os.getcwd()}')

debfd=open("/etc/debian_version","r")
print(debfd.read())
debfd.close()

os.fchdir(fd)
os.chroot('.')

print(f'cwd: {os.getcwd()}')

debfd=open("/etc/debian_version","r")
print(debfd.read())
debfd.close()

Результат:

root@glasswalker:/var/lib/lxc/buster-amd64/rootfs# /tmp/chrootback.py 
cwd: /var/lib/lxc/buster-amd64/rootfs
cwd: /
10.8

cwd: /
bullseye/sid

Мелочи

Можно злоупотреблять «неизвестным пространством», чтобы избежатьchroot()без сохранения дескриптора файла. Это описано на этой странице от 2005 года :

.

Как вырваться из chroot ()тюрьмы

За исключением двух проблем в данном коде (, нужно добавить #include <stdlib.h>и исправить опечатки в двойных кавычках в fprintf()в строке 62 ), он по-прежнему отлично работает на сегодняшнем Debian (и наверняка несколько *никсов ).

Насколько я понимаю,похоже, что, находясь в «неизвестном пространстве» (, то есть :, ситуация, ведущая к ошибке OP, когда cwd находится за пределами текущего корня ), можно затем вслепую вернуться к фактический корень .

1
18.03.2021, 22:26

Теги

Похожие вопросы