From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: Installing from distribution CDs Date: Tue, 11 Jan 2005 14:47:15 -0600 Message-ID: <1105476435.8207.16.camel@localhost> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-7Vg7hSbTzYD/gMlwiGha" Return-path: Sender: xen-devel-admin@lists.sourceforge.net Errors-To: xen-devel-admin@lists.sourceforge.net List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , List-Archive: To: xen-devel@lists.sourceforge.net Cc: niv@us.ibm.com List-Id: xen-devel@lists.xenproject.org --=-7Vg7hSbTzYD/gMlwiGha Content-Type: text/plain Content-Transfer-Encoding: 7bit Hi, I recently tried to see what it would take in Xen to install a distribution from a CD in domain > 0. Here's my findings along with a couple patches I used to find this. These patches are proof of concepts and quite ugly. 1) initrd support Xen currently implements the ramdisk option which seems to simply pull in a gzip'd file to a ramdisk and set that as the root. Looking at the initrd code in the kernel and reading through the man page, initrd is a bit more complicated than that. Among other things, the initrd process will check for a /linuxrc file and execute it. After execution, it will remount a new root and then fall through to the normal init process. SLES-9 at least uses linuxrc. I imagine most distros do since it was added specifically to help out distros. 2) CDROM support. SLES-9 at least expects to have been booted from a CDROM and looks for a /proc/sys/ entry to find out where that CDROM is. Right now Xen doesn't really support CDROMs. The attached patches add /linuxrc to the init list (this will at least let you get a bit into the installation process), add an old hack from 2.4 Xen to enable at least some response to MULTISESSION ioctls (otherwise isofs won't mount the device), and also add a CDROM entry to /proc/sys for hdc1. A couple questions did come up though: 1) why isn't xen using the Linux initrd code? The man page says that initrd has unspecified features. My fear is that some distros rely on these features so reusing the initrd code would probably be best. 2) Have there been thoughts on how removable devices like CDROMs are going to be supported? BTW, you have to increase the ramdisk size to 64MB and add support for minix to the kernel in order to boot off of SLES cd. Regards, -- Anthony Liguori Samba, Linux/Windows Interoperability Linux Technology Center (LTC) - IBM Austin E-mail: aliguori@us.ibm.com Phone: (512) 838-1208 Tie Line: 678-1208 --=-7Vg7hSbTzYD/gMlwiGha Content-Disposition: attachment; filename=xen-sles9-fakecd.diff Content-Type: text/x-patch; name=xen-sles9-fakecd.diff; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: 7bit diff -ur xen-2.0/linux-2.6.9-xen-sparse/drivers/xen/blkfront/vbd.c xen-2.0-new/linux-2.6.9-xen-sparse/drivers/xen/blkfront/vbd.c --- xen-2.0/linux-2.6.9-xen-sparse/drivers/xen/blkfront/vbd.c 2005-01-03 21:46:11.000000000 -0600 +++ xen-2.0-new/linux-2.6.9-xen-sparse/drivers/xen/blkfront/vbd.c 2005-01-05 14:08:26.000000000 -0600 @@ -31,6 +31,8 @@ #include "block.h" #include +#include +#include /* * For convenience we distinguish between ide, scsi and 'other' (i.e. @@ -281,6 +283,98 @@ return NULL; } +#define CDROM_STR_SIZE 1000 +static char info[CDROM_STR_SIZE]; + +int cdrom_sysctl_info(ctl_table *ctl, int write, struct file * filp, + void __user *buffer, size_t *lenp, loff_t *ppos) +{ + int pos; + + if (!*lenp || (*ppos && !write)) { + *lenp = 0; + return 0; + } + + pos = sprintf(info, + "CD-ROM information, Id: cdrom.c 3.20 2003/12/17\n" + "\ndrive name:\t\thdc1\n" + "drive speed:\t\t40\n" + "drive # of slots:\t1\n" + "Can close tray:\t\t0\n" + "Can open tray:\t\t0\n" + "Can lock tray:\t\t0\n" + "Can change speed:\t0\n" + "Can select disk:\t0\n" + "Can read multisession:\t0\n" + "Can read MCN:\t\t0\n" + "Reports media changed:\t0\n" + "Can play audio:\t\t0\n" + "Can write CD-R:\t\t0\n" + "Can write CD-RW:\t0\n" + "Can read DVD:\t\t0\n" + "Can write DVD-R:\t0\n" + "Can write DVD-RAM:\t0\n" + "Can read MRW:\t\t0\n" + "Can write MRW:\t\t0\n" + "Can write RAM:\t\t0\n" + "\n"); + + return proc_dostring(ctl, write, filp, buffer, lenp, ppos); +} + +/* Place files in /proc/sys/dev/cdrom */ +static ctl_table cdrom_table[] = { + { + .ctl_name = DEV_CDROM_INFO, + .procname = "info", + .data = &info, + .maxlen = CDROM_STR_SIZE, + .mode = 0444, + .proc_handler = &cdrom_sysctl_info, + }, + { .ctl_name = 0 } +}; + +static ctl_table cdrom_cdrom_table[] = { + { + .ctl_name = DEV_CDROM, + .procname = "cdrom", + .maxlen = 0, + .mode = 0555, + .child = cdrom_table, + }, + { .ctl_name = 0 } +}; + +static ctl_table cdrom_root_table[] = { +#ifdef CONFIG_PROC_FS + { + .ctl_name = CTL_DEV, + .procname = "dev", + .maxlen = 0, + .mode = 0555, + .child = cdrom_cdrom_table, + }, +#endif /* CONFIG_PROC_FS */ + { .ctl_name = 0 } +}; +static struct ctl_table_header *cdrom_sysctl_header; + +static void cdrom_sysctl_register(void) +{ + static int initialized; + + if (initialized == 1) + return; + + cdrom_sysctl_header = register_sysctl_table(cdrom_root_table, 1); + if (cdrom_root_table->ctl_name && cdrom_root_table->child->de) + cdrom_root_table->child->de->owner = THIS_MODULE; + + initialized = 1; +} + /* * xlvbd_init_device - initialise a VBD device * @disk: a vdisk_t describing the VBD @@ -323,13 +417,20 @@ goto out; } + printk(KERN_ALERT "XenLinux: init of %d %s\n", device, gd->disk_name); + if (VDISK_READONLY(xd->info)) set_disk_ro(gd, 1); + if (!strcmp(gd->disk_name, "hdc1")) { + xd->info = VDISK_TYPE_CDROM; + } + /* Some final fix-ups depending on the device type */ switch (VDISK_TYPE(xd->info)) { case VDISK_TYPE_CDROM: gd->flags |= GENHD_FL_REMOVABLE | GENHD_FL_CD; + cdrom_sysctl_register(); /* FALLTHROUGH */ case VDISK_TYPE_FLOPPY: case VDISK_TYPE_TAPE: --=-7Vg7hSbTzYD/gMlwiGha-- ------------------------------------------------------- The SF.Net email is sponsored by: Beat the post-holiday blues Get a FREE limited edition SourceForge.net t-shirt from ThinkGeek. It's fun and FREE -- well, almost....http://www.thinkgeek.com/sfshirt