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

Reply via email to