LINUX.ORG.RU

Как отработает rename перемещение каталогов с разных устройств?

 ,


0

2

В простейшем случае все понятно. Если старое и новое имя файла располагаются на разных устройствах, операция не будет выполнена и будет выдан код ошибки EXDEV. А если перемещается каталог? И при этом новое и старое путевые имена располагаются на одном устройстве, но некоторые ветки старого путевого имени каталога располагаются на другом устройстве. Ну, скажем для примера, стал я перемещать каталог media из /var/run в /root. /root и /var/run/media/user1/usbflash принадлежат одному устройству, а все что далее за ubflash - уже другому. Ядро сначала «пройдет» по всему дереву и сразу выдаст ошибку? Или возможен некий вариант с менее предсказуемым результатом?

Ответ на: комментарий от anonymous

Ну не ядро, а собственно системный вызов rename.

zloy_starper ★★★
() автор топика

Это тебе нужно man readdir и далее по ссылкам. Просто rename такого не умеет, это тебе не mv из coreutils.

emulek
()

В данном случае просто путь поменяется. Рекурсивно обходить никто не будет. Загугли, что вообще такое «каталог» в онтопике.

emulek
()
Ответ на: комментарий от emulek

Это тебе нужно man readdir и далее по ссылкам.

Это не ответ на вопрос. Ну да я могу сам обойти дерево каталогов и проверить все ветки на предмет нахождения их в одной ФС. Но мне уже самому стало интересно, что будет в указанной ситуации.

zloy_starper ★★★
() автор топика
Ответ на: комментарий от emulek

Те есть, если взять приведенный мной пример, то /media со всеми подкаталогами на текущий момент переместится в /root. Но когда отмонтируются все флэшки, то в /root останутся «огрызки» типа media/user1/usbflash без содержимого этого usbflash? Так что ли?

zloy_starper ★★★
() автор топика

Переместится всё, включая точки монтирования. Например:

# mount | grep /mnt
/dev/sda1 on /mnt/build type reiser4 (rw,noatime,atom_max_size=0x7ab84,atom_max_age=0x927c0,atom_min_size=0x100,atom_max_flushers=0x1,cbk_cache_slots=0x10)
/etc/autofs/auto.net on /mnt/network type autofs (rw,relatime,fd=6,pgrp=672,timeout=300,minproto=5,maxproto=5,indirect)

# mv /mnt /mnt2

# mount | grep /mnt2
/dev/sda1 on /mnt2/build type reiser4 (rw,noatime,atom_max_size=0x7ab84,atom_max_age=0x927c0,atom_min_size=0x100,atom_max_flushers=0x1,cbk_cache_slots=0x10)
/etc/autofs/auto.net on /mnt2/network type autofs (rw,relatime,fd=6,pgrp=672,timeout=300,minproto=5,maxproto=5,indirect)

# mv /mnt2 /mnt

# mount | grep /mnt
/dev/sda1 on /mnt/build type reiser4 (rw,noatime,atom_max_size=0x7ab84,atom_max_age=0x927c0,atom_min_size=0x100,atom_max_flushers=0x1,cbk_cache_slots=0x10)
/etc/autofs/auto.net on /mnt/network type autofs (rw,relatime,fd=6,pgrp=672,timeout=300,minproto=5,maxproto=5,indirect)

При этом каждый вызов mv(1) соответствует строго одному вызову rename(2) (проверил strace-ом).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от zloy_starper

Те есть, если взять приведенный мной пример, то /media со всеми подкаталогами на текущий момент переместится в /root. Но когда отмонтируются все флэшки, то в /root останутся «огрызки» типа media/user1/usbflash без содержимого этого usbflash? Так что ли?

попробуй.

на самом деле, /media/ это вовсе не «корзинка с файлами», это список ссылок. Т.е. никаких файлов там нет, есть только ссылки. Ты можешь перемещать СПИСОК куда угодно, сами файлы и каталоги остаются на своих местах.

Представь: есть бумажка, на которой написано «носки лежат на третьей полке в шкафу». Если ты бумажку перенесёшь к другу домой, твои носки тоже перенесуться к другу в шкаф? Нет. Если это хардлинк или mount --bind. Если это симлинк, то «перенесуться», и симлинк будет битым(потому что симлинк — простая текстовая строка с указанием пути).

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.