Как я могу “повторно связать” много поврежденных символьных ссылок?

Прежде всего, и я понимаю, что это не было одно из условий от Вашего вопроса, необходимо понять метаданные. Кратко, и украденный от Википедии, метаданные являются данными о данных. То есть те метаданные содержат информацию о части данных. Например, если я владею автомобилем затем, у меня есть ряд информации об автомобиле, но который не является частью самого автомобиля. Информация, такая как регистрационный номер, сделайте, смоделируйте, год изготовления, информации о страховке, и так далее. Вся та информация коллективно упоминается как метаданные. В Linux и файловых системах UNIX метаданные существуют на нескольких уровнях организации, как Вы будете видеть.

Суперблок является по существу метаданными файловой системы и определяет тип файловой системы, размер, состояние и информацию о других структурах метаданных (метаданные метаданных). Суперблок очень очень важен для файловой системы и поэтому хранится в нескольких избыточных копиях для каждой файловой системы. Суперблок является структурой метаданных очень "высокого уровня" для файловой системы. Например, если суперблок раздела, / var, становится поврежденным затем, рассматриваемая файловая система (/var) не может быть смонтирована операционной системой. Обычно в этом случае необходимо работать fsck который автоматически выберет альтернативу, резервную копию суперблока и попытается восстановить файловую систему. Сами резервные копии хранятся в распространении групп блока через файловую систему с первым, сохраненным при 1 смещении блока от запуска раздела. Это важно, если ручное восстановление необходимо. Можно просмотреть информацию о ext2/ext3/ext4 резервных копиях суперблока с командой dumpe2fs /dev/foo | grep -i superblock который полезен в случае ручной попытки восстановления. Давайте предположим, что команда dumpe2fs производит строку Backup superblock at 163840, Group descriptors at 163841-163841. Мы можем использовать эту информацию и дополнительное знание о структуре файловой системы, чтобы попытаться использовать это резервное копирование суперблока: /sbin/fsck.ext3 -b 163840 -B 1024 /dev/foo. Обратите внимание на то, что я принял размер блока 1 024 байтов для этого примера.

inode существует в, или на, файловая система и представляет метаданные о файле. Для ясности все объекты в Linux или системе UNIX являются файлами; фактические файлы, каталоги, устройства, и так далее. Обратите внимание на то, что, среди метаданных, содержавшихся в inode, нет никакого имени файла, поскольку люди думают о них, это будет важно позже. inode содержит по существу информацию о владении (пользователь, группа), режим доступа (чтение, запишите, выполните полномочия), и тип файла.

dentry является связующим звеном, которое содержит inodes и файлы вместе путем связи inode чисел с именами файлов. Dentries также играют роль в кэшировании каталога, которое, идеально, сохраняет наиболее часто используемые файлы под рукой для более быстрого доступа. Обход файловой системы является другим аспектом dentry, поскольку он поддерживает отношения между каталогами и их файлами.

Файл, в дополнение к тому, чтобы быть, о чем обычно думают люди при дарившем слово является действительно просто блоком логически связанных произвольных данных. Сравнительно очень тусклое рассмотрение всей работы, сделанной (выше) для отслеживания их.

Я полностью понимаю, что несколько предложений не дают полное объяснение ни одного из этих понятий, поэтому не стесняйтесь просить дополнительные детали когда и, где необходимо.

55
09.08.2011, 02:04
3 ответа

Нет никакой команды для перенастройки символьной ссылки, все, что можно сделать, удаляют его и создают другой. Принятие Вас имеет утилиты GNU (например, в соответствии с невстроенным Linux или Cygwin), можно использовать -lname основной из find соответствовать символьным ссылкам их целью, и readlink считать содержание ссылки. Непротестированный:

find /mnt/home/someone/something -lname '/home/someone/*' \
     -exec sh -c 'ln -snf "/mnt$(readlink "$0")" "$0"' {} \;

Было бы лучше сделать эти символьные ссылки родственником. Существует удобная небольшая названная утилита symlinks (первоначально Mark Lords, теперь сохраняемым J. Brandt Buckley), существующий во многих дистрибутивах Linux. Прежде чем перемещение, или после восстановления действительных ссылок как выше работало symlinks -c /mnt/home/someone/something преобразовать все абсолютные символьные ссылки в соответствии с указанным каталогом к относительным символьным ссылкам, если они не пересекают границу файловой системы.

56
27.01.2020, 19:33
  • 1
    Без обид, это - большая острота, но строковая замена Bash могла, вероятно, сделать некоторое волшебство w.r.t. изменение пути и будет легче. –  0xC0000022L 08.02.2012, 22:30
  • 2
    @STATUS_ACCESS_DENIED, Как так? Единственная строковая операция должна предварительно ожидать /mnt к пути; Вам не нужна никакая более необычная строковая операция, чем конкатенация. –  Gilles 'SO- stop being evil' 08.02.2012, 22:41
  • 3
    @Gilles: извините, я думал больше о Вашем комментарии с относительными путями. Для точного "перевода" Вашего примера Вы, конечно, правы. –  0xC0000022L 08.02.2012, 22:55

Я знаю, что это не точно, что запрашивает автор, но кажется, что у них уже есть свой ответ, таким образом, я добавляю это для других как я, которые натыкаются на вопрос.

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

например, После изменения имени пользователя, для замены старого имени пользователя новым именем пользователя в цели многих ссылок после того, как было уже сделано перемещение. Создайте сценарий, названный заменой-simlinks, показанной ниже:

#!/bin/bash
link=$1
# grab the target of the old link
target=$(readlink -- "$1")

# replace the first occurrence of oldusername with newusername in the target string
target=${target/oldusername/newusername}

# Test the link creation
echo ln -s -- "$target" "$link"

# If the above echo shows the correct commands are being issued, then uncomment the following lines and run the command again
#rm "$link"
#ln -s "$target" "$link"

и назовите его со следующей командой:

find /home/newusername/ -lname '/home/oldusername/*' -exec ~/bin/replace-simlinks {} \;

Надеюсь эта справка кто-то

править: Спасибо Gilles для запущения на этом сценарии и подсказке об использовании сценария символьных ссылок для создания родственника ссылок.

13
27.01.2020, 19:33
  • 1
    я нахожу это решение лучше, потому что это использует строковую замену, которая помогает в случаях, где необходимо изменить имя папки посреди пути. Решение также довольно легко изменить для выполнения более сложных преобразований при необходимости. –  Gallaecio 30.11.2014, 00:56

Создать /home как символьная ссылка на /mnt/home, и все существующие символьные ссылки будут допустимы снова.

4
27.01.2020, 19:33
  • 1
    Связанный смонтированный часто имеет тенденцию быть менее хрупким, чем символьные ссылки в сценариях, где программы знают о символьных ссылках и действуют по-другому в зависимости от факта... –  0xC0000022L 08.02.2012, 22:27

Теги

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