Linux复习
简要说明什么是Linux,历史,发布的主要版本。
GNU GPL下免费开源的类Unix操作系统,支持多种硬件平台;
历史:1984,Richard Stallman starts GNU project
1991,Linus Torvalds writes 1st version of Linux kernel
1992, First Distributions emerge
主要发行版本:Redhat—>Fedora Debian Ubuntu SuSe Mandrake
GNU与Linux的关系
Linux是操作系统内核,GNU提供了大量自由软件丰富在Linux上;
GNU是一个由自由软件构成的类Unix操作系统。Linux应该叫GNU/Linux
Linux安装
Choose language, keyboard type, mouse type
Create partitions
Setup a boot loader
Configure networkConfigure user and authentication
Select package groups
Configure X
Install packagesCreate boot disk
选择磁盘文件系统,分区:MBR or GPT
MBR(Master Boot Record)主引导记录,有自己的启动代码;最大支持2TB(容量瓶颈)
GPT(GUID Partition Table)GUID分区表,提供更加灵活的磁盘分区机制;支持2TB以上的大磁盘;磁盘分区个数无限制;
文件系统
操作系统中负责存取和管理文件的部分;一个文件及其某些属性的集合,它为这些文件的序列号提供了一个名称空间;
类型:
- VFS,虚拟文件系统,与以下的磁盘文件系统(即文件的分区格式不同),为底层的文件系统 供了统一的抽象。(更多内容参见 Chapter3 VFS)
- EXT2、EXT3、FAT32
启动过程
1)加载BIOS【主板上的固定芯片,控制开机】,包含了CPU的相关信息,设备启动顺序信息,硬盘信息,内存信息,时钟信息等;之后BIOS将系统的控制权交给硬盘的第一个扇区,开始由Linux控制系统;
2)读取MBR主引导记录,存放着预启动信息,分区表信息;找到MBR后,会复制0x7c00地址的内容(BootLoader)到物理内存;
3)Boot Loader:加载和启动Linux系统内核;Linux下的BootLoader为GRUB;
4)init过程,根据inittab文件来设定运行等级。
安装软件
apt-get command * ; dpkg; aptitude;yum+rpm
文件
文件是一堆数据的集合;可以读写的对象,有确定的属性,包括访问权限和类型;byte stream字节流文件;
文件类型:
(-)普通文件:纯文本文档、二进制文件、数据格式文件等
(c)字符设备文件:与设备进行交互的文件。Linux中所有的设备都被抽象为了对应的文件。字符设备是按字符读取。
(b)块设备文件:同字符设备文件,但是是按块读取。
(p)数据输送文件,管道文件(FIFO,pipe)。他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。
(s)socket文件。我们可以启动一个程序来监听客户端的要求,而客户端就可以通过这个 socket 来进行数据的沟通。如启动 Mysql 服务会创建一个对应的 socket 文件。一般在/var/run 目录中
(l)符号链接
(d)目录
目录
Linux 中所有的目录均包含在一个统一的、虚拟的统一文件系统(Unified File System)中;物理设备被挂载到对应挂载点,抽象为一个文件;
根目录下文件夹的作用:图
虚拟终端Virtual Terminal(Alt+Fn)
VT1-6: text mode logins
VT7: graphic mode login prompt
文件权限:用户、组、其他用户;读、写、执行; $ chmod 765 file
默认文件权限:file:-rw-r—r— 644 directory:drwxr-xr-x 755
进程:进程是一个正在执行的程序实例,由执行程序、它的当前值、状态信息以及通过操作系统管理进程执行情况的资源组成;
重定向
标准输入0 标准输出1 标准错误2
1
2
3
4> 输出重定向到一个文件或设备 覆盖原来的文件
>! 输出重定向到一个文件或设备 强制覆盖原来的文件
>> 输出重定向到一个文件或设备 追加原来的文件
< 输入重定向到一个程序管道:一个进程的输出作为另一个进程的输入; |
环境变量
echo 显示环境变量 echo $PATH
env 显示系统所有的环境变量
set 显示本地定义的shell变量
export 设置新的环境变量 export HELLO=”hello”常见环境变量
- HOME 用于保存注册目录的完全路径名。
- PATH 用于保存用冒号分隔的目录路径名,Shell 将按 PATH 变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。
- TERM 终端的类型。
- UID 当前用户的识别字,取值是由数位构成的字串。
- PWD 当前工作目录的绝对路径名,该变量的取值随 cd 命令的使用而变化。
- PS1 主 示符,在特权用户下,默认的主示符是#,在普通用户下,默认的主 示符是$。
脚本文件的执行方式及不同点:
- $ sh script_file
- chmod +x script_file ./script_file
- source script_file 或 . script_file
不同:法1,2会在当前进程下新开一个子进程执行该脚本;法3直接用和shell进程交互的当前进程执行该脚本。
shell不同类型
变量:用户变量、环境变量、参数变量和内部变量
用户变量:用户在shell脚本里定义的变量
read:-n作用是不换行,echo默认换行; -p参数允许在read命令行中直接指定一个提示;
省略变量名则输入的内容存储在默认变量REPLY; -t为等待输入时间添加一个最大值;
-n1表示只取输入的第一个字母;-s输入密码;
参数变量和内部变量:
调用脚本程序时如果带有参数,对应的参数和额外产生的一些变量
引号:单引号内所有的字符都是其字面意思;双引号内,除了$、``和\外,所有字符保持本身含义
条件测试
test expression 或 expression 或((expression)),但是(())里只能使用 C 风格的比较(< <= > >= !=)(无法使用-eq 等比较命令)
捕获命令
1
$(command) `command`
参数扩展
1
$((...))
即时文档:在shell脚本中向一条命令传送输入数据;
静态库 动态库
动态库链接时并不链接进.exe,等到执行时才链接;
执行时,静态库.a比动态库.so效率高一些,但是使用动态库可以减小单个文件的大小,防止单个可执行文件过大。全部使用静态库,不利于维护。
gcc
为什么编译分前后端:
- 编译前端主要包括词法分析、语法分析、语义分析、中间代码生成这几个部分,仅与编译的源语言有关
- 后端则包含代码优化和目标代码生成部分。仅与编译的目标语言及运行环境有关。
- 将编译过程划分成前端和后端,主要目的是在多种源语言和多种目标语言的开发过程中,可以灵活搭配组合,消除重复开发的工作量,提高编译系统的开发效率;
makefile描述模块间的依赖关系;make命令根据makefile对程序进行管理和维护;make判断被维护文件的时序关系
多目标:当多个目标文件依赖于一个文件,并且其生成的命令大体类似,可以使用一个自动化变量“$@”表示着目前规则中所有的目标的集合;
VFS:内核中负责文件系统运作;会把各种不同的文件系统组织成同一个接口,在系统调用层再做一次封装,之后可以进行系统调用。
产生四种对象:
超级块对象super block:代表当前VFS内核挂载知道这个分区,存储文件系统的信息;代表一个文件系统单位;
索引节点对象index-node object:记录磁盘上的文件;代表一个具体文件;
文件对象file object:代表某个文件被打开;文件对象并不代表磁盘上的文件;
目录项对象dentry object:记录每个文件的目录结构。
硬连接:不同的文件名对应同一个inode;不能跨越文件系统;对应系统调用link;
软链接:存储被链接文件的文件名(而不是inode)实现链接;可以跨越文件系统;对应系统调用symlink;可以对目录进行链接;
系统调用 库函数
系统调用是Linux内核的对外接口,用户程序和内核之间的唯一接口,提供最小接口;
库函数依赖于系统调用,提供较复杂的功能;
文件描述符:0读进数据 1写数据 2也随时写数据error
文件锁
标志位
Linux是有强制锁的,默认不开启;想让Linux支持强制性锁,不但在mount时加上-o mand,而且要对加锁的文件需要设置相关权限;
使用 -o mand 选项来挂载文件系统。这样在执行 mount() 系统调用时,会传入 MS_MANDLOCK 标记,从而将 super_block 结构中的 s_flags 设置为 1,用来表示在这个文件系统上可以采用强制锁。例如:
1
2# mount -o mand /dev/sdb7 /mnt``
# mount | grep mnt``/dev/sdb7 on /mnt type ext3 (rw,mand)命令集合
more:分页显示文件
less:与more类似,但可以随意浏览文件;less在查看之前不会加载整个文件;
nice:调整程序运行的优先级
renice:可以给正在运行的进程设置调度优先级
命令行1.为用户提供了强大的文本编辑器;2.节省资源,进程树比较小;3.不会因为线程被阻塞就停止响应;
配置文件
- title —————— Ubuntu, kernel 2.6.20-16-generic
- root —————— (hd0,1)
- kernel —————— /boot/vmlinuz-2.6.20-16-generic root=UUID=3f784cd9-516f-4808-a601– b19356f6bdea ro quiet splash locale=zh_CN vga=0x318
- initrd —————— /boot/
title:指定此菜单项的名称,既在grub列表里的名称
root:指定启动分区,注意,编号从0开始:比如第一块硬盘的第一个分区应该是(hd0,0)。启动分区的编号可以使用fdisk -l查询,但是需要root权限。
kernel:指定启动的内核的绝对路径和名称,后边跟参数,一般来说root参数就是你的根文件系统,一定要有的,可以像范例中使用
- initrd:指定系统启动访问真正的根文件系统前,访问的ramdisk映象