cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

cachefiles.rst (23056B)


      1.. SPDX-License-Identifier: GPL-2.0
      2
      3===================================
      4Cache on Already Mounted Filesystem
      5===================================
      6
      7.. Contents:
      8
      9 (*) Overview.
     10
     11 (*) Requirements.
     12
     13 (*) Configuration.
     14
     15 (*) Starting the cache.
     16
     17 (*) Things to avoid.
     18
     19 (*) Cache culling.
     20
     21 (*) Cache structure.
     22
     23 (*) Security model and SELinux.
     24
     25 (*) A note on security.
     26
     27 (*) Statistical information.
     28
     29 (*) Debugging.
     30
     31 (*) On-demand Read.
     32
     33
     34Overview
     35========
     36
     37CacheFiles is a caching backend that's meant to use as a cache a directory on
     38an already mounted filesystem of a local type (such as Ext3).
     39
     40CacheFiles uses a userspace daemon to do some of the cache management - such as
     41reaping stale nodes and culling.  This is called cachefilesd and lives in
     42/sbin.
     43
     44The filesystem and data integrity of the cache are only as good as those of the
     45filesystem providing the backing services.  Note that CacheFiles does not
     46attempt to journal anything since the journalling interfaces of the various
     47filesystems are very specific in nature.
     48
     49CacheFiles creates a misc character device - "/dev/cachefiles" - that is used
     50to communication with the daemon.  Only one thing may have this open at once,
     51and while it is open, a cache is at least partially in existence.  The daemon
     52opens this and sends commands down it to control the cache.
     53
     54CacheFiles is currently limited to a single cache.
     55
     56CacheFiles attempts to maintain at least a certain percentage of free space on
     57the filesystem, shrinking the cache by culling the objects it contains to make
     58space if necessary - see the "Cache Culling" section.  This means it can be
     59placed on the same medium as a live set of data, and will expand to make use of
     60spare space and automatically contract when the set of data requires more
     61space.
     62
     63
     64
     65Requirements
     66============
     67
     68The use of CacheFiles and its daemon requires the following features to be
     69available in the system and in the cache filesystem:
     70
     71	- dnotify.
     72
     73	- extended attributes (xattrs).
     74
     75	- openat() and friends.
     76
     77	- bmap() support on files in the filesystem (FIBMAP ioctl).
     78
     79	- The use of bmap() to detect a partial page at the end of the file.
     80
     81It is strongly recommended that the "dir_index" option is enabled on Ext3
     82filesystems being used as a cache.
     83
     84
     85Configuration
     86=============
     87
     88The cache is configured by a script in /etc/cachefilesd.conf.  These commands
     89set up cache ready for use.  The following script commands are available:
     90
     91 brun <N>%, bcull <N>%, bstop <N>%, frun <N>%, fcull <N>%, fstop <N>%
     92	Configure the culling limits.  Optional.  See the section on culling
     93	The defaults are 7% (run), 5% (cull) and 1% (stop) respectively.
     94
     95	The commands beginning with a 'b' are file space (block) limits, those
     96	beginning with an 'f' are file count limits.
     97
     98 dir <path>
     99	Specify the directory containing the root of the cache.  Mandatory.
    100
    101 tag <name>
    102	Specify a tag to FS-Cache to use in distinguishing multiple caches.
    103	Optional.  The default is "CacheFiles".
    104
    105 debug <mask>
    106	Specify a numeric bitmask to control debugging in the kernel module.
    107	Optional.  The default is zero (all off).  The following values can be
    108	OR'd into the mask to collect various information:
    109
    110		==	=================================================
    111		1	Turn on trace of function entry (_enter() macros)
    112		2	Turn on trace of function exit (_leave() macros)
    113		4	Turn on trace of internal debug points (_debug())
    114		==	=================================================
    115
    116	This mask can also be set through sysfs, eg::
    117
    118		echo 5 >/sys/modules/cachefiles/parameters/debug
    119
    120
    121Starting the Cache
    122==================
    123
    124The cache is started by running the daemon.  The daemon opens the cache device,
    125configures the cache and tells it to begin caching.  At that point the cache
    126binds to fscache and the cache becomes live.
    127
    128The daemon is run as follows::
    129
    130	/sbin/cachefilesd [-d]* [-s] [-n] [-f <configfile>]
    131
    132The flags are:
    133
    134 ``-d``
    135	Increase the debugging level.  This can be specified multiple times and
    136	is cumulative with itself.
    137
    138 ``-s``
    139	Send messages to stderr instead of syslog.
    140
    141 ``-n``
    142	Don't daemonise and go into background.
    143
    144 ``-f <configfile>``
    145	Use an alternative configuration file rather than the default one.
    146
    147
    148Things to Avoid
    149===============
    150
    151Do not mount other things within the cache as this will cause problems.  The
    152kernel module contains its own very cut-down path walking facility that ignores
    153mountpoints, but the daemon can't avoid them.
    154
    155Do not create, rename or unlink files and directories in the cache while the
    156cache is active, as this may cause the state to become uncertain.
    157
    158Renaming files in the cache might make objects appear to be other objects (the
    159filename is part of the lookup key).
    160
    161Do not change or remove the extended attributes attached to cache files by the
    162cache as this will cause the cache state management to get confused.
    163
    164Do not create files or directories in the cache, lest the cache get confused or
    165serve incorrect data.
    166
    167Do not chmod files in the cache.  The module creates things with minimal
    168permissions to prevent random users being able to access them directly.
    169
    170
    171Cache Culling
    172=============
    173
    174The cache may need culling occasionally to make space.  This involves
    175discarding objects from the cache that have been used less recently than
    176anything else.  Culling is based on the access time of data objects.  Empty
    177directories are culled if not in use.
    178
    179Cache culling is done on the basis of the percentage of blocks and the
    180percentage of files available in the underlying filesystem.  There are six
    181"limits":
    182
    183 brun, frun
    184     If the amount of free space and the number of available files in the cache
    185     rises above both these limits, then culling is turned off.
    186
    187 bcull, fcull
    188     If the amount of available space or the number of available files in the
    189     cache falls below either of these limits, then culling is started.
    190
    191 bstop, fstop
    192     If the amount of available space or the number of available files in the
    193     cache falls below either of these limits, then no further allocation of
    194     disk space or files is permitted until culling has raised things above
    195     these limits again.
    196
    197These must be configured thusly::
    198
    199	0 <= bstop < bcull < brun < 100
    200	0 <= fstop < fcull < frun < 100
    201
    202Note that these are percentages of available space and available files, and do
    203_not_ appear as 100 minus the percentage displayed by the "df" program.
    204
    205The userspace daemon scans the cache to build up a table of cullable objects.
    206These are then culled in least recently used order.  A new scan of the cache is
    207started as soon as space is made in the table.  Objects will be skipped if
    208their atimes have changed or if the kernel module says it is still using them.
    209
    210
    211Cache Structure
    212===============
    213
    214The CacheFiles module will create two directories in the directory it was
    215given:
    216
    217 * cache/
    218 * graveyard/
    219
    220The active cache objects all reside in the first directory.  The CacheFiles
    221kernel module moves any retired or culled objects that it can't simply unlink
    222to the graveyard from which the daemon will actually delete them.
    223
    224The daemon uses dnotify to monitor the graveyard directory, and will delete
    225anything that appears therein.
    226
    227
    228The module represents index objects as directories with the filename "I..." or
    229"J...".  Note that the "cache/" directory is itself a special index.
    230
    231Data objects are represented as files if they have no children, or directories
    232if they do.  Their filenames all begin "D..." or "E...".  If represented as a
    233directory, data objects will have a file in the directory called "data" that
    234actually holds the data.
    235
    236Special objects are similar to data objects, except their filenames begin
    237"S..." or "T...".
    238
    239
    240If an object has children, then it will be represented as a directory.
    241Immediately in the representative directory are a collection of directories
    242named for hash values of the child object keys with an '@' prepended.  Into
    243this directory, if possible, will be placed the representations of the child
    244objects::
    245
    246	 /INDEX    /INDEX     /INDEX                            /DATA FILES
    247	/=========/==========/=================================/================
    248	cache/@4a/I03nfs/@30/Ji000000000000000--fHg8hi8400
    249	cache/@4a/I03nfs/@30/Ji000000000000000--fHg8hi8400/@75/Es0g000w...DB1ry
    250	cache/@4a/I03nfs/@30/Ji000000000000000--fHg8hi8400/@75/Es0g000w...N22ry
    251	cache/@4a/I03nfs/@30/Ji000000000000000--fHg8hi8400/@75/Es0g000w...FP1ry
    252
    253
    254If the key is so long that it exceeds NAME_MAX with the decorations added on to
    255it, then it will be cut into pieces, the first few of which will be used to
    256make a nest of directories, and the last one of which will be the objects
    257inside the last directory.  The names of the intermediate directories will have
    258'+' prepended::
    259
    260	J1223/@23/+xy...z/+kl...m/Epqr
    261
    262
    263Note that keys are raw data, and not only may they exceed NAME_MAX in size,
    264they may also contain things like '/' and NUL characters, and so they may not
    265be suitable for turning directly into a filename.
    266
    267To handle this, CacheFiles will use a suitably printable filename directly and
    268"base-64" encode ones that aren't directly suitable.  The two versions of
    269object filenames indicate the encoding:
    270
    271	===============	===============	===============
    272	OBJECT TYPE	PRINTABLE	ENCODED
    273	===============	===============	===============
    274	Index		"I..."		"J..."
    275	Data		"D..."		"E..."
    276	Special		"S..."		"T..."
    277	===============	===============	===============
    278
    279Intermediate directories are always "@" or "+" as appropriate.
    280
    281
    282Each object in the cache has an extended attribute label that holds the object
    283type ID (required to distinguish special objects) and the auxiliary data from
    284the netfs.  The latter is used to detect stale objects in the cache and update
    285or retire them.
    286
    287
    288Note that CacheFiles will erase from the cache any file it doesn't recognise or
    289any file of an incorrect type (such as a FIFO file or a device file).
    290
    291
    292Security Model and SELinux
    293==========================
    294
    295CacheFiles is implemented to deal properly with the LSM security features of
    296the Linux kernel and the SELinux facility.
    297
    298One of the problems that CacheFiles faces is that it is generally acting on
    299behalf of a process, and running in that process's context, and that includes a
    300security context that is not appropriate for accessing the cache - either
    301because the files in the cache are inaccessible to that process, or because if
    302the process creates a file in the cache, that file may be inaccessible to other
    303processes.
    304
    305The way CacheFiles works is to temporarily change the security context (fsuid,
    306fsgid and actor security label) that the process acts as - without changing the
    307security context of the process when it the target of an operation performed by
    308some other process (so signalling and suchlike still work correctly).
    309
    310
    311When the CacheFiles module is asked to bind to its cache, it:
    312
    313 (1) Finds the security label attached to the root cache directory and uses
    314     that as the security label with which it will create files.  By default,
    315     this is::
    316
    317	cachefiles_var_t
    318
    319 (2) Finds the security label of the process which issued the bind request
    320     (presumed to be the cachefilesd daemon), which by default will be::
    321
    322	cachefilesd_t
    323
    324     and asks LSM to supply a security ID as which it should act given the
    325     daemon's label.  By default, this will be::
    326
    327	cachefiles_kernel_t
    328
    329     SELinux transitions the daemon's security ID to the module's security ID
    330     based on a rule of this form in the policy::
    331
    332	type_transition <daemon's-ID> kernel_t : process <module's-ID>;
    333
    334     For instance::
    335
    336	type_transition cachefilesd_t kernel_t : process cachefiles_kernel_t;
    337
    338
    339The module's security ID gives it permission to create, move and remove files
    340and directories in the cache, to find and access directories and files in the
    341cache, to set and access extended attributes on cache objects, and to read and
    342write files in the cache.
    343
    344The daemon's security ID gives it only a very restricted set of permissions: it
    345may scan directories, stat files and erase files and directories.  It may
    346not read or write files in the cache, and so it is precluded from accessing the
    347data cached therein; nor is it permitted to create new files in the cache.
    348
    349
    350There are policy source files available in:
    351
    352	https://people.redhat.com/~dhowells/fscache/cachefilesd-0.8.tar.bz2
    353
    354and later versions.  In that tarball, see the files::
    355
    356	cachefilesd.te
    357	cachefilesd.fc
    358	cachefilesd.if
    359
    360They are built and installed directly by the RPM.
    361
    362If a non-RPM based system is being used, then copy the above files to their own
    363directory and run::
    364
    365	make -f /usr/share/selinux/devel/Makefile
    366	semodule -i cachefilesd.pp
    367
    368You will need checkpolicy and selinux-policy-devel installed prior to the
    369build.
    370
    371
    372By default, the cache is located in /var/fscache, but if it is desirable that
    373it should be elsewhere, than either the above policy files must be altered, or
    374an auxiliary policy must be installed to label the alternate location of the
    375cache.
    376
    377For instructions on how to add an auxiliary policy to enable the cache to be
    378located elsewhere when SELinux is in enforcing mode, please see::
    379
    380	/usr/share/doc/cachefilesd-*/move-cache.txt
    381
    382When the cachefilesd rpm is installed; alternatively, the document can be found
    383in the sources.
    384
    385
    386A Note on Security
    387==================
    388
    389CacheFiles makes use of the split security in the task_struct.  It allocates
    390its own task_security structure, and redirects current->cred to point to it
    391when it acts on behalf of another process, in that process's context.
    392
    393The reason it does this is that it calls vfs_mkdir() and suchlike rather than
    394bypassing security and calling inode ops directly.  Therefore the VFS and LSM
    395may deny the CacheFiles access to the cache data because under some
    396circumstances the caching code is running in the security context of whatever
    397process issued the original syscall on the netfs.
    398
    399Furthermore, should CacheFiles create a file or directory, the security
    400parameters with that object is created (UID, GID, security label) would be
    401derived from that process that issued the system call, thus potentially
    402preventing other processes from accessing the cache - including CacheFiles's
    403cache management daemon (cachefilesd).
    404
    405What is required is to temporarily override the security of the process that
    406issued the system call.  We can't, however, just do an in-place change of the
    407security data as that affects the process as an object, not just as a subject.
    408This means it may lose signals or ptrace events for example, and affects what
    409the process looks like in /proc.
    410
    411So CacheFiles makes use of a logical split in the security between the
    412objective security (task->real_cred) and the subjective security (task->cred).
    413The objective security holds the intrinsic security properties of a process and
    414is never overridden.  This is what appears in /proc, and is what is used when a
    415process is the target of an operation by some other process (SIGKILL for
    416example).
    417
    418The subjective security holds the active security properties of a process, and
    419may be overridden.  This is not seen externally, and is used whan a process
    420acts upon another object, for example SIGKILLing another process or opening a
    421file.
    422
    423LSM hooks exist that allow SELinux (or Smack or whatever) to reject a request
    424for CacheFiles to run in a context of a specific security label, or to create
    425files and directories with another security label.
    426
    427
    428Statistical Information
    429=======================
    430
    431If FS-Cache is compiled with the following option enabled::
    432
    433	CONFIG_CACHEFILES_HISTOGRAM=y
    434
    435then it will gather certain statistics and display them through a proc file.
    436
    437 /proc/fs/cachefiles/histogram
    438
    439     ::
    440
    441	cat /proc/fs/cachefiles/histogram
    442	JIFS  SECS  LOOKUPS   MKDIRS    CREATES
    443	===== ===== ========= ========= =========
    444
    445     This shows the breakdown of the number of times each amount of time
    446     between 0 jiffies and HZ-1 jiffies a variety of tasks took to run.  The
    447     columns are as follows:
    448
    449	=======		=======================================================
    450	COLUMN		TIME MEASUREMENT
    451	=======		=======================================================
    452	LOOKUPS		Length of time to perform a lookup on the backing fs
    453	MKDIRS		Length of time to perform a mkdir on the backing fs
    454	CREATES		Length of time to perform a create on the backing fs
    455	=======		=======================================================
    456
    457     Each row shows the number of events that took a particular range of times.
    458     Each step is 1 jiffy in size.  The JIFS column indicates the particular
    459     jiffy range covered, and the SECS field the equivalent number of seconds.
    460
    461
    462Debugging
    463=========
    464
    465If CONFIG_CACHEFILES_DEBUG is enabled, the CacheFiles facility can have runtime
    466debugging enabled by adjusting the value in::
    467
    468	/sys/module/cachefiles/parameters/debug
    469
    470This is a bitmask of debugging streams to enable:
    471
    472	=======	=======	===============================	=======================
    473	BIT	VALUE	STREAM				POINT
    474	=======	=======	===============================	=======================
    475	0	1	General				Function entry trace
    476	1	2					Function exit trace
    477	2	4					General
    478	=======	=======	===============================	=======================
    479
    480The appropriate set of values should be OR'd together and the result written to
    481the control file.  For example::
    482
    483	echo $((1|4|8)) >/sys/module/cachefiles/parameters/debug
    484
    485will turn on all function entry debugging.
    486
    487
    488On-demand Read
    489==============
    490
    491When working in its original mode, CacheFiles serves as a local cache for a
    492remote networking fs - while in on-demand read mode, CacheFiles can boost the
    493scenario where on-demand read semantics are needed, e.g. container image
    494distribution.
    495
    496The essential difference between these two modes is seen when a cache miss
    497occurs: In the original mode, the netfs will fetch the data from the remote
    498server and then write it to the cache file; in on-demand read mode, fetching
    499the data and writing it into the cache is delegated to a user daemon.
    500
    501``CONFIG_CACHEFILES_ONDEMAND`` should be enabled to support on-demand read mode.
    502
    503
    504Protocol Communication
    505----------------------
    506
    507The on-demand read mode uses a simple protocol for communication between kernel
    508and user daemon. The protocol can be modeled as::
    509
    510	kernel --[request]--> user daemon --[reply]--> kernel
    511
    512CacheFiles will send requests to the user daemon when needed.  The user daemon
    513should poll the devnode ('/dev/cachefiles') to check if there's a pending
    514request to be processed.  A POLLIN event will be returned when there's a pending
    515request.
    516
    517The user daemon then reads the devnode to fetch a request to process.  It should
    518be noted that each read only gets one request. When it has finished processing
    519the request, the user daemon should write the reply to the devnode.
    520
    521Each request starts with a message header of the form::
    522
    523	struct cachefiles_msg {
    524		__u32 msg_id;
    525		__u32 opcode;
    526		__u32 len;
    527		__u32 object_id;
    528		__u8  data[];
    529	};
    530
    531where:
    532
    533	* ``msg_id`` is a unique ID identifying this request among all pending
    534	  requests.
    535
    536	* ``opcode`` indicates the type of this request.
    537
    538	* ``object_id`` is a unique ID identifying the cache file operated on.
    539
    540	* ``data`` indicates the payload of this request.
    541
    542	* ``len`` indicates the whole length of this request, including the
    543	  header and following type-specific payload.
    544
    545
    546Turning on On-demand Mode
    547-------------------------
    548
    549An optional parameter becomes available to the "bind" command::
    550
    551	bind [ondemand]
    552
    553When the "bind" command is given no argument, it defaults to the original mode.
    554When it is given the "ondemand" argument, i.e. "bind ondemand", on-demand read
    555mode will be enabled.
    556
    557
    558The OPEN Request
    559----------------
    560
    561When the netfs opens a cache file for the first time, a request with the
    562CACHEFILES_OP_OPEN opcode, a.k.a an OPEN request will be sent to the user
    563daemon.  The payload format is of the form::
    564
    565	struct cachefiles_open {
    566		__u32 volume_key_size;
    567		__u32 cookie_key_size;
    568		__u32 fd;
    569		__u32 flags;
    570		__u8  data[];
    571	};
    572
    573where:
    574
    575	* ``data`` contains the volume_key followed directly by the cookie_key.
    576	  The volume key is a NUL-terminated string; the cookie key is binary
    577	  data.
    578
    579	* ``volume_key_size`` indicates the size of the volume key in bytes.
    580
    581	* ``cookie_key_size`` indicates the size of the cookie key in bytes.
    582
    583	* ``fd`` indicates an anonymous fd referring to the cache file, through
    584	  which the user daemon can perform write/llseek file operations on the
    585	  cache file.
    586
    587
    588The user daemon can use the given (volume_key, cookie_key) pair to distinguish
    589the requested cache file.  With the given anonymous fd, the user daemon can
    590fetch the data and write it to the cache file in the background, even when
    591kernel has not triggered a cache miss yet.
    592
    593Be noted that each cache file has a unique object_id, while it may have multiple
    594anonymous fds.  The user daemon may duplicate anonymous fds from the initial
    595anonymous fd indicated by the @fd field through dup().  Thus each object_id can
    596be mapped to multiple anonymous fds, while the usr daemon itself needs to
    597maintain the mapping.
    598
    599When implementing a user daemon, please be careful of RLIMIT_NOFILE,
    600``/proc/sys/fs/nr_open`` and ``/proc/sys/fs/file-max``.  Typically these needn't
    601be huge since they're related to the number of open device blobs rather than
    602open files of each individual filesystem.
    603
    604The user daemon should reply the OPEN request by issuing a "copen" (complete
    605open) command on the devnode::
    606
    607	copen <msg_id>,<cache_size>
    608
    609where:
    610
    611	* ``msg_id`` must match the msg_id field of the OPEN request.
    612
    613	* When >= 0, ``cache_size`` indicates the size of the cache file;
    614	  when < 0, ``cache_size`` indicates any error code encountered by the
    615	  user daemon.
    616
    617
    618The CLOSE Request
    619-----------------
    620
    621When a cookie withdrawn, a CLOSE request (opcode CACHEFILES_OP_CLOSE) will be
    622sent to the user daemon.  This tells the user daemon to close all anonymous fds
    623associated with the given object_id.  The CLOSE request has no extra payload,
    624and shouldn't be replied.
    625
    626
    627The READ Request
    628----------------
    629
    630When a cache miss is encountered in on-demand read mode, CacheFiles will send a
    631READ request (opcode CACHEFILES_OP_READ) to the user daemon. This tells the user
    632daemon to fetch the contents of the requested file range.  The payload is of the
    633form::
    634
    635	struct cachefiles_read {
    636		__u64 off;
    637		__u64 len;
    638	};
    639
    640where:
    641
    642	* ``off`` indicates the starting offset of the requested file range.
    643
    644	* ``len`` indicates the length of the requested file range.
    645
    646
    647When it receives a READ request, the user daemon should fetch the requested data
    648and write it to the cache file identified by object_id.
    649
    650When it has finished processing the READ request, the user daemon should reply
    651by using the CACHEFILES_IOC_READ_COMPLETE ioctl on one of the anonymous fds
    652associated with the object_id given in the READ request.  The ioctl is of the
    653form::
    654
    655	ioctl(fd, CACHEFILES_IOC_READ_COMPLETE, msg_id);
    656
    657where:
    658
    659	* ``fd`` is one of the anonymous fds associated with the object_id
    660	  given.
    661
    662	* ``msg_id`` must match the msg_id field of the READ request.