pk 发表于 2002-12-13 03:54:30

Mandrake Linux的问题集.

在硬盘用ISO裸装Mandrake90

论坛里面对于硬盘安装Mandrake90的帖子已经有了很多,一般的方法都是先把三个iso文件解压到硬盘的某个目录上面,然后再通过DOS启动,用loadin.exe引导或者或者用软盘启动。但到目前为止,我还没有见到用ISO裸装Mandrake90的方法。现在介绍下的我安装过程的情况。由于Mandrake90刚出来的时候,我下载了Mandrake90三ISO个文件,是通过解压安装的。但由于刚开始的时候,对linux认识并不多,一古脑儿把所有的东西都装上了,结果发现有些东西并不用上,加上自己的硬盘太小,所以近日来想keep fit下硬盘,就想到了重装Mandrake90.

1、下载iso文件,我是通过MS在www.linuxiso.org下载的,那里有很多的linux,如果你的网络速度快的,这里是个很好的地方。当然,你也可以下载第一个iso文件,以后可经通过网络慢慢长大你的Mandrake90;

2、将iso文件放在某个Fat32或Fat16文件系统的磁盘(最好不要放在ntfs文件系统下,这个方法我没有试过,应该没有问题吧?大家想试就自己试下吧)X下:即分区的根目录下,也可放到其它的目录下,但这是为了方便以后安装;

3、安装的启动方法,这有多种,作者是通过软盘启动安装的。将Mandrake90的ISO CD1中的images目录解的hd.img用WINIMAGE解压到一张软盘上。

4、用刚才做好的启动盘启动机器,成功启动后,选择正确的分区,然后输入iso的名字(有些人为了方便,会改变ISO的文件名,作者没有试过,大家可以自己试试,应该是可以的),例如:Mandrake90-cd1-inst.i586.iso,正确后它会继续向后进的;

5、接下来的界面起来就与其它硬盘或光盘安装是一样的了;下面的就是关键了:)哈哈

6、在安装软件包到一定时候,会弹出一个对话框,提示一个文件无法安装。这是要换ISO文件了.

7、当第一次出错时(要换CD2了:):

Ctrl+Alt+F2切换到控制台,运行如下命令:

#umount /tmp/image
#losetup -d /dev/loop3
#mknod /dev/loop0 b 7 0
#/mnt/bin/mount -o loop /tmp/hdimage/Mandrake90-cd2-ext.i586.iso /tmp/image

如果没有错误提示,Alt+F7切换到安装界面,继续即可;

8、再出现错误时,是需要第三张盘,再次切换到控制台,但此时与上稍有不同:

#umount /tmp/image
#losetup -d /dev/loop0
#/mnt/bin/mount -o loop /tmp/hdimage/Mandrake90-cd3-i18n.i586.iso /tmp/image

切换回安装界面继续安装;

9、文件安装结束时,还会用到CD1,所以,还会报错一次,切换到控制台,使用如下命令:

#umount /tmp/image
#losetup -d /dev/loop0
#/mnt/bin/mount -o loop /tmp/hdimage/Mandrake90-cd1-inst.i586.iso /tmp/image

再切换到安装界面。

10、下面的情况和你原来的设置就是一样了。注:如果在整个安装过程,需要某个包,你用上面的方法切换加载iso就是了。当遇到安装X的时候,最好还是跳过吧,因为这是一个全宇宙人都知道bug。呵呵,为了方便维护系统,最好还是做张启动盘吧,在出现问题的时候,可以通过软盘来修复错误。

    另外的情况,呵呵,当你相对比较熟悉linux的时候,当只下载Mandrake90的第一个iso文件的时候,随便装上几个最必要的包,系统就能用了;之后运用urpmi等一些小工具来维护升级你的系统。大多数OS的安装是“一口气吃成个胖子”型的,而Mandrake和Debian只要有了个base就可以通过网络一点一点“长大” :):cool:

BTW:(:刚才有一段时间这里连不上,相同的内容我也在LinuxSir上也帖了同样的帖子):)

pk 发表于 2003-1-3 03:44:24

为了保持连续性,我接着上篇来说说Mandrake的安装软件和升级的一些方法,以确保你能很方便地维护你的系统。

pk 发表于 2003-1-3 03:44:46

下面说说Mandrake的安装软件和升级的一些方法,介绍下一些小工具的基本用法,比如urpmi、urpmi.addmedia等。我在上面说过,Mandrake90本身只要第一个ISO文件便可通过网络一点点长大,当然你也可以随意增加或删除一些软件,比如用rpmdrake是增加或升级安装,rpmdrake-remove则是删除.。

1、当你的计算机本身有Mandrake的iso文件的时候,你可很方便实现。首先把你的iso文件mount到某个目录下,比如我的:
mount -t iso9660 -o loop /mnt/win_c2/Mandrake90iso_image/Mandrake90-cd1-inst.i586.iso /mnt/iso1

mount -t iso9660 -o loop /mnt/win_c2/Mandrake90iso_image/Mandrake90-cd2-ext.i586.iso /mnt/iso2

mount -t iso9660 -o loop /mnt/win_c2/Mandrake90iso_image/Mandrake90-cd3-i18n.i586.iso /mnt/iso3

当然,我可很容易进入到/mnt/isoX目录下选自己的想加的软件进行安装了。但当这时遇到你的一些rpm依赖关系的时候,你就感到这种安装方式很麻烦。呵呵,请看下面的。
urpmi.addmedia cd1 file://mnt/iso1/Mandrake/RPMS
urpmi.addmedia cd2 file://mnt/iso2/Mandrake/RPMS2
urpmi.addmedia cd3 file://mnt/iso3/Mandrake/RPMS3
然后你进行到/var/lib/urpmi目录看到,你可以看到正面三个文件了,
list.cd1
list.cd2
list.cd3
这就是介质创建 hdlist 综合文件文件。同时会更新/etc/urpmi/urpmi.cfg,你可以看看时的内容就知道是什么东西了。

接下来你可以通过rpmdrake、rpmdrake-remove来增删软件。当然此时,你也可以用urpmi加一些参数来进行操作,详细的可以参考man页。

2。网络安装和升级软件的方法。

如果你只有一个很小的系统,但只要你能上网,就可通过网络来升级和维护你的系统。你首先要知道一些提供的网络安装和升级软件的站点,我经常去的就是202.38.75.11,那里更新也很及时。当然,你可选择一些速度快的站点。
# rpm -rf /var/lib/urpmi/*
# echo rxvt >> /etc/urpmi/skip.list
# urpmi.addmedia ftp1 ftp://202.38.75.11/FreeOS/Mandrake90/Mandrake/RPMS   \
with ../base/hdlist1.cz                                                
# urpmi.addmedia ftp2 ftp://202.38.75.11/FreeOS/Mandrake90/Mandrake/RPMS2\
with ../base/hdlist2.cz                                                
# urpmi.addmedia ftp3 ftp://202.38.75.11/FreeOS/Mandrake90/Mandrake/RPMS3\
with ../base/hdlist3.cz                                                
# urpmi.addmedia updates ftp://202.38.75.11/FreeOS/Mandrake90/updates/RPMS \
with ../base/hdlist.cz                                                   

其中ftp1~ftp3对应于三张安装盘,updates对应于安全更新。

当然,你也可以用 --distrib这个参数,这是 一次加入几张安装盘的信息,hdlist 是自动寻找的。这样更加方便些。
urpmi.addmedia --distrib ftp://202.38.75.11/FreeOS/Mandrake90/

注意:自动寻找的时候的路径和上面的有区别的。/var/lib/urpmi目录和/etc/urpmi/urpmi.cfg文件都会更新。

通过这样,你一样使用rpmdrake、rpmdrake-remove来增删软件, 利用updates就可以升级软件。详细的用法还要参考下man页。

当然,你可以到MandrakeSoft的主页上,看看那些是要更新,直接更新就是了,也可以用MandrakeUpdate到国外的镜像站点自动更新,不过,这种方法可能会很慢。

pk 发表于 2003-1-3 03:45:08

昨天晚上到今天上午,我都连不上。原来在线写的,但当写完的时候,以为连不上了,所以,可能多点击了几次,请班主把下面重复的内容删除。谢谢。

pk 发表于 2003-1-3 03:45:30

Mandrake FAQ(1)

http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=12395

Mandrake FAQ(2)

http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=12396

pk 发表于 2003-1-3 03:45:52

Mandrake9.0的启动过程(从init开始)(一)(Z

作者:kj501
下面转载的两篇帽子不错。谢谢kj501的辛勤劳动。
Mandrake9.0的启动过程(从init开始)(一)

以阅读源代码的方式研究 linux的启动过程,是我早已有之的心愿。今天总算是开工了。由于理解系统初始化过程要有汇编的基础,所以我只好先从init开始。
init的源代码在/usr/src/linux-2.4.19-9mdk/init目录下,在这个目录下共有三个文件do_mounts.c、main.c和version.c。其中main.c就是init进程的源代码。这段代码并不长,只有640行。
首先用ctags -x main.c 生成一个tags文件,用vi 打开后,可以看到各个函数的索引:

LPS_PREC macro 183 main.c #define LPS_PREC 8
MAX_INIT_ARGS macro 125 main.c #define MAX_INIT_ARGS 8
MAX_INIT_ENVS macro 126 main.c #define MAX_INIT_ENVS 8
__KERNEL_SYSCALLS__ macro 12 main.c #define __KERNEL_SYSCALLS__
argv_init variable 135 main.c static char *
argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
calibrate_delay function 185 main.c void __init
calibrate_delay(void)
checksetup function 160 main.c static int __init
checksetup(char *line)
child_reaper variable 498 main.c struct task_struct
*child_reaper = &init_task;
cols variable 131 main.c int rows, cols;
debug_kernel function 226 main.c static int __init
debug_kernel(char *str)
do_basic_setup function 521 main.c static void __init
do_basic_setup(void)
do_initcalls function 500 main.c static void __init
do_initcalls(void)
envp_init variable 136 main.c char *
envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };
execute_command variable 133 main.c char *execute_command;
gr_setup function 148 main.c static int __init
gr_setup(char *str)
init function 603 main.c static int init(void
*unused)
loops_per_jiffy variable 178 main.c unsigned long
loops_per_jiffy = (1<<12);
parse_options function 254 main.c static void __init
parse_options(char *line)
profile_setup function 138 main.c static int __init
profile_setup(char *str)
quiet_kernel function 234 main.c static int __init
quiet_kernel(char *str)
rest_init function 389 main.c static void rest_init(void)
rows variable 131 main.c int rows, cols;
smp_init function 349 main.c static void __init
smp_init(void)
smp_init function 361 main.c static void __init
smp_init(void)
smp_init macro 354 main.c #define smp_init() do { }
while (0)
start_kernel function 401 main.c asmlinkage void __init
start_kernel(void)
wait_init_idle variable 344 main.c unsigned long
wait_init_idle;

有了这个索引后,查找函数就方便了。再用vi 打开main.c,找到init函数,如下:

代码:
static int init(void * unused)
{
        lock_kernel();
        do_basic_setup();

        prepare_namespace();
#ifdef CONFIG_GRKERNSEC
        grsecurity_init();
#endif
        /*
       * Ok, we have completed the initial bootup, and
       * we're essentially up and running. Get rid of the
       * initmem segments and start the user-mode stuff..
       */
        free_initmem();
        unlock_kernel();

        if (open("/dev/console", O_RDWR, 0) < 0)
                printk("Warning: unable to open an initial console.\n");

        (void) dup(0);
        (void) dup(0);

        /*
       * We try each of these until one succeeds.
       *
       * The Bourne shell can be used instead of init if we are
       * trying to recover a really broken machine.
       */

        if (execute_command)
                execve(execute_command,argv_init,envp_init);
        execve("/sbin/init",argv_init,envp_init);
        execve("/etc/init",argv_init,envp_init);
        execve("/bin/init",argv_init,envp_init);
        execve("/bin/sh",argv_init,envp_init);
        panic("No init found.Try passing init= option to kernel.");


在源代码中,可以看到很多如同#ifdef
CONFIG_GRKERNSEC的宏定义,这些宏定义可以在/usr/src/linux-2.4.19-9mdk/目录下的.config文件中找到。用vi
查看.config文件中的宏定义,发现"# CONFIG_GRKERNSEC is not
set",也就是没有定义,因此,这个宏定义可以不管它。先来看执行流程。

一、do_basic_setup()函数
init进程第一个执行的函数是lock_kernel(),这个函数在很多内核的源代码中都有,但我没有找到它的函数定义,只好放弃。
第二个执行的函数就是do_basic_setup(),这个函数的内容如下:

代码:
/*
* Ok, the machine is now initialized. None of the devices
* have been touched yet, but the CPU subsystem is up and
* running, and memory and process management works.
*
* Now we can finally start doing some real work..
*/
static void __init do_basic_setup(void)
{

        /*
       * Tell the world that we're going to be the grim
       * reaper of innocent orphaned children.
       *
       * We don't want people to have to make incorrect
       * assumptions about where in the task array this
       * can be found.
       */
        child_reaper = current;

#if defined(CONFIG_MTRR)        /* Do this after SMP initialization */
/*
* We should probably create some architecture-dependent "fixup after
* everything is up" style function where this would belong better
* than in init/main.c..
*/
        mtrr_init();
#endif   /*mtrr(Memory Type Range Register)是Inter P6系列处理器用来控制处理器读写内存范围的。*/

#ifdef CONFIG_SYSCTL
        sysctl_init();
#endif        /* 对/proc文件系统和sysctl()系统调用相关部分进行初始化*/

        /*
       * Ok, at this point all CPU's should be initialized, so
       * we can start looking into devices..
       */
#if defined(CONFIG_ARCH_S390)
        s390_init_machine_check();
#endif

#ifdef CONFIG_PCI
        pci_init();
#endif   /* 初始化PCI总线 */
#ifdef CONFIG_SBUS
        sbus_init();
#endif
#if defined(CONFIG_PPC)
        ppc_init();
#endif
#ifdef CONFIG_MCA
        mca_init();
#endif
#ifdef CONFIG_ARCH_ACORN
        ecard_init();
#endif
#ifdef CONFIG_ZORRO
        zorro_init();
#endif
#ifdef CONFIG_DIO
        dio_init();
#endif
#ifdef CONFIG_NUBUS
        nubus_init();
#endif
#ifdef CONFIG_ISAPNP
        isapnp_init();
#endif/* 对ISA总线即插即用初始化 */
#ifdef CONFIG_TC
        tc_init();
#endif

        /* Networking initialization needs a process context */
        sock_init();/* 初始化网络协议栈 */

        start_context_thread();
        do_initcalls();

#ifdef CONFIG_IRDA
        irda_proto_init();
        irda_device_init(); /* Must be done after protocol initialization */
#endif
#ifdef CONFIG_PCMCIA
        init_pcmcia_ds();                /* Do this last */
#endif
}


很明显,这段代码是用来进行对系统初始化的。开头的一段注释告诉我们,系统硬件此时只有cpu子系统在运转,内存管理和进程管理也开始工作了。接下来,就是对硬件的初始化。
这一部分与硬件密切相关,在编译核心时,将根据配置文件.config来编译相应的部分。用vi查看.config文件,发现定义的项目如下:

CONFIG_MTRR=y
CONFIG_SYSCTL=y

CONFIG_PCI=y
# CONFIG_PCI_GOBIOS is not set
# CONFIG_PCI_GODIRECT is not set
CONFIG_PCI_GOANY=y
CONFIG_PCI_BIOS=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_NAMES=y
CONFIG_PCI_HERMES=m

# CONFIG_SBUS is not set
# CONFIG_MCA is not set
CONFIG_ISAPNP=y

CONFIG_TCIC=y
CONFIG_TC35815=m

CONFIG_IRDA=m
CONFIG_IRDA_ULTRA=y
CONFIG_IRDA_CACHE_LAST_LSAP=y
CONFIG_IRDA_FAST_RR=y
# CONFIG_IRDA_DEBUG is not set

CONFIG_PCMCIA=m
CONFIG_PCMCIA_AHA152X=m
CONFIG_PCMCIA_FDOMAIN=m
CONFIG_PCMCIA_NINJA_SCSI=m
CONFIG_PCMCIA_QLOGIC=m
CONFIG_PCMCIA_HERMES=m
CONFIG_PCMCIA_3C589=m
CONFIG_PCMCIA_3C574=m
CONFIG_PCMCIA_FMVJ18X=m
CONFIG_PCMCIA_PCNET=m
CONFIG_PCMCIA_AXNET=m
CONFIG_PCMCIA_NMCLAN=m
CONFIG_PCMCIA_SMC91C92=m
CONFIG_PCMCIA_XIRC2PS=m
CONFIG_PCMCIA_IBMTR=m
CONFIG_PCMCIA_XIRCOM=m
CONFIG_PCMCIA_XIRTULIP=m
CONFIG_PCMCIA_RAYCS=m
CONFIG_PCMCIA_NETWAVE=m
CONFIG_PCMCIA_WAVELAN=m
CONFIG_PCMCIA_WVLAN=m
CONFIG_PCMCIA_SERIAL_CS=m

呵呵,这样一看,mandrake缺省配置的东西真不少,就连我根本用不上的IRDA和PCMCIA都编译成模块了。有了这些代码后,在开机时,就会看到这些启动信息:

[root@c4 linux-2.4.19-9mdk]#dmesg
......
mtrr: v1.40 (20010327) Richard Gooch ([email protected])
mtrr: detected mtrr type: Intel
PCI: PCI BIOS revision 2.10 entry at 0xfdb81, last bus=3
PCI: Using configuration type 1
PCI: Probing PCI hardware
Unknown bridge resource 0: assuming transparent
PCI: Using IRQ router PIIX [8086/2440] at 00:1f.0
isapnp: Scanning for PnP cards...
isapnp: No Plug & Play device found
Linux NET4.0 for Linux 2.4
......

二、prepare_namespace()函数
接下来要执行的是prepare_namespace()函数。这个函数在/usr/src/linux-2.4.19-9mdk/init/do_mounts.c文件中。内容如下:

代码:
/*
* Prepare the namespace - decide what/where to mount, load ramdisks, etc.
*/
void prepare_namespace(void)
{
        int is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
#ifdef CONFIG_ALL_PPC
        extern void arch_discover_root(void);
        arch_discover_root();
#endif /* CONFIG_ALL_PPC */
#ifdef CONFIG_BLK_DEV_INITRD
        if (!initrd_start)
                mount_initrd = 0;
        real_root_dev = ROOT_DEV;
#endif
        sys_mkdir("/dev", 0700);
        sys_mkdir("/root", 0700);
        sys_mknod("/dev/console", S_IFCHR|0600, MKDEV(TTYAUX_MAJOR, 1));
#ifdef CONFIG_DEVFS_FS
        sys_mount("devfs", "/dev", "devfs", 0, NULL);
        do_devfs = 1;
#endif

        create_dev("/dev/root", ROOT_DEV, NULL);
        if (mount_initrd) {
                if (initrd_load() && ROOT_DEV != MKDEV(RAMDISK_MAJOR, 0)) {
                        handle_initrd();
                        goto out;
                }
        } else if (is_floppy && rd_doload && rd_load_disk(0))
                ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
        mount_root();
out:
        sys_umount("/dev", 0);
        sys_mount(".", "/", NULL, MS_MOVE, NULL);
        sys_chroot(".");
        mount_devfs_fs ();
}


这段代码主要是决定根设备安装在那儿,在中间要处理一下RAM disk并判断是不是软盘启动的。
。RAM主要用来在核心安装根文件系统之前,预先装入一些模块。如果在lilo中指定了一个initrd.img映像文件,则内核在安装根设备之前,把它装上,否则正常安装根设备。

三、转入用户态运行
在完成初始化后,系统接着执行free_initmem(),将初始化过程中使用的内在释放。然后执行unlock_kernel(),这个函数想必就是前面lock_kernel()的逆操作了。然后以可读可写方式打开一个控制台设备。并复制两个文件描述符。
最后,init检查是否有给定的指今,如果没有,则按顺序检查是否存在/sbin/init、/etc/init、/bin/init和/bin/sh等文件,如果存在,则跳转执行相应和程序。一般情况下,系统都会启动/sbin/init程序,从此以后创建的进程都会在用户态运行。下一步的系统启动过程,也由/sbin/init来接着完成。

pk 发表于 2003-1-3 03:46:14

Mandrake9.0的启动过程(从init开始)(一)(Z

作者:kj501      谢谢kj501的辛勤劳动。
Mandrake9.0的启动过程(从init开始)(二)

在内核引导结束并启动/sbin/init之后,系统就转入用户态的运行。在这之后创建的一切进程,都是在用户态进行。这里先要讲清楚一个概念:就是init进程虽然是从内核开始的,即在前面所讲的init/main.c中的init()函数在启动后就已经是一个核心线程,但在转到执行/sbin/init之后,内核中的init()就变成了/sbin/init程序,状态也转变成了用户态,也就是说核心线程变成了一个普通的进程。这样一来,内核中的init函数实际上只是init进程的入口,它在执行execve("/sbin/init",argv_init,envp_init)时改变成为一个普通的用户进程。这就是exec系列函数替换进程映像的变身大法,只要你学过unix环境下的多进程编程,应该都能理解这一点。
除此之外,它们的代码来源也有差别,内核中的init()函数的源代码在/init/main.c中,是内核的一部分。而/sbin/init程序的源代码是sysvinit软件包的一部分,可以从ftp://ftp.cistron.nl/pub/people/miq...程序,如:halt, init, killall5, last, lastb (链接至 last), mesg, pidof (链接至 killall5), poweroff (链接至 halt), reboot (链接至 halt), runlevel, shutdown, sulogin, telinit (链接至 init), utmpdump 和 wall等等。对于启动过程而言,这里最重要的就是init程序。它启动之后,要完成很多任务:检查文件系统,启动各种后台服务进程,最后为每个终端和虚拟控制台启动一个getty进程供用户登录。由于所有其它用户进程都是由init派生的,因此它又是其它一切用户进程的父进程。
init进程启动后,就要按照/etc/inittab的内容进程系统设置。下面就是manfrake9.0的inittab内容:

#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg, <[email protected]>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by Mandrake Linux are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Things to run in every runlevel.
ud:nce:/sbin/update

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf:owerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345owerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

从中可以看到,inittab的每一行由四个字段组成。分别是:
id:runlevels:actionrocess
id:是每一行的标识符,长度一般为2个字符而且在整个inittab中必须唯一。对于getty或其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。
runlevels:指定运行级别,一般使用0-6以及S或s。运行级别是指init进程的整个系统的一个运行状态,它定义了系统所提供的服务,常见的运行级别如下:0,系统终止;1,单用户模式;3没有网络文件系统支持的多用户模式;4,保留;5,启动到Xwindow;6,重新启动,S和s意义相同,表示单用户模式且无需inittab文件,因此也不必在inittab中出现,实际上,进入单用户模式时,init直接在控制台(/dev/console)上运行/sbin/sulogin。实际上,7-9的运行级别也是可以使用的,只是传统的Unix系统没有定义这几个级别。级别可以是并列的多个值,以匹配多个运行级别,对大多数action来说,仅当runlevel与当前运行级别匹配成功才会执行。。
action:指出的是init程序执行process命令的方式。initdefault是一个特殊的action值,用于标识缺省的运行级别。当init进程由核心启动后,它将读取inittab中的initdefault项,取得其中的运行级别,并作为当前的运行级别。如果没有inittab文件,或者其中没有initdefault项,init将在控制台上请求输入运行级别。respawn 在进入相应runlevel时执行,如果该进程结束,init会再起一个进程执行同样的命令。once在进入有runlevels指定的运行级别时运行并且只执行一次。wait的执行效果和once一样,但init会等待该命令结束。ctrlaltdel指定在用户按下Ctrl-Alt-Del时执行的命令。powerfail 在系统接收到掉电信号时启动相关进程。powerwait 和powerfail一样,在系统接收到掉电信号时启动相关进程,并等待进程终止,在进程终止前不做任何其它操作。off 若该项相关进程已经存在则强行终止,否则忽略。sysinit、boot、bootwait等action将在系统启动时无条件运行,而忽略其中的运行级别,其中sysinit 指定需要运行的第一个程序(或脚本),boot将在sysinit之后执行,bootwait的执行效果和boot一样,但init会等待该命令结束,其余的action(不含initdefault)都与某个运行级别相关,可以在inittab的man手册中找到各个action的定义的详细描述。
process:给出每行要执行的命令。

知道inittab的字段意义以后,我们来看一下inittab的结构。inittab的第一行是设定系统的运行级别,如下所示:

id:5:initdefault:

从以上的介绍中可以知道,系统的运行级别是5,也就是系统启动时自动进入xwindow。接着进行系统初始化:

si::sysinit:/etc/rc.d/rc.sysinit

这样init进程就会执行/etc/rc.d/rc.sysinit。这个脚本最常见的动作就是激活交换分区,检查磁盘,加载硬件模块,这些动作无论哪个运行级别都是需要优先执行的。只有在rc.sysinit执行完以后init进程才会执行其他的boot或bootwait动作。如果没有boot或bootwait动作,init进程就接着执行下面的内容:

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

这里,系统将会根据运行级别选择要执行的命令。从前面我们已经知道系统的运行级别是5,所以实际上只有这一行被执行了:

l5:5:wait:/etc/rc.d/rc 5

这一行的最后是以参数5运行/etc/rc.d/rc,实际上就是运行/etc/rc.d/rc3.d下的所有程序(或脚本)。用ls命令查看/etc/rc.d/rc3.d目录,如下:

[kj501@c4 kj501]$ ls /etc/rc.d/rc3.d/
K09dm@ S16ypserv@ S56rawdevices@ S90crond@
K55routed@ S17alsa@ S56xinetd@ S90postgresql@
K90mysql@ S18sound@ S60cups@ S91smb@
S01usb@ S20random@ S60nfs@ S92lisa@
S03iptables@ S20xfs@ S60rwhod@ S95innd@
S05harddrake@ S25netfs@ S66yppasswdd@ S95kheader@
S10network@ S26apmd@ S75keytable@ S99devfsd@
S11portmap@ S26ypxfrd@ S80postfix@ S99hamboot@
S12syslog@ S40atd@ S85httpd@ S99linuxconf@
S13partmon@ S40saslauthd@ S85numlock@ S99local@
S14nfslock@ S55named@ S85proftpd@
S15gpm@ S55sshd@ S89internet@

这些文件都是一些系统服务程序,以“S”打头的文件用来在进入运行级别5时启动服务进程,以“K”打头的文件用来在系统关闭,离开运行级别5之前终止服务进程。后面的数字大小决定执行的先后次序,对于以”K“打头的服务进程,按照从高到低的顺序执行,对于以”S“打头的服务进程,按照从低到高的顺序执行。如果用ls -l 查看这些文件,就会发现它们大部分都是到/etc/rc.d/init.d目录下各个shell脚本的符号链接,而且这些脚本一般能接受start、stop、restart、status等参数,在启动时以start参数启动以“S”打头的脚本链接,如果存在一个同样的脚本链接但是以”K“打头,也会先执行以”K“打头的脚本链接,然后再执行以”S“打头的脚本链接,以保证这个服务进程是重新启动的。要注意在这些脚本的最后,都有一个S99local@的链接,这个链接是链接到/etc/rc.d/rc.local,而不是象其它脚本链接一样链接到/etc/rc.d/init.d下。可以在这个rc.local加入一些每个运行级别都要执行但又必须在系统服务进程启动后才能执行的命令,比如说对一些系统服务程序的参数设置。执行这些脚本之后,下面就要执行一个在每个运行级别都要执行的命令:

ud:nce:/sbin/update

这句话表明每一个运行级别都要运行命令update,此程序每隔30秒把内存缓冲区的内容回写一次,称为"同步",以防止系统崩溃或突然掉电造成的数据丢失和损坏。在这条命令之后,系统要设置一个陷阱,处理Ctrl-Alt-Del三个键同时按下时的执行动作。

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

这样,当用户按下Ctrl-Alt-Del时,系统就会执行/sbin/shutdown -t3 -r now这个命令重新启动系统。如果你要使Ctrl-Alt-Del失效,在这一行的前面加上一个”#“,也就是把它注释掉就行了。
再往下,我们可以看到这一行:

pf:owerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

这是处理在突然断电时系统执行的命令的。要让系统执行这个命令,你需要有UPS的支持并要启动powerd服务进程。与此相对应,如果在shutdown命令还没有执行完成时,电源又重新恢复正常,则系统会执行下面的命令中止shutdown命令:

pr:12345owerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

最后,系统要执行下列的命令,产生6个控制台:

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

这些操作都是通过getty进行的。mingetty是getty的简化,不能处理串口操作。getty的功能一般包括:打开终端线,并设置模式;输出登录界面及提示,接受用户名的输入;以该用户名作为login的参数,加载login程序等等。缺省的登录提示记录在/etc/issue文件中,但每次启动,一般都会由rc.local脚本根据系统环境重新生成。大家可以看到,在第二个字段上(也就是runlevel字段)并列有几个运行级别2345,这表明系统只有在2345运行级别时才会启动这些进程。respawn的意思在前面已经介绍过,这里就不说了。在产生这六个控制台后,每一个控制台都会出现login:提示符,系统的启动过程也就到此结束了,此时只要输入你的用户名和口令,你就开始正常地使用linux了。

pk 发表于 2003-1-3 03:46:36

:roll::roll::roll::roll::roll:

pk 发表于 2003-1-3 03:46:58

:lol::lol::lol::lol::lol::lol::lol::lol:

pk 发表于 2003-1-3 03:47:20

:lol::lol::lol::lol::lol::lol:

pk 发表于 2003-1-3 03:47:42

1 :evil:

QuickTime 发表于 2003-1-10 22:04:47

可是把这个设置成update来源之后如何update呢?启动MDK update需要连接到国外啊

pk 发表于 2003-1-11 19:01:30

你事先把在var/lib/urpmi/里面的东西全部干掉,同时看看/etc/urpmi/urpmi.cfg这个文件时的内容。

如果不行,你可以手工做嘛,在‘软件包管理’-->Software Source Manager里面把那些没有用的东西去掉。详细的你也可以看看这里:
http://www.trylinuxsd.com/dvd/pages/page2.html
或者是这里:
http://mandrakeforum.com/article.php?sid=2580&lang=en

tvtree 发表于 2003-1-11 19:30:50

:cry::cry: 用你说的方法不行,系统提示没有loop3什么的,搞的我原来的都没法继续安装了,是否跟硬盘分区有关啊,我的硬盘60G,分五个取,最后一个8G多给了linux。

pk 发表于 2003-1-12 03:47:24

老大,怎么说不行呢。首先要问问自己的方法对了没有?我已经安装多次都通过。

注意:你要在出错的时候对能切换到第二个终端,然后才umount /tmp/image,再losetup -d /dev/loop3 。如果你是正在用第一张ISO,还是正在装,而你又切换到第二个终端,会有这种情况发生。

关于分区的情况,我在写的时候已经说得很清楚了,我用的是fat32,如果是ntfs或其它的系统格式,你自己试试,我不会为了这个原因而再装一 遍我的系统吧。ntfs格式在Mandrake中是支持的,但一般只能读,不能写。Linux的东西还是大家自己多试试嘛。另外,和你的分多少个区没有关系。

再有,我也说得很清楚了,你只要第一个ISO文件也可装上,然后通过网络或我后继介绍的方法中的一种来升级你的系统。只是用第一个ISO文件装的时候,你只能选少一些软件。最少的好像只要70M左右就行了。

另外,请你详细给出你的错误信息,如果单单就"没有loop3什么的"一句,我也不能帮你什么忙。再者,我写这个是为了大家交流经验,你那句"搞的我原来的都没法继续安装了"使人看了感觉不太好。
Good lucky!
页: [1] 2 3
查看完整版本: Mandrake Linux的问题集.