Правила для действий add
выполняются во время запуска системы, если устройство присутствует. Это делается путем выполнения udevadm info --action=add
на системе SysVinit, и внутренне на системе Upstart или Systemd. Однако это происходит очень рано в процессе загрузки, в то время, когда корневая файловая система все еще монтируется только для чтения, а файловые системы из /etc/fstab
еще не смонтированы. Я не уверен, что /run
уже доступен в этот момент. Это может быть слишком рано для того, что нужно сделать вашему сценарию.
Быстрый и грязный, но портативный способ запустить ваш скрипт во время запуска - запустить его из /etc/rc.local
, при условии, что устройство присутствует.
if [ -e /dev/disk/by-id/… ]; then
/var/scripts/my-script.sh
fi
Обратите внимание, что если устройство будет вставлено во время запуска, возможно возникновение состояния гонки: скрипт будет выполнен, как только устройство будет обнаружено, а затем снова из /etc/rc.local
.
Более чистым решением было бы определить блок systemd и объявить зависимости, которые вам нужны, в вашем сценарии. Вам все равно нужно остерегаться потенциального состояния гонки.
Обратите внимание, что rsync -a
также не сохраняет ACL, расширенные атрибуты, жесткие ссылки (, как уже отмечалось ), разреженность.
С GNU cp
по крайней мере
cp -a
Сохраняет все, что делает больше, чем rsync
. Более близким эквивалентом rsync будет
rsync -aAHX
Я не думаю, что rsync может воспроизвести разреженность, но вы можете использовать --sparse
, чтобы последовательности NUL (, независимо от того, выделены они или дыры ), превращались в дыры в месте назначения.
Обратите внимание, что (не -стандартная)-a
опция cp
подразумевает -r
.-l
(еще один нестандартный -вариант ), при условии, что GNU cp
не делает то, что вам нужно. Он делает жесткие ссылки вместо копирования файлов.