Chapter 27. /dev and /proc

A Linux or UNIX machine typically has the /dev and /proc special-purpose directories.

27.1. /dev

The /dev directory contains entries for the physical devices that may or may not be present in the hardware. [1] The hard drive partitions containing the mounted filesystem(s) have entries in /dev, as a simple df shows.

 bash$ df
 Filesystem           1k-blocks      Used Available Use%
 Mounted on
 /dev/hda6               495876    222748    247527  48% /
 /dev/hda1                50755      3887     44248   9% /boot
 /dev/hda8               367013     13262    334803   4% /home
 /dev/hda5              1714416   1123624    503704  70% /usr
 	      

Among other things, the /dev directory also contains loopback devices, such as /dev/loop0. A loopback device is a gimmick that allows an ordinary file to be accessed as if it were a block device. [2] This enables mounting an entire filesystem within a single large file. See Example 16-8 and Example 16-7.

A few of the pseudo-devices in /dev have other specialized uses, such as /dev/null, /dev/zero, /dev/urandom, /dev/sda1, /dev/udp, and /dev/tcp.

For instance:

To mount a USB flash drive, append the following line to /etc/fstab. [3]
   1 /dev/sda1    /mnt/flashdrive    auto    noauto,user,noatime    0 0
(See also Example A-24.)

Checking whether a disk is in the CD-burner (soft-linked to /dev/hdc):
   1 head -1 /dev/hdc
   2 
   3 
   4 #  head: cannot open '/dev/hdc' for reading: No medium found
   5 #  (No disc in the drive.)
   6 
   7 #  head: error reading '/dev/hdc': Input/output error
   8 #  (There is a disk in the drive, but it can't be read;
   9 #+  possibly it's an unrecorded CDR blank.)   
  10 
  11 #  Stream of characters and assorted gibberish
  12 #  (There is a pre-recorded disk in the drive,
  13 #+  and this is raw output -- a stream of ASCII and binary data.)
  14 #  Here we see the wisdom of using 'head' to limit the output
  15 #+ to manageable proportions, rather than 'cat' or something similar.
  16 
  17 
  18 #  Now, it's just a matter of checking/parsing the output and taking
  19 #+ appropriate action.

When executing a command on a /dev/tcp/$host/$port pseudo-device file, Bash opens a TCP connection to the associated socket.

Getting the time from nist.gov:

 bash$ cat </dev/tcp/time.nist.gov/13
 53082 04-03-18 04:26:54 68 0 0 502.3 UTC(NIST) *
 	      

[Mark contributed the above example.]

Downloading a URL:

 bash$ exec 5<>/dev/tcp/www.net.cn/80
 bash$ echo -e "GET / HTTP/1.0\n" >&5
 bash$ cat <&5
 	      

[Thanks, Mark and Mihai Maties.]


Example 27-1. Using /dev/tcp for troubleshooting

   1 #!/bin/bash
   2 # dev-tcp.sh: /dev/tcp redirection to check Internet connection.
   3 
   4 # Script by Troy Engel.
   5 # Used with permission.
   6  
   7 TCP_HOST=www.dns-diy.com   # A known spam-friendly ISP.
   8 TCP_PORT=80                # Port 80 is http.
   9   
  10 # Try to connect. (Somewhat similar to a 'ping' . . .) 
  11 echo "HEAD / HTTP/1.0" >/dev/tcp/${TCP_HOST}/${TCP_PORT}
  12 MYEXIT=$?
  13 
  14 : <<EXPLANATION
  15 If bash was compiled with --enable-net-redirections, it has the capability of
  16 using a special character device for both TCP and UDP redirections. These
  17 redirections are used identically as STDIN/STDOUT/STDERR. The device entries
  18 are 30,36 for /dev/tcp:
  19 
  20   mknod /dev/tcp c 30 36
  21 
  22 >From the bash reference:
  23 /dev/tcp/host/port
  24     If host is a valid hostname or Internet address, and port is an integer
  25 port number or service name, Bash attempts to open a TCP connection to the
  26 corresponding socket.
  27 EXPLANATION
  28 
  29    
  30 if [ "X$MYEXIT" = "X0" ]; then
  31   echo "Connection successful. Exit code: $MYEXIT"
  32 else
  33   echo "Connection unsuccessful. Exit code: $MYEXIT"
  34 fi
  35 
  36 exit $MYEXIT

Notes

[1]

The entries in /dev provide mount points for physical and virtual devices. These entries use very little drive space.

Some devices, such as /dev/null, /dev/zero, and /dev/urandom are virtual. They are not actual physical devices and exist only in software.

[2]

A block device reads and/or writes data in chunks, or blocks, in contrast to a character device, which acesses data in character units. Examples of block devices are a hard drive and CD ROM drive. An example of a character device is a keyboard.

[3]

Of course, the mount point /mnt/flashdrive must exist. If not, then, as root, mkdir /mnt/flashdrive.

To actually mount the drive, use the following command: mount /mnt/flashdrive

Newer Linux distros automount flash drives in the /media directory.