Я хочу вставить виртуальный жесткий диск (или что-нибудь еще), чтобы он занимал системный блок /dev/sdb, как я могу это сделать в Linux (Ubuntu и Debian)?
4 ответа
Создайте файл такого размера, каким вы хотите, чтобы этот виртуальный жесткий диск был (размер файла 1Mx1024 или 1 ГБ следующий:)
dd if=/dev/zero of=virtual_hard_drive.bin bs=1M count=1024
Создайте петлевое устройство вместо /dev/sdb
mknod /dev/sdb b 7 500
Нет, это не сработает, если у вас уже есть /dev/sdb
.
Вам нужно будет заменить 500 на другое число в крайне маловероятном случае, если у вас есть /dev/loop500
.
Теперь назначьте свой файл этому устройству цикла
losetup /dev/sdb virtual_hard_drive.bin
Итак, теперь у вас есть файл, работающий как жесткий диск, через механизм циклического устройства Linux. На этом этапе вы хотите отформатировать его с помощью mke2fs /dev/sdb
или аналогичного, а затем смонтировать его обычным способом.
Чтобы заставить это работать при загрузке, потребуется некоторое редактирование сценариев времени загрузки, так как сценарии, которые проверяют fstab
, не будут превращать /dev/sdb
в устройство цикла при загрузке самостоятельно.
Если вы на самом деле не нужен объем там, вы можете сделать что - то вроде ln -s /dev/sdb /dev/full
, чтобы /dev/sdb
"точку" в full
мере (или zero
или null
или даже dvdrom
виртуальной устройства.
Зачем вам именно это /dev/sdb
? Я думаю, вам нужно объяснить, почему вы хотите, чтобы что-то занимало этот узел блочного устройства, потому что вы не можете просто что-то использовать. Если у вас есть программное обеспечение, которое хочет читать /dev/sdb
, вы можете просто изменить программное обеспечение.
В худшем случае вы можете использовать симулятор хоста отладки SCSI. Просто выполните modprobe scsi_debug
, и значения по умолчанию должны предоставить одно устройство SCSI. Обратите внимание, что он не будет явно находиться в /dev/sdb
, но всегда будет следующим доступным устройством SCSI.
Если вы хотите использовать необработанный файл образа диска, вы можете использовать петлевые устройства для доступа к нему в качестве блочного устройства (например, /dev/sdb
).
- Создайте пустое изображение:
dd if=/dev/zero of=/path/to/the/image bs=1M count=10240
Это создаст пустое изображение размером 10 ГиБ. - Свяжите изображение с устройством цикла:
sudo losetup -f --show /path/to/the/image
Это напечатает используемое устройство петли. Допустим, это/dev/loop0
. - Создать разделы (и файловые системы):
sudo gparted /dev/loop0
- Переместите оригинал
/dev/sdb
: для входаfor a in /dev/sdb* ; do sudo mv "$a" "$a-orig" ; done
- Скопируйте петлевые устройства вместо
/dev/sdb
:l=/dev/loop0 ; d=/dev/sdb ; sudo cp -a "$l" "$d" ; for a in "$l"* ; do sudo cp -a "$a" "$d${a#$l}" ; done
После этого у вас будет образ диска /path/to/the/image
доступный как /dev/sdb
включая разделы.
Решения, основанные на losetup
приведенных выше, не создают блочное устройство SCSI, следовательно, они не создают узел устройства /dev/sd*
и для его создания требуется некоторое переименование или связывание, а некоторые программы могут не найти устройство подходящим. так как он не использует подсистему SCSI.
Можно создать дисковое устройство SCSI, которое поддерживается разделом или файлом, используя targetcli
. См. Http://linux-iscsi.org/wiki/Tcm_loop и https://stackoverflow.com/questions/30972176/creating-a-loopback-device-in-lio-scsi-target, где рассматриваются проблемы с этими инструкциями. , Как и в случае симулятора хоста отладки SCSI, предложенного @ robbat2, этому устройству будет присвоен следующий доступный идентификатор.
Я понял, что симулятор хоста отладки SCSI поддерживается ОЗУ, поэтому он нестабилен. С помощью метода, который я предлагаю здесь, данные будут фактически записаны в раздел или файл.