LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 613|回复: 7

再问置顶帖子那个自动换ISO的方法。

[复制链接]
发表于 2004-8-10 18:44:08 | 显示全部楼层 |阅读模式
据说能够自动换ISO是因为替换了all.rdz,也就是说那个MandrakeISOinstall-10.0文件里面的all.rdz和光盘里面的alt0目录里的all.rdz不同。

那么我想知道究竟有什么不同,如果是shell脚本的话,这个脚本是怎么写的?

我想多了解一点,谢谢!
发表于 2004-8-10 21:03:47 | 显示全部楼层
关紧是mixISOs和sh两个东西起作用,
你可以看一下mixISOs和sh.S两个的源码,
关于all.rdz,README是这样说的
-----------
Note: The all.rdz is a gzipped ext2 filesystem. You should first gunzip it, then put the two files sh and mix_ISOs in its "/tmp" dir. The sh must be executable. After copying these two files, you may re-gzip the image again.
                                                                                                                                             
-----------------------------------------------
                                                                                                                                             
To unzip all.rdz, use this command:
                                                                                                                                             
gzip -d -c all.rdz > all.rd
                                                                                                                                             
To mount all.rd, use this command:
                                                                                                                                             
mount -o loop all.rd tmp_dir
                                                                                                                                             
To copy files, use commands like this:
                                                                                                                                             
cp sh mix_ISOs tmp_dir/tmp/
                                                                                                                                             
Unmount all.rd and commit the change:
                                                                                                                                             
umount tmp_dir
                                                                                                                                             
To zip all.rd, use this command:
                                                                                                                                             
gzip -9 -c all.rd > all.rdz
-----------
发表于 2004-8-10 21:12:12 | 显示全部楼层
mount -o loop all.rd /tmp_dir后你会发现/tmp_dir里是dev tmp etc bin sbin等像个系统,其tmp下就是sh mix_ISOs两个东西,

其原理和下面的安装方法原理是一个鸟样:p
--------------
1.选择从硬盘安装,输入CD1的具体名字,
2.在安装软件包到一定时候,会弹出一个对话框,提示一个文件无法安装,要换CD了.

2.1当第一次出错时(要换CD2了:):
Ctrl+Alt+F2切换到控制台,运行如下命令:
#umount /tmp/image
#losetup -d /dev/loop3
#mknod /dev/loop0 b 7 0
#/mnt/bin/mount -o loop /tmp/hdimage/Mandrakexxx-cd2.i586.iso /tmp/image

如果没有错误提示(你要确保你以上的步骤正确),Alt+F7切换到安装界面,继续即可;

2.2再出现错误时,是需要第三张盘,再次用Ctrl+Alt+F2切换到控制台,:
#umount /tmp/image
#losetup -d /dev/loop0
#/mnt/bin/mount -o loop /tmp/hdimage/Mandrakexxx-cd3.i586.iso /tmp/image
切换回安装界面继续安装;
2.3同样需要cd4:
#umount /tmp/image
#losetup -d /dev/loop0
#/mnt/bin/mount -o loop /tmp/hdimage/Mandrakexxx-cd4.i586.iso /tmp/image
切换回安装界面继续安装;
2.4文件安装结束时,还会用到CD1,所以,还会报错一次,切换到控制台,使用如下命令:
#umount /tmp/image
#losetup -d /dev/loop0
#/mnt/bin/mount -o loop /tmp/hdimage/Mandrakexxx-cd1.i586.iso /tmp/image
再切换到安装界面。
-----------------------
对照mixISOs,sh.S源码理解一下
发表于 2004-8-11 00:42:49 | 显示全部楼层

注意!

采用手动换ISO的方法,报错的软件包无法被安装。可能导致安装成功后无法进入系统。
 楼主| 发表于 2004-8-11 01:00:11 | 显示全部楼层

mix_ISOs 源码

#!/bin/sh

# Copyright(C) 2003 Tinybit (tinybit@163.net)
# Free program. You can redistribute it under GNU GPL.

export PATH=/usr/bin:/usr/sbin:/bin

c=0
while [ "$c" = 0 ]; do
  for d in 0 1 2 3 4 5 6 7 ; do mknod /dev/loop$d b 7 $d ; done
  f=/tmp/hdimage/*.[Ii][Ss][Oo]
  d=$(echo $f | grep "
  • ")
      [ "$d" = "" ] || break

      for d in 1 2 3 4 5 6 7 8 ; do mkdir /tmp/cd$d ; done

      for f in /tmp/hdimage/*.[Ii][Ss][Oo]; do
        for d in 0 1 2 3 4 5 6 7 8 ; do
          losetup -d /dev/loop$d
          losetup /dev/loop$d $f || continue
          mount -r -t iso9660 /dev/loop$d /tmp/cd1 && break
        done
        [ "$d" = 8 ] && continue
       
        cd /tmp/image
        g=$(ls -l)
        cd /tmp/cd1
        d=$(ls -l)
        cd /
        if [ "$g" != "$d" ]; then
          umount /tmp/cd1
          continue
        fi
    #    echo CD1: $f

        umount /tmp/image || break
        umount /tmp/cd1 || break

        for d in 0 1 2 3 4 5 6 7 ; do losetup -d /dev/loop$d ; done

        losetup /dev/loop0 $f || break
        mount -r -t iso9660 /dev/loop0 /tmp/cd1 || break

        c=$(($c+1))

        mkdir /tmp/image/Mandrake

        cd /tmp/cd1
        for g in *; do [ "$g" != Mandrake ] && ln -s /tmp/cd1/$g /tmp/image/$g; done
        cd Mandrake
        for g in *; do ln -s /tmp/cd1/Mandrake/$g /tmp/image/Mandrake/$g; done
        break
      done
      [ "$c" = 0 ] && break

      for g in /tmp/hdimage/*.[Ii][Ss][Oo]; do
        [ "$g" = "$f" ] && continue
        cd /
        umount /tmp/cd$(($c+1))
        losetup -d /dev/loop$c
        losetup /dev/loop$c $g || continue
        mount -r -t iso9660 /dev/loop$c /tmp/cd$(($c+1)) || continue
        cd /tmp/cd$(($c+1))/Mandrake || continue
        c=$(($c+1))
    #    echo CD$c: $g
        for d in *; do ln -s /tmp/cd$c/Mandrake/$d /tmp/image/Mandrake/$d; done
        cd ..
        for d in *; do [ "$d" != Mandrake ] && ln -s /tmp/cd$c/$d /tmp/image/$d; done
        [ "$c" = 8 ] && break
      done

      cd /
    #  echo Total number of Mandrake ISO files found: $c
      break
    done > /dev/null 2> /dev/null

    exit

    # killall /bin/sh
    d=""
    while [ "$d" = "" ]; do
      d=$(ps | grep "/bin/sh *$")
      c=0
      while [ "$c" != 100000 ]; do
        c=$(($c+1))
      done
    done
    set $d
    if [ "$1" != root ] && [ "$1" != 0 ]; then
      kill -9 $1
    else
      kill -9 $2
    fi

    exec /usr/bin/busybox sh
  •  楼主| 发表于 2004-8-11 01:01:19 | 显示全部楼层

    sh.S 源码

    /* Use the following command to compile and build:
    *
    *        gcc -s -nostdlib -o sh sh.S
    *
    */

            .globl _start
            .text

    _start:

            /* fork() */
            xorl    %eax, %eax
            incl        %eax
            incl        %eax
            int     $0x80
            testl        %eax, %eax
            jz        1f
            /* exit(0) */
            xorl    %ebx, %ebx
            xorl    %eax, %eax
            incl    %eax
            int     $0x80

    1:
    #if 0
            /* setpgid(0,0) */
            xorl    %ebx, %ebx
            xorl    %ecx, %ecx
            xorl    %eax, %eax
            movb        $57, %al
            int     $0x80
    #else
            /* setsid() */
            xorl    %eax, %eax
            movb        $66, %al
            int     $0x80
    #endif
    1:
            /* sleep(1) */
            xorl    %eax, %eax
            movb        $162, %al
            movl        $(time_sleep), %ebx
            xorl    %ecx, %ecx
            int     $0x80
           
            /* access("/bin/sh", F_OK) */
            xorl    %eax, %eax
            movb        $33, %al
            movl        $(shell_path), %ebx
            xorl    %ecx, %ecx
            int     $0x80
            orl        %eax, %eax
            jnz        1b        /* loop when not exist */

            /* execve("/bin/sh", argv, NULL) */
            xorl    %eax, %eax
            movb        $11, %al
            movl        $(shell_path), %ebx
            movl        $(argv), %ecx
            movl        $(envp), %edx
            int     $0x80
           
            /* exit(1) */
            xorl    %ebx, %ebx
            incl        %ebx
            xorl    %eax, %eax
            incl    %eax
            int     $0x80

    time_sleep:
            .long        1
            .long        0

    shell_path:
            .string        "/bin/sh"
    arg0:
            .string        "mix_ISOs"
    arg1:
            .string        "/tmp/mix_ISOs"
    argv:
            .long        arg0
            .long        arg1
    envp:
            .long        0
     楼主| 发表于 2004-8-11 01:02:34 | 显示全部楼层
    :( 发现论坛的一个bug了,对行首空格/tab的截取是错误的。不应该截取行首白字符。
     楼主| 发表于 2004-8-11 01:07:52 | 显示全部楼层
    对照代码能猜个八八九九了,谢谢楼上两位。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表