Как знать, является ли диском SSD или жесткий диск

Найденный решением здесь.

То, что Вы хотите сделать, записать доверяемую программу включения ввода-вывода в 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.

207
21.02.2013, 23:27
10 ответов

Linux автоматически обнаруживает SSD, и начиная с версии 2.6.29 ядра, можно проверить sda с:

cat /sys/block/sda/queue/rotational

Необходимо добраться 1 для жестких дисков и 0 для SSD.

Это не будет, вероятно, работать, если Ваш диск будет логическим устройством, эмулированным аппаратными средствами (как RAID-контроллер).

См. этот ответ для получения дополнительной информации...

328
27.01.2020, 19:27
  • 1
    На Stackoverflow кто-то нашел, что эта sys-информация не работала. –  PythoNic 23.07.2014, 13:55
  • 2
    @totor Лучше добавляет этот комментарий к другому сообщению. Я не знаю его версии :) –  PythoNic 04.09.2014, 16:21
  • 3
    @Totor Вы корректны в "гибридных" дисках. Однако гибриды двойного диска обнаруживаются как два отдельных диска, где SSHD (Твердотельный Гибридный Диск) обнаруживается как единственный диск. Так, SSHD показал бы вращательный из 1. –  Terrance 30.06.2016, 19:18
  • 4
    На виртуальных серверах Вы, возможно, должны выбрать /sys/block/vda/queue/rotational –  MonoThreaded 08.11.2016, 23:45

Использовать smartctl (установка путем установки smartmontools) получать информацию о поставщике,

sudo smartctl -a /dev/sdb

Если Вы видите строку как это,

Rotation Rate: Solid State Device

Это было бы твердотельным диском.

53
27.01.2020, 19:27

проверить cat /proc/scsi/scsi. там необходимо видеть точную модель диска. затем Вы просто гуглите модель для нахождения информации об этом.

10
27.01.2020, 19:27
  • 1
    dmesg будет содержать ту же информацию. dmesg | grep -i -e scsi -e ata –  Matt 21.02.2013, 11:41

В других ответах уже рассказывается, как получить эту информацию несколькими способами, включая / proc . Но вы должны ожидать, что все эти механизмы будут ложными, если на пути есть какая-либо виртуализация, например, гибридный массив SAN с несколькими уровнями, или если машина Linux является виртуальной машиной (где Linux, вероятно, будет сообщать о диске как о базовом вращающемся диске SCSI. , независимо от того, какое на самом деле оборудование)

13
27.01.2020, 19:27

С lsblk (часть пакета util-linux ):

lsblk -d -o name,rota
NAME ROTA
sda     0
sdb     0
sdc     1

где ROTA означает вращательное устройство ( 1 , если истинно, 0 , если ложно)

104
27.01.2020, 19:27

Мне нужно было сделать это на VPS, и ни одно из предложенных решений не помогло,

этот ответ помог

https://serverfault.com/questions/551453/how-do-i-verify-that-my-hosting-provider-gave-me-ssds/551495#551495

Итак, речь идет о чтении случайных данных с диска и оценке времени.

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
29
27.01.2020, 19:27

Это старое сообщение, но я хотел поделиться другим способом сделать это, который я обнаружил случайно:

sg_vpd --page=bdc /dev/sda

Эта команда извлекает Vital Product Data для характеристик блочного устройства. Для диска с вращающейся головкой выходные данные будут включать: Номинальная скорость вращения: 7200 об/мин. Для твердотельного накопителя вывод будет следующим: Невращающийся носитель (например, твердотельный)

3
27.01.2020, 19:27

Введите это в терминале 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.

2
27.01.2020, 19:27
find /sys/block/* -maxdepth 1 -exec echo {} \; -exec grep '0' {}/queue/rotational \; | grep -B1 '^0' | grep '^/' | sed 's/^.*\///g'

Это ищет все блочные устройства и проверяет, является ли оно поворотным (1 ); если не (0 )это ssd.

Здесь отображаются только диски, помеченные как ssd.

2
27.01.2020, 19:27

Если вы хотите быть ленивым и действительно хотите прочитать что-то вроде 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
-1
12.09.2021, 09:49

Теги

Похожие вопросы