Er der et medlem, som har Linux installeret direkte på en SSD, der gider teste dette script og sætte resultatet ind her i tråden? Jeg har PT ikke sådan en selv og er i tvivl om det virker. Scriptet er naturligvis helt ufarligt.
Jeg ved det ikke virker på en virtuelt installeret Linux (giver et falsk resultat), der er installeret på en SSD og formentlig heller ikke på en maskine med RAID. Derfor er det nødvendigt at Linux er installeret direkte på en maskine med kun en SSD.
På forhånd tak.
#!/bin/bash
cat /sys/block/sda/queue/rotational
if [ $? -eq 1 ]
then
echo -e "\033[1;31mIt seems to be an SSD.\033[0m"
read -n1 -r -p "Press any key to exit..." key
exit
else
echo -e "\033[1;32mIt seems to be an RPM.\033[0m"
read -n1 -r -p "Press any key to exit..." key
exit
fi
$SHELL
Hvis nogen kender en anden kommando (eller metode), der er i stand til at returnere en værdi (fx 0 eller 1), hvis disken er henholdvis en SSD eller en roterende, så vil jeg meget gerne høre den.
Ved nogen eksempelvis hvordan man kan få smartctl (fra pakken smartmontools) til at returnere en numerisk værdi (0 eller 1), eller en anden værdi, der kan bruges til at afgøre om en proces automatisk skal afsluttes eller fortsættes?
23-03-2004
Jeg har en DELL XPS 15 med SSD men jeg har ikke en
/sys/block/sda/
men
/sys/block/nvme0n1/
Deruodver tror jeg måske dit tjek er forkert: $? indeholder exit koden for det foregående program (cat) og det vil altid være '0' hvis filen findes og '1' hvis den ikke findes. Filen rotational indeholder værdien '0' eller '1' men det er ikke det du tjekker på.
20-05-2010
Tak for svaret.
#1: /sys/block/nvme0n1/
Den kender jeg ikke. Kan du henvise til mere info?
#1: Deruodver tror jeg måske dit tjek er forkert: $? indeholder exit koden for det foregående program (cat) og det vil altid være '0' hvis filen findes og '1' hvis den ikke findes. Filen rotational indeholder værdien '0' eller '1' men det er ikke det du tjekker på.
Okay. Det kan muligvis forklare hvorfor jeg ikke forstår. Det er hensigten at tjekke om disken er rotational, for at afbryde scriptet hvis disken er en ssd, men jeg forstår ikke helt hvad jeg har gang i. cat /sys/block/sda/queue/rotational virker helt korrekt ikke pålidelig.
Mener du jeg tjekker om filen rotational findes, men ikke om disken er rotational?
Ligesom vedr. /sys/block/nvme0n1/ skal scriptet kunne afgøre pålideligt om disken er roterende eller ej, uanset hvilken desktop maskine det køres på (bortset fra en maskine med RAID).
23-03-2004
Her er lidt om NVMe:
https://wiki.archlinux.org/index.php/Solid_state_d...
Dit tjek konstaterer blot om filen findes, men filen kan godt findes uanset om man har en rotationel disk eller ej.
Du er også nødt til at tjekke om den værdi der står i filen er 0 eller 1.
#!/bin/bash
declare -i X=`cat /sys/block/nvme0n1/queue/rotational`
if [ $X -eq 1 ]
then
echo "Yeps"
else
echo "Nope"
fi
Jeg tror denne kommando er interessant for dig. Den lister alle block devices (fysiske diske, loop devices...):
lsblk
# Evt kaldt med disse parametre
lsblk -d -o name,type,rota
20-05-2010
#3
Tak for hjælpen.
På mine Linux systemer (en roterende hardware installeret disk og en virtuel (vmware) på en SSD), ser det ud til at /sys/block/nvme0n1/queue/rotational kun findes, hvis OS er installeret direkte på en fysisk SSD. Lidt ligesom /sys/block/sda/queue/rotational tilsyneladende kun findes hvis disken er roterende, men det er jeg ikke sikker på.
Værdien i rotational er 1.
Det er hensigten at kommandoen skal fungere på en virtuel disk for at afgøre om den fysiske disk er en SSD. Problemet er at en virtuel disk tilsyneladende altid tror den er roterende.
sudo smartctl -a /dev/sda | grep 'Rotation Rate' (fra smartmontools) kan imidlertid se om en fysisk disk er SSD eller ikke, selvom smartctl køres fra en virtuel disk, men den kan jeg ikke få til at returnere en numerisk værdi. Ved du om det kan lade sig gøre, eller om det er muligt, på en eller anden måde, at bruge output fra smartctl som en værdi?
Eksempel fra en virtuel disk på en SSD:
administrator@mint-19:~$ sudo smartctl -a /dev/sda | grep 'Rotation Rate'
[sudo] adgangskode for administrator:
Rotation Rate: Solid State Device
lsblk -d -o name,type,rota er udmærket, men kan desværre heller ikke læse om en virtuel disk findes på en SSD.
Det vil formentlig bringe mig lidt videre, hvis du gider sætte resultatet af dette her, fra din SSD maskine, ind i tråden. I det mindste kan jeg så få scriptet til at afslutte automatisk, hvis det køres på en fysisk SSD:
#!/bin/bash
declare -i X=`cat /sys/block/nvme0n1/queue/rotational`
if [ $X -eq 1 ]
then
echo -e "\033[1;32mIt seems to be an RPM.\033[0m"
read -n1 -r -p "Press any key to exit..." key
exit
else
echo -e "\033[1;31mIt seems to be an SSD.\033[0m"
read -n1 -r -p "Press any key to exit..." key
exit
fi
$SHELL
23-03-2004
sudo smartctl -a /dev/sda | grep 'Rotation Rate' (fra smartmontools) kan imidlertid se om en fysisk disk er SSD eller ikke, selvom smartctl køres fra en virtuel disk, men den kan jeg ikke få til at returnere en numerisk værdi. Ved du om det kan lade sig gøre, eller om det er muligt, på en eller anden måde, at bruge output fra smartctl som en værdi?
grep's exit kode er 0 hvis søgningen matcher og 1 hvis den ikke gør så her kan du tjekke på værdien af `$? '.
Output fra script på min maskine:
It seems to be an SSD.
Press any key to exit...
Hvilket er korrekt da der sidder SSD i maskinen.
20-05-2010
#5: Hvilket er korrekt da der sidder SSD i maskinen.
Yes og det virker også med stien til sda, så jeg er kommet noget videre ;)
Tak for hjælpen.
05-12-2009
Jeg svarede lige i den anden tråd fordi jeg ikke havde set der var kommet en ny tråd:
https://www.linuxin.dk/node/22438#comment-91525
For fuldstændighedens skyld bringer jeg mit forslag her også:
#!/bin/bash
rotational=$(cat /sys/block/sda/queue/rotational)
if [ $rotational -eq 1 ]
then
echo -e "\033[1;32mIt seems to be an RPM.\033[0m"
else
echo -e "\033[1;31mIt seems to be an SSD.\033[0m"
fi
I bund og grund magen toil phoenix' forslag. Vil lige bemærke at $() anses for mere moderne/bedre end backticks. Men det virker jo som regel lige godt.
20-05-2010
Det er glimrende. Mange tak. Problemet er løst på Linux installeret på enten en fysisk SSD eller HDD.
Imidlertid ikke på en virtuel disk, fordi scriptet læser disken på den emulerede maskine og derfor ikke den egentlige fysiske disk.
Den ultimative løsning er formentlig, så vidt jeg forstår, at installere smartmontools og benytte smartctl for at afgøre om den fysiske disk er en SSD.
Det vil gøre scriptet uafhængigt af enhver harddisk, uanset om det køres på en virtuel eller en fysisk disk.
Kommandoen er: sudo smartctl -a /dev/sda | grep 'Rotation Rate'
Resultat kan henholdvis på en roterende og SSD (virtuel såvel som fysisk) enten være:
- Rotation Rate: 7200 rpm
- Rotation Rate: Solid State Device
Jeg forstår bare ikke hvordan man får et script til at reagere på output fra smartctl.
Jeg har forsøgt at skrive output til en fil, hvilket jeg godt kan, men min bash forståelse er for ringe til at bruge det som argument i et script.
Hensigten er at scriptet afslutter sig selv hvis disken er en SSD, for at undgå at brugeren skal svare på spørgsmål, der potentielt kan skade disken.
05-12-2009
Du kan gøre det sådan:
#!/bin/bash
device=$1
denied=$(smartctl -a /dev/$device | grep -o 'Permission denied')
if [ ! -z "$denied" ]
then
echo "Script must be run with sudo!"
exit
fi
rotational=$(smartctl -a /dev/$device | grep 'Rotation Rate')
if [[ "$rotational" =~ "Solid State Device" ]]
then
echo -e "\033[1;31mIt seems to be an SSD.\033[0m"
else
echo -e "\033[1;32mIt seems to be an RPM.\033[0m"
fi
Sciptet bruges således:
sudo ./ssd-test sda
sudo er nødvendig.
#8: Resultat kan henholdvis på en roterende og SSD (virtuel såvel som fysisk) enten være:
- Rotation Rate: 7200 rpm
- Rotation Rate: Solid State Device
På min sda som er en roterende harddisk, er der slet ingen linje med Rotation! Så det er altså ikke skudsikkert.
På min SSD står der: Rotation Rate: Solid State Device
20-05-2010
#9
Det bliver bedre og bedre, selvom det åbenbart heller ikke er skudsikkert. Jeg slipper nok ikke for at skrive en masse advarsler.
sudo er nødvendig og kun en fordel, fordi brugeren så er nødt til at forholde sig til handlingen, der er en defrag af harddisken og som jeg nødig vil være ansvarlig for ødelægger en SSD.
Super og endnu engang mange tak.
Edit:
Jeg tror alligevel scriptet er skudsikkert, fordi det ikke betyder noget at det returnere Solid State Device eller Rotation Rate i terminalen, men om scriptet kan afgøre om skal fortsætte eller ej.
Det her virker perfekt, uanset det køres i en virtuel harddisk på en ssd eller en fysisk roterende hdd. Det medfører (heldigvis) at jeg skal skrive det egentlige script om, som dit eksempel bliver en del af.
#!/bin/bash
rotational=$(sudo smartctl -a /dev/sda | grep 'Rotation Rate')
if [[ "$rotational" =~ "Solid State Device" ]]
then
echo -e "\033[1;31mIt seems to be an SSD.\033[0m"
else
echo -e "\033[1;32mIt seems to be an RPM.\033[0m"
fi
$SHELL
20-05-2010
Opdatering
Det endelige script ser nu sådan ud og bør fungere på samtlige harddiske med Debian/Ubuntu derivater (apt-get backend), hvor der ikke er tale om RAID. Hvis nogen finder en fejl, eller noget der kan forbedres, så modtages det med et stort tak.
Selve e4defrag er deaktiveret af sikkerheds årsag.
#!/bin/bash
# Define Color Variables
GREEN='\033[32;1m'
YELLOW='\033[33;1m'
RED='\033[31;1m'
BLUE='\033[34m'
BBLUE='\033[34;1m'
STD='\033[0m'
# Define function (force to use Enter key)
PAUSE_ENTER(){
read -s -p "" fackEnterKey
}
echo "This will defrag the entire ext4 formatted partition without unmounting"
echo "For defrag a specific file or partition, use ..."
echo -e $BBLUE
e4defrag
echo -e $STD
# Checking and installing smartctrl (smartmontools)
echo -e $YELLOW"Checking if Smartmontools and smartctl are installed ..."$STD
if ! [ -x "$(command -v smartctl)" ]; then
echo -e $YELLOW"Smartmontools$RED is needed for checking SSD or HDD rotation rate but is not installed."
echo -e "Press $YELLOW[Enter]$RED to install Smartmontools ..."$STD
PAUSE_ENTER
sudo apt-get update && sudo apt-get install smartmontools
else
echo -e $GREEN"OK$STD Smartmontools is installed."
fi
tput sgr0
# Checking for SSD or rotational
echo
echo -e $YELLOW"Checking if the drive is an SSD or rotational"$STD
rotational=$(sudo smartctl -a /dev/sda | grep 'Rotation Rate')
if [[ "$rotational" =~ "Solid State Device" ]]
then
echo
echo -e $RED"WARNING!$STD ${YELLOW}This is an SSD.$RED Do NOT defrag."$STD
read -n1 -r -p "Press any key to abort..." key
exit
else
echo
echo -e $GREEN"OK$STD This seems to be an rotational hard drive. It may be safe to defrag"
echo -e "Below another check will be performed that dosen't automaticly abort."
fi
echo
tput sgr0
# Display filesystem
echo -e $YELLOW"Displaying filesystems:"$STD
echo -e $BBLUE
lsblk -f
echo
df
echo -e $STD
echo -e $YELLOW"Save any work and close all programs before continuing"
echo
echo -e "Do you wish to defrag the entire ext4 formatted partition?"$STD
echo -e "You may need to run e4defrag several times depending how much space available"
echo -e "This gonna take a while. Please be patient and do not interrupt"
echo
# Run smartctl for secondly checking if the drive is SSD.
echo "Performing the secondly security check ..."
tput setaf 3
tput bold
sudo smartctl -a /dev/sda | grep 'Rotation Rate'
echo
echo -e $RED"WARNING!$STD If status above shows:$YELLOW Solid State Device$STD, then the automatic SSD check has failed."
echo -e $YELLOW"In that case, PLEASE ABORT NOW to avoid damageing your SSD hard drive"$STD
echo
echo -e "Push$YELLOW Y(es) and [Enter]$STD to defrag or$YELLOW N(o) and [Enter]$STD to abort"
# Starting e4defrag
while true; do
read -p "" yn
case $yn in
# e4defrag is deactivated for security reasons. Please uncomment to activate
[Yy]* ) # sudo e4defrag /
echo -e ${GREEN}"Done${STD} ${YELLOW}Do you wanna defrag again?${STD}
Push${YELLOW} Y(es)${STD} or${YELLOW} N(o)${STD} and push${YELLOW} Enter${STD}" ;;
[Nn]* ) exit ;;
* ) echo -e ${YELLOW}"Do you wanna defrag the system?${STD}
Please answer${YELLOW} Y(es)${STD} or${YELLOW} N(o)${STD} and push${YELLOW} Enter${STD}" ;;
esac
done
$SHELL
Edit 2:
# Define function (force to use Enter key)
PAUSE_ENTER(){
read -s -p "" fackEnterKey
}
Er flyttet højere op fordi det ellers ikke virker hvis smartmontools ikke er installeret.
05-12-2009
#11: Selve e4defrag er deaktiveret af sikkerheds årsag.
Skal der ikke være echo foran i linje 19: echo e4defrag ?
20-05-2010
#12: Skal der ikke være echo foran i linje 19: echo e4defrag ?
Det tror jeg ikke, fordi kommandoen e4defrag, uden parameter, blot viser brug af e4defrag (uden at gøre andet).
echo kommandoerne i linje 18 og linje 20, angiver tekst formateringen, hvor echo -e $STD nulstiller farven.
18 echo -e $BBLUE
19 e4defrag
20 echo -e $STD
e4defrag er deaktiveret i linje 81 med octothorpe el. hash tag (#), ikke echo.
80 # e4defrag is deactivated for security reasons. Please uncomment to activate
81 [Yy]* ) # sudo e4defrag /
05-12-2009
#13: Det tror jeg ikke, fordi kommandoen e4defrag, uden parameter, blot viser brug af e4defrag (uden at gøre andet).
Ja det har du ret i. Prøvede lige.