2009-05-25 59 views
32

Tôi sẵn sàng phát hành một công cụ chỉ hiệu quả với các ổ đĩa cứng thông thường, chứ không chỉ SSD (ổ đĩa thể rắn). Trong thực tế, nó không nên được sử dụng với SSD bởi vì nó sẽ dẫn đến rất nhiều đọc/ghi mà không có hiệu quả thực sự.Có cách nào để phát hiện xem ổ đĩa có phải là ổ SSD không?

Bất cứ ai cũng biết cách phát hiện nếu một ổ đĩa nhất định là trạng thái rắn?

+0

Câu hỏi này có [một câu trả lời trên Unix & Linux] (http://unix.stackexchange.com/questions/65595/how-to-know-if-a-disk-is- an-ssd-hoặc-an-hdd/65602 # 65602). – Totor

+0

[Làm cách nào để kiểm tra xem Ubuntu của tôi có được đặt trên SSD không?] (Http://askubuntu.com/q/792814/253474) –

Trả lời

3

Phát hiện SSD không phải là không thể như dseifert tạo ra. Đã có một số tiến bộ trong libata của linux (http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html), mặc dù nó có vẻ chưa sẵn sàng cho người dùng.

Và tôi chắc chắn hiểu tại sao điều này cần được thực hiện. Đó là cơ bản sự khác biệt giữa một danh sách liên kết và một mảng. Chống phân mảnh và như vậy thường phản tác dụng trên SSD.

0

Thiết bị SSD mô phỏng giao diện thiết bị đĩa cứng, vì vậy chúng chỉ có thể được sử dụng như ổ đĩa cứng. Điều này cũng có nghĩa là không có cách chung để phát hiện chúng là gì.

Bạn có thể sử dụng một số đặc điểm của biến tần (độ trễ, tốc độ, kích thước), mặc dù điều này sẽ không chính xác cho tất cả các ổ đĩa. Một khả năng khác có thể là nhìn vào S.M.A.R.T. dữ liệu và xem liệu bạn có thể xác định loại đĩa thông qua điều này (theo tên model, các giá trị nhất định), tuy nhiên trừ khi bạn giữ một cơ sở dữ liệu của tất cả các ổ đĩa trên mạng, điều này cũng sẽ không chính xác 100%.

+0

Tôi đồng ý, tôi nghĩ cách duy nhất là tìm ra cách các nhà sản xuất tạo ra khóa nối tiếp cho SSD của họ thiết bị như trái ngược với HDD. Sau đó, xây dựng danh sách tất cả các nhà sản xuất và mẫu chuỗi SSD của họ. Tôi đã từng phải tìm một số số serial của thiết bị để xác định xem chúng có phù hợp với nhu cầu của tôi hay không (iPod dành cho thị trường Mỹ, bộ định tuyến Linksys với Linux fw) – Mihaela

+0

Không đúng khi nói khóa nối tiếp là cách duy nhất có thể. Một số ổ đĩa tự báo cáo RPM của chúng là 1 hoặc 0 (http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg02562.html) –

+1

Có thể bạn đã đúng, nhưng tôi không chắc chắn. "Một số ổ đĩa" -> có vấn đề, nó phải là tất cả các ổ đĩa, không có đầu cơ. – Mihaela

8

Bạn thực sự có thể dễ dàng xác định độ trễ quay - tôi đã thực hiện điều này một lần như một phần của dự án đại học. Nó được mô tả trong this report. Bạn sẽ muốn chuyển sang trang 7 nơi bạn thấy một số đồ thị đẹp về độ trễ. Nó đi từ khoảng 9,3 ms đến 1,1 ms - giảm 8,2 ms. Điều đó tương ứng trực tiếp với 60 s/8.2 ms = 7317 RPM.

Nó được thực hiện with simple C code - đây là phần đo giữa các vị trí ab trong tệp cào. Chúng tôi đã làm điều này với lớn hơn và lớn hơn b giá trị cho đến khi chúng tôi đã lang thang tất cả các con đường xung quanh một hình trụ:

 
/* Measure the difference in access time between a and b. The result 
* is measured in nanoseconds. */ 
int measure_latency(off_t a, off_t b) { 
    cycles_t ta, tb; 

    overflow_disk_buffer(); 

    lseek(work_file, a, SEEK_SET); 
    read(work_file, buf, KiB/2); 

    ta = get_cycles(); 
    lseek(work_file, b, SEEK_SET); 
    read(work_file, buf, KiB/2); 
    tb = get_cycles(); 

    int diff = (tb - ta)/cycles_per_ns; 
    fprintf(stderr, "%i KiB to %i KiB: %i nsec\n", a/KiB, b/KiB, diff); 
    return diff; 
} 
+0

Không phải mã C! Jeff không bao giờ có thể xử lý điều đó! PS: Có được điều này được đề cập trên diễn viên pod và chúng tôi nhận được để uống! – geoffc

+0

Hehe :-) Tôi chỉ thấy thẻ "delphi" ... xin lỗi về điều đó :-) Tôi tin tưởng bạn guys guys để chuyển đổi nó sang Pascal, tôi đã không sử dụng Delphi trong nhiều năm. –

3

Bạn có thể nhận được may mắn bằng cách chạy

smartctl -i sda 

từ Smartmontools. Hầu như tất cả các ổ SSD đều có SSD trong trường Model. Không có đảm bảo mặc dù.

+0

Ý bạn là 'smartctl -i/dev/sda' – EarthMind

29

Cuối cùng là giải pháp đáng tin cậy! Hai trong số họ, thực sự!

Kiểm tra/sys/block/sdX/queue/rotational, trong đó sdX là tên ổ đĩa. Nếu đó là 0, bạn đang xử lý một SSD và 1 có nghĩa là ổ cứng cũ.

Tôi không thể đặt ngón tay lên phiên bản Linux nơi nó được giới thiệu, nhưng nó có trong Ubuntu 3.2 của Linux và trong vanilla Linux 3.6 và không có trong vanilla 2.6.38. Oracle cũng có backported nó với hạt nhân Enterprise không thể phá vỡ 5.5, dựa trên 2.6.32.

Ngoài ra còn có một ioctl để kiểm tra xem ổ đĩa có quay hay không từ Linux 3.3, được giới thiệu bởi this commit. Tuy nhiên, việc sử dụng sysfs thường thuận tiện hơn.

+0

Cũng có trong RHEL 6.4. – Raedwald

+6

Tôi đã cố gắng điều này và 'quay 'nằm. – Flimm

+3

@Flimm vui lòng [gửi báo cáo lỗi hạt nhân] (https://bugzilla.kernel.org/) về việc này. – Totor

0

Hai xu của tôi để trả lời câu hỏi cũ nhưng rất quan trọng này ... Nếu đĩa được truy cập qua SCSI, thì bạn sẽ (có khả năng) có thể sử dụng lệnh SCSI INQUIRY để yêu cầu tốc độ quay của nó.Trang VPD (Dữ liệu Sản phẩm Quan trọng) được gọi là Block Device Characteristics và có số 0xB1. Bytes 4 và 5 của trang này chứa một số với ý nghĩa:

  • 0000h "tốc độ quay vừa không được báo cáo"
  • 0001h "Non-quay trung bình (ví dụ, trạng thái rắn)"
  • 0002h - 0400h "Dành riêng"
  • 0401h - FFFEh "danh nghĩa tỷ lệ luân chuyển trung bình trong vòng một phút (ví dụ, rpm) (ví dụ: 7 200 rpm = 1C20h, 10 000 rpm = 2710h, và 15 000 rpm = 3A98h)"
  • FFFFh "Đã đặt trước"

Vì vậy, SSD phải có 0001h trong trường này. Tài liệu T10.org về trang này có thể được tìm thấy here.

Tuy nhiên, trạng thái triển khai của tiêu chuẩn này không rõ ràng đối với tôi.

0

Tôi đã viết mã javascript sau. Tôi cần xác định xem máy có đang sử dụng ổ SSD và nếu đó là ổ đĩa khởi động. Giải pháp sử dụng giao diện MSFT_PhysicalDisk WMI.

function main() 
{ 
    var retval= false; 
    // MediaType - 0 Unknown, 3 HDD, 4 SSD 
    // SpindleSpeed - -1 has rotational speed, 0 has no rotational speed (SSD) 
    // DeviceID - 0 boot device 
    var objWMIService = GetObject("winmgmts:\\\\.\\root\\Microsoft\\Windows\\Storage"); 
    var colItems = objWMIService.ExecQuery("select * from MSFT_PhysicalDisk"); 
    var enumItems = new Enumerator(colItems); 
    for (; !enumItems.atEnd(); enumItems.moveNext()) 
    { 
     var objItem = enumItems.item(); 
     if (objItem.MediaType == 4 && objItem.SpindleSpeed == 0) 
     { 
      if (objItem.DeviceID ==0) 
      { 
       retval=true; 
      } 
     } 
    } 
    if (retval) 
    { 
     WScript.Echo("You have SSD Drive and it is your boot drive."); 
    } 
    else 
    { 
     WScript.Echo("You do not have SSD Drive"); 
    } 
    return retval; 
} 
main(); 
+2

Đây không phải là câu trả lời. – TomSlick

3

lsblk -d -o name,rota liệt kê các ổ đĩa của bạn và có 1 tại ROTA nếu đó là ổ đĩa quay và 0 nếu là ổ SSD. sản lượng Ví dụ:

 
NAME ROTA 
sda  1 
sdb  0 
Các vấn đề liên quan