Remake initrd
Posted: Mon 05 Dec 2011, 20:56
Hi All
I have idea to substitute file init in initrd as (example)
// 2>/dev/null; diet -v -Os gcc -static init.c -o init -Wl,-s,-x,--gc-sections; exit
#include <stdio.h>
#include <unistd.h>
#include <sys/mount.h>
#include <sys/vfs.h>
#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>
#include <linux/loop.h>
int main(int arvc, char *argv[], char *env[]){
char *devname="/Y.sfs";
char *size="size=64m";
int fd,fdev,lodev;
struct stat st;
struct statfs stfs;
dev_t rootdev;
while(*env){ if(env[0][0]=='s'&&env[0][1]=='i'&&env[0][2]=='z'&&env[0][3]=='e'&&env[0][4]=='=') size=env[0];env++;}
fdev = open(devname,O_RDWR);
if (fdev==-1) return 1;
lodev = open("/dev/loop0",O_RDWR);
if (lodev==-1) return 2;
ioctl(lodev, LOOP_SET_FD, fdev);
close(lodev);
if(mount("/dev/loop0","/d_root","squashfs",0,NULL)) return 3;
if(mount("none", "/d_rw","tmpfs",0,size)) return 4;
if(mount("aufs","/d_new","aufs",0,"br=/d_rw:/d_root")) return 5;
chdir("/d_new");
stat("/", &st);
rootdev = st.st_dev;
stat(".", &st);
statfs("/", &stfs);
if(mount(".", "/", NULL, 8192, NULL)) printf("error moving root\n");;
chroot(".");
chdir("/");
execl("/sbin/init", "init", (char*)NULL);
return 0;
}
//-----------------------------------------------------------------
and insert root squashfs into initrd (CPIO-archive).
In this case the kernel have to be compiled with squashfs and aufs.
I tested this idea with Fatdog and lucid and it works very quickly.
It'll be very good for NetBoot.
Cheers
I have idea to substitute file init in initrd as (example)
// 2>/dev/null; diet -v -Os gcc -static init.c -o init -Wl,-s,-x,--gc-sections; exit
#include <stdio.h>
#include <unistd.h>
#include <sys/mount.h>
#include <sys/vfs.h>
#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>
#include <linux/loop.h>
int main(int arvc, char *argv[], char *env[]){
char *devname="/Y.sfs";
char *size="size=64m";
int fd,fdev,lodev;
struct stat st;
struct statfs stfs;
dev_t rootdev;
while(*env){ if(env[0][0]=='s'&&env[0][1]=='i'&&env[0][2]=='z'&&env[0][3]=='e'&&env[0][4]=='=') size=env[0];env++;}
fdev = open(devname,O_RDWR);
if (fdev==-1) return 1;
lodev = open("/dev/loop0",O_RDWR);
if (lodev==-1) return 2;
ioctl(lodev, LOOP_SET_FD, fdev);
close(lodev);
if(mount("/dev/loop0","/d_root","squashfs",0,NULL)) return 3;
if(mount("none", "/d_rw","tmpfs",0,size)) return 4;
if(mount("aufs","/d_new","aufs",0,"br=/d_rw:/d_root")) return 5;
chdir("/d_new");
stat("/", &st);
rootdev = st.st_dev;
stat(".", &st);
statfs("/", &stfs);
if(mount(".", "/", NULL, 8192, NULL)) printf("error moving root\n");;
chroot(".");
chdir("/");
execl("/sbin/init", "init", (char*)NULL);
return 0;
}
//-----------------------------------------------------------------
and insert root squashfs into initrd (CPIO-archive).
In this case the kernel have to be compiled with squashfs and aufs.
I tested this idea with Fatdog and lucid and it works very quickly.
It'll be very good for NetBoot.
Cheers