Проблема с изменением разрешений с помощью fakeroot

Как вы сказали, vm_area_structсообщает, в какой области памяти произошла ошибка, и в этой структуре содержатся флаги защиты. Функция __do_page_faultвызывает find_vmaдля получения указателя на vm_area_struct. Затем эта структура передается через handle_pte_faultвплоть доdo_swap_page(в параметре vm_fault *vmf), который вызывает mk_pteс битами защиты в качестве параметра.

Другая ваша проблема :, если страница COW выгружена и процесс хочет записать на нее. В этом случае вы получаете ошибку страницы, потому что страница заменена. Обработчик позаботится о ситуации, и процесс приостановится до тех пор, пока страница не будет прочитана с диска. Когда процесс планируется запустить снова, он повторно -выполняет ошибочную инструкцию записи и БАХ! — получаем новую ошибку, на этот раз так как страница читается -только из-за копии -на запись -.

3
29.08.2019, 13:27
2 ответа

Fakeroot не выполняет все изменения метаданных файла, в том-то и дело :, что он только притворяется программой, которая работает под ним. Fakeroot не вносит изменений, которые он не может сделать, например, меняет владельца. Он также не вносит изменений, которые могут привести к сбоям в работе. Например, следующий код успешно выполняется при запуске от имени пользователя root, поскольку пользователь root всегда может открывать файлы независимо от разрешений :

.
chmod 111 a.txt
cp a.txt b.txt

Но при запуске от имени не -пользователя root, cpзавершается ошибкой, поскольку не может прочитать a.txt. Чтобы этого избежать, chmodпод fakeroot не удаляет разрешения у пользователя.

Fakeroot делает вид, что вносит изменения в запущенную программу.

$ stat -c "Before: %A" a.txt; fakeroot sh -c 'chmod 111 a.txt; stat -c "In fakeroot: %A" a.txt'; stat -c "After: %A" a.txt
Before: -rwx--x--x
In fakeroot: ---x--x--x
After: -rwx--x--x

Вообще говоря, изменения метаданных файла, сделанные внутри fakeroot, не гарантируют, что они сохранятся при вызове fakeroot. В этом-то и дело. Сделайте один вызов fakeroot, который выполняет как изменения метаданных, так и любые операции (, такие как упаковка архива ), которые вы хотите выполнить с измененными метаданными.

5
27.01.2020, 21:17

Это особенность fakeroot, необходимая для реализации корневой -функции маскировки; как задокументировано в комментарии к коду:

if a file is unwritable, then root can still write to it (no matter who owns the file). If we are fakeroot, the only way to fake this is to always make the file writable, readable etc for the real user (who started fakeroot). Also holds for the exec bit of directories.

Таким образом, fakerootвсегда устанавливает u=rwxи записывает запрошенные реальные разрешения в своем внутреннем состоянии (, которое вы можете сохранить в файл с опцией -s; результирующий файл удобочитаем -для человека ). На самом деле

chmod 155 a.txt
fakeroot chmod 111 a.txt

приведет к созданию файла с разрешениями 711!

2
27.01.2020, 21:17

Теги

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