Глава 28. /dev/zero и /dev/null


/dev/null

Псевдоустройство /dev/null — это, своего рода, "черная дыра" в системе. Это, пожалуй, самый близкий смысловой эквивалент. Все, что записывается в этот файл, "исчезает" навсегда. Попытки записи или чтения из этого файла не дают, ровным счетом, никакого результата. Тем не менее, псевдоустройство /dev/null вполне может пригодиться.

Подавление вывода на stdout.

  1. cat $filename >/dev/null
  2. # Содержимое файла $filename не появится на stdout.


Подавление вывода на stderr (from Пример 12-3).

  1. rm $badname 2>/dev/null
  2. #           Сообщение об ошибке "уйдет в никуда".


Подавление вывода, как на stdout, так и на stderr.

  1. cat $filename 2>/dev/null >/dev/null
  2. # Если "$filename" не будет найден, то вы не увидите сообщения об ошибке.
  3. # Если "$filename" существует, то вы не увидите его содержимое.
  4. # Таким образом, вышеприведенная команда ничего не выводит на экран.
  5. #
  6. #  Такая методика бывает полезной, когда необходимо лишь проверить код завершения команды
  7. #+ и нежелательно выводить результат работы команды на экран.
  8. #
  9. # cat $filename &>/dev/null
  10. #     дает тот же результат, автор примечания Baris Cicek.


Удаление содержимого файла, сохраняя, при этом, сам файл, со всеми его правами доступа (очистка файла) (из Пример 2-1 и Пример 2-2):

  1. cat /dev/null > /var/log/messages
  2. #  : > /var/log/messages   дает тот же эффект, но не порождает дочерний процесс.
  3. cat /dev/null > /var/log/wtmp


Автоматическая очистка содержимого системного журнала (logfile) (особенно хороша для борьбы с надоедливыми рекламными идентификационными файлами ("cookies")):

Пример 28-1. Удаление cookie-файлов

  1. if [ -f ~/.netscape/cookies ]  # Удалить, если имеются.
  2. then
  3.   rm -f ~/.netscape/cookies
  4. fi
  5. ln -s /dev/null ~/.netscape/cookies
  6. # Теперь, все cookie-файлы, вместо того, чтобы сохраняться на диске, будут "вылетать в трубу".
/dev/zero

Подобно псевдоустройству /dev/null, /dev/zero так же является псевдоустройством, с той лишь разницей, что содержит нули (здесь имеются ввиду двоичные нули, а не символы "0" ASCII). Информация, выводимая в этот файл, так же бесследно исчезает. Чтение нулей из этого файла может вызвать некоторые затруднения, однако это можно сделать, к примеру, с помощью команды od или шестнадцатиричного редактора. В основном, /dev/zero используется для создания заготовки файла с заданой длиной.

Пример 28-2. Создание файла подкачки (swapfile), с помощью /dev/zero

  1. #!/bin/bash
  2. # Создание файла подкачки.
  3. # Этот сценарий должен запускаться с правами root.
  4. ROOT_UID=0         # Для root — $UID 0.
  5. E_WRONG_USER=65    # Не root?
  6. FILE=/swap
  7. BLOCKSIZE=1024
  8. MINBLOCKS=40
  9. SUCCESS=0
  10. if [ "$UID" -ne "$ROOT_UID" ]
  11. then
  12.   echo; echo "Этот сценарий должен запускаться с правами root."; echo
  13.   exit $E_WRONG_USER
  14. fi
  15. blocks=${1:-$MINBLOCKS}          #  По-умолчанию — 40 блоков,
  16.                                  #+ если размер не задан из командной строки.
  17. # Ниже приводится эквивалентный набор команд.
  18. # --------------------------------------------------
  19. # if [ -n "$1" ]
  20. # then
  21. #   blocks=$1
  22. # else
  23. #   blocks=$MINBLOCKS
  24. # fi
  25. # --------------------------------------------------
  26. if [ "$blocks" -lt $MINBLOCKS ]
  27. then
  28.   blocks=$MINBLOCKS              # Должно быть как минимум 40 блоков.
  29. fi
  30. echo "Создание файла подкачки размером $blocks блоков (KB)."
  31. dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks  # "Забить" нулями.
  32. mkswap $FILE $blocks             # Назначить как файл подкачки.
  33. swapon $FILE                     # Активировать.
  34. echo "Файл подкачки создан и активирован."
  35. exit $SUCCESS

Еще одна область применения /dev/zero"очистка" специального файла заданного размера, например файлов, монтируемых как loopback-устройства (см. Пример 13-7) или для безопасного удаления файла (см. Пример 12-45).

Пример 28-3. Создание электронного диска

  1. #!/bin/bash
  2. # ramdisk.sh
  3. #  "электронный диск" — это область в ОЗУ компьютера
  4. #+ с которой система взаимодействует как с файловой системой.
  5. #  Основное преимущество — очень высокая скорость чтения/записи.
  6. #  Недостатки — энергозависимость, уменьшение объема ОЗУ, доступного системе,
  7. #                относительно небольшой размер.
  8. #
  9. #  Чем хорош электронный диск?
  10. #  При хранении наборов данных, таких как таблиц баз данных или словарей, на электронном диске
  11. #+ вы получаете высокую скорость работы с этими наборами, поскольку время доступа к ОЗУ
  12. #  неизмеримо меньше времени доступа к жесткому диску.
  13. E_NON_ROOT_USER=70             # Сценарий должен запускаться с правами root.
  14. ROOTUSER_NAME=root
  15. MOUNTPT=/mnt/ramdisk
  16. SIZE=2000                      # 2K блоков (измените, если это необходимо)
  17. BLOCKSIZE=1024                 # размер блока — 1K (1024 байт)
  18. DEVICE=/dev/ram0               # Первое устройство ram
  19. username=`id -nu`
  20. if [ "$username" != "$ROOTUSER_NAME" ]
  21. then
  22.   echo "Сценарий должен запускаться с правами root."
  23.   exit $E_NON_ROOT_USER
  24. fi
  25. if [ ! -d "$MOUNTPT" ]         #  Проверка наличия точки монтирования,
  26. then                           #+ благодаря этой проверке, при повторных запусках сценария
  27.   mkdir $MOUNTPT               #+ ошибки возникать не будет.
  28. fi
  29. dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE  # Очистить электронный диск.
  30. mke2fs $DEVICE                 # Создать файловую систему ext2.
  31. mount $DEVICE $MOUNTPT         # Смонтировать.
  32. chmod 777 $MOUNTPT             # Сделать электронный диск доступным для обычных пользователей.
  33.                                # Но при этом, только root сможет его отмонтировать.
  34. echo "Электронный диск \"$MOUNTPT\" готов к работе."
  35. # Теперь электронный диск доступен для любого пользователя в системе.
  36. #  Внимание! Электронный диск — это энергозависимое устройство! Все данные, хранящиеся на нем,
  37. #+ будут утеряны при остановке или перезагрузке системы.
  38. #  Если эти данные представляют для вас интерес, то сохраняйте их копии в обычном каталоге.
  39. # После перезагрузки, чтобы вновь создать электронный диск, запустите этот сценарий.
  40. # Простое монтирование /mnt/ramdisk, без выполнения подготовительных действий, не будет работать.
  41. exit 0