blob: e0673d1b7733c2985aa31a0379a238a0a6c3a7db [file] [log] [blame]
Berkeley DB database schema for filesystem
------------------------------------------
system environment variables:
DB_HOME: database home dir, for transaction database + logs
DB_PASSWORD: if present, AES-encrypt database with this password
db4 environment
===============
"metadata": metadata
page size 512
little endian byte order
"hash": hash refence counts
page size 512
little endian byte order
"data": user data storage
page size 2048
little endian byte order
optionally encrypted w/ DB4 AES encryption
database "metadata"
===================
inode
-----
key: /inode/%Lu (%Lu == inode number)
value record's fields (all little endian):
struct dbfs_raw_inode:
guint64 ino: inode number (identity)
guint64 version: linear sequence number, starts @ 1
guint32 mode: unix mode_t
guint32 nlink: number of hard links
guint32 uid: unix user id
guint32 gid: unix group id
guint64 rdev: unix dev_t
guint64 size: inode data size, in bytes
guint64 ctime: file creation time
guint64 atime: file last-accessed time
guint64 mtime: file last-modified time
struct dbfs_extent blocks[0]: array of extents, describing inode data
struct dbfs_extent:
dbfs_blk_id_t id: 20-byte sha1 hash of DB-returned data block
guint32 off: fragment's offset into DB-returned data
guint32 len: length of fragment
NOTE: sha1 hash covers the entire data block, as originally written to
the database. File modifications may cause 'off' and 'len' to change,
which implies that 'id' is no longer the sha1 hash of the current
fragment.
directories
-----------
An array of struct dbfs_dirent, aligned on DBFS_DIRENT_ALIGN bounds.
key: /dir/%Lu inode number associated with this dir
struct dbfs_dirent:
guint32 magic: magic number (0xd4d4d4d4U)
guint16 res2: reserved for future use
guint16 namelen: length of final filename component
guint64 ino: inode number of referenced inode
char name[0]: UTF8 final filename component (namelen bytes)
0-7 bytes alignment padding
The array of struct dbfs_dirent is terminated by a final dbfs_dirent
containing a zero-length name (namelen==0).
symbolic links
--------------
key: /symlink/%Lu inode number associated with this symlink
value: UTF8 string, containing link text (variable length)
extended (named) attributes
---------------------------
name max length: 256
data max length: 1MB (1024 * 1024 bytes)
key: /xattr/%Lu/%s inode number, attribute name
value: variable-length binary data
key: /xattr/%Lu inode number
value: An array of struct dbfs_xlist, aligned on DBFS_XLIST_ALIGN bounds.
struct dbfs_xlist:
guint32 namelen length of attribute name
char name[0] UTF8 attribute name (namelen bytes)
0-7 bytes alignment padding
database "data"
===============
Used for all data storage. Each file is broken up into chunks of no
more than DBFS_MAX_EXT_LEN (4MB) bytes, called extents.
key: 20-byte SHA-1 hash of data contents
value: variable-length binary data
database "hash"
===============
Used for keeping a reference count of each item in database "data".
key: 20-byte SHA-1 hash of data contents
value: struct dbfs_hashref
struct dbfs_hashref:
guint32 refs Object reference count.