开发者

Creating a hard link to partial file contents in linux

开发者 https://www.devze.com 2023-02-12 17:06 出处:网络
I have fileA, which has a size of 200 MB. Now I want to create a hardlink to fileA, na开发者_开发问答med fileB, but I only want this file point to the first 100 mb of fileA. So basically I need fileB

I have fileA, which has a size of 200 MB. Now I want to create a hardlink to fileA, na开发者_开发问答med fileB, but I only want this file point to the first 100 mb of fileA. So basically I need fileB to point to the same data blocks, but with a different length. It doesn't necessarily have to be a real hardlink it could be a virtual file proxying contents.

I was thinking about duplicating the Inode somehow and changing the length, but I presume this could cause filesystem coherency issues (when datablocks move around etc.). Is there any linux tool or user-level system call that could let me do this?


You cannot do this directly in the manner you are talking about. There are filesystems that sort of do this. For example LessFS can do this. I also believe that the underlying structure of btrfs supports this, so if someone put the hooks in, it would be accessible at user level.

But, there is no way to do this with any of the ext filesystems, and I believe that it happens implicitly in LessFS.

There is a really ugly way of doing it in btrfs. If you make a snapshot, then truncate the snapshot file to 100M, you have effectively achieved your goal.

I believe this would also work with btrfs and a sufficiently recent version of cp you could just copy the file with cp then truncate one copy. The version of cp would have to have the --reflink option, and if you want to be extra sure about this, give the --reflink=always option.


Adding to @Omnifarious's answer:

What you're describing is not a hard link. A hard links is essentially a reference to an inode, by a path name. (A soft link is a reference to a path name, by a path name.) There is no mechanism to say, "I want this inode, but slightly different, only the first k blocks". A copy-on-write filesystem could do this for you under the covers. If you were using such a filesystem then you would simply say

cp fileA fileB && truncate -s 200M fileB

Of course, this also works on a non-copy-on-write filesystem, but it takes up an extra 200 MB instead of just the filesystem overhead.

Now, that said, you could still implement something like this easily on Linux with FUSE. You could implement a filesystem that mirrors some target directory but simply artificially sets a maximum length to files (at say 200 MB).

FUSE

FUSE Hello World


Maybe you can check ChunkFS. I think this is what you need (I didn't try it).

0

精彩评论

暂无评论...
验证码 换一张
取 消