bios告诉vmlinuz有什么硬件,vmlinuz附带了一些基本的硬件驱动,vga和鼠标,键盘等的驱动,

而其他的驱动,类似于文件系统,硬盘的驱动,则放置在initrd中,减少kernel的空间占用

如果不是第一次启动,则需要一个新旧硬件的比对,kuduz 发现新硬件,然后根据/etc/sysconfig/hwconf

如果挂接老的硬件,需要添加的参数以及如何挂接需要参考/etc/modprobe.conf

如果是新硬件,需要修改这两个文件

modules里面有硬件信息

对比modules.alias根据厂商的硬件信息,识别出新硬件的信息

模块的具体的位置存储在modules.dep,也存储了模块的依赖关系


硬件的发现过程

实验:

1,给本机添加reiserfs的模块,让系统支持rfs的文件系统

kernel.org放置的kernel不能用在企业级的

必须用redhat测试过kernel   (下载源代码,并打上补丁,生成打过补丁的源代码)

lftp ftp.redhat.com

>ls

>cd redhat


[root@localhost linux-2.6.18.i686]# uname -r确定自己的系统版本号

2.6.18-128.el5

[root@localhost tmp]# rpm -ivh kernel-2.6.18-128.4.1.el5.src.rpm 安装相应的的内核

warning: user mockbuild does not exist - using root

warning: group mockbuild does not exist - using root

warning: user mockbuild does not exist - using root

warning: group mockbuild does not exist - using root

warning: user mockbuild does not exist - using root

warning: group mockbuild does not exist - using root

warning: user mockbuild does not exist - using root

warning: group mockbuild does not exist - using root 

. 这里报错是因为rpm包是官网下载打包好的,打包所使用的root用户是redhat打包时候的用户

.

.

warning: user mockbuild does not exist - using root

warning: group mockbuild does not exist - using root

[root@localhost tmp]# cd /usr/src/redhat/   进入目录

[root@localhost redhat]# ls

BUILD   RPMS   SOURCES   SPECS   SRPMS

目录分别代表什么意义

BUILD(用来执行创建rpm的工作目录)编译的中间文件,解开的原代码放那里去

SOURCES源代码文件以及patch文件,rpm默认寻找目录

SPECS此目录存放源代码编译的时候的配置文件

SRPMS半成品,放置原代码包,编译出来的src的rpm包(*src.rpm),(包含了sources+specs,为了遵循GPL的协议,公布出去)

RPMS编译后产生的所有的rpm的文件

[root@localhost redhat]# cd SPECS/

[root@localhost SPECS]# ls

kernel-2.6.spec

[root@localhost SPECS]# rpmbuild -bp --target i686 kernel-2.6.spec

(其中p把pre的部分做完#spec文件中包含了pre,post等部分

Building target platforms: i686

Building for target i686

Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.2082

+ umask 022

+ cd /usr/src/redhat/BUILD

+ LANG=C

+ export LANG

+ unset DISPLAY

+ '[' '!' -d kernel-2.6.18/vanilla ']'

+ rm -f pax_global_header

+ cd /usr/src/redhat/BUILD

+ rm -rf kernel-2.6.18

.

.

.

.

+ patch -p1 -s

+ exit 0

[root@localhost SPECS]# cd ../BUILD/

[root@localhost BUILD]# ls

kernel-2.6.18

[root@localhost BUILD]# cd kernel-2.6.18/  到build目录下的kernel

[root@localhost kernel-2.6.18]# ls

config  Config.mk  linux-2.6.18.i686  vanilla  xen

[root@localhost kernel-2.6.18]# cd linux-2.6.18.i686/

[root@localhost linux-2.6.18.i686]# ls

arch     CREDITS        fs       Kbuild       Makefile  REPORTING-BUGS  sound

block    crypto         include  kernel       mm        samples         usr

configs  Documentation  init     lib          net       scripts

COPYING  drivers        ipc      MAINTAINERS  README    security

[root@localhost linux-2.6.18.i686]# uname -r

2.6.18-128.el5

[root@localhost linux-2.6.18.i686]# vim Makefile 

将    把 makefile的标识EXTRAVERSION改成当前的内核 e.g:EXTRAVERSION= -128.el5

EXTRAVERSION = -prep

修改为

EXTRAVERSION = -128.el5

保存退出


[root@localhost linux-2.6.18.i686]#make menuconfig 告诉kernel编译这个模块

File system ---->Reiserfs  support-->选择:stats...../ReiserFs..../ReiserFs....ReiserFs....

保存退出

[root@localhost linux-2.6.18.i686]# make prepare    内核预执行

scripts/kconfig/conf -s arch/i386/Kconfig

  CHK     include/linux/version.h

  UPD     include/linux/version.h

  CHK     include/linux/utsrelease.h

  UPD     include/linux/utsrelease.h

  SYMLINK include/asm -> include/asm-i386

  CC      arch/i386/kernel/asm-offsets.s

  GEN     include/asm-i386/asm-offsets.h

[root@localhost linux-2.6.18.i686]# make modules_prepare  内核模块的预执行

  CHK     include/linux/version.h

  CHK     include/linux/utsrelease.h

  HOSTCC  scripts/genksyms/genksyms.o

[root@localhost linux-2.6.18.i686]# make M=fs/reiserfs/   依赖模块要逐层make

                                           模块的具体路径

  WARNING: Symbol version dump /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/Module.symvers

           is missing; modules will have no dependencies and modversions.


  LD      fs/reiserfs/built-in.o

  CC [M]  fs/reiserfs/bitmap.o

  CC [M]  fs/reiserfs/do_balan.o

  CC [M]  fs/reiserfs/namei.o

  CC [M]  fs/reiserfs/inode.o   结束后有reiserfs.ko即所需的模块

[root@localhost linux-2.6.18.i686]# insmod fs/reiserfs/reiserfs.ko 

 #手动添加reiserfs.ko模块,位置可以在任意地方 

[root@localhost linux-2.6.18.i686]# lsmod |grep reiserfs  查看系统加载模块有没有挂接好

reiserfs              211588  0 

[root@localhost linux-2.6.18.i686]# ls

arch   configs  CREDITS  Documentation  fs       init  Kbuild  lib          Makefile  net     REPORTING-BUGS  scripts   sound

block  COPYING  crypto   drivers        include  ipc   kernel  MAINTAINERS  mm        README  samples         security  usr

[root@localhost kernel-2.6.18]# rmmod reiserfs    #删除rfs模块

[root@localhost kernel-2.6.18]# lsmod |grep reiserfs

[root@localhost linux-2.6.18.i686]#

mkdir /lib/modules/2.6.18-128.el5/kernel/fs/reiserfs 创建文件夹

[root@localhost linux-2.6.18.i686]# install -m 755 -d /lib/modules/2.6.18-128.el5/kernel/fs/reiserfs/

[root@localhost linux-2.6.18.i686]# depmod -a 生成modules.dep文件

[root@localhost linux-2.6.18.i686]# 

grep reiserfs /lib/modules/2.6.18-128.el5/modules.dep 

[root@localhost linux-2.6.18.i686]# lsmod |grep reiserfs  查看系统加载模块有没有挂接好

reiserfs              211588  0 

[root@localhost reiserfs]# 

install -m 755 -t /lib/modules/2.6.18-128.el5/kernel/fs/reiserfs/ /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/fs/reiserfs/reiserfs.ko 

Install   -m  755  -t (单个文件)   源目标    目的目标

                   -d (整个目录)

手动拷贝需要先设定权限,copy后再给文件设置权限

安装rfs模块到指定的位置

#make install 就是调用install命令,就是将产生的文件copy到相应的位置

[root@localhost reiserfs]# depmod -a

[root@localhost reiserfs]# modprobe reiserfs

[root@localhost reiserfs]# modinfo reiserfs  查看模块的信息

filename:       /lib/modules/2.6.18-128.el5/kernel/fs/reiserfs/reiserfs.ko

license:        GPL

author:         Hans Reiser <reiser@namesys.com>

description:    ReiserFS journaled filesystem

srcversion:     75AFFF93098091BCAD10C8A

depends:        

vermagic:       2.6.18-128.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1

[root@localhost reiserfs]# module_sig红帽子的官方签名






































[root@localhost bootinitrd]# zcat initrd-2.6.18-128.el5.img | cpio -i

11745 blocks

[root@localhost bootinitrd]# ls -R

\.:

bin  dev  etc  init  initrd-2.6.18-128.el5.img  lib  proc  sbin  sys  sysroot


./bin:

dmraid  insmod  kpartx  modprobe  nash


./dev:

console  null  ram   ram1  systty  tty0  tty10  tty12  tty3  tty5  tty7  tty9   ttyS1  ttyS3

mapper   ptmx  ram0  rtc   tty     tty1  tty11  tty2   tty4  tty6  tty8  ttyS0  ttyS2  zero


./dev/mapper:


./etc:


./lib:

ata_piix.ko      dm-message.ko  dm-region_hash.ko  firmware   mptbase.ko   ohci-hcd.ko  scsi_transport_spi.ko  vmxnet3.ko

dm-log.ko        dm-mod.ko      ehci-hcd.ko        jbd.ko     mptscsih.ko  pvscsi.ko    sd_mod.ko              vmxnet.ko

dm-mem-cache.ko  dm-raid45.ko   ext3.ko            libata.ko  mptspi.ko    scsi_mod.ko  uhci-hcd.ko


./lib/firmware:


./proc:


./sys:


./sysroot:




权限和认证

login 我是谁

su 我想成为谁

sudo 我想作某件事情,可以作某件事情,需要作一件事情,授权

授权在suid sgid

使用这个文件的时候拥有文件拥有者的权限

sgid,某个组的权限


认证可以有多种方式,passwd+shadow 标准unix的认证方式,login调用一个 pam的模块,pam.so,包括pamunix.so pam.md5.so

login把用户给的用户名字和密码给pam判断是否成功,然后给login返回信息成功还是不成功

认证本身和程序相关,如果程序需要的话,就需要

NIS 是远端的yppasswd ypshadow

如果login包含认证,则需要重新写程序,但是现在只需要写程序,需要修改的用模块的定义

认证不止是su在用,login,

可插入性的认证方式的好处,统一认证,与程序无关,用户透明  (pam机制)



授权,要给用户授权要有一个基准

配置,可以是文件本身上的认证 (suid sgid acl权限,

附加授权权限 setfacl,为了和windows连用,

为了使文件被kevin写,tube读,told写,mark读,如果还有一个其他的用户,则不方便设置


实验2

#mount -o remount,acl /myfiles/

给某一个分区作

#cd /myfiles/testdir 

#mkdir dir 

#setfacl -m u:kevin:rwx dir 

m是modules u用户还是组,kevin用户还是组名 

#getfacl dir

kevin有了rwx的权限


使用acl使的系统性能下降17%

需要去查看用户的权限,然后去比对


htpasswd也是一种授权方式,mysql的用户的认证,哪些用户能对哪些表做什么事情


安全也就是授权和认证

认证和授权都是针对程序的,程序本身不需要授权,则可以跳过去




从用户登录开始,

login登录的提示符,登录的认证程序,inittab 产生的 tty终端调用的login,如果调用的是需要认证的则去找pam机制

终端登录调用的是允许在哪些终端登录,在/etc/securetty

判断是否有nologin的文件,如果存在,普通用户是不可以登录的

passwd认证是否存在该用户,是否可以登录shell

用户的

(0,多长时间可以改密码

最后是0或者1,则不能登录)

shadow看用户是否过期了


minetty --autologin root tty1

跳过认证自动登录

man minetty查看参数


/etc/pam.d/login

去查看/etc/nologin是否存在,如果存在,则不允许登录

进去了,但是被T出来了


tty错误/etc/securetty,删除了tty3,则tty3不允许的登录

从安全的角度考虑,一般只开两个tty的登录许可


tty调用的pam.d/login



登录管理器 gdm 用的不是login



2,用户登录


3,motd文本的信息


4,pam决定了家目录的位置,如果是本地的则去找 /etc/passwd,进入到/


5,启动shell,csh,tcsh,zsh,nash 

判断用户使用哪种shell

执行/etc/profile下面的*.sh

系统有很多的shell,需要各自的环境,以单独的一个文件放置到 profile

conf 其中conf.d设置的是为了修改局部的配置,而不影响整体的配置


图形登录的时候执行xterm的,bash子 shell,之后执行bashrc

tty的时候先读取.bash_profile后,执行bashrc


用户自己决定是否执行 /etc/bashrc


退出的时候不保留记录 kill -9 0


/etc/skel包含了profile,bashrc等配置文件,添加用户的时候拷贝过去

可以放置***


initrd.img只需要放置本地启动需要的

安装需要防止所有可能的模块,可能需要各种板卡的驱动


1,用于启动的initrd.img

cp /boot/initrd*.img

mkdir /tmp/bootinitrd

zcat ../initrd*.img | cpio -i 

#-i input

#cpio用在纸带机上

#tar最早用在磁带机


dmraid lvm如果根是 raid 或者lvm则能识别出来


kpartx硬件虚拟化 mutipath

双hba卡+一个storage

两个卡认到2个设备

虚拟成一个设备



cd bootinitrd 

#解压开来

zcat ../initrd-2.6.18-128.el5.img | cpio -i

去掉lib中的ext3.ko,然后重新生成

#重新生成

find ./ | cpio -H newc -o > ../initrd.my

#以最高压缩比压缩

gzip -9 initrd.my


2,用于安装的 initrd.img

mkdir installinitrd

cd !$


解压开来之后

modules/pci.ids

作业:

查找pci.ids在系统中的哪个位置

dmesg

pci.ids由org提供


mkdir modules

mkdir 2.6.18-164.el5/i686/


zcat ../* | cpio -i


el4 initrd的制作方法

ext2的initrd

dd if=/dev/zero of=/tmp/initrddir bs=1M count=8

mkfs.ext2 initrddir

mount 

cp -a bootinitrd initrddir

gzip -9 initrddir


initrd.img然后去lib/modules-modules_alias 先去比对,然后去.dep去找位置