On 29.03.2021 16:16, Claudius Heine wrote: > Hi, > > I am currently investigating the possibility to use `btrfs-stream` files > (generated by `btrfs send`) for deploying a image based update to > systems (probably embedded ones). > > One of the issues I encountered here is that btrfs-send does not use any > diff algorithm on files that have changed from one snapshot to the next. >
btrfs send works on block level. It sends blocks that differ between two snapshots. > One way to implement this would be to add some sort of 'patch' command > to the `btrfs-stream` format. > This would require reading complete content of both snapshots instead if just computing block diff using metadata. Unless I misunderstand what you mean. > Is this something upstream would be interested in? > > Lets say we introduce a new `btrfs-send` format, lets call it > `btrfs-delta-stream`, which could can be created from a `btrfs-stream`: > > 1. For all `write` commands, check the requirements: > - Does the file already exists in the old snapshot? > - Is the file smaller than xMiB (this depends on the diff-algo and > the available resources) > 2. If the file fulfills those requirements, replace 'write' command with > 'patch' command, and calculate the binary delta. Also check if the > delta is actually smaller than the data of the new file. Possible add > the used binary diff algo as well as a checksum of the 'old' file to the > command as well. > > This file format can of course be converted back to `btrfs-stream` and > then applied with `btrfs-receive`. > > I would probably start with `bsdiff` for the diff algorithm, but maybe > we want to be flexible here. > > Of course if `btrfs-delta-stream` is implemented in `btrfs-progs` then, > we can create and apply this format directly. > > regards, > Claudius