网络操作系统-Linux基础 主讲人:王柯wangk@swnu.edu.cn 西南师范大学计算机科学系2005年春 第2章Red Hat Linux 9.0 安装与配置 2.1 安装前的准备工作 ? 2.1.1 收集硬件信息 ? 2.1.2 选择安装方法 ? 2.1.3 制作引导软盘 ? 2.1.4 选择安装方式 ? 2.1.5 磁盘分区和文件系统常识 2.1.1 收集硬件信息 ?了解你的硬件 –你有几个硬盘? –每个硬盘容量多大? –如果你拥有不止一个硬盘,哪个是主硬盘? –你有多大的硬盘? –你有SCSI卡吗?制造商和型号是什么? –你的鼠标是什么型号? –鼠标由几个按键? –如果是串口述表,那么连在哪个串口上? –你的显卡是什么型号?多少显存? –你的显示器制造商和型号? –如果你连到一个网络上,你还需要知道: ?你的IP地址? ?你的子网掩码? ?你的网关地址? ?你的域名服务器地址? ?你的域名? ?你的主机名? ?你的网卡制造商和型号? ? 2.1.2 选择安装方法 –从本地安装(CD-ROM/硬盘) –从网络安装(NFS/FTP/HTTP) ? 2.1.3 制作引导软盘 ? 2.1.4 选择安装方式 – Personal Desktop方式 – Workstation方式 –Server方式 – Custom方式 – Upgrade方式 ? 2.1.5 磁盘分区和文件系统常识 硬盘分区: 主分区(Primary Partition) 扩展分区(Extension Partition) 逻辑分区(Logical Partition ) 驱动器+分区标识: Primary Master: /dev/hda1 Primary Slave: /dev/hdb2 Secondary Master: /dev/hdc3 Secondary Slave: /dev/hdd5 Linux至少需要两个专门的分区: Linux Native(根分区) Linux Swap(交换分区) $mkdir /mnt/cdrom $mount –t auto /dev/hdb /mnt/cdrom ? 2.1.5 磁盘分区和文件系统常识 文件系统: VFS(Virtual File System) 逻辑文件系统(ext2/ext3) 2.2 安装Red Hat Linux 9.0 ? 2.2.1 启动安装程序 ? 2.2.2 从光盘安装 ? 2.2.3 安装步骤 2.2.1 启动安装程序 ? Boot模式 boot: 图形界面安装 boot: text 文字界面安装 boot: expert 专家模式安装 boot: linux dd 需要Driver Disk的安装 boot: rescue 系统修复模式 2.2.2 从光盘安装 ?虚拟控制台(Virtual Console) 1.选择语系 2.选择键盘类型 3.选择鼠标 4.选择新安装或升级安装 5.选择安装模式 6. *设置磁盘分区 7.自动分区 8. Disk Druid手动分区 9. *配置引导装载程序 (GRUB或LILO) 10.配置网络连接 11.配置防火墙 12.选择支持语言 13.配置时区 14.设置root口令 15.配置网络口令 16.选择安装包 17.准备安装 18.安装软件包 19.创建启动盘 20.配置显示卡 21. *配置X-Window系统 22.安装完成 2.2.3 安装步骤 ?多重引导 –GRUB –LILO – LOADLIN –SYSLINUX – System Commander – Partition Logic ?分区 –最小化的分区示例 / 35MB /boot 5MB /chroot 10MB /home 100MB /tmp 30MB /usr 232MB /var 25MB ? LBA(Logical Block Addressing): a method used with SCSI and IDE disk drives to translate the cylinder, head, and sector specifications of the drive into addresses that can be used by an enhanced BIOS. LBA is used with drive's that are larger than 504 MB. LINUX启动 LINUX启动 ?当开启基于Linux 的系统时,内核被一个引导 工具,例如LILO,从硬盘载入内存。在此时, 内核接管了的系统控制。它所作的第一件事是 探测并初始化它所找到的硬件--它被编译成能 支持的那些。一旦硬件已经被正确初始化,它 就准备开始运行进程了。它运行的第一个进程 被称为"init",位于/sbin目录下。然后,"init" 启动在/etc/inittab文件中指定的其他进程。 启动 ? “init”通常启动一个名为“getty”程序的多份拷贝, 它等待来自控制台的登录。在getty成功处理一 个登录请求后,缺省的shell (通常是bash) 被载入。 一旦进入bash,就可启动任意一个想要的程序了。 ?当所有这些新的进程被启动后,内核仍在控制系 统,精确地给CPU 分割时间片,这样每个进程将 均匀地分到。另外,内核继续为各种运行中的进 程提供硬件抽象和网络服务。 模块 所有最新的Linux 内核都支持内核模块。Kernel 模块是非常整齐的--它们是除非需要驻留在硬 盘上的内核部分。一旦内核需要一个特定模块 的功能时,它从硬盘被载入,自动集成到内核 中就可被使用了。另外,如果内核模块有好几 分钟未被使用,内核可以自愿地将其从内存中 调出--被称之为"自动清除"。 模块 ?内核模块是驻留在/lib/modules 目录下,而且 每个模块文件名结尾都有一个".o"。每个模块 代表一个内核功能的特定组件--一个模块可能 提供FAT 文件系统支持,而另一个可能支持 一种特殊的ISA 以太网卡. ?模块使得内核占用少量的内存空间。可创建一 个内核只包含足以启动计算机的功能,而其他 的功能则在需要时被载入。由于内核能自动清 除它所载入的模块,系统的内存资源能被很好 地利用。 模块 ?不能将所有一切放入模块中。由于模块是 存放在磁盘上,可启动的内核映像需要被 编译入磁盘控制器以及对基本文件系统 (通常是ext2 文件系统)的支持。如果没有 将这些重要的组件编译入内核映像(而是 将它们作为模块来编译),内核就无法获 得基本的功能来从磁盘上载入这些模块了 --导致了一个“鸡生蛋、蛋生鸡”的问题! 初始化流程分析 初始化流程 ?加电或复位 ?BIOS启动 ? Boot Loader ?操作系统初始化 加电或复位 ?CS:IP组合指向BIOS入口,这里是处理器运行 的第一条指令 ? CS:=FFFF; IP:=0000 BIOS启动 ?读入零柱面零道1扇区(MBR),其中放 Boot Loader ?BIOS提供一组中断以便对硬件设备的访 问 Boot Loader ?将系统启动代码读入内存 操作系统初始化 ?完成存储管理、设备管理、文件管理、 进程管理的初始化 初始化任务 ?初始化时要加入使80386进入保护模式的 代码。所以初始化过程依赖于处理器 ?加入即插即用初始化代码 Linux的Boot Loader ?软盘的结构 硬盘的结构 ?3D参数(Disk Geometry). 既磁头数 (Heads), 柱面数(Cylinders), 扇区数 (Sectors per track),以及相应的寻址方式. ?等密度结构硬盘. 外圈磁道的扇区比内圈 磁道多. 采用这种结构后, 硬盘不再具有 实际的3D参数, 寻址方式也改为线性寻 址, 即以扇区为单位进行寻址. 硬盘的结构 ?主分区表(MBR)在硬盘的第一个扇区. ?各子分区也有自己的分区表,放在该扩 展分区对应的第一个扇区中。 1.开机:-) 2. BIOS 加电自检( Power On Self Test -- POST ) 内存地址为0ffff:0000 3.将硬盘第一个扇区(0头0道1扇区, 也就是Boot Sector) 读入内存地址0000:7c00 处. 4.检查(WORD) 0000:7dfe 是否等于0xaa55, 若 不等于则转去尝试其他启动介质, 如果没有其 他启动介质则显示"No ROM BASIC" 然后死 机. 5.跳转到0000:7c00 处执行MBR 中的程序. 6. MBR 首先将自己复制到0000:0600 处, 然后继 续执行. 7.在主分区表中搜索标志为活动的分区. 如果发现 没有活动分区或有不止一个活动分区, 则停止. 8.将活动分区的第一个扇区读入内存地址 0000:7c00 处. 9.检查(WORD) 0000:7dfe 是否等于0xaa55, 若不 等于则显示"Missing Operating System" 然后停 止, 或尝试软盘启动. 10.跳转到0000:7c00 处继续执行特定系统的启动 程序. 11.启动系统... ?以上步骤中2,3,4,5 步是由BIOS 的引导程序完 成. 6,7,8,9,10 步由MBR中的引导程序完成. Boot Loader ?MBR中的代码为boot loader 或boot loader 的一 部分 ? Ms-boot Loader: 检查盘上是否存在两个隐含的 系统文件(IBMBIO.COM IBMDOS.COM). 将 其读出并送到内存中指定的区域,将控制权转 移给IBMBIO这个模块。 ?LILO:一个在linux下的boot loader,实现多重 启动 只有DOS系统 主引导扇区分区引导扇区操作系统 DOS-MBR MS-DOS COMMAND.COM 只有DOS的硬盘分区 DOS 和LINUX双系统 主引导扇区分区引导扇区操作系统 DOS-MBR MS-DOS COMMAND.COM LOADLIN Linux 用LOADLIN从DOS下启动Linux ?实现:DOS的主引导区和分区引导区无变化, 在DOS的配置文件autoexec.bat中加入LOADIN 程序 LILO 主引导扇区分区引导扇区操作系统 其它OS ...... DOS-MBR LILO LINUX LILO存放在Linux分区的引导扇区内 ?存放在linux分区的引导扇区内 ?特点:在启动前要设置为活动分区(烦 琐) LILO ?在分区引导扇区内多重引导 主引导扇区分区引导扇区操作系统 MS-DOS DOS DOS-MBR LILO LINUX LINUX LOADLIN LINUX LILO在分区引导扇区内的多重引导 LILO ?LILO放在主引导扇区里 主引导扇区分区引导扇区操作系统 LILO linux 其它操作系统 LILO放在主引导扇区中 LILO组成 ? Map installer: LILO用于管理启动文件的程序。 将boot loader写入引导分区,创建纪录文件- -map file 以映射内核启动文件。 ? The boot loader: 由BIOS读入内存的那部分 LILO程序,负责将OS的引导分区读入内存。 ?其它文件: –存放map install 纪录的map 文件(boot/map) 和存放LILO配置信息的配置文件 (/etc/lilo.conf) ?LILO在引导linux的同时还可以向linux内核传 送参数。 LILO运行分析 ?引导扇区被BIOS读入后,显示L字符。 ?在启动第二级引导扇区前,显示I。 ?读入二级引导扇区,当其获得控制权后显 示L。读入命令行解释器显示O。 ?读入内核image,控制权交给setup.S Setup.S ?检查OS代码 ?从BIOS获取内存、硬件等信息。 ?设置32位启动程序的存储位置。 ? Load idt和gdt ?设置保护模式标志位, ?控制权Head.S这段纯32位汇编代码 Head.S ?清空中断向量表 – linux初始化完成后,BIOS中断服务程 序就不会再被使用。在初始化最后阶 段(start_kernel()完成后),中断向量表 将被各个中断服务程序填充(包括设 备驱动程序)。 ?将启动参数保存在empty_zero_page中。 ?检查CPU类型。 Head.S ?调用setup_paging函数 –将映射出2个页的物理内存。一个是 swap_page_dir, 一个是零页pg0 –初始化页目录表 –定义empty_bad_page, empty_bad_page_table, empty_zero_page Head.s ? Empty_zero_page存放系统启动参数和命令行参 数。 ?物理地址0x0000没有被页映射。这里保存中断 向量表、GDT等比较重要的数据结构。 ?配置全局表述符表GDT,增加用户码段、用户 数据段、任务堆栈段、LDT ? Lgdt, lidt(重新执行),lldt ?调用/init/main.C中的start_kernel Start_kernel() ?此前已完成段页机制的建立。 ? Start_kernel()执行后,则可以以一个用户的身 份登录和使用linux了。 ? Start_kernel() { Setup_arch();//作与cpu、内存相关的初始化 ? Paging_init();// arch/i386/mm/init.c 完成页初始化,实现线性地址映射到物理地址 的页映射。 分配memory_start?memory_end的地址空间。 ? Trap_init()// /arch/i386/kernel/trap.c –初始化中断向量表,调用set_trap_gate宏对 中断向量表的各个表项填写中断处理程序。 –例如:中断80 由set_system_gate完成,实现 系统调用的中断。 –初始化第一个任务init_task的ldt和TSS,并填 入GDT的表项中;然后将其读入系统TSS和 LDT寄存器中 ? Init_irq() // /arch/i386/kernel/irq.c –初始化8259级连脚和协处理器引脚 – Struct irqaction{ void (*handler)(int, void *, struct pt_regs*); unsigned long flags; unsigned long mask; const char *name; void *dev_id; struct irqaction *next;} – Static void math_error_irq(int cpl,void *dev_id, struct pt_regs *regs) { outb(0, 0xf0); if( ignore_irq13|| !hard_math) return; math_error(); } – Static struct irqaction irq13 = { math_error_irq, 0,0,”math error”,NULL, NULL} –后继的中断在知道了设备驱动程序后,由 setup_x86_irq()完成中断初始化 ? Sched_init()// /kernel/sched.c – Init_bh//将timer, tqueue, immediate加入 ? Time_init() // /arch/i386/kernel/timer.c –初始化时间系统 ? Parse_options() //main.c –将启动参数付给相应变量。 ? Console_init() // /linux/drivers/char/tty_io.c –终端初始化 ? Kmalloc_init // linux/mm/kmallo.c –检查可用内存大小 ? Inode_init() // /linux/fs/inode.c –Vfs的I 节点初始化:初始化I node查找哈稀 表 ? Name_cache_init() // linux/fs/dcache.c –VFS目录缓存机制初始化。 ? Buffer_init() // linux/fs/buffer.c –指示块缓存初始化 ? Mem_init() // arch/i386/mm/init.c ?下面是各个模块的初始化,在init进程建立后完 成。 Init 进程的建立 ? Kernel_thread(init, NULL ,0)建立,它是所有进 程的父。 –Init()建立dbflush, kswapd两个新的内核线程 –初始化tty1设备 –启动init进程 –根据启动脚本文件创建其它必要的进程去 完成一下操作: ?检查FILE SYSTEM ?启动系统守护进程 ?为各个终端建立getty进程 ?执行/etc/rc下的命令 Init进程的启动流程 ?启动所需的shell脚本文件 ? Etc/inittab –Init根据其内容进入不同启动级别 ? Inittab中的选项 ? 2.3 基本日常工作 ? 2.3.1 设置代理 ? 2.3.2 登录 ? 2.3.3 打开Shell prompt ? 2.3.4 创建用户帐号/密码su useradd userdel passwd ? 2.3.5 文档资料 ? 2.3.6 桌面环境切换KDE<—>GNOME ? 2.3.7 注销 ? 2.3.8 关机halt haltsys shutdown reboot 2.3 基本日常工作 ? 2.3.1 设置代理 ? 2.3.2 登录 ? 2.3.3 打开Shell prompt ? 2.3.4 创建用户帐号/密码 su useradd userdel passwd ? 2.3.5 文档资料 tar xzvf file1.tar.gz rpm -Uvh fiel1.rpm ? 2.3.6 桌面环境切换KDE<—>GNOME ? 2.3.7 注销 ? 2.3.8 关机 halt haltsys shutdown reboot sync