Ссылка на 2 существующих файла

Да, Linux может делать фрагментацию, но, как и в случае с входящими пакетами, ядро старается не делать фрагментацию в первую очередь (например, с помощью path MTU discovery перед отправкой и получением данных).

Вы можете увидеть, например, https://github.com/torvalds/linux/blob/master/net/ipv4/ip_output.c ip_do_fragment

3
11.06.2017, 11:07
5 ответов

В Linux в качестве альтернативы привязке монтирования вы также можете использовать оверлейное монтирование, чтобы временно связать один файл с другим. Преимущество наложения заключается в том, что вы можете изменить наложение, не требуя привилегий root, в отличие от привязки монтирования, для которой требуются привилегии root для теневого и обратного копирования файлов.

Демонстрация:

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

$ mkdir one two work mpnt
$ sudo mount -t overlay none -olowerdir=one,upperdir=two,workdir=work mpnt
$ echo "hello world" > one/abcd
$ echo "another" > one/xyz

Мы создали тестовые файлы в папке один выше, эти файлы также видны в точке монтирования mpnt.

$ ls -lh mpnt
total 8.0K
-rw-r--r-- 1 lieryan lieryan 12 Jun 11 03:33 abcd
-rw-r--r-- 1 lieryan lieryan  8 Jun 11 03:33 xyz

Давайте изменим файлы в mpnt:

$ ln -sf abcd mpnt/xyz 

Мы изменили mpnt/xyz выше, чтобы он был символической ссылкой, но overlayfs перенаправляет все записи в mpnt в верхний каталог, поэтому созданная нами символическая ссылка фактически записывается в two, видим символическую ссылку в папке two, а также mpnt:

$ ls -lh two
total 0
lrwxrwxrwx 1 lieryan lieryan 4 Jun 11 03:34 xyz -> abcd
$ ls -lh mpnt
total 4.0K
-rw-r--r-- 1 lieryan lieryan 12 Jun 11 03:33 abcd
lrwxrwxrwx 1 lieryan lieryan  4 Jun 11 03:34 xyz -> abcd

Симлинк работает как положено при использовании из mpnt:

$ cat mpnt/xyz
hello world

Если если мы что-то удалим из mpnt, overlayfs также перенаправит запись в верхний каталог:

$ rm mpnt/xyz

Однако в этом случае overlayfs на самом деле создает файл специального символьного устройства (обратите внимание на атрибут c), называемый файлом белого цвета. Когда overlayfs видит файл этого типа в верхнем каталоге, overlayfs делает вид, что файл не существует в mpnt:

$ ls -lh mpnt 
total 4.0K
-rw-r--r-- 1 lieryan lieryan 12 Jun 11 03:33 abcd
$ ls -lh two
total 4.0K
c--------- 1 lieryan lieryan 12 Jun 11 03:33 xyz

Мы можем удалить файл специальных символов из верхнего каталога, чтобы восстановить xyz из нижнего каталога:

$ rm two/xyz  # delete the "whiteout" file
rm: remove write-protected character special file 'two/xyz'? y

] Теперь xyz снова виден в mpnt и имеет то же содержимое файла, что и one/xyz.

$ ls -lh mpnt 
total 8.0K
-rw-r--r-- 1 lieryan lieryan 12 Jun 11 03:33 abcd
-rw-r--r-- 1 lieryan lieryan  8 Jun 11 03:33 xyz
$ cat mpnt/xyz
another
2
27.01.2020, 21:07

как abcd, так и xyz должны отображать свое исходное содержимое после того, как они будут разъединены

Тогда вам нужна не ссылка. Если два файла связаны, то они имеют одинаковое содержимое. Точнее, две записи каталога связаны, если они указывают на один и тот же файл. Удаление файла не оставляет двух файлов: удаление записи каталога означает удаление этой записи каталога (системный вызов для удаления файла даже называется unlink).

Нет общей функции дублирования файла другим файлом.Вы можете использовать файловую систему bindfs для дублирования каталога другим каталогом. Чтобы затенить каталог xyz каталогом abcd, запустите

bindfs -n -o nonempty xyz abcd

. После этого предыдущее содержимое abcd будет скрыто, а доступ к abcd каким-либо образом получает доступ к xyz. Bindfs — это FUSE файловая система, которая создает bind-монтирование. Чтобы отменить затенение и увидеть исходное содержимое abcd, размонтируйте файловую систему:

fusermount -u abcd

Обратите внимание, что монтирование файловой системы не меняет того, что хранится на диске. Теневое копирование ограничено вашей машиной и длится максимум до следующей перезагрузки. Если вы хотите, чтобы теневое копирование продолжалось, вам нужно добавить это монтирование в список вещей, которые нужно монтировать во время загрузки (/etc/fstab). Но если вы хотите, чтобы теневое копирование продолжалось, то монтирование, вероятно, не лучший подход: вместо этого просто переместите файл и создайте символическую ссылку

mv abcd abcd.orig
ln -s xyz abcd

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

rm abcd
mv abcd.orig abcd
2
27.01.2020, 21:07

Насколько я вас понимаю, вы хотите связать два файла, но не хотите потерять данные в обоих файлах. Вы пометили свой пост Solaris, поэтому я предполагаю, что вы используете эту операционную систему. Поэтому ссылки на функциональные возможности других операционных систем не кажутся полезными. Этот ответ предполагает, что вы используете один или несколько наборов данных zfs для данных.

Вы можете просто сделать zfs снимок вашей файловой системы, куда вы хотите поместить ссылку вместо файла, сделать ln -sf abcd xyz, сделать с ним все, что хотите, а затем откатиться

root@solaris:/rpool# zfs create rpool/filesystem1
root@solaris:/rpool# mkfile 1k /rpool/filesystem1/file1
root@solaris:/rpool# mkfile 1k /rpool/filesystem1/file2
root@solaris:/rpool# ls -l /rpool/filesystem1
total 2
-rw-------   1 root     root        1024 Jun  8 20:33 file1 .  
-rw-------   1 root     root        1024 Jun  8 20:33 file2
root@solaris:/rpool# zfs snapshot rpool/filesystem1@withtwofiles
root@solaris:/rpool# rm /rpool/filesystem1/file2
root@solaris:/rpool# ln -s /rpool/filesystem1/file1 /rpool/filesystem1/file1
root@solaris:/rpool# ls -l /rpool/filesystem1
total 4
-rw-------   1 root     root        1024 Jun  8 20:33 file1
lrwxrwxrwx   1 root     root          24 Jun  8 20:33 file2 -> /rpool/filesystem1/file1
root@solaris:/rpool# zfs rollback rpool/filesystem1@withtwofiles
root@solaris:/rpool# ls -l /rpool/filesystem1
total 6
-rw-------   1 root     root        1024 Jun  8 20:33 file1
-rw-------   1 root     root        1024 Jun  8 20:33 file2
root@solaris:/rpool# 

Вместо того, чтобы отвязать вас просто откатите файловую систему по ссылке

1
27.01.2020, 21:07

Эта команда:

ln -sf abcd xyz

не перезаписывает содержимое xyzсодержимым abcd, как вы думаете. Символическая ссылка не является файлом, поэтому она не содержит никакого содержимого.

Если вы хотите временно связать xyzс abcd, не теряя при этом его содержимого, вам нужно каким-то образом сохранить содержимое.

  • Вы можете скопировать содержимое во временный файл. Думаю, для этого не нужна иллюстрация.
  • Вы также можете использовать память, то есть хранить содержимое в переменной.
  • Вы можете использовать жесткую ссылку.

Теперь я продемонстрирую последний. У вас есть abcdи xyz, как объяснено в вашем вопросе.

  1. Жесткая -связь xyzс zyx, чтобы содержимое сохранялось в zyx, позволяя вам управлять xyz.

    $ ln xyz zyx
    

    На данный момент xyzи zyxявляются двумя жесткими ссылками inode , содержащими данные xyz, как описано в вашем вопросе. Вы можете проверить это с помощью:

    $ cat zyx
    xyz
    
  2. Теперь, когда zyxна месте, вы можете принудительно связать xyzс abcd.

    $ ln -sf abcd xyz
    

    zyxпо-прежнему сохраняет символы xyz. Вы можете проверить это с помощью:

    $ cat zyx
    xyz
    

    В то время как xyzтеперь является программным -, связанным с abcd.Для проверки запустите это:

    $ cat xyz
    abcd
    
  3. Если вы хотите восстановить начальное состояние, повторно свяжите xyzс исходным содержимым. То есть перелинковать его с исходным индексным узлом.

    $ ln -f zyx xyz
    

    Чтобы проверить, работает ли:

    $ cat xyz
    xyz
    

    И теперь вы можете отвязать дополнительную жесткую -связь zyxс:

    $ rm zyx
    

    Или сохраните его для будущих операций. В любом случае xyzпо-прежнему содержит то, что было в начале.

    $ rm zyx
    $ cat xyz
    xyz
    
6
27.01.2020, 21:07

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

Нужная вам функциональность не является родной для Unix (связывания файлов, чтобы они отображались как один и чтобы их можно было разъединить позже ). Linux , тем не менее, (несколько лет назад )реализовал нечто, называемое монтированием привязки, позволяющее монтировать файл или каталог поверх других (файлов поверх файлов и каталогов на начало каталогов ).

Предлагаемое решение:Если вы хотите, чтобы файл временно выглядел как другой, используйте привязку монтирования(mount -B file1 file2). Он установит file1поверх file2. После размонтирования оба файла снова будут отображаться в том виде, в каком они существовали изначально.

# echo A >A

# echo B >B

# mount -B A B

# cat A
A

# cat B
A

# umount B

# cat A
A

# cat B
B

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

17
27.01.2020, 21:07

Теги

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