How can I tell linux kernel to completely ignore a disk as if it was not even connected?

Notice

Please scroll down for the answer (it has few points but it is the correct one). The problem is solved by a patch that will be in kernel 3.12.7 and up; I hope it will back-ported to earlier ones, too.

My laptop is a Samsung Chronos serie s 7. Ubuntu Gnome Remix 13.04, with Intel updated drivers.

I have a problem with the internal SSD drive (8G capacity). It fails with COMRESET and input/output errors. I am quite convinced that the problem is hardware; unfortunately I do not have Windows installed in the laptop to check if it's a matter of SSD configuration or whatever.

The problem is that the disk is recognized by udev:

KERNEL[9.515930] add /devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0/block/sdb (block)
ACTION=add
DEVNAME=sdb
DEVPATH=/devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0/block/sdb
DEVTYPE=disk
MAJOR=8
MINOR=16
SEQNUM=1785
SUBSYSTEM=block
UDEV_LOG=3

and after that it fails in a lot of checks, delaying boot, delaying shutdown, and making (I think) suspend impossible.

Is it possible to tell Linux to completely ignore anything on the ata2 link? I tried adding this line to /etc/udev/rules.d/10-local.rules

SUBSYSTEMS=="pci" DRIVERS=="ahci" KERNELS=="ata2" OPTIONS=="ignore_device"

but it doesn't work.

On the other hand, if anyone knows how to reset the SSD if it was left in "cache" mode without using Windows... or to boot a "live" windows to do the same...

Thanks!

Data added:

Full udevadm info -a -n /dev/sdb pasted to

smartctl -i /dev/sdb -T permissive gives:

root@samsung-romano:/home/romano# smartctl -i /dev/sdb -T permissive
smartctl 5.43 2012-06-30 r3573 [x86_64-linux-3.8.0-31-generic] (local build)
Copyright (C) 2002-12 by Bruce Allen,
Vendor: /1:0:0:0
Product:
User Capacity: 600,332,565,813,390,450 bytes [600 PB]
Logical block size: 774843950 bytes
>> Terminate command early due to bad response to IEC mode page

which is clearly wrong. Nevertheless:

root@samsung-romano:/home/romano# fdisk -b 512 -C 970 -H 256 -S 63 /dev/sdb
fdisk: unable to read /dev/sdb: Input/output error

(SSD data from ).

ADDITIONAL THOUGHT:

Could all this being a side effect of the Intel Smart Response Technology not being disabled before installing Linux? If yes, how can I check it short of reinstalling a windows on the machine? Or this is a shot in the dark? (In the bios the SSD drive doesn't show and there is nothing about Intel SRT).

ABOUT MARKING AS DUPLICATE:

I changed the title of the question; I do not think that the linked question answers my problem. I positively know that the SSD is failing. I am asking if it's possible to tell the linux kernel to not probe for it at all.

8

6 Answers

Two solutions here: one is fast to apply, although solves the problem only partially, the other one is the complete one but requires you to compile your own kernel.

The correct answer is a kernel patch.

Robin H. Johnson wrote a patch for the SATA kernel driver (find it in Unix/Linux stack exchange site) which hides completely the drive.

Update 1 The patch is now upstream (at least in 3.12.7 stable kernel), see the git repository. I asked for backport in the Ubuntu launchpad.

Update 2 The patch is in the standard kernel for Ubuntu Trusty Thar 14.04; so now only the following addition to boot parameter is needed.

Once the patch is installed, adding

 libata.force=2.00:disable

to the kernel boot parameters will hide the disk from the Linux kernel. Double check that the number is correct; searching for the device name can help:

(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

To add a kernel parameter (bot temporarily and permanently) you can check this Q&A: How do I add a kernel boot parameter?

Workaround

At least the problem of enabling suspend-resume has been solved by by Unix StackExchange user Emmanuel in . As root, issue the command:

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

before suspend.

To make it permanent, add the following file in /etc/pm/sleep.d/ and make it executable:

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

with content:

#!/bin/sh
# Delete the failing disk so that it will not block suspend
case "$1" in suspend|hibernate) if [ -d /sys/block/sdb ]; then echo 1 > /sys/block/sdb/device/delete fi ;;
esac

...and now the system suspends (and resume) correctly.

4

You can try to create the udev rule with the following information (output of udevadm info -a -n /dev/sdb).

INFO:

looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0': KERNELS=="1:0:0:0" SUBSYSTEMS=="scsi" DRIVERS=="sd" ATTRS{rev}=="SSD " ATTRS{type}=="0" ATTRS{scsi_level}=="6" ATTRS{model}=="SanDisk iSSD P4 " ATTRS{state}=="running" ATTRS{queue_type}=="none" ATTRS{iodone_cnt}=="0x309" ATTRS{iorequest_cnt}=="0x30a" ATTRS{queue_ramp_up_period}=="120000" ATTRS{timeout}=="30" ATTRS{evt_media_change}=="0" ATTRS{ioerr_cnt}=="0x1d6" ATTRS{queue_depth}=="1" ATTRS{vendor}=="ATA " ATTRS{device_blocked}=="0" ATTRS{iocounterbits}=="32"

1) Create the udev rule.

  • sudo nano /etc/udev/rules.d/99-hide-ssd.rules

You can try to match the "SUBSYSTEMS" &"DRIVERS" keys, and "ATTRS{rev}" & ATTRS{model} attributes, then assign the "UDISKS" variable to ignore it.

The content of the 99-hide-ssd.rules file would be:

SUBSYSTEMS=="scsi", DRIVERS=="sd", ATTRS{rev}=="SSD ", ATTRS{model}=="SanDisk iSSD P4 ", ENV{UDISKS_IGNORE}="1"

To save the changes in nano... Ctrl+O, then Enter and finally Ctrl+X.

2) Finally refresh the udev rules with:

  • sudo udevadm trigger

NOTE: With the ENV{UDISKS_IGNORE}="1" it will ignore the disk for Ubuntu 12.10 & 13.04.
For Ubuntu 12.04 the variable would be ENV{UDISKS_PRESENTATION_HIDE}="1".

Hope this helps.

3

suggests in part:

As root, open up /etc/udev/rules.d/60-persistent-storage.rules with your favorite text editor.

A few lines down, you'll probably see a line that looks like this:

skip rules for inappropriate block devices

KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md", GOTO="persistent_storage_end"Add "sdb*" to that second line, so it looks like this:

KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md|sdb*", GOTO="persistent_storage_end"

Save, reboot, and maybe it works. If not, well, is this post-warranty?

2

If your other disks are not using ahci, or aren't SSD, you may remove the kernel driver for them.

to remove for that session (until the next reboot), run:

sudo rmmod ahci

to reload it, run:

sudo modprobe ahci

if you see that everything is going fine, you now can disable it totally (don't load it next boots). open the file /etc/modprobe.d/blacklist.conf, and add the following line:

blacklist ahci 

to blacklist ssd drivers, just replace ahci with sd

1

From what I know of, there is no way to remove the message, other than removing you SSD.

3

I went and wrote a kernel patch for you that implements the ability to disable a single disk at boot time, so that you don't need to bother with disabling it in udev, or the waiting during the initial boot.

Should apply to many kernels very easily (the line above it was added 2013-05-21/v3.10-rc1*, but can be safely applied manually without that line).

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like