Re: Partitionnement

Pàgina inicial

Reply to this message
Autor: olivier.eribon
Data:  
A: philippe
CC: guilde
Assumpte: Re: Partitionnement
Selon "Philippe B." <philippe@???>:

oui utiliser fdisk en passant les parametres a partir d'un script ou d'un
morceau de code C par exemple.

Ce code cree trois partitions avec les regles suivantes :
- 1ere partition (utilisateur) de taille = USER_PERCENTAGE_DISK % de la taille
du disque limite a MAX_SIZE_USER
- 2eme partition de swap de taille SWAPSIZE
- 3eme partition (system) de taille restante

la premiere partition est de type VFAT 32
la seconde de type swap
la derniere est de type ext2
Les partitions sont ensuite formatées.

Je pense que tu peux adapter cet exemple a ton probleme.

Cordialement Olivier Eribon

#include <stdio.h>
#include "stdlib.h"
#include "string.h"

#define INPUTSIZE            1024


#define SWAPSIZE             512*1024*1024 /* Mo*/
#define USER_PERCENTAGE_DISK 50            /* % */
#define MAX_SIZE_USER        10            /* Go */


int main(int argc, char **argv)
{
int heads;
int sectors;
int cylinders;
unsigned long units;
unsigned long units1;
unsigned long units2;
int partstart;
int partend;
unsigned long size;
char cmdline[128];
char input[INPUTSIZE];
char *tmp;
FILE* scriptfile;
FILE* resultfile;

   if(argc!=2) {
        printf("format : %s </dev/hda, /dev/hdb..>\n", argv[0]);
      exit(1);
   }
  /* Create fdisk script to get geometry */
  scriptfile = fopen("/tmp/fdisk.script","w");
  fprintf(scriptfile,"o\np\nq\n");
  fclose(scriptfile);


/* Execute script */
snprintf(cmdline,128,"cat /tmp/fdisk.script|/sbin/fdisk %s
> /tmp/fdisk.result 2> /dev/null",argv[1]);

system(cmdline);

/* Read results */
resultfile = fopen("/tmp/fdisk.result","r");
fgets(input,INPUTSIZE,resultfile);

  /* Find where Disk geometry line is */
  while(!(strstr(input,"Disk")==input)) {
    fgets(input,INPUTSIZE,resultfile);
  }
  tmp = strstr(input,":")+2;
  heads = atoi(tmp);
  tmp = strstr(tmp,",")+2;
  sectors = atoi(tmp);
  tmp = strstr(tmp,",")+2;
  cylinders = atoi(tmp);


  /* Find where Unit size line is */
  while(!(strstr(input,"Units")==input)) {
    fgets(input,INPUTSIZE,resultfile);
  }
  tmp = strstr(input,"of")+3;
  units1 = atoi(tmp);
  tmp = strstr(tmp,"*")+2;
  units2 = atoi(tmp);
  units = units1 * units2;


/* Print results */
printf("Heads:%d Sectors:%d Cylinders:%d Unit size:%
ld\n",heads,sectors,cylinders,units);

/* Create fdisk script to create partitions */
scriptfile = fopen("/tmp/fdisk.script","w");
/* Clear any old partition table */
fprintf(scriptfile,"o\n");

  /* Create user partition */
  partstart = 1;
  partend   = (int)(cylinders/100*USER_PERCENTAGE_DISK);
  size      = ((partend-partstart+1) * 100 ) / cylinders;
  if((size / 1024) > MAX_SIZE_USER ) {
    partend   = (int)(MAX_SIZE_USER * 1024 * (1024 * 1024 / units) );
    size      = ((partend-partstart+1) * 100 ) / cylinders;
  }
  fprintf(scriptfile,"n\np\n1\n%d\n%d\n",partstart,partend);
  printf("user partition : %6d-%6d (size %2ld \%)\n",
     partstart,partend,size);


  /* Create swap partition */
  partstart = partend+1;
  partend   = partend + SWAPSIZE / units;
  size      = ((partend-partstart+1) * 100 ) / cylinders;
  fprintf(scriptfile,"n\np\n2\n%d\n%d\n",partstart,partend);
  printf("swap partition : %6d-%6d (size %2ld \%)\n",
     partstart,partend,size);


  /* Create system partition */
  partstart = partend+1;
  partend   = cylinders;
  size      = ((partend-partstart+1) * 100 ) / cylinders;
  fprintf(scriptfile,"n\np\n3\n%d\n%d\n",partstart,partend);
  printf("syst partition : %6d-%6d (size %2ld \%)\n",
     partstart,partend,size);


/* Set type of user partition to c */
fprintf(scriptfile,"t\n1\nc\n");

/* Set type of swap partition to 82 */
fprintf(scriptfile,"t\n2\n82\n");

/* Set user partition bootable (active) */
fprintf(scriptfile,"a\n1\n");

/* Write and exit */
fprintf(scriptfile,"p\nw\n");
fclose(scriptfile);

/* Execute script */
snprintf(cmdline,128,"cat /tmp/fdisk.script|/sbin/fdisk %s
> /tmp/fdisk.result 2> /dev/null",argv[1]);

system(cmdline);

/* format user partition */
snprintf(cmdline,128,"mkdosfs -v -F 32 -n MTS_USER %s1",argv[1]);
printf("# %s\n",cmdline);
system(cmdline);

/* format swap partition */
snprintf(cmdline,128,"mkswap %s2",argv[1]);
printf("# %s\n",cmdline);
system(cmdline);

/* format syst partition */
snprintf(cmdline,128,"mkfs.ext2 -b 4096 %s3",argv[1]);
printf("# %s\n",cmdline);
system(cmdline);
snprintf(cmdline,128,"tune2fs -c 0 -i 0 %s3",argv[1]);
printf("# %s\n",cmdline);
system(cmdline);

fclose(resultfile);
exit(0);
}

> Bonjour,
>
> j'aimerais procéder au partitionnement automatique d'un disque dur à
> l'aide de sfdisk. J'ai tenté de dumper une partition existante d'un
> disque, de la modifier (en bash) puis de la recréer toujours à l'aide de
> sfdisk, mais nada, ca ne fonctionne pas. (je pense un souci de shell).
>
> Cependant, il y a apparemment une facon beaucoup plus simple de créer
> automatique des partitions avec sfdisk.
>
> Quelqu'un aurait-il déjà fait ce genre d'opération, ou aurait une idée sur
> mon soucis ?
>
> En gros, ce que je voudrais par exemple :
>
> /dev/hda1 2go
> /dev/hda2 10go
> /dev/hda3 512Mo de swap
>
> Merci d'avance,
>
> Philippe
>
>
>
>