/* Если функция вызывается впервые, открываем файл /dev/random
и сохраняем его дескриптор. */
if (dev_random_fd == -1) {
dev_random_fd = open("/dev/random", O_RDONLY);
assert(dev_random_fd != -1);
}
/* Читаем столько байтов, сколько необходимо для заполнения
целочисленной переменной. */
next_random_byte = (char*)&random_value;
bytes_to_read = sizeof(random_value);
/* Цикл выполняется до тех пор, пока не будет прочитано
требуемое количество байтов. Поскольку файл /dev/random
заполняется в результате пользовательских действий,
при длительном отсутствии активности операция чтения
может быть заблокирована или возвращать
лишь один байт за раз. */
do {
int bytes_read;
bytes_read =
read(dev_random_fd, next_random_byte, bytes_to_read);
bytes_to_read -= bytes_read;
next_random_byte += bytes_read;
} while (bytes_to_read > 0);
/* Вычисляем случайное число в правильном диапазоне. */
return min + (random_value % (max - min + 1));
}
6.5.5. Устройства обратной связи
disk-image
(естественно, сам этот файл должен размещаться на реальном диске, размер которого больше имитируемого).Устройства обратной связи называются /dev/loop0
/dev/loop1
и т.д. Каждому из них соответствует одно виртуальное блочное устройство. Создавать такие устройства может только суперпользователь.Устройство обратной связи используется так же, как и любое другое блочное устройство. В частности, на нем можно создать файловую систему и смонтировать ее подобно файловой системе обычного диска или раздела. Такая файловая система, целиком размещаемая в дисковом файле, называется
Ниже описана последовательность действий, которые необходимо выполнить, чтобы создать виртуальную файловую систему и смонтировать ее на устройстве обратной связи.
1. Создайте пустой файл, который будет содержать образ ВФС. Размер файла должен соответствовать видимому размеру виртуальной файловой системы после ее монтирования.
Проще всего создать файл фиксированного размера с помощью команды dd
/dev/zero
.Файл disk-image
% dd if=/dev/zero of=/trap/disk-image count=20480
20480+0 records in
20480+0 records out
% ls -l /tmp/disk-image
-rw-rw---- 1 root root 10485760 Mar 8 01:56 /trap/disk-image
2. Только что созданный файл заполнен нулевыми байтами. Теперь следует сформировать в нем файловую систему. При этом будут созданы управляющие структуры, предназначенные для организации и хранения файлов, и корневой каталог.
Файловая система может иметь любой тип. Команда mke2fs
ext2
(чаще всего используется в жестких дисках Linux-систем). Поскольку команда обычно работает с блочными устройствами, она потребует подтверждение:% mke2fs -q /tmp/disk-image
mke2fs 1.18, 11-Nov-1999 for EXT2 FS 0.5b, 95/08/09
disk-image is not a block special device.
Proceed anyway? (y,n) y
Опция -q
Теперь файл disk-image