Я, в отличие от других ответивших, использую exFAT. Я не слишком серьезный пользователь, но необходимость устанавливать exfat-fuse
при новой установке немного раздражает.
Дополнительным преимуществом NTFS является полная поддержка в лучшем менеджере разделов, gParted. Узнайте больше наhttps://gparted.org/features.php
Вот почему я скоро перейду на NTFS для своего внутреннего общего раздела объемом 150 ГБ, к которому мне нужен доступ из дистрибутивов Linux и Windows 10.
Что касается EXT4, Ext2Fsd не является моим любимым инструментом, и им непросто пользоваться.
Одна проблема с NTFS, однако, fsck
. ntfsfix
далеко не так хорош в NTFS, и, в конце концов, вы получаете головную боль с платным проприетарным программным обеспечением в Windows
Я вижу три проблемы:
вы используете 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 находится за пределами текущего корня ), можно затем вслепую вернуться к фактический корень .