Build an embedded filesystem (QNX)
mkefs [-c cache_dir] -t ffs2 | ffs3 [-l inputline] [-nv] [buildfile [outputfile]]
QNX Neutrino, Linux, Microsoft Windows
The mkefs utility reads a text buildfile describing an embedded filesystem and produces a binary image file containing the embedded filesystem. You can copy this file to flash at a later stage, or use mkimage to combine it with an OS image before downloading.
Don't confuse this command with mkifs, which builds an OS image filesystem, or mketfs, which builds an embedded transaction filesystem (ETFS). |
The input and output files are specified on the command line:
QNX Neutrino flash filesystem version 3 no longer provides built-in decompression. The flash filesystem's decompression functionality has moved into the inflator resource manager. You should now use the deflate utility to compress files. |
The buildfile uses the same grammar as the mkifs command, but supports different attributes.
The buildfile is basically just a list of files that you want to be included in the embedded filesystem image file when it's built by mkefs. As well as the files to be included, you can specify various attributes that are used to set parameters of the filesystem and the files in it. For example, you can specify the maximum size of the filesystem, or the user and group IDs of the individual files.
You can't use a backslash (\) to break long lines into smaller pieces. |
In a buildfile, a pound sign (#) indicates a comment; anything between it and the end of the line is ignored. There must be a space between a buildfile command and the pound sign.
Each line is in the form:
[attributes] file_specification
where the attributes (with the enclosing square brackets) and the file specification are both optional.
Attributes provide information about the file following the attribute. They're enclosed in square brackets; when combining attributes (e.g. to specify both the user ID and the group ID), enclose both attribute tokens in the same pair of square brackets. For example:
# correct way [uid=5 gid=5] filename # incorrect way [uid=5] [gid=5] filename
There are two types of attributes:
A question mark (?) before an attribute makes the setting conditional. The attribute is set only if it hasn't already been set. For example, ?+bigendian sets the +bigendian attribute only if +bigendian or -bigendian hasn't already been set.
The file_specification takes one of the following forms:
The mkefs utility doesn't parse the contents of an inline file for
anything but the closing brace.
For example, mkefs doesn't interpret
a pound sign (#) in an inline file as the beginning of a comment.
The syntax of the inline file depends on what it's used for on the
target system.
Closing braces (}) and backslashes (\) in an inline file must be escaped with a backslash. |
You can enclose a filename in double quotes ("") if it includes spaces or unusual characters.
The mkefs command supports the following attributes:
An OR-bar indicates that either the first element or the second element must be present, but not both (e.g. +|- bigendian means either +bigendian or -bigendian, but not +-bigendian). |
+|-bigendian
Set the byte order for the embedded filesystem to either big (via +bigendian) or little (via -bigendian) endian. The default is little endian.
block_size=bsize
Set the block size for the embedded filesystem. The block size depends on what memory devices you have in your target hardware and how they're arranged. For example, two interleaved 64K × 8-bit devices configured for a 16-bit interface have a block size of 128K bytes. The default block size is 64K bytes.
cd=filename
Set the current working directory to the specified pathname before attempting to open the host file. Default is the directory from which mkefs was invoked.
dperms=dperms_spec
Set the access permissions of the directory. If specified as a number, the permissions are set to that number (just like the chmod command). If specified as an asterisk (“*”), the host directory's permissions are used; for an inline directory, the permissions are obtained from the umask of the user running mkefs. Otherwise, a symbolic mode string (which is a subset of chmod's) is used to delete, add, or set permissions.
The symbolic mode string consists of:
You can include more than one symbolic mode string, separating them with a comma (,).
The default dperms_spec is “*”.
filter=filter_spec
Run the host file through the filter program specified, presenting the host file data as standard input to the program and using the standard output from the program as the data to be placed into the embedded filesystem. Default is no filter.
The most common filter you're likely to use with the embedded filesystem is deflate. This compresses the file before copying it to the embedded filesystem. For example:
[filter="deflate"]
You can specify a filter_spec of none. This is useful if you need to override a global filter specification.
[+|-followlink]target_path=host_path
If you specify +followlink or omit it, mkefs follows any links and makes target_path a copy of host_path.
If you specify -followlink, mkefs creates a link called target_path that points to whatever host_path points at. It's up to you to make sure that the file pointed to is placed in the image.
gid=id_spec
Set the group ID number for the file. The value of this attribute may be either a number or an asterisk (*). If it's an asterisk, the group ID is taken from the host file; for an inline file, the group ID is the group of the user running mkefs. The default value for this attribute is *.
max_size=size
Set the maximum size of the embedded filesystem. You can set this attribute if you don't want the filesystem to exceed a maximum size. If this occurs while mkefs is building the filesystem, you'll see a warning message. The default is 4G bytes.
min_size=size
Set the minimum size of the embedded filesystem. If the size of the filesystem is less than this size after all the specified files have been added, then the filesystem is padded to the required size. The default is unspecified, meaning that no padding occurs.
mount=filename
Specify the mountpoint for the embedded filesystem. You can override the mountpoint with the -n option to the flashctl command.
The default is "", which makes the flash filesystem drivers (devf-*) use the appropriate default, usually /fs1p1.
+|-optional
If true, and the host file can't be found, output a warning and continue building the embedded filesystem. If false, and the host file can't be found, output an error message and exit mkefs. The default is false.
perms=perms_spec
Set the access permissions of the file. If specified as a number, the permissions are set to that number (just like the chmod command). If specified as an asterisk (“*”), the host file's permissions are used; for an inline file, permissions of 0666 are used. Otherwise, a symbolic mode string (which is a subset of chmod's) is used to delete, add, or set permissions.
The symbolic mode string consists of:
You can include more than one symbolic mode string, separating them with a comma (,).
The default perms_spec is “*”.
When running on a Windows host, mkefs can't get the execute (x), setuid (“set user ID”), or setgid (“set group ID”) permissions from the file. Use the perms attribute to specify these permissions explicitly. You might also have to use the uid and gid attributes to set the ownership correctly. To determine whether or not a utility needs to have the setuid or setgid permission set, see its entry in the Utilities Reference. |
prefix=prefix_spec
Set the prefix on the target file names. The default is the empty string.
search=path:path:…
This attribute specifies that mkefs should search for the file in the named locations on the host system. The search directory portion of the host file name isn't included in the name that's stored in the image file system.
Colon separators and forward slashes in the paths are the standard Unix conventions, but for Windows searches, you must use the standard Windows conventions, such as semicolon separators and backslashes in the paths. |
spare_blocks=sblocks
Set the number of spare blocks to be used by the embedded filesystem. If you want the embedded filesystem to be able to reclaim the space taken up by deleted files, set the number of spare blocks to 1 or more. The default is 1.
type=file_type
Sets the type of the files being created in the embedded filesystem. Allowable types are:
Specifying [type=dir] tells mkefs to make the named file
a directory; you don't need to specify the type when you're copying the
contents of a directory.
For example, this command:
[type=dir]/usr/bin=/usr/nto/x86/bin marks all the contents of /usr/bin as directories. To copy /usr/nto/x86/bin to /usr/bin, you just need to specify: /usr/bin=/usr/nto/x86/bin |
uid=id_spec
Set the user ID number for the file. The value of this attribute may be either a number or an asterisk (*). If it's an asterisk, the user ID is taken from the host file; for an inline file, the user ID is the user running mkefs. The default value for this attribute is “*”.
Here's a sample buildfile, my_efs.bld:
# A sample buildfile for mkefs [block_size=128k spare_blocks=1] /home/jwall/nto_flash
In this example, we've specified a block size of 128K and one spare block. The files and subdirectories from the /home/jwall/nto_flash directory on the host system are to be recursively copied into the root directory of the embedded filesystem.
To create an embedded filesystem image file using the above buildfile, invoke mkefs as follows:
mkefs my_efs.bld my_image.efs
This creates the my_image.efs file containing the embedded filesystem, which can then be copied to the target system.
deflate, devf-*, flashctl, inflator, mkifs
Making an OS Image chapter of Building Embedded Systems
QNX Neutrino System Architecture