> > PARTEZ PAS, J'AI QUAND MEME UNE QUESTION ;-) > > Question subsidiaire : j'ai du faire à la main le lien entre /dev/cdrom > et /dev/scd0 pour que ça fonctionne ... par quelle méthode ce lien > pourrait-il être automatique ? (c'est pour faire une distrib live... > contexte knoppix) > J'ai fait un programme linuxrc avec recherche automatique du CDROM contenant un fichier, chargement de la racine et création du lien: En gros
Il cherche un CDROM IDE ou SCSI Sur ces CDROMS, il cherche un fichier root.gz (il monte le cdrom sur /cdrom) Il dézippe le fichier dans /dev/ram1 Il modifie dans le système de fichier de /dev/ram1 le lien /dev/cdrom vers le CD où se trouve le fichier. Et voilà. Je pense que tu pourras adapter ce programme sans difficulté à tes besoins. Si tu veux le source complet, dis le moi (unzip n'est pas donné ci dessous, je l'ai récupéré tout prêt). François Boisson int main(int argc, char **argv) { struct stat stat_buf; char media_str[]="/proc/ide/ide0/hda/media"; char blank[]=""; char idedrives[]="0a0b1c1d"; char *cd_device; char cd_ide[]="/dev/hda"; char cd_scsi[]="/dev/scd0"; char inbuf[80]; int trouve; int i,x; int nbcdromscsi; FILE *f; // New startup by Paul // ameliore par F. Boisson // Passage au CDrom suivant si echec et incorporation des Cdrom SCSI printf("Lancement INITRD (F.Boisson Fevrier 2003)\n"); // Mount proc on /proc printf(" Montage de proc\n"); if (mount ("none","/proc","proc",MS_MGC_VAL, blank)) { printf("[RATE]: echec du montage\n"); exit(0); } trouve = 0; printf(" Recherche CDrom\n"); cd_device = cd_ide; for (x=0;((x<8) && (trouve == 0));x+=2) { media_str[13]=idedrives[x]; media_str[17]=idedrives[x+1]; if (f=fopen(media_str,"r")) { if (fgets(inbuf,80,f)) { if (strstr(inbuf,"cdrom")!=NULL) { cd_device[7]=media_str[17]; trouve = 1; } } fclose(f); } // Si trouve = 1, CDrom trouvé if (trouve == 1) { printf(" --> CDrom en [%s]\n",cd_device); chdir("/dev"); unlink("cdrom"); symlink(cd_device,"cdrom"); printf(" Montage CD\n"); if (mount ("/dev/cdrom","/cdrom","iso9660",MS_MGC_VAL+MS_RDONLY, blank)) { printf("[RATE]: montage impossible\n"); trouve=0; } else printf(" --> réussite\n"); // Le CD a pu etre monté if (trouve == 1) { printf(" Extraction de root.gz sur ram1\n"); /* Open input file en l'occurrence root.gz */ in_file = fopen("/cdrom/root.gz", "r"); if (in_file == NULL) { printf("[RATE]: Lecture fichier impossible\n"); trouve = 0; } else { /* Open output file le ramdisk */ out_file = fopen("/dev/ram1", "w"); if (out_file == NULL) { fclose(in_file); umount("/cdrom"); printf("[RATE]: écriture impossible\n"); exit(0); } if (unzip(in_file, out_file) != 0) { printf("[RATE]: Fichier impossible à extraire\n"); umount("/cdrom"); exit(0); } else { printf(" --> réussite\n"); fclose (in_file); fclose (out_file); } } umount("/cdrom"); } } } if ((x==8) && (trouve == 0)) { printf("[RATE]: pas de CDrom IDE trouvé\n"); printf("Recherche de CDrom SCSI\n"); nbcdromscsi = 0; if (f=fopen("/proc/scsi/scsi","r")) { while (fgets(inbuf,80,f)) { if ((strstr(inbuf,"Type:") != NULL) && (strstr(inbuf,"CD-ROM")!=NULL)) nbcdromscsi++; } fclose(f); } else printf("[RATE]: Pas de SCSI trouvé\n"); if (nbcdromscsi == 0) { printf("[RATE]: pas de CDrom SCSI trouvé\n"); exit(1); } // on adapte... cd_device = cd_scsi; for (i=0;((i<nbcdromscsi) && (trouve==0));i++) { // test des différents CDscsi cd_scsi[8] = '0'+i; // rappel: cd_device = cd_scsi printf(" --> CDrom en [%s]\n",cd_device); chdir("/dev"); unlink("cdrom"); symlink(cd_device,"cdrom"); printf(" Montage CD\n"); if (mount("/dev/cdrom","/cdrom","iso9660",MS_MGC_VAL+MS_RDONLY, blank)) { printf("[RATE]: montage impossible\n"); trouve=0; } else { printf(" --> réussite\n"); trouve = 1; } // recherche du fichier // Le CD a pu etre monté if (trouve == 1) { printf(" Extraction de root.gz sur ram1\n"); /* Open input file */ in_file = fopen("/cdrom/root.gz", "r"); if (in_file == NULL) { printf("[RATE]: Lecture fichier impossible\n"); trouve = 0; } else { /* Open output file */ out_file = fopen("/dev/ram1", "w"); if (out_file == NULL) { fclose(in_file); umount("/cdrom"); printf("[RATE]: écriture impossible\n"); exit(0); } if (unzip(in_file, out_file) != 0) { printf("[RATE]: Fichier impossible à extraire\n"); umount("/cdrom"); exit(0); } else { printf(" --> réussite\n"); fclose (in_file); fclose (out_file); } } umount("/cdrom"); } } } if (trouve == 0) { printf("ECHEC: Pas de CDrom trouve\n"); exit(1); } /* Creat the symlink in the real root fs */ printf(" Montage de la racine\n"); if (mount ("/dev/ram1","/ram","ext2",MS_MGC_VAL, blank)) { printf("[RATE]: montage de /dev/ram1 impossible\n"); exit(1); } else printf(" --> réussite\n"); chdir("/ram/dev"); printf(" creation de /dev/cdrom\n"); symlink(cd_device,"cdrom"); chdir("/"); umount("/ram"); umount("/proc"); printf("\nINITRD fini, racine construite...\n"); return(0); }