Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  11 1527
Hei.

For et par dager siden hadde jeg store planer om å oppgradere fra Debian Lenny, til Debian squeeze (6.0). Da jeg kjørte lenny, hadde jeg et softwareraid med 3 2TB disker i raid 5. Rett etter jeg hadde oppgradert til squeeze, hadde det bare vært å kjøre mdadm --assemble /dev/md0, og alt hadde vært i den skjønneste orden. Men det gjorde ikke jeg. Jeg valgte istedet å melde inn en av diskene i raidet inn i et annet raid, med disker som ikke fantes. Resultatet av det ble at jeg hadde 2 ukomplette raid. Dette fikk jeg heldig vis løst igjen, ved å melde ut den disken jeg hadde meldt inn i det andre raidet, og dette den som spare i md0. Da bygde arrayet seg opp igjen, og flott var det! Men jeg får fortsatt ikke tilgang til raidet, da jeg har korrupte superblocks. Har prøvd e2fsck -b xxxx /md0, uten suksess. Virker som om backupen av superblockene også er overskrevet på et vis.

Raidet kjører ext3. Dette outputter e2fsck /dev/md0:
e2fsck 1.41.12 (17-May-2010)
e2fsck: Superblock invalid, trying backup blocks...
e2fsck: Bad magic number in super-block while trying to open /dev/md0

The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193 <device>


Filene mine eksisterer, men jeg får ikke tillgang til de pga korrupt filsystem, virker det som. Noen som har en ide om hvordan jeg kan få fikset dette?

Dette outputter mdadm --detail /dev/md0, noe som tyder på at raidet er friskt...

/dev/md0:
Version : 1.2
Creation Time : Mon Feb 7 22:43:22 2011
Raid Level : raid5
Array Size : 3907025920 (3726.03 GiB 4000.79 GB)
Used Dev Size : 1953512960 (1863.02 GiB 2000.40 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent

Update Time : Sun Feb 13 00:41:08 2011
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Name : bravo:0 (local to host bravo)
UUID : 61c13834:fb02824f:078051e5:b39f45cc
Events : 86

Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
3 8 48 2 active sync /dev/sdd
Disclaimer:
Her er et lite skudd i mørket fra min side. Jeg har tilnærmet null erfaring med dette. Men vil tro at dette vil få deg på riktig spor:

Hva er output hvis du kjører følgende?
mdadm --assemble --scan
mdadm -E /dev/sdb
mdadm -E /dev/sdc
mdadm -E /dev/sdd

Du kan også prøve å kjøre dette:
mdadm --assemble /dev/md0 --raid-level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd



Evt. kan du prøve å angi UUID og/eller blocksize i stedenfor/tillegg

Her er et lite utrag av man pagen som kan være relevant:

Kode

      Usage: mdadm --assemble md-device options-and-component-devices...
 
      Usage: mdadm --assemble --scan md-devices-and-options...
 
      Usage: mdadm --assemble --scan options...
 
      This  usage  assembles one or more raid arrays from pre-existing compo-
      nents.  For each array, mdadm needs to know the md device, the identity
      of  the array, and a number of component-devices. These can be found in
      a number of ways.
 
      In the first usage example (without the --scan) the first device  given
      is  the md device.  In the second usage example, all devices listed are
      treated as md devices and assembly is attempted.  In the  third  (where
      no devices are listed) all md devices that are listed in the configura-
      tion file are assembled.
 
      If precisely one device is listed, but --scan is not given, then  mdadm
      acts  as  though --scan was given and identify information is extracted
      from the configuration file.
 
      The identity can be given with the --uuid  option,  with  the  --super-
      minor  option,  can be found  in the config file, or will be taken from
      the super block on the first component-device  listed  on  the  command
      line.
 
      Devices  can  be  given on the --assemble command line or in the config
      file. Only devices which have an md superblock which contains the right
      identity will be considered for any array.
 
      The  config  file  is  only  used  if explicitly named with --config or
      requested with (a  possibly  implicit)  --scan.   In  the  later  case,
      /etc/mdadm.conf is used.
 
      If  --scan is not given, then the config file will only be used to find
      the identity of md arrays.
 
      Normally the array will be started after it is assembled.   However  if
      --scan is not given and insufficient drives were listed to start a com-
      plete (non-degraded) array, then the array is  not  started  (to  guard
      against  usage  errors).   To  insist that the array be started in this
      case (as may work for RAID1, 4, 5 or 6), give the --run flag.
 
      If an auto option is given, either on the command line (--auto)  or  in
      the  configuration file (e.g. auto=part), then mdadm will create the md
      device if necessary or will re-create it if it doesn't look  usable  as
      it is.
 
      This can be useful for handling partitioned devices (which don't have a
      stable device number - it can change after a  reboot)  and  when  using
      "udev"  to manage your /dev tree (udev cannot handle md devices because
      of the unusual device initialisation conventions).
 
      If the option to "auto" is "mdp" or "part"  or  (on  the  command  line
      only)  "p",  then  mdadm  will  create a partitionable array, using the
      first free one that is not inuse, and does not already have an entry in
      /dev (apart from numeric /dev/md* entries).
 
      If the option to "auto" is "yes" or "md" or (on the command line) noth-
      ing, then mdadm will create a traditional, non-partitionable md  array.
 
      It  is  expected  that  the "auto" functionality will be used to create
      device  entries  with  meaningful  names  such  as  "/dev/md/home"   or
      "/dev/md/root",  rather than names based on the numerical array number.
 
      When using this option to create  a  partitionable  array,  the  device
      files  for the first 4 partitions are also created. If a different num-
      ber is required it can be simply appended to  the  auto  option.   e.g.
      "auto=part8".   Partition names are created by appending a digit string
      to the device name, with an intervening "p" if  the  device  name  ends
      with a digit.
 
      The  --auto  option  is  also  available in Build and Create modes.  As
      those modes do not use a config file, the "auto="  config  option  does
      not apply to these modes.
Nitram's Avatar
Trådstarter
61 7
Hei, og takk for svar!

mdadm --detail --scan (eller mdadm --assemble --scan) >> /etc/mdadm/mdadm.conf viser:
ARRAY /dev/md0 metadata=1.2 name=bravo:0 UUID=61c13834:fb02824f:078051e5:b39f45cc

UUID er angitt, og arrayet ser bra ut. Det ser heller ut til å være filsystemet det er problemer med. Jeg har også prøvd å recreate raidet, da jeg vet at mdadm er så smart at den forstår at diskene har vært medlem i samme raid før, og recreater raidet uten å røre dataen. Ingen lykke der heller, dessverre.
mke2fs -n /dev/md0 viser hvor backup superblockene befinner seg på disken, og jeg har prøvd alle! Veldig irreterende å måtte reformatere diskene når jeg vet at dataen fortsatt er inntakt..

mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
244195328 inodes, 976756480 blocks
48837824 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
29809 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848, 512000000, 550731776, 644972544
For meg så virker det som at du starter i feil rekkefølge.

Du kan ikke lage et filsystem på en raid partisjon som ikke er satt opp skikkelig. Du må sette opp md0 uten feil først før du kan lage ett filsystem på den.

Prøvde du å asseble slik jeg foreslo, altså noe ala:

Kode

# mdadm --assemble /dev/md0 --raid-level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
Selv om du får feilmelding så kan nissen jobbe i bakgrunnen.
Du kan sjekke om den gjenoppbygger raidet ditt ved å kjøre:

Kode

# cat /proc/mdstat
Sist endret av niklasj; 13. februar 2011 kl. 15:10.
Nitram's Avatar
Trådstarter
61 7
Raidet mitt er jo allerede gjenoppbygd. For å assemble raidet, skal det egentlig bare være:
mdadm --assemble /dev/md0
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

Prøvde allikevel med det du sa, uten hell. Prøvde også å recreate raidet mitt på nytt på denne måten:

mdadm -S /dev/md0

mdadm --zero-superblock /dev/sdb
mdadm --zero-superblock /dev/sdc
mdadm --zero-superblock /dev/sdd

mdadm --create --verbose /dev/md1 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

mount -t ext3 /dev/md1 /storage/md1


Arrayet kom opp igjen, men dessverre i samme stand som det allerede var. Oppe å gå, men med korrupt filsystem. Noen flere forslag? Like før jeg biter i det sure eplet og lærer av mine brendte hender, altså sette opp alt på nytt og miste dataen! Det må vel være et recovery software der ute som klarer å hente ut all rådata uavhengig av superblocks og filsystem? Noe som bare tar alt - uansett? Kommer til å reformatere diskene til ext4 uansett, etter at jeg har fått tatt en backup av filene.

cat /proc/mdstat viser:
Personalities : [raid6] [raid5] [raid4]
md0 : active (auto-read-only) raid5 sdb[0] sdd[3] sdc[1]
3907025920 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>


mount -t ext3 /dev/md1 /storage/md1 gav forresten følgende output:
mount: wrong fs type, bad option, bad superblock on /dev/md1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so
Nei da kommer jeg dessverre til kort

Hvis det er viktig informasjon ville jeg ha ventet til noen litt mer kyndig leser tråden (slashdot f. eks).

Evt. kan du prøve å stille spørsmålet på det engelsk språklige Debian forumet.
Nitram's Avatar
Trådstarter
61 7
Venter litt til Takk for hjelpen!
Nitram's Avatar
Trådstarter
61 7
Tenkte jeg skulle prøve en siste ting før jeg whipa raidet clean og startet på nytt. I skrivende stund har Photorec, i samarbeid med testdisk, klart å restore 2449 filer! Photorec bryr seg ikke om filsystemet i det hele tatt. Den bare ser om den kjenner igjen noe data, og restorer det som er relevant. Genialt!

Estimated time for achievement 33h38m21s...
▼ ... noen uker senere ... ▼
Jeg har laget en snutt med kode for å detektere ext-filsystemer ved å lese data fra disken, interessert?
EDIT: programmet er litt ukomplett, men det kan fint si om det er en gyldig superblokk på disken i det hele tatt

Kode

hawken-pc code # dd if=/dev/md0 bs=64k | ./fs 
Sector 0 might be a partition:
	Sector 2 = ext superblock?
	block size: 4096, sectors: 7814057984, superblock id: 0
Sector 20509411 might be a partition:
	Sector 20509413 = ext superblock?
	block size: 0, sectors: 0, superblock id: 0
fs.c

Kode

#include <stdio.h>

#define BLOCK 512

int main(){
	int status, cur_sec=0; // For some weird reason, it starts at 0
	char sector[BLOCK];
	unsigned short temp;
	unsigned int temps[100];
	while(1){
		status = read(0, &sector[0], BLOCK);
		if(status != 512) {
			printf("The End.\n");
			return -1;
		}
		temp = *((short *)&sector[56]);
		temps[2] = *((int *)&sector[0]); // ntfs id?
//		printf("Sector %i, magic: %i, temps2=%i\n", cur_sec, temp, temps[2]);
		if(temp == 61267){
			temps[2] = *((int *)&sector[4]);
			temps[3] = *((int *)&sector[24]);
			temps[4] = (temps[3] == 2 ? 4096 : (temps[3] == 1 ? 2048 : (temps[3] == 0 ? 1024 : 0)));
			temps[5] = *((short *)&sector[90]);
			if(temps[5] == 0){
				printf("Sector %i might be a partition:\n", cur_sec-2);
				printf("\tSector %i = ext superblock?\n", cur_sec);
				printf("\tblock size: %i, sectors: %lld, superblock id: %i\n",
						temps[4],
						(unsigned long long)temps[2]*(temps[4]/512),
						temps[5]);
			}
		} else if(temps[2] == 1318081259){
			printf("Sector %i is probably NTFS!\n", cur_sec);
		}
		cur_sec++;
	}
}
Kompilere:
gcc -o fs fs.c

PS: Jeg har akkurat samme oppsett som deg, kun med ext4 som filsystem!
La meg gjette: WD Caviar Green? :P

jeg legger også merke til at du har "Chunk Size : 512K", og antar at du burde ta hensyn til dette og rekkefølgen til diskene når du assembler. Du kan også prøve å kjøre mdadm --manage /dev/md0 -f /dev/sd + b c eller d for å fjerne en disk med eventuelle feil og lese fra pariteten istedenfor! ^_^

Fant også nettopp ut at man kan lese av fra en av diskene av gangen, fordi størrelsen på en chunk er ganske stor
Om det da ikke er en superblokk på noen av diskene har du mistet data (på ordentlig)!

Kode

hawken-pc code # dd if=/dev/sdd bs=64k | ./fs 
Sector 0 might be a partition:
	Sector 2 = ext superblock?
	block size: 4096, sectors: 7814057984, superblock id: 0

Kode

hawken-pc code # dd if=/dev/md0 bs=64k | ./fs 
Sector 0 might be a partition:
	Sector 2 = ext superblock?
	block size: 4096, sectors: 7814057984, superblock id: 0
Sist endret av hawken07; 7. mars 2011 kl. 23:11.
Nitram's Avatar
Trådstarter
61 7
Har allerede krøpet til korset...


#blkid /dev/md0
/dev/md0: UUID="63d1f786-1fef-4fcc-8f6b-082faf554810" TYPE="ext4"


Recovery med photorec fungerte helt greit, egentlig. Problemet var at alle filene mine ble namet f2057234059274. Var egentlig ikke noe stress å få tilbake all dataen jeg hadde. Kostet bare litt ratio! Har lært veldig mye av denne feilen, så er egentlig litt takknemmelig for at det skjedde nå i ettertid Satte opp raidet mitt med EXT4 dette gangen også, så nå fungerer raidet mitt optimalt. Har til og med tweaka det ved å endre stripe_cache_size fra 254 som er default verdien til 8192. Dette endret skrivehastigheten min med over 36 MB/s! Hvis noen lurer på hvordan jeg fikk til det, så er det bare å si ifra.

Kul kodesnutt du har laget, hawken! Hva er det den kan gjøre som ikke e2fsck kan ta seg av? Eller eventuelt fsck? Er bare nysgjerrig på hvordan den fungerer Kult om du kunne forklart litt rundt det. Og nei, har ingen WD Green power. Hadde planer om å kjøpe de, men et lite googlesøk stoppet meg. WD sine green-disker fungerer sikkert fint alene, men i RAID går alt galt.... Spesielt i RAID 5!
Sånn kjapt, så går programmet gjennom alle sektorene i disken på leting etter en ext-superblokk
e2fsck gir seg om den ikke er i sektor 2

Uheldigvis hadde den fått overflow halvveis gjennom disken (cur_sect blir resatt :P)

Jeg trengte den da jeg hadde ødelagt partisjonstabellen på en 500GB harddisk (som forøvrig er død, rundt sektor 4 millioner døde den)
For fremtiden: disktype er et greit program hvis man lurer på format / filsystem eller noe til en disk, partisjon eller et diskimage i en fil.