Re: "probleme" xine
>
> 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);
}
Reply to: