User:Mstone/Commentaries/olpc-update: Difference between revisions
Jump to navigation
Jump to search
m (New page: This is a commentary intended to elucidate the data structures used by olpcrd and olpc-update in Early boot. = Unpartitioned = == Data Structures == # For rollback purposes, we need...) |
mNo edit summary |
||
Line 29: | Line 29: | ||
= Partitioned = |
= Partitioned = |
||
The design for partitioned systems is simpler than for unpartitioned systems. It works as follows. |
|||
TBD. |
|||
# Partitions are identified by colon-delimited prefixes, like <tt>boot:</tt>, <tt>root:</tt>, and so on. |
|||
# At all times, for all tree-ids <tt>$a</tt>: |
|||
## <tt>boot:/boot</tt> should be a symlink to 'boot-versions/$a' |
|||
## <tt>boot:/boot-versions/$a</tt> should contain: |
|||
### a symlink named 'alt' pointing to <tt>../$b</tt> for some tree-id <tt>$b</tt> |
|||
### instructions on how to boot the system like a kernel and initramfs. |
Revision as of 02:15, 5 November 2009
This is a commentary intended to elucidate the data structures used by olpcrd and olpc-update in Early boot.
Unpartitioned
Data Structures
- For rollback purposes, we need a data structure with some pointers in it. (e.g., "current", and usually "alt".) The pointers should point to trees of files.
- This data structure is called a "boot config", and is implemented as a directory in /versions/configs containing some symlinks.
- We need a distinguished boot config so that OFW has something specific to hand control to. This distinguished boot config is the target of another pointer implemented as a symlink at /versions/boot.
- We need to be able to atomically modify the distinguished boot configuration. We do this by
- making a fresh boot config,
- making a fresh symlink pointing to it
- renaming the freshly created symlink to /versions/boot
- For update purposes, we need to know what actual *tree* is currently running. Therefore, our initramfs puts a symlink at /versions/running to identify the currently running *tree*.
- For update purposes, we need to maintain cryptographic manifests of our trees of files. These go in /versions/contents/...
Robust Updates
Automatic updates require sufficient free space to install the update. We get that space by
- Making and installing a new boot config with no fallback, thereby unreferencing any non-sticky old builds.
- Deleting any non-sticky old builds.
- Installing the update.
- Verifying the update.
- Making and installing a new boot config with our current running tree as the "alt" image and with the new tree as the "current" image.
This way, the system is *always* in a consistent state.
Partitioned
The design for partitioned systems is simpler than for unpartitioned systems. It works as follows.
- Partitions are identified by colon-delimited prefixes, like boot:, root:, and so on.
- At all times, for all tree-ids $a:
- boot:/boot should be a symlink to 'boot-versions/$a'
- boot:/boot-versions/$a should contain:
- a symlink named 'alt' pointing to ../$b for some tree-id $b
- instructions on how to boot the system like a kernel and initramfs.