Làm thế nào để vô hiệu hóa kernel dò tìm ổ đĩa?


9

Tôi có máy tính xách tay samsung với SSD 30 GB ExpressCache SanDisk được hàn trên mainbord. SSD đã chết (gây ra hàng tấn lỗi khi tôi cố truy cập bằng cách nào đó), nhưng nó vẫn bị phát hiện khi khởi động kernel, tôi thấy đó là phân vùng, sự thống nhất của Ubuntu cho thấy biểu tượng ổ đĩa không thể đếm được trong ngăn kéo ứng dụng và tệ nhất là tôi không thể treo máy tính xách tay , vì gửi lệnh đình chỉ đến thiết bị ssd không thành công. Tôi đã cố gắng truyền tham số kernel sdb = nopcoat, nhưng có vẻ như nó đã bị lỗi thời từ lâu trong kernel 3.8.0 (Ubuntu 13.04). Làm cách nào để tắt thiết bị sata trong các kernel gần đây?

Câu trả lời:


1

Hai giải pháp ở đây: một là nhanh chóng để áp dụng, mặc dù chỉ giải quyết được một phần, một là giải pháp hoàn chỉnh nhưng yêu cầu bạn phải biên dịch kernel của riêng bạn.

Câu trả lời đúng là một bản vá kernel.

Robin H. Johnson đã viết một bản vá cho trình điều khiển hạt nhân SATA ( tìm thấy nó trong trang web trao đổi ngăn xếp Unix / Linux ) ẩn hoàn toàn ổ đĩa.

Cập nhật Bản vá hiện đang ngược dòng (ít nhất là trong kernel ổn định 3.12.7), xem kho git . Tôi đã yêu cầu backport trong launchpad Ubuntu .

Sau khi bản vá được cài đặt, thêm

 libata.force=2.00:disable

các tham số khởi động kernel sẽ ẩn đĩa khỏi kernel Linux. Kiểm tra kỹ xem số đó có đúng không; tìm kiếm tên thiết bị có thể giúp:

(0)samsung-romano:~% dmesg | grep iSSD
[    1.493279] ata2.00: ATA-8: SanDisk iSSD P4 8GB, SSD 9.14, max UDMA/133
[    1.494236] scsi 1:0:0:0: Direct-Access     ATA      SanDisk iSSD P4  SSD  PQ: 0 ANSI: 5

Giải pháp thay thế

Đã được trả lời bởi người dùng Unix StackExchange Emmanuel trong https://unix.stackexchange.com/a/103742/52205

Bạn ít nhất có thể giải quyết vấn đề đình chỉ bằng cách ban hành lệnh

echo 1 > /sys/block/sdb/device/delete

trước khi đình chỉ.

Để tự động hóa nó, tôi đã thêm tệp sau: (lưu ý các cờ, nó phải được thực thi)

-rwxr-xr-x 1 root root 204 Dec  6 16:03 99_delete_sdb

trong thư mục /etc/pm/sleep.d/

#!/bin/sh

# Tell grub that resume was successful

case "$1" in
    suspend|hibernate)
        if [ -d /sys/block/sdb ]; then
            echo Deleting device sdb 
            echo 1 > /sys/block/sdb/device/delete       
        fi
        ;;
esac

... và bây giờ hệ thống tạm dừng (và tiếp tục) một cách chính xác. Tôi đã thêm đoạn trích

if [ -d /sys/block/sdb ]; then
      echo Deleting device sdb 
      echo 1 > /sys/block/sdb/device/delete     
fi

đến /etc/rc.localquá, cho biện pháp tốt.


Cảm ơn @Rmano, công cụ echo đã làm việc. Nhưng không rõ, tôi nên đặt 99_delete_sdbtập tin thực thi ở đâu? Trong /etc/rc0.d/có thể?
Serge Melekhin

Xin lỗi --- đã thêm thông tin liên quan.
Rmano

5

Tôi đã đi và viết một bản vá kernel cho bạn để thực hiện khả năng vô hiệu hóa một đĩa đơn khi khởi động, do đó bạn không cần phải vô hiệu hóa nó trong udev hoặc chờ trong quá trình khởi động ban đầu.

http://dev.gentoo.org/~robbat2/patches/3.13-libata-disable-disks-by-param.patch

Nên áp dụng cho nhiều hạt nhân rất dễ dàng (dòng trên nó đã được thêm 2013-05-21 / v3.10-rc1 *, nhưng có thể được áp dụng một cách an toàn mà không cần dòng đó).


1
Cảm ơn những nỗ lực của bạn. Có lẽ bạn có thể nhận xét (đối với những người không quá quen thuộc với các bản vá kernel), cách áp dụng bản vá và cách sử dụng nó (có thể sdb=disablelà tham số kernel).
mpy

1
kernel.org/doc/Documentation/appelling-patches.txt bao gồm việc áp dụng các bản vá kernel nói chung, nhưng nhiều bản phân phối có các phương pháp cụ thể để áp dụng các bản vá. Bản vá này cụ thể hơn thực hiện một cờ lực 'vô hiệu hóa' cho libata. Người dùng sẽ cần sử dụng nó với libata.force = ID: vô hiệu hóa trong đó ID là một số hoặc số. Số tuple xác định ổ đĩa trong câu hỏi.
robbat2

Tôi không biết hướng dẫn này: wiki.ubfox.com/Kernel/BuildYourOwnKernel được cập nhật. Tôi sẽ cố gắng nếu tôi có thể trong tuần này ...
Rmano

Nhân tiện, trong trường hợp Máy tính xách tay Samsung, lệnh có lẽ phải là "libata.force = 2.00: vô hiệu hóa" ( grep iSSD /var/log/syslogsẽ cung cấp cho bạn một gợi ý).
Rmano

1
FYI, nó được hợp nhất với kernel cho 3.13 cũng như cây kernel ổn định. Tuy nhiên, tùy chọn gật đầu KHÔNG được chấp nhận.
robbat2

0

Tôi đã nghiên cứu điều này và tìm thấy một giải pháp có thể được thực hiện khá dễ dàng trên Ubuntu. Bản phân phối sử dụng kmod, do đó, phần sau sẽ hoạt động tốt trên phần đó và bất kỳ bản phân phối nào sử dụng kmod.

Tùy thuộc vào trình điều khiển nào bạn đang sử dụng, bạn sẽ cần đưa vào danh sách đen nếu bạn muốn tắt tất cả các thiết bị SATA. Hãy thử lsmod | grep satavà tìm ra trình điều khiển nào bạn đang sử dụng. Sau đó, trong việc /etc/modprobe.d/tạo một tệp mới của bạn echo blacklist (module) > blacklist.confđể thêm nó vào danh sách đen. Xây dựng lại initramfs của bạn với mkinitramfsnó để có hiệu lực. Khởi động lại.

Thay phiên, chỉ cần thêm modprobe.blacklist=(module)vào các tham số kernel của bạn.


1
Nó sẽ vô hiệu hóa tất cả các thiết bị sata bao gồm cả ổ cứng, vì vậy máy tính xách tay của tôi sẽ không khởi động được nữa. Và hỗ trợ sata được biên dịch thành kernel (không phải là một mô-đun), vì vậy tôi không thể đưa vào danh sách đen.
Serge Melekhin

Được rồi, vì vậy sau đó chỉ cần mở máy tính xách tay của bạn và tháo ổ đĩa ...
Hector

Thật không may, tôi không đủ năng lực để làm điều đó - nó được hàn trên mainbord, không được gắn qua cáp sata. Tôi thậm chí không chắc chắn rằng máy tính xách tay sẽ hoạt động nếu tôi chỉ gỡ bỏ nó.
Serge Melekhin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.