Chapter 3. Using Cygwin

Table of Contents

Mapping path names
Introduction
The Cygwin Mount Table
The cygdrive path prefix
Additional Path-related Information
Text and Binary modes
The Issue
The default Cygwin behavior
Example
Binary or text?
Programming
File permissions
Special filenames
Special files in /etc
Invalid filenames
Forbidden characters in filenames
Filenames with unusual (foreign) characters
Case sensitive filenames
POSIX devices
The .exe extension
The /proc filesystem
The /proc/registry filesystem
The @pathnames
The CYGWIN environment variable
Implemented options
Obsolete options
Cygserver
What is Cygserver?
Cygserver command line options
How to start Cygserver
The Cygserver configuration file
Cygwin Utilities
cygcheck
cygpath
dumper
getfacl
kill
mkgroup
mkpasswd
mount
passwd
ps
regtool
setfacl
ssp
strace
umount
Using Cygwin effectively with Windows
Pathnames
Console Programs
Cygwin and Windows Networking
The cygutils package
Creating shortcuts with cygutils
Printing with cygutils

This chapter explains some key differences between the Cygwin environment and traditional UNIX systems. It assumes a working knowledge of standard UNIX commands.

Mapping path names

Introduction

Cygwin supports both Win32- and POSIX-style paths. Directory delimiters may be either forward slashes or backslashes. Paths using backslashes are always handled as Win32 paths. POSIX paths must only use forward slashes as delimiter, otherwise they are treated as Win32 paths and file access might fail in surprising ways. Note that the usage of Win32 paths, though possible, is deprecated, since it circumvents important internal path handling mechanisms. UNC pathnames (starting with two slashes and a network name) are also supported.

POSIX operating systems (such as Linux) do not have the concept of drive letters. Instead, all absolute paths begin with a slash (instead of a drive letter such as "c:") and all file systems appear as subdirectories (for example, you might buy a new disk and make it be the /disk2 directory).

Because many programs written to run on UNIX systems assume the existance of a single unified POSIX file system structure, Cygwin maintains a special internal POSIX view of the Win32 file system that allows these programs to successfully run under Windows. Cygwin uses this mapping to translate from POSIX to Win32 paths as necessary.

The Cygwin Mount Table

The /etc/fstab file is used to map Win32 drives and network shares into Cygwin's internal POSIX directory tree. This is a similar concept to the typical UNIX fstab file. The mount points stored in /etc/fstab are globally set for all users. Sometimes there's a requirement to have user specific mount points. The Cygwin DLL supports user specific fstab files. These are stored in the directory /etc/fstab.d and the name of the file is the Cygwin username of the user, as it's stored in the /etc/passwd file. The content of the user specifc file is identical to the system-wide fstab file.

The file fstab contains descriptive information about the various file systems. fstab is only read by programs, and not written; it is the duty of the system administrator to properly create and maintain this file. Each filesystem is described on a separate line; fields on each line are separated by tabs or spaces. Lines starting with '#' are comments.

The first field describes the block special device or remote filesystem to be mounted. On Cygwin, this is the native Windows path which the mount point links in. As path separator you MUST use a slash. Usage of a backslash might lead to unexpected results. UNC paths (using slashes, not backslashes) are allowed. If the path contains spaces these can be escaped as '\040'.

The second field describes the mount point for the filesystem. If the name of the mount point contains spaces these can be escaped as '\040'.

The third field describes the type of the filesystem. Cygwin supports any string here, since the file system type is usually not evaluated. The notable exception is the file system type cygdrive. This type is used to set the cygdrive prefix.

The fourth field describes the mount options associated with the filesystem. It is formatted as a comma separated list of options. It contains at least the type of mount (binary or text) plus any additional options appropriate to the filesystem type. Recognized options are binary, text, nouser, user, exec, notexec, cygexec, nosuid, posix=[0|1]. The meaning of the options is as follows.

  acl       - Cygwin uses the filesystem's access control lists (ACLs) to
              implement real POSIX permissions (default).  This flag only
	      affects filesystems supporting ACLs (NTFS) and is ignored
	      otherwise.
  auto      - Ignored.
  binary    - Files default to binary mode (default).
  cygexec   - Treat all files below mount point as cygwin executables.
  exec      - Treat all files below mount point as executable.
  noacl     - Cygwin ignores filesystem ACLs and only fakes a subset of
	      permission bits based on the DOS readonly attribute.  This
	      behaviour is the default on FAT and FAT32.  The flag is
	      ignored on NFS filesystems.
  nosuid    - No suid files are allowed (currently unimplemented).
  notexec   - Treat all files below mount point as not executable.
  nouser    - Mount is a system-wide mount.
  override  - Force the override of an immutable mount point (currently "/").
  posix=0   - Switch off case sensitivity for paths under this mount point
	      (default for the cygdrive prefix).
  posix=1   - Switch on case sensitivity for paths under this mount point
	      (default for all other mount points).
  text      - Files default to CRLF text mode line endings.
  user      - Mount is a user mount.

While normally the execute permission bits are used to evaluate executability, this is not possible on filesystems which don't support permissions at all (like FAT/FAT32), or if ACLs are ignored on filesystems supporting them (see the aforementioned acl mount option). In these cases, the following heuristic is used to evaluate if a file is executable: Files ending in certain extensions (.exe, .com, .bat, .btm, .cmd) are assumed to be executable. Files whose first two characters begin with '#!' are also considered to be executable. The exec option is used to instruct Cygwin that the mounted file is "executable". If the exec option is used with a directory then all files in the directory are executable. This option allows other files to be marked as executable and avoids the overhead of opening each file to check for a '#!'. The cygexec option is very similar to exec, but also prevents Cygwin from setting up commands and environment variables for a normal Windows program, adding another small performance gain. The opposite of these options is the notexec option, which means that no files should be marked as executable under that mount point.

A correct root directory is quite essential to the operation of Cygwin. A default root directory is evaluated at startup so a fstab entry for the root directory is not necessary. If it's wrong, nothing will work as expected. Therefore, the root directory evaluated by Cygwin itself is treated as an immutable mount point and can't be overridden in /etc/fstab... unless you think you really know what you're doing. In this case, use the override flag in the options field in the /etc/fstab file. Since this is a dangerous thing to do, do so at your own risk.

/usr/bin and /usr/lib are by default also automatic mount points generated by the Cygwin DLL similar to the way the root directory is evaluated. /usr/bin points to the directory the Cygwin DLL is installed in, /usr/lib is supposed to point to the /lib directory. This choice is safe and usually shouldn't be changed. An fstab entry for them is not required.

nouser mount points are not overridable by a later call to mount. Mount points given in /etc/fstab are by default nouser mount points, unless you specify the option user. This allows the administrator to set certain paths so that they are not overridable by users. In contrast, all mount points in the user specific fstab file are user mount points.

The fifth and sixth field are ignored. They are so far only specified to keep a Linux-like fstab file layout.

Note that you don't have to specify an fstab entry for the root dir, unless you want to have the root dir pointing to somewhere entirely different (hopefully you know what you're doing), or if you want to mount the root dir with special options (for instance, as text mount).

Example entries:

  • Just a normal mount point:

    c:/foo /bar fat32 binary 0 0
  • A mount point for a textmode mount with case sensitivity switched off:

    C:/foo /bar/baz ntfs text,posix=0 0 0
  • A mount point for a Windows directory with spaces in it:

    C:/Documents\040and\040Settings /docs ext3 binary 0 0
  • A mount point for a remote directory without ACL support:

    //server/share/subdir /srv/subdir smbfs binary,noacl 0 0
  • This is just a comment:

    # This is just a comment
  • Set the cygdrive prefix to /mnt:

    none /mnt cygdrive binary 0 0

Whenever Cygwin generates a Win32 path from a POSIX one, it uses the longest matching prefix in the mount table. Thus, if C: is mounted as /c and also as /, then Cygwin would translate C:/foo/bar to /c/foo/bar. This translation is normally only used when trying to derive the POSIX equivalent current directory. Otherwise, the handling of MS-DOS filenames bypasses the mount table.

If you want to see the current set of mount points valid in your session, you can invoking the Cygwin tool mount without arguments:

Example 3.1. Displaying the current set of mount points

bash$ mount
f:/cygwin/bin on /usr/bin type system (binary,auto)
f:/cygwin/lib on /usr/lib type system (binary,auto)
f:/cygwin on / type system (binary,auto)
e:/src on /usr/src type system (binary)
c: on /cygdrive/c type user (binary,posix=0,user,noumount,auto)
e: on /cygdrive/e type user (binary,posix=0,user,noumount,auto)

You can also use the mount command to add new mount points, and the umount to delete them. However, since they are only noted in memory, these mount points will disappear as soon as your last Cygwin process ends. See the section called “mount” and the section called “umount” for more information.

Note

When you upgrade an existing older Cygwin installation to Cygwin 1.7, your old system mount points (stored in the HKEY_LOCAL_MACHINE branch of your registry) are read by a script and the /etc/fstab file is generated from these entries. Note that entries for /, /usr/bin, and /usr/lib are never generated.

The old user mount points in your HKEY_CURRENT_USER branch of the registry are not used to generate /etc/fstab. If you want to create a user specific /etc/fstab.d/${USER} file from your old entries, there's a script available which does exactly that for you, /bin/copy-user-registry-fstab. Just start the script and it will create your user specific fstab file. Stop all your Cygwin processes and restart them, and you can simply use your old user mount points as before.

The cygdrive path prefix

As already outlined in the section called “File Access”, you can access arbitary drives on your system by using the cygdrive path prefix. The default value for this prefix is /cygdrive, and a path to any drive can be constructed by using the cygdrive prefix and appending the drive letter as subdirectory, like this:

  bash$ ls -l /cygdrive/f/somedir

This lists the content of the directory F:\somedir.

The cygdrive prefix is a virtual directory under which all drives on a system are subsumed. The mount options of the cygdrive prefix is used for all file access through the cygdrive prefixed drives. For instance, assuming the cygdrive mount options are binary,posix=0, then any file /cygdrive/x/file will be opened in binary mode by default (mount option binary, and the case of the filename doesn't matter (mount option posix=0.

The cygdrive prefix may be changed in the fstab file as outlined above. Please note that you must not use the cygdrive prefix for any other mount point. For instance this:

  none /cygdrive cygdrive binary 0 0
  D:   /cygdrive/d somefs text 0 0

will not make file access using the /mnt/d path prefix suddenly using textmode. If you want to mount any drive explicitly in another mode than the cygdrive prefix, use a distinct path prefix:

  none /cygdrive cygdrive binary 0 0
  D:   /mnt/d somefs text 0 0

Additional Path-related Information

The cygpath program provides the ability to translate between Win32 and POSIX pathnames in shell scripts. See the section called “cygpath” for the details.

The HOME, PATH, and LD_LIBRARY_PATH environment variables are automatically converted from Win32 format to POSIX format (e.g. from c:/cygwin\bin to /bin, if there was a mount from that Win32 path to that POSIX path) when a Cygwin process first starts.

Symbolic links can also be used to map Win32 pathnames to POSIX. For example, the command ln -s //pollux/home/joe/data /data would have about the same effect as creating a mount point from //pollux/home/joe/data to /data using mount, except that symbolic links cannot set the default file access mode. Other differences are that the mapping is distributed throughout the file system and proceeds by iteratively walking the directory tree instead of matching the longest prefix in a kernel table. Note that symbolic links will only work on network drives that are properly configured to support the "system" file attribute. Many do not do so by default (the Unix Samba server does not by default, for example).