Как можно скопировать файловую систему так, как она есть?

10

У меня есть файловая система для устройства, которое я программирую, для которого я хотел бы сделать точную копию. В идеале я хотел бы, чтобы эта копия была идентична папке, из которой она была скопирована. Я пытался использовать cp -r cp -aи rsync -azvPпопытаться достичь этого. Каждый из них, тем не менее, приводит к папке с другим размером (используя du -s) и, в конечном счете, даже если на моем устройстве не будет исходной папки, он не будет скопирован с той, которую я скопировал.

  • Что исключается из-за того, что команды, которые я использовал, не учитываются?
  • Можно ли сохранить все идентичным при копировании файловой системы / папки? Если так, как бы я поступил так?

PS Я опубликовал аналогичные вопросы на StackOverflow, но быстро понял, что задал его не на тот обмен


Изменить: Это может быть не полезно, но независимо от того, какой метод я использую скопированный каталог, всегда вызывает рассматриваемый компьютер к панике ядра со следующим выводом.

VFS: невозможно смонтировать root fs через NFS, попробуйте дискету. VFS: Невозможно открыть корневое устройство «nfs» или unknown-block (2,0). Добавьте правильный параметр загрузки «root =»; Вот доступные разделы: 1f00
64 mtdblock0 (драйвер?) 1f02 64 mtdblock2 (драйвер?) 1f04 2432 mtdblock4 (драйвер?) 1f05 128 mtdblock5 (драйвер?) 1f06 4352 mtdblock6 (драйвер?) 1f07 204928 mtdblock7 (драйвер?) 1f08 50304 mtdblock8 (драйвер?) 0800
8388608 sda драйвер: sd Паника ядра - не синхронизируется: VFS: невозможно смонтировать root fs на unknown-block (2,0)

TopGunCoder
источник
5
Разница в duвыходных данных не является показателем того, что содержимое не совпадает.
Игнасио Васкес-Абрамс
Мое устройство не загружается с использованием скопированного каталога. Я принимаю это как индикатор и задаюсь вопросом, что именно я делаю неправильно, что скопированная файловая система не обрабатывается одинаково
TopGunCoder
Вы должны точно указать, что вы пытаетесь сделать. rsync -aили cp -aделать точные копии каталогов, но вы пытаетесь скопировать загрузочный диск, есть еще несколько вещей, которые вам нужно сделать, чтобы завершить это.
forcefsck
1
Что за устройство? Что за файловая система? Что за носитель?
Михас
1
Для меня это звучит так, будто вы хотите использовать что-то вроде dd if=/some/location of=/some/other/location bs=4Mчтения и записи данных как есть.

Ответы:

12

Я обычно использую одну из следующих альтернатив:

  • rsync -aHAX(добавьте v для многословия) гарантирует, что при копировании вы сохраните любую структуру ссылок и x-attrs в целевой папке. Не забывайте, aозначает архив и сохраняет время, права собственности и разрешения уже.
  • Простой tar cvf(не сжимайте, чтобы сэкономить время, просто смените их) - вот что я использую, если первый не соответствует тому, что мне нужно по какой-либо причине, и у меня нет времени, но я всегда пробую первый.

Чтобы проверить, что все прошло как надо, вы можете запустить diff -r <folder1> <folder2>потом, если хотите.

bayindirh
источник
1
Это сделал трюк! Мне также просто нужно было убедиться, что устройство, которое я загружал (через NFS), было выключено и не могло получить доступ к файловой системе во время копирования.
TopGunCoder
1
Ах, клиенты NFS с доступом для чтения и записи иногда могут оживить ситуацию!
Bayindirh
3
Это не скопирует разреженные файлы без -S. Это может быть частью du -sразницы. Я привык rsync -axXSAHкопировать все заново. -X будет копировать только внутри файловой системы, а не файлы, смонтированные из другой файловой системы.
Виктор Ротман
Как насчет --numeric-id?
0x2207
@ 0x2207 Это полезно только в том случае, если у пользователя разные числовые идентификаторы в разных системах (например, пользователь hbayindir находится в обеих системах и имеет UID 1000 в источнике и 1536 в месте назначения). Мне никогда не приходилось использовать эту опцию, так как мне нужно сохранить настоящего владельца, а не UID и GID. Если у пользователя нет ни источника, ни пункта назначения, в качестве запасного варианта используется числовой идентификатор.
17
4

Читая ваш ответ в комментариях, вы можете попытаться скопировать корневую папку («Мое устройство не загружается с использованием скопированного каталога»). В этом случае вам нужно сделать несколько вещей.

$ cd /
$ mkdir backups

$ tar -cvpf /backups/fullbackup.tar --directory=/ --exclude=proc --exclude=sys \
     --exclude=dev/pts --exclude=backups .

После того, как вы скопировали корневую папку в новую систему, вам нужно будет обновить grub перед ее загрузкой.

$ grub-install --recheck /dev/sdX (Where X is the partition number)
$ update-grub
Jeight
источник
+1 Я думаю, что ключ в сообщении о неудачной загрузке в OP, и это обращается к нему.
MSW
Как оказалось, что-то очень похожее на это сработало. Я имел дело с файловой системой (FS) на моем компьютере, которую мне нужно было скопировать. Все, что потребовалось, было для меня tar cтогда tar x. Кикер должен был убедиться, что моя машина была выключена, так как я загружал ее, используя FS, которая была локальной для моей машины, но удаленной от устройства, с которого я загружался (я
запускал
grub-install: error: embedding is not possible, but this is required for cross-disk install.
Виталий Зданевич
2

Вы можете попробовать FSArchiver . Это преемник подобного образа, который сейчас не поддерживается. В прошлом я использовал и partimage, и FSArchiver, и они оба работали хорошо. Насколько я знаю, они оба делают копии файловой системы, максимально близкой к оригинальной. Я думаю, что FSArchiver немного мощнее, чем пристрастие. Например, он работает с ext4, а partimage - нет. См. Таблицу сравнения FSArchiver / Partimage .

Фахим Митха
источник
2

Использование duдля сравнения папок по своей сути проблематично. Если вы действительно хотите сравнить две директории, основываясь исключительно на их размерах, используйте duследующее:

$ du -sh --apparent-size <dir>

Этот переключатель сообщит точный размер каталогов в зависимости от объема дискового пространства, которое он использует при хранении на физическом носителе. Диски организованы в блоки, а файлы записаны в эти блоки. Если файлу требуется только БЛОК + 1 место, он будет занимать 2 БЛОКА места, и это duобычно сообщается. Помните, что название инструмента - использование диска!

Учитывая, что вы имеете дело с тем, что звучит как целая файловая система, я был бы склонен использовать ddдля создания точной копии раздела, на котором находится каталог

$ dd if=/dev/sda1 of=/srv/boot.img

Затем вы можете использовать это boot.imgдля восстановления раздела, где вы хотите.

$ dd if=/srv/boot.img of=/dev/sdb1
SLM
источник
du также сообщит о размере на диске (поэтому разреженные файлы и жесткие ссылки занимают меньше места). Например, du -sh /varдает 21G, но du -sh --apparent-size /varдает 209G в моей системе.
Виктор Ротман
0

Это немного зависит от того, что вы подразумеваете под «идентичным».

  • Просто делать rsyncбыло бы хорошо большую часть времени. Иногда вы хотите использовать, tarчтобы упаковать все в файл и извлечь его в другом месте.
  • Если вам нужен клон всей файловой системы, вы можете использовать ее ddдля копирования всей файловой системы.

Если у вас есть какие-либо способы отладки вашего устройства, попробуйте выяснить, в чем именно заключается проблема, почему оно в настоящее время не работает.

Михась
источник