freebsd-dev/bin/df/df.1
Stefan Eßer c33db74b53 fs/msdosfs: add tracking of free root directory entries
This update implements tallying of free directory entries during
create, delete,	or rename operations on FAT12 and FAT16 file systems.

Prior to this change, the total number of root directory entries
was reported as number of inodes, but 0 as the number of free
inodes, causing system health monitoring software to warn about
a suspected disk full issue.

The FAT12 and FAT16 file systems provide a limited number of
root directory entries, e.g. 512 on typical hard disk formats.
The valid range of values is 1 to 65535, but the msdosfs code
will effectively round up "odd" values to the next multiple of 16
(e.g. 513 would allow for 528 root directory entries).

This update implements tracking of directory entries during create,
delete, or rename operations, with initial values determined by
scanning the directory when the file system is mounted.

Total and free directory entries are reported in the f_files and
f_ffree elements of struct statfs, despite differences in semantics
of these values:

- There is no limit on the number of files and directories that can
  be created on a FAT file system. Only the root directory of FAT12
  and FAT16 file systems is limited, any number of files can still be
  created in sub-directories, even when 0 free "inodes" are reported.

- A single file can require 1 to 21 directory entries, depending on
  the character set, structure, and length of the name. The DOS 8.3
  style file name takes up 1 entry, and if the name does not comply
  with the syntax of a DOS 8.3 file name, 1 additional entry is used
  for each 13 characters of the file name. Since all these entries
  have to be contiguous, it is possible that a file or directory with
  a long name can not be created, despite a sufficient total number of
  free directory entries.

- Renaming a file can require more directory entries than currently
  allocated to store its long name, which may prevent an in-place
  update of the name if more entries are needed. This may cause a
  rename operation to fail if no contiguous range of free entries for
  the new name can be found.

- The volume label is stored in a directory entry. An empty FAT file
  system with a volume label will therefore show 1 used "inode" in
  df.

- The perceentage of free inodes shown in df or monitoring tools does
  only represent the state of the root directory of a FAT12 or FAT16
  file system. Neither does a reported value of 0% free inodes does
  prevent files from being created in sub-directories, nor does a
  value of 50% free inodes guarantee that even a single file with
  a "long" name can be created in the root directory (if every other
  directory entry is occupied and there are no 2 contiguous entries).

The statfs(2) and df(1) man pages have been updated with a notice
regarding the possibly different semantics of values reported as
total and free inodes for non-Unix file systems.

PR:		270053
Reported by:	Ben Woods <woodsb02@freebsd.org>
Approved by:	mckusick
MFC after:	1 month
Differential Revision:	https://reviews.freebsd.org/D38987
2023-03-29 08:46:01 +02:00

309 lines
8.7 KiB
Groff

.\"-
.\" Copyright (c) 1989, 1990, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\" 3. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" @(#)df.1 8.3 (Berkeley) 5/8/95
.\" $FreeBSD$
.\"
.Dd March 29, 2023
.Dt DF 1
.Os
.Sh NAME
.Nm df
.Nd display free disk space
.Sh SYNOPSIS
.Nm
.Op Fl -libxo
.Op Fl b | g | H | h | k | m | P
.Op Fl acilnT
.Op Fl \&,
.Op Fl t Ar type
.Op Ar file | filesystem ...
.Sh DESCRIPTION
The
.Nm
utility
displays statistics about the amount of free disk space on the specified
mounted
.Ar file system
or on the file system of which
.Ar file
is a part.
By default block counts are displayed with an assumed block size of
512 bytes.
If neither a file or a file system operand is specified,
statistics for all mounted file systems are displayed
(subject to the
.Fl t
option below).
.Pp
The following options are available:
.Bl -tag -width indent
.It Fl -libxo
Generate output via
.Xr libxo 3
in a selection of different human and machine readable formats.
See
.Xr xo_parse_args 3
for details on command line arguments.
.It Fl a
Show all mount points, including those that were mounted with the
.Dv MNT_IGNORE
flag.
This is implied for file systems specified on the command line.
.It Fl b
Explicitly use 512 byte blocks, overriding any
.Ev BLOCKSIZE
specification from the environment.
This is the same as the
.Fl P
option.
The
.Fl k
option overrides this option.
.It Fl c
Display a grand total.
.It Fl g
Use 1073741824 byte (1 Gibibyte) blocks rather than the default.
This overrides any
.Ev BLOCKSIZE
specification from the environment.
.It Fl h
.Dq Human-readable
output.
Use unit suffixes: Byte, Kibibyte, Mebibyte, Gibibyte, Tebibyte and
Pebibyte (based on powers of 1024) in order to reduce the number of
digits to four or fewer.
.It Fl H , Fl Fl si
Same as
.Fl h
but based on powers of 1000.
.It Fl i
Include statistics on the number of free and used inodes.
In conjunction with the
.Fl h
or
.Fl H
options, the number of inodes is scaled by powers of 1000.
In case the filesystem has no inodes then
.Sq -
is displayed instead of the usage percentage.
.It Fl k
Use 1024 byte (1 Kibibyte) blocks rather than the default.
This overrides the
.Fl P
option and any
.Ev BLOCKSIZE
specification from the environment.
.It Fl l
Select locally-mounted file system for display.
If used in combination with the
.Fl t Ar type
option, file system types will be added or excluded acccording to the
parameters of that option.
.It Fl m
Use 1048576 byte (1 Mebibyte) blocks rather than the default.
This overrides any
.Ev BLOCKSIZE
specification from the environment.
.It Fl n
Print out the previously obtained statistics from the file systems.
This option should be used if it is possible that one or more
file systems are in a state such that they will not be able to provide
statistics without a long delay.
When this option is specified,
.Nm
will not request new statistics from the file systems, but will respond
with the possibly stale statistics that were previously obtained.
.It Fl P
Explicitly use 512 byte blocks, overriding any
.Ev BLOCKSIZE
specification from the environment.
This is the same as the
.Fl b
option.
The
.Fl k
option overrides this option.
.It Fl t Ar type
Select file systems to display.
More than one type may be specified in a comma separated list.
The list of file system types can be prefixed with
.Dq no
to specify the file system types for which action should
.Em not
be taken.
If used in combination with the
.Fl l
option, the parameters of this option will modify the list of
locally-mounted file systems selected by the
.Fl l
option.
For example, the
.Nm
command:
.Bd -literal -offset indent
df -t nonfs,nullfs
.Ed
.Pp
lists all file systems except those of type NFS and NULLFS.
The
.Xr lsvfs 1
command can be used to find out the types of file systems
that are available on the system.
.It Fl T
Include file system type.
.It Fl ,
(Comma) Print sizes grouped and separated by thousands using the
non-monetary separator returned by
.Xr localeconv 3 ,
typically a comma or period.
If no locale is set, or the locale does not have a non-monetary separator, this
option has no effect.
.El
.Sh ENVIRONMENT
.Bl -tag -width BLOCKSIZE
.It Ev BLOCKSIZE
Specifies the units in which to report block counts.
This uses
.Xr getbsize 3 ,
which allows units of bytes or numbers scaled with the letters
.Em k
(for multiples of 1024 bytes),
.Em m
(for multiples of 1048576 bytes) or
.Em g
(for gibibytes).
The allowed range is 512 bytes to 1 GB.
If the value is outside, it will be set to the appropriate limit.
.El
.Sh EXAMPLES
Show human readable free disk space for all mount points including file system
type:
.Bd -literal -offset indent
$ df -ahT
Filesystem Type Size Used Avail Capacity Mounted on
/dev/ada1p2 ufs 213G 152G 44G 78% /
devfs devfs 1.0K 1.0K 0B 100% /dev
/dev/ada0p1 ufs 1.8T 168G 1.5T 10% /data
linsysfs linsysfs 4.0K 4.0K 0B 100% /compat/linux/sys
/dev/da0 msdosfs 7.6G 424M 7.2G 5% /mnt/usb
.Ed
.Pp
Show previously collected data including inode statistics except for devfs or
linsysfs file systems.
Note that the
.Dq no
prefix affects all the file systems in the list and the
.Fl t
option can be specified only once:
.Bd -literal -offset indent
$ df -i -n -t nodevfs,linsysfs
Filesystem 1K-blocks Used Avail Capacity iused ifree %iused
Mounted on
/dev/ada1p2 223235736 159618992 45757888 78% 1657590 27234568 6% /
/dev/ada0p1 1892163184 176319420 1564470712 10% 1319710 243300576 1%
/data
/dev/da0 7989888 433664 7556224 5% 0 0 100%
/mnt/usb
.Ed
.Pp
Show human readable information for the file system containing the file
.Pa /etc/rc.conf :
.Bd -literal -offset indent
$ df -h /etc/rc.conf
Filesystem Size Used Avail Capacity Mounted on
/dev/ada1p2 213G 152G 44G 78% /
.Ed
.Pp
Same as above but specifying some file system:
.Bd -literal -offset indent
$ df -h /dev/ada1p2
Filesystem Size Used Avail Capacity Mounted on
/dev/ada1p2 213G 152G 44G 78% /
.Ed
.Sh NOTES
For non-Unix file systems, the reported values of used and free inodes
may have a different meaning than that of used and available files and
directories.
An example is msdosfs, which in the case of FAT12 or FAT16 file systems
reports the number of available and free root directory entries instead
of inodes
.Po
where 1 to 21 such directory entries are required to store
each file or directory name or disk label
.Pc .
.Sh SEE ALSO
.Xr lsvfs 1 ,
.Xr quota 1 ,
.Xr fstatfs 2 ,
.Xr getfsstat 2 ,
.Xr statfs 2 ,
.Xr getbsize 3 ,
.Xr getmntinfo 3 ,
.Xr libxo 3 ,
.Xr localeconv 3 ,
.Xr xo_parse_args 3 ,
.Xr fstab 5 ,
.Xr mount 8 ,
.Xr pstat 8 ,
.Xr quot 8 ,
.Xr swapinfo 8
.Sh STANDARDS
With the exception of most options,
the
.Nm
utility conforms to
.St -p1003.1-2004 ,
which defines only the
.Fl k , P
and
.Fl t
options.
.Sh HISTORY
A
.Nm
command appeared in
.At v1 .
.Sh BUGS
The
.Fl n
flag is ignored if a file or file system is specified.
Also, if a mount
point is not accessible by the user, it is possible that the file system
information could be stale.
.Pp
The
.Fl b
and
.Fl P
options are identical.
The former comes from the BSD tradition, and the latter is required
for
.St -p1003.1-2004
conformity.