Найденный решением здесь.
То, что Вы хотите сделать, записать доверяемую программу включения ввода-вывода в C, который предоставляет доступ только к требуемым портам, затем использует execvp () для выполнения сценария в адресном пространстве вызывающей стороны. Вы будете затем setuid корень к скомпилированному активатору ввода-вывода.
Вот некоторый пример кода, адаптированный из вышеупомянутого источника (убедиться использовать блок адреса, который Вы не возражаете писать в):
#include
#include
#include
#define DESIRED_PORT 0x300
#define NUM_BYTES 8
int main(int argc, char*argv[])
{
if (argc < 2) {
printf("Error: no target program specified.\n");
exit(1);
}
if (ioperm(DESIRED_PORT, NUM_BYTES, 1)) {
printf("Error: couldn't set port permissions.\n");
exit(1);
}
// Set uid to current user's id before executing the script
setgid(getgid());
setuid(getuid());
if (execvp(argv[1], &argv[1]) < 0) {
printf("Error: target program execution error.\n");
exit(1);
}
}
Давайте назовем это io_enable.c, затем скомпилируем и корень setuid:
$ gcc io_enable.c -o io_enable
$ sudo chown root io_enable
$ sudo chmod u+s io_enable
Затем, мы можем протестировать его со следующим сценарием Python:
#!/usr/bin/python
import portio
ADDR = 0x300
fd = open('/tmp/portio.log', 'w')
for i in range(10):
portio.outb(i, ADDR)
fd.write('Wrote %d, read %d.\n' % (i, portio.inb(ADDR)))
fd.close()
Я называю это io_test.py и затем выполняю его как так:
$ ./io_enable python io_test.py
Похож это работает:
$ cat /tmp/portio.log
Wrote 0, read 0.
Wrote 1, read 1.
Wrote 2, read 2.
Wrote 3, read 3.
Wrote 4, read 4.
Wrote 5, read 5.
Wrote 6, read 6.
Wrote 7, read 7.
Wrote 8, read 8.
Wrote 9, read 9.
Linux автоматически обнаруживает SSD, и начиная с версии 2.6.29 ядра, можно проверить sda
с:
cat /sys/block/sda/queue/rotational
Необходимо добраться 1
для жестких дисков и 0
для SSD.
Это не будет, вероятно, работать, если Ваш диск будет логическим устройством, эмулированным аппаратными средствами (как RAID-контроллер).
См. этот ответ для получения дополнительной информации...
Использовать smartctl
(установка путем установки smartmontools
) получать информацию о поставщике,
sudo smartctl -a /dev/sdb
Если Вы видите строку как это,
Rotation Rate: Solid State Device
Это было бы твердотельным диском.
проверить cat /proc/scsi/scsi
. там необходимо видеть точную модель диска. затем Вы просто гуглите модель для нахождения информации об этом.
В других ответах уже рассказывается, как получить эту информацию несколькими способами, включая / proc
. Но вы должны ожидать, что все эти механизмы будут ложными, если на пути есть какая-либо виртуализация, например, гибридный массив SAN с несколькими уровнями, или если машина Linux является виртуальной машиной (где Linux, вероятно, будет сообщать о диске как о базовом вращающемся диске SCSI. , независимо от того, какое на самом деле оборудование)
С lsblk
(часть пакета util-linux
):
lsblk -d -o name,rota
NAME ROTA
sda 0
sdb 0
sdc 1
где ROTA
означает вращательное устройство
( 1
, если истинно, 0
, если ложно)
Мне нужно было сделать это на VPS, и ни одно из предложенных решений не помогло,
этот ответ помог
Итак, речь идет о чтении случайных данных с диска и оценке времени.
time for i in `seq 1 1000`; do
dd bs=4k if=/dev/sda count=1 skip=$(( $RANDOM * 128 )) >/dev/null 2>&1;
done
вот мои результаты для SSD
real 0m1.375s
user 0m0.285s
sys 0m0.944s
и HDD
real 0m14.249s
user 0m0.752s
sys 0m6.284s
Это старое сообщение, но я хотел поделиться другим способом сделать это, который я обнаружил случайно:
sg_vpd --page=bdc /dev/sda
Эта команда извлекает Vital Product Data для характеристик блочного устройства. Для диска с вращающейся головкой выходные данные будут включать: Номинальная скорость вращения: 7200 об/мин. Для твердотельного накопителя вывод будет следующим: Невращающийся носитель (например, твердотельный)
Введите это в терминале Linux:
cat /proc/scsi/scsi
Как у меня:
$ cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: ATA Model: ST1000LM024 HN-M Rev: 0004
Type: Direct-Access ANSI SCSI revision: 05
Host: scsi1 Channel: 00 Id: 00 Lun: 00
Vendor: ATA Model: SAMSUNG SSD PM83 Rev: 3D1Q
Type: Direct-Access ANSI SCSI revision: 05
Host: scsi2 Channel: 00 Id: 00 Lun: 00
Vendor: HL-DT-ST Model: DVD+-RW GT80N Rev: A103
Type: CD-ROM ANSI SCSI revision: 05
Вы можете увидеть модель вашего жесткого диска, если это SSD или HHD.
find /sys/block/* -maxdepth 1 -exec echo {} \; -exec grep '0' {}/queue/rotational \; | grep -B1 '^0' | grep '^/' | sed 's/^.*\///g'
Это ищет все блочные устройства и проверяет, является ли оно поворотным (1 ); если не (0 )это ssd.
Здесь отображаются только диски, помеченные как ssd.
Если вы хотите быть ленивым и действительно хотите прочитать что-то вроде ssd
или hdd
дать
sudo lshw -short -C disk
попробуйте.
Мой вывод показывает оба:
H/W path Device Class Description
=======================================================
/0/100/17/0 /dev/sda disk 1TB TOSHIBA MQ01ABD1
/0/100/17/1 /dev/sdb disk 128GB SSD PHISON 128GB
/0/100/17/0.0.0 /dev/sr0 disk DVDRAM GUD0N
/sys/block/vda/queue/rotational
– MonoThreaded 08.11.2016, 23:45