只是想知道共享内存的关键是文件名还是 inode。
我有一个名为 .last 的文件,它只是一个指向名为 YYYYMMDDHHMMSS 的文件的硬链接。
一个目录看起来像这样:
20110101143000
.last
Run Code Online (Sandbox Code Playgroud)
.last 只是到 20110101143000 的硬链接。
一段时间后,创建了一个新文件
20110101143000
20110622083000
.last
Run Code Online (Sandbox Code Playgroud)
然后我们删除 .last,并重新创建它以引用新文件。
我们的软件在这些更新期间持续运行,使用 MAP_SHARED 映射 .last 文件。处理完文件后,软件可能会将其缓存几分钟,而不是取消映射。在一台物理服务器上,有 12-24 个软件实例同时运行。不同的实例通常会同时映射同一个文件。我的问题是:
linux 是使用文件名来锁定共享内存,还是使用 inode?
鉴于这种情况:
如果 linux 使用 inode,那么 proc A 和 B 将看到映射到不同文件的不同内存块,这就是我们想要的。如果 linux 使用文件名,那么 A 和 B 都会看到映射到新文件的相同内存块。B 没问题,但是当分片块中的内存发生变化时,A 崩溃了。
有谁知道它实际上是如何工作的?我要测试,但如果结果是基于名称的,除非有人知道诀窍,否则我就完蛋了。
谢谢!
我的 bash 脚本将一些文件复制到一些多个目录。
为了节省空间并最大限度地提高速度,我更愿意制作硬链接而不是副本,因为无论如何,所有副本都需要在其生命周期内保持相同。
不过,该脚本在不同的计算机上运行,并且可能存在目标目录与源目录存在于不同卷中的情况。在这种情况下,我无法创建硬链接,只需复制文件。
如何检查源目录和目标目录是否存在于同一卷中,以便我根据它进行硬链接或复制?
我正在尝试使用硬链接复制文件,其中文件存储为Django FileField.我想使用硬链接来节省空间和复制时间(预计不会对原始文件或副本进行任何更改).但是,当我尝试从下面的代码段调用new_file.save()时,我遇到了一些奇怪的错误.
AttributeError: 'file' object has no attribute '_committed'
Run Code Online (Sandbox Code Playgroud)
我的想法是,在制作硬链接后,我可以打开链接文件并将其存储到Django新的File实例的FileFile中.我错过了这里的一步还是什么?
models.py
class File(models.Model):
stored_file = models.FileField()
Run Code Online (Sandbox Code Playgroud)
elsewhere.py
import os
original_file = File.objects.get(id=1)
original_file_path = original_file.file.path
new_file = File()
new_file_path = '/path/to/new/file'
os.makedirs(os.path.realpath(os.path.dirname(new_file_path)))
os.link(original_file_path, new_file_path)
new_file.stored_file = file(new_file_path)
new_file.save()
Run Code Online (Sandbox Code Playgroud) 给定一个目录,如何查找其中不是硬链接文件的所有文件(以及任何子目录)?或者更具体地说,那些不是具有多个引用的硬链接文件?
基本上我想扫描一个文件夹并返回该目录中的唯一文件列表,包括目录和符号链接(而不是它们的目标).如果可能的话,最好还忽略支持它们的文件系统上的硬链接目录(例如HFS +).
ln -s /dir1/file1 /dir2/file1
Run Code Online (Sandbox Code Playgroud)
我想在目标 dir1 中创建一个软链接,其文件名与 dir2 中的源文件名相同 如果不在目标路径中键入 file1 名称,如何完成此操作
我有数千个自己的安装程序,需要一个关键的dll文件进行卸载步骤,这个dll文件大小约为2 mb然后避免不必要的磁盘空间(2mb*100安装程序)我想将文件存储一次{cf}
然后为之创建一个硬链接需要该文件的下一个安装程序.
我可以在Inno Setup中创建硬链接而无需使用外部应用程序,例如mklink.exe用法?
这是我所拥有的一个简短示例,我的所有安装程序都遵循相同的"结构":
[Files]
; VCL Styles
Source: {tmp}\uninstall.vsf; DestDir: {app}; Flags: ignoreversion
Source: {tmp}\uninstall.dll; DestDir: {app}; Flags: ignoreversion uninsneveruninstall
; Temp files
Source: {tmp}\*; DestDir: {tmp}; Excludes: uninstall.dll, uninstall.vsf; Flags: recursesubdirs createallsubdirs ignoreversion
; Program
Source: {app}\*; DestDir: {app}; Flags: recursesubdirs createallsubdirs ignoreversion
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在将uninstall.dll移动到{app}
,但我想要做的是:如果不存在,请将uninstall.dll文件复制到{cf}\InnoSetup\uninstall.dll
filepath并创建一个硬链接{app}\uninstall.dll
,如果已经存在则该文件然后只是制作硬链接,仅此而已,我不会仍然存储uninstall.dll文件{app}\uninstall.dll
,只是我想要一个符号引用因为uninstall.dll文件永远不应该被卸载.
我怎么能这样做?
我正在重构和“dockerizing”一个由 shell 脚本、C++ 二进制文件和各种开源包(其中包括httpd)组成的遗留应用程序
有没有办法在 docker 容器中创建指向位于 docker 卷中的文件的硬链接?
我计划按如下方式构建容器:
services:
legacy-app:
image: my-legacy-app
volumes:
- http-files:/var/www/html/
httpd:
image: httpd:2.4
volumes:
- http-files:/usr/local/apache2/htdocs/
volumes:
http-files:
Run Code Online (Sandbox Code Playgroud)
遗留应用程序中的一些 init 脚本在/var/www/html/目录中创建指向文件系统中其他文件的硬链接。他们现在返回以下错误:
ln: creating hard link `/var/www/html/1/application' to `/home/conf/application': Invalid cross-device link
Run Code Online (Sandbox Code Playgroud)
我尝试使用符号链接并且它有效。但是,这里选择硬链接的原因是在删除所有指向该文件的链接后删除该文件。
有没有办法创建跨 docker 卷的硬链接?
我在文件大小和已用磁盘空间之间存在差异(总文件大小甚至超过磁盘大小).我想因为在Windows 7/Vista中存在许多硬链接(对于WinSxS组件).但是,如何以编程方式将硬链接与Windows 7中的真实文件区分开来?
我想知道在 Linux 上是否可以识别文件(或链接)是否是硬链接。例如,如果我创建了:
dd if=/dev/urandom bs=1024 count=10000 of=file_10MB conv=notrunc
ln file_10MB file_10MB_link1
Run Code Online (Sandbox Code Playgroud)
我想创建一个检查函数,可以这样使用:
if is_hardlink("file_10MB_link1"):
pass
Run Code Online (Sandbox Code Playgroud)
如何使用 Python 检查文件是否为硬链接?