mv -Z
применяет контекст selinux по умолчанию. Отличается ли он от всех других вызовов mv
и работает со всеми файлами в перемещенном каталоге по отдельности?
Да.
$ mkdir a
$ touch a/b
$ ls -Z -d a a/b
unconfined_u:object_r:user_home_t:s0 a
unconfined_u:object_r:user_home_t:s0 a/b
$ strace -f mv -Z a ~/.local/share/Trash/files
...
open("/home/alan/.local/share/Trash/files/a/b", O_RDONLY|O_NOFOLLOW) = 3
...
fgetxattr(3, "security.selinux", "unconfined_u:object_r:user_home_t:s0", 255) = 37
fsetxattr(3, "security.selinux", "unconfined_u:object_r:data_home_t:s0", 37, 0) = 0
...
$ cd ~/.local/share/Trash/files
$ ls -Zd a a/b
unconfined_u:object_r:data_home_t:s0 a
unconfined_u:object_r:data_home_t:s0 a/b
Это также привело к тому, что при перемещении каталога внутри одной файловой системы произойдет сбой. Т.е. из-за нехватки места на диске при смене меток. Влияние этого смягчается, поскольку изменение метки происходит на втором этапе. Первоначальная операция перемещения по-прежнему заключается в однократном атомарном переименовании
. Это означает, что метки будут несовместимы, но файлы будут согласованы во всем остальном. Как только освободится место, исправить метки должно быть просто.