学习笔记——Linux

Posted by 大攀 on Monday, November 9, 2020

TOC

一切皆为文件

特点

  • 免费开源
  • 模块化程度高
    • 内核设计分成:进程管理、内存管理、进程间通信、虚拟文件系统、网络 5部分,其采用模块化机制使用户可以根据实际需要,在内核插入或移走模块。
  • 广泛的硬件支持
  • 安全稳定
    • Linux采取了很多安全技术措施,包括读写权限控制、带保护的子系统、审计跟踪、核心授权等。
  • 多用户、多任务
    • 多用户是指系统资源可以同时被不同的用户使用,每个用户对自己的资源有特定的权限,互不影响;多任务是指计算机能同时运行多个程序,且程序之间彼此独立,Linux内核负责调度每个进程,使之平等地访问处理器。由于CPU处理速度极快,从用户的角度来看所有的进程好像在并行运行。
  • 良好的可移植性
    • Linux中95%以上的代码都是用C语言编写的,C是一种机器无关的高级语言,是可移植的。

安装

  • 不同发行版之间的差别在于软件管理的不同。
  • 必须要有的两个分区为 根分区(/)swap分区(交换分区)
    • 交换分区是一个特殊的分区,它的作用相当于Windows下的虚拟内存,这个分区的大小一般设置为物理内存的两倍,但是不管物理内存有多大,交换分区建议不要超过8GB,因为大于8GB的交换分区其实并没有多大实际意义。
  • Grub
    • Grand Unified Bootloader, Grub是一个系统引导工具,通过它可以加载内核,从而引导系统启动。
  • /boot分区
    • /boot分区用于放置Linux启动所用到的文件,如kernel和initrd文件。
  • DHCP
    • Dynamic Host Configuration Protocol动态主机配置协议。
  • tty
    • 默认情况下Linux提供6个终端,可以使用组合键Ctrl+Alt+F1进入第一个终端,使用组合键Ctrl+Alt+F2进入第二个终端,其他终端的组合键以此类推。
    • tty是Teletype的简写,Teletype是最早出现的一种终端设备,很像电传打字机。在Linux系统中,在特殊文件目录/dev下有一些文件与之对应,比如/dev/tty1、/dev/tty2等,从tty1到tty6又称为虚拟终端。如果想回到桌面模式,只需要使用组合键Ctrl+Alt+F7即可。

系统启动流程

系统引导

  1. “加电自检”——Power On Self Test (POST):
    • 计算机会加载BIOS,这是计算机上最接近硬件的软件,各家主板制造商都会开发适合自己主板的BIOS,而BIOS中一项很重要的功能就是对自身的硬件做一次健康检查,只有硬件没有问题,才能运行软件。
  2. 引导系统
    • 这个动作是BIOS设定的,BIOS默认会从硬盘上的第0柱面、第0磁道、第一个扇区中读取被称为MBR的东西,即主引导记录。
    • 一个扇区的大小是512字节,存放的内容是一段引导程序和分区信息,其中引导程序部分占用446字节,另外64字节是磁盘分区表DPT,最后两字节是MBR的结束位。这512字节的空间内容是由专门的分区程序产生的,比如说Windows下的fdisk.exe,或者Linux下的fdisk命令,所以它不依赖于任何操作系统,而MBR中的引导程序也是可以修改的,所以可以利用这个特性实现*多操作系统共存*。
    • 由于RedHat、CentOS默认会使用Grub作为其引导操作系统的程序,而Grub本身又比较大,所以常见的方式是在MBR中写入Grub的地址,这样系统实际会载入Grub作为操作系统的引导程序。
  3. 运行Grub
    • Grub最重要的功能就是根据其配置文件加载kernel镜像,并运行内核加载后的第一个程序/sbin/init,这个程序会根据/etc/inittab来进行初始化的工作。
    • 其实这里最重要的就是根据文件中设定的值来确定系统将会运行的runlevel,默认的runlevel定义在“id:3:initdefault:”中,其中的数字3说明目前的运行级别定义为3。
  4. 初始化系统配置
    • Linux将根据/etc/inittab中定义的系统初始化配置si::sysinit:/etc/rc.d/rc.sysinit执行/etc/rc.sysinit脚本,该脚本将会设置系统变量、网络配置,并启动swap、设定/proc、加载用户自定义模块、加载内核设置等。
  5. 启动相应的服务
    • 根据第三步读到的runlevel值来启动对应的服务,如果值为3,就会运行/etc/rc3.d/下的所有脚本,如果值为5,就会运行/etc/rc5.d/下的所有脚本。
  6. 运行/etc/rc.local
  7. 生成终端或X Window来等待用户登录

系统运行级别(runlevel)

所在/etc/inittab

  1. 运行级0:关机
  2. 运行级1:单用户模式
    • 系统出现问题时可使用这种模式进入系统维护,典型的使用场景时在忘记root密码时可进入此模式修改root密码。
  3. 运行级2:多用户模式
    • 没有网络连接
  4. 运行级3:完全多用户模式
    • Linux服务器常见的运行级
  5. 运行级4:保留未使用
  6. 运行级5:窗口模式
    • 支持多用户,支持网络
  7. 运行级6:重启

服务启动脚本

Linux启动过程中会使用K或S开头的脚本关闭或启动相关服务。

示例:当atd设置为启动时,将会在对应的/etc/rcX.d(X代表0~6)目录下显示:S95atd-> ../init.d/atd,系统根据第一个字母S判定atd需要启动,然后会调用命令/etc/init.d/atd start;当atd设置为关闭时,将会在对应的/etc/rcX.d目录下显示:K05atd-> ../init.d/atd,系统根据第一个字母K判定atd需要关闭,然后调用命令/etc/init.d/atd stop,这样就实现了对atd的启停控制,其他服务也是同样的原理。

命令

严格区分大小写

man文件

  • man命令
    • 上下键阅读文件内容
    • 空格键翻页
    • ’/‘搜索,n向下查找,N向上查找。示例”/time”回车
    • q结束查看man文件
  • man文件种类
    • 常见命令的说明
    • 可调用的系统
    • 函数库
    • 设备文件
    • 文件格式
    • 游戏说明
    • 杂项
    • 系统管理员可用的命令
    • 与内核相关的说明
  • man -f 命令
    • 查询要找的命令存在于哪些man文件中
    • 示例:man -f reboot / man 2 reboot

info

info工具是一个基于菜单的超文本系统。包括少许关于Linux Shell、工具、命令的说明文档。示例:info ls

/usr/share/doc

命令文件

date

显示日期,date +%Y%m%d

用户管理

Linux是一个多用户分时系统,想要使用系统资源,就必须在系统中有合法的账号,每个账号都有一个唯一的用户名,同时必须设置密码。在系统中使用用户的概念,一方面可以方便识别不同的用户,另一方面也可以为用户设置合理的文件权限,为每个用户的数据提供安全保障。另外,为了更灵活地管理用户和控制文件权限,Linux还采用了用户组的概念,这为系统管理提供了极大的便利。

用户(32位整数)

  • 分为:根用户(0)、系统用户(1~500)、普通用户(501~max(Int32))
  • /etc/passwd和/etc/shadow(用户信息和密码信息)/etc/group(用户组)

    账号管理

    新增和删除用户

  • useradd

    • 系统在添加用户时,需要预先为这个用户创建一些默认的“配置文件”,而默认配置的就是/etc/skel目录下的几个隐藏文件。可以说,/etc/skel实际上是创建用户时的“模板”。
    • -u 参数指定UID
    • -g 参数指定用户组
    • -d参数指定家目录
  • passwd 修改密码

  • usermod 修改用户

    • 其实usermod命令就是在对/etc/passwd和/etc/shadow文件做一些修改而已。
  • userdel 删除用户

新增和删除用户组

  • groupadd
  • groupdel

检查用户信息

查看用户:users、who、w

切换用户

su和sudo; - 运行sudo命令时,系统首先检查/etc/sudoers,判断该用户是否有执行sudo的权限。 - visudo编辑权限配置。 - 严格来说,sudo并不是真的切换了用户,而是使用其他用户的身份和权限执行了命令。

例行任务管理

  1. 单一时刻执行一次任务:at
           默认情况下,所有用户都可以使用at命令来调度自己的任务,如果由于特殊的原因需要禁止某些用户使用这个功能,可以将该用户的用户名添加至/etc/at.deny中。
  2. 周期任务:cron
  3. 首先需要确定crond进程在运行,如果没有运行,需要先启动该进程。(ubuntu下进程名为:cron)
  4. 与at类似,每个用户都可以设置自己的crontab,如果由于特殊的原因需要禁止某些用户使用这个功能,可以将该用户的用户名添加至/etc/cron.deny中。除了root之外,普通用户只可以设置、查看、删除自己的计划任务,root可以使用-u参数查看指定用户的任务。
  5. 系统例行任务配置文件/etc/crontab

文件管理

FHS(文件系统层次标准)定义了在根目录下的主要目录以及每个目录应该存放什么文件。

HFS定义的目录结构:

目录 目录的用途
/bin 常见的用户命令
/boot 内核和启动文件
/dev 设备文件
/etc 系统和服务的配置文件
/home 系统默认的普通用户的家目录
/lib 系统函数库目录
/lost+found ext3文件系统需要的目录,用于磁盘检查
/mnt 系统加载文件系统时常用的挂载点
/opt 第三方软件安装目录
/proc 虚拟文件系统
/root root用户的家目录
/sbin 存放系统管理命令
/tmp 临时文件的存放目录
/usr 存放与用户直接相关的文件和目录
/media 系统用来挂载光驱等临时文件系统的挂载点

文件的相关操作

touch(对已有文件只更新创建时间)、rm、mv(rename)、cat、head(-n 指定行数)、tail(-f 动态查看文件尾,eg:$tail -f /var/log/message)、dos2unix

dos2unix, 该命令是DOS to UNIX的简写,就是可以把DOS格式的文本文件转变成UNIX下的文本文件。之所以有这样的需求是因为Linux和Windows系统是可以通过文件共享的方式共享文件的,当把Windows下的文本文件移动到Linux下时,会由于系统之间文本文件的换行符不同而造成文件在Linux下的读写操作有问题。该命令的使用方式非常简单直接,后面跟上需要转换的文件名即可。

目录的相关操作

cd、pwd、mkdir(-p 一次性创建所有目录)、rmdir(只能删除空目录)和rm(-r 删除目录)、cp(-r 复制目录)

目录也是文件 (.  ..),作用在于存放其他的目录和文件。

文件和目录的权限

drwxr-xr-x 26 root root 4096 11月 9 17:07 ..

列数递增 含义 补充说明
drwxr-xr-x 文件的类别和权限 第一个字符表明文件的类型,剩余9个字符,3个一组,分别标识文件所有者user、文件所有组group、其他用户others拥有的权限
26 连接数 除了目录文件之外,其他所有文件的连接数都是1,目录文件的连接数是该目录中包含其他目录的总个数+2
root 代表文件的所有人
root 代表文件的所有组
4096 该文件的大小
11月 9 17:07 该文件的创建时间或最近的修改时间
.. 文件名

字符含义:

第一个字符可能的值 含义
d 目录
- 普通文件
l 链接文件
b 块文件
c 字符文件
s socket文件
p 管道文件

权限说明:

字符 说明
r 读权限
w 写权限
x 执行权限

Linux下的文件还有一些隐藏属性,必须使用lsattr来显示,默认情况下,文件的隐藏属性都是没有设置的。

如果要设置文件的隐藏属性,需要使用chattr命令。eg:chattr +a test.cfg

拥有a属性的文件只能在尾部增加数据而不能被删除,即便是root用户也不能删除它。

设置了i属性的文件将无法写入、改名、删除,即便是root用户也不行。这种属性常用于设置在系统或者关键服务中的配置文件,这对提升系统安全性有较大的帮助。

man chattr

改变文件权限:chmod

chmod u+r somefile

u、g、o来分别代表拥有者、拥有组、其他人。 增加权限使用+号,删除权限使用-号,详细权限使用=号; 定义r=4,w=2,x=1 (eg: chmod 754 somefile)。
如果需要修改的不是一个文件而是一个目录,以及该目录下所有的文件、子目录、子目录下所有的文件和目录(即递归设置该目录下所有的文件和目录的权限),则需要使用-R参数,也就是chmod-R 754 somedir。

改变文件的拥有者:chown

chown u:g somefile

chown -R u:g somedir

该命令用来更改文件的拥有者,同时它也具备更改文件拥有组的功能。

改变文件的拥有组:chgrp

chgrp [-R] g somedir

文件特殊属性:SUID/SGID/Sticky

-rwsr-xr-x 1 root root 59640 1月 25 2018 /usr/bin/passwd*

SUID:用户的s权限代表该命令设置了SUID权限,这意味着普通用户可以使用root的身份来执行这个命令。(SUID权限只能用于二进制文件)

SGID:如果某个二进制文件的用户组权限被设置了s权限,则该文件的用户组中所有的用户将都能以该文件的用户身份去运行这个命令。(eg: chmod g+s somefile)

Sticky:Sticky权限只能用于设置在目录上,设置了这种权限的目录(t),任何用户都可以在该目录中创建或修改文件,但是只有该文件的创建者和root可以删除自己的文件。 >$ ll -d /tmp/

drwxrwxrwt 16 root root 4096 11月 9 17:44 /tmp/

chmod o+t somedir

默认权限和umask

系统在/etc/profile文件中,设置不同用户的umask值(文件和目录创建时的默认权限)。 >使用遮罩(umask)计算权限:

777用字符串表示为:rwxrwxrwx,如果遮罩值是022,用字符串表示为:—-w–w-,那么前者第五位和第八位的w被遮罩掉,权限变为rwxr-xr-x,用数字表示就是755。如果遮罩值是002,用字符串表示为:——-w-,那么第八位的w被遮罩掉,权限变为rwxrwxr-x,用数字表示就是775。

查看文件类型:file

相比于ls -l通过查看第一个字符判断文件类型,file命令则可以直接告诉我们文件类型,还能给出更多的文件信息。(eg:$file /root)

查找文件

  • 一般查找:find

    • $find PATH -name FILENAME
    • 使用星号通配符来模糊匹配要查找的文件名
    • find常见参数:
    参数 含义
    -name filename 查找文件名为filename的文件
    -perm 根据文件权限查找
    -user username 根据用户名查找
    -mtime -n/+n 查找n天内/n天前更改过的文件
    -atime -n/+n 查找n天内/n天前访问过的文件
    -ctime -n/+n 查找n天内/n天前创建的文件
    -newer filename 查找更改时间比filename新的文件
    -type b/d/c/p/l/f/s 查找块/目录/字符/管道/链接/普通/套接字文件
    -size 根据文件大小查找
    -depth n 最大的查找目录深度
  • 数据库查找:locate

    • 与find不同,locate命令依赖于一个数据库文件,Linux系统默认每天会检索一下系统中的所有文件,然后将检索到的文件记录到数据库中。
    • 在运行locate命令的时候可直接到数据库中查找记录并打印到屏幕上,所以使用locate命令要比find命令反馈更为迅速。
    • updatedb命令,主动创建最新的文件列表数据库。
  • 查找执行文件:which/whereis

    • which用于从系统的PATH变量所定义的目录中查找可执行文件的绝对路径。
    • eg: which passwd
    • whereis也能查到其路径,但是和which不同的是,它不但能找出其二进制文件,还能找出相关的man文件。
    • eg: whereis passwd

文件压缩和打包

服务器环境中压缩文件还是非常有必要的,比如:文本类的日志文件之压缩比往往能达到80%~90%。

  • gzip/gunzip
    • 用来压缩和解压缩单个文件的工具
  • tar
    • tar不但可以打包文件,还可以将整个目录中的全部文件整合成一个包,整合包的同时还能使用gzip的功能进行压缩。
    • tar -zcvf boot.tgz /boot
      • -z:使用gzip压缩
      • -c:创建压缩文件
      • -v:显示当前被压缩的文件
      • -f:使用文件名(boot.tgz)
    • tar -zxvf boot.tgz -C /tmp
      • 解压缩
      • -C:指定压缩后的目录存放的位置
  • bzip2
    • 使用bzip2压缩文件时,默认会产生以.bz2扩展名结尾的文件。
    • 使用-z参数进行压缩,使用-d参数进行解压缩。
  • cpio
    • 该命令一般是不单独使用的,需要和find命令一同使用。
    • 备份:$find /etc/ -name *.conf | cpio -cov > /tmp/conf.cpio
    • 还原:$cpio –absolute-filenames-icvu < /tmp/conf.cpio

一般来说,整合后的包习惯使用.tar作为其后缀名,使用gzip压缩后的文件则使用.gz作为其后缀名。

因为tar有同时整合和压缩的功能,所以可使用.tar.gz作为后缀名,或者简写为.tgz。

文件系统

磁盘的盘片是带磁性的,物理上最终会使用不同的磁性代替0和1,这里就有一个明显的问题:磁盘的物理存储方式决定了其根本没有文件和目录的概念。而对用户来说,0和1同样毫无意义,那怎么办呢?这就需要一种类似于“翻译”的机制存在于用户和磁盘之间了,在Linux中采用的是文件系统+虚拟文件系统(Virtual File System,VFS)的解决方案。

文件系统

文件系统是操作系统用于明确磁盘或分区上相关文件的方法和数据结构,通俗的说法就是在磁盘上组织文件的方法。在使用前,都需要针对磁盘做初始化操作,并将记录的数据结构写到磁盘上,这种操作就是建立文件系统,在有些操作系统中称之为格式化。

Linux支持多种不同的文件系统,包括ext2、ext3、ext4、zfs、iso9660、vfat、msdos、smbfs、nfs等,还能通过加载其他模块的方式支持更多的文件系统。虽然文件系统多种多样,但是大部分Linux系统都具有类似的通用结构,包括超级块(superblock)、i节点(inode)、数据块(data block)、目录块(directoryblock)等。

  • 超级块包括文件系统的总体信息,是文件系统的核心,所以在磁盘中会有多个超级块,以防止由于磁盘出现坏块导致全部文件系统无法使用。
  • i节点存储所有与文件有关的元数据,也就是文件所有者、权限等属性数据以及指向的数据块,但是不包括文件名和文件内容。
  • 数据块是真实存放文件数据的部分,一个数据块默认情况下是4KB。
  • 目录块包括文件名和文件在目录中的位置,并包括文件的i节点信息。

磁盘分区、创建文件系统、挂载

磁盘使用前需要对其进行分割,这种动作被形象地称为分区。磁盘的分区分为两类,即主分区和扩展分区。受限制于磁盘的分区表大小(MBR大小为512字节,其中分区表占64字节),由于每个分区信息使用16字节,所以一块磁盘最多只能创建4个主分区,为了能支持更多分区,可以使用扩展分区(扩展分区中可以划分更多逻辑分区),但是即便这样,分区还是要受主分区+扩展分区最多不能超过4个的限制。在完成磁盘分区后,需要进行创建文件系统的操作,最后将该分区挂载到系统中的某个挂载点才可以使用。

  • 创建文件系统:fdisk
    • fdisk:manipulate disk partition table
  • 磁盘挂载:mount
    • 创建了文件系统的分区后,在Linux系统下还需要经过挂载才能使用,挂载设备的命令是mount。
    • 挂载点只能是目录。
    • umount(解除挂载): $umount /DEVICE/PATH 或 $umount MOUNT_POINT
  • 设置启动自动挂载:/etc/fstab
  • 磁盘检查:fsck、badblocks
    • 当磁盘出现逻辑错误时,可以使用fsck来尝试修复。
    • 出现此类错误比较典型的情况是当机器突然掉电时可能引发。
    • fsck-t TYPE /DEVICE/PATH
    • fsck在检查磁盘的时候,需要磁盘是未挂载的状态,否则会造成文件系统损坏。
    • badblocks:主要用来检测磁盘的物理坏道。

如果系统的根文件系统出现问题需要fsck怎么办呢?因为系统在运行时,根是无法被umount的。这时候只有重新启动计算机,因为如果确认根文件系统出现问题,系统在重启的时候会检测到这个问题,然后提示用户输入root的密码进入单用户模式,这样就可以使用fsck来修复根文件系统了。

Linux逻辑卷

磁盘一旦经过分区后,再想改变磁盘中这个分区的大小就很难了。为了更好地使用磁盘空间,提高系统空间的可扩展性,此时就需要使用逻辑卷。

逻辑卷

  • 逻辑卷就是使用逻辑卷组管理(Logic Volume Manager)创建出来的设备,也是Linux操作系统可以认识的设备。
  • 事实上,LVM是介于硬盘祼设备和文件系统的中间层。
  • 逻辑卷组管理:
    • 物理卷(Physical Volume, PV),也就是物理磁盘分区。如果要想使用LVM来管理物理卷,可使用fdisk工具将其ID改为LVM可以识别的值(也就是8e)。
    • 卷组(Volume Group, VG),是PV的集合。
    • 逻辑卷(Logic Volume, LV),是PV中划出来的一块逻辑磁盘。
  • 首先创建一个或多个物理卷,物理卷按照相同(或不同)的组名称聚集形成一个(或多个)物理卷组,而逻辑卷就是从某个物理卷组中抽象出来的一块磁盘空间。

制作逻辑卷

  1. 创建物理卷:pvcreate、pvdisplay
  2. 创建并查询卷组:vgcreate、vgdisplay
  3. 扩容卷组:vgextend
  4. 创建逻辑卷:lvcreate、lvdisplay
  5. 创建文件系统并挂载

硬链接和软链接

  硬链接(hard link)又称实际链接,是指通过索引节点来进行链接。在Linux文件系统中,所有的文件都会有一个编号,称为inode,多个文件名指向同一索引节点是被允许的,这种链接就是硬链接。硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接指向同一文件,删除一个链接并不会影响索引节点本身和其他的链接,只有当最后一个链接被删除时,文件的数据块及目录的链接才会被释放。也就是说,文件真正删除的前提条件是与之相关的所有硬链接均被删除。

  • 硬链接两个限制:
    • 不允许给目录创建硬链接;
    • 只有在同一文件系统中的文件之间才能创建链接,即不同分区上的两个文件之间不能够建立硬链接。

  软链接(soft link)又称符号链接(symbolic link),是一个包含了另一个文件路径名的文件,可以指向任意文件或目录,也可以跨不同的文件系统。软链接和Windows下的“快捷方式”十分类似,删除软链接并不会删除其所指向的源文件,如果删除了源文件则软链接会出现“断链”。

  • 软链接:
    • 创建:ln -s (硬链接:ln) file file_slink
    • 软链接本身就是一个文件(file和file_slink的inode不同)

字符处理

管道

  在Linux中也存在着管道,它是一个固定大小的缓冲区,该缓冲区的大小为1页,即4K字节。管道是一种使用非常频繁的通信机制,我们可以用管道符“|”来连接进程,由管道连接起来的进程可以自动运行,如同有一个数据流一样,所以管道表现为输入输出重定向的一种方法,它可以把一个命令的输出内容当作下一个命令的输入内容,两个命令之间只需要使用管道符连接即可。

ls -l /etc/init.d | more

使用grep搜索文本

  grep是Linux下非常强大的基于行的文本搜索工具,使用该工具时,如果匹配到相关信息就会打印出符合条件的所有行。

  • grep [-ivnc] ‘需要匹配的字符’ 文件名
    • -i不区分大小写
    • -c统计包含匹配的行数
    • -n输出行号
    • -v反向匹配(不包含)

使用sort排序

$ sort [-ntkr] 文件名

  • -n采取数字排序
  • -t指定分隔符
  • -k指定第几列
  • -r反向排序

cat sort.txt | sort -t “:” -k 2 -n

使用uniq删除重复内容

  如果文件(或标准输出)中有多行完全相同的内容,我们很自然希望能删除重复的行,同时还可以统计出完全相同的行出现的总次数,uniq命令就能帮助解决这个问题。

  uniq命令只会对比相邻的行,如果有连续相同的若干行则删除重复内容,仅输出一行。如果相同的行非连续,则uniq命令不具备删除效果。

cat uniq.txt | sort | uniq -c

使用cut截取文本

  cut能处理的对象是“一行”文本,可从中选取出用户所需要的部分。在有特定的分隔符时,可以指定分隔符,然后打印出以分隔符隔开的具体某一列或某几列,也可以打印指定的字符。

cat /etc/passwd | cut -f 1,6-7 -d ‘:’

cat /etc/passwd | cut -c 1-5,7-10

使用rt做文本转换

  rt作用在于文本转换或删除。

将文件/etc/passwd中的小写字母转换为大写字母:$cat /etc/passwd | tr ‘[a-z]’ ‘[A-Z]’

将文件/etc/passwd中的冒号删除:$cat /etc/passwd | tr ‘:’

使用paste做文本合并

  paste的作用在于将文件按照行进行合并,中间使用tab隔开(-d 指定合并文件时行间的分隔符)。

paste -d : a.txt b.txt

使用split分割大文件

  split命令来实现文件的分割,支持按照行数分割和按照大小分割这两种模式。要说明的是,二进制文件因为没有“行”的概念,所以二进制文件无法使用行分割,而只能按照文件大小进行分割。

按照行进行分割:$split -l 500 big_file.txt smallfile | ls smallfile*

按照文件大小分割:$split -b 64m big_bin smallbin | ll -h smallbin*

网络管理

网络接口配置

  • 使用ifconfig检查和配置网卡

    • eth: Ethernet,代表以太网,0代表是第一块网卡,第二块以太网网卡eth1,以此类推;
    • Link encap: 指封装方式为以太网;
    • HWaddr: 网卡的硬件地址(MAC地址);
    • inet addr: 该网卡当前的IP地址;
    • Broadcast: 广播地址(系统根据IP和掩码计算得出);
    • Mask: 掩码;
    • UP: 说明该网卡目前处于活动状态;
    • MTU: 最大传输单元,此网卡一次所能传输的最大分包;
    • RX: 接收的包;
    • TX: 发送的包;
    • collision: 代表发生的冲突数,如果值不为0则很可能网络存在故障;
    • txqueuelen: 传输缓冲区长度大小;
    • lo: 主机的回环地址,这个地址用于本地通信。
  • 命令示例:

    • 指定具体设备:ifconfig eht0
    • 指定IP地址(属动态配置):ifconfig eht0 192.168.159.131 netmask 255.255.255.0 或 ifconfig eht0 192.168.159.13124
    • 断开网卡:ifconfig eth0 down 或 ifdown eth0
    • 启动网卡;ifconfig eht0 up 或 ifup eht0
    • 显示所有(包括当前不活动的)网卡:ifconfig -a
  • 将IP配置信息写入配置文件

    • ifconfig命令可以直接配置网卡IP,但是这属于一种动态的配置,所配置的信息只是保存在当前运行的内核中。一旦系统重启,这些信息将丢失。
    • 写入配置文件,系统重启后将从这些配置文件中读取出来。
    • 网络配置文件/etc/sysconfig/network-scripts/ (/etc/sysconfig/network)
    • DEVICE变量定义了设备的名称;
    • BOOTPROTO变量定义了获取IP的方式,dhcp 或 static;
    • ONBOOT变量定义了启动时是否激活使用该设备,yes表示激活,no表示不激活。
    • GATEWAY变量来定义网关
    • 重启网络服务:service network restart

路由和网关设置

  • 查看系统当前路由表: route -n
  • 添加网关:route add default gw 192.168.159.2
  • 删除网关:route del default gw 192.168.159.2 或 route del default
  • 添加网络配置文件/etc/sysconfig/network-scripts/ 或 /etc/sysconfig/network

DNS客户端配置

  • /etc/hosts
    • 记录有限的主机名和IP的对应关系,加快域名解析,不必去请求DNS服务器。
  • /etc/resolv.conf
    • DNS客户端配置文件
    • nameserver关键字后面紧跟着一个DNS主机的IP地址,可以设置2~3个nameserver,但是主机在查询域名时会首先查询第一个DNS,当该DNS不可用时才会查询第二个DNS,以此类推。
    • search关键字后紧跟的是一个域名。每个主机严格来说都应该有一个FQDN(全限定域名),所以往往域名就很长,如果这里写成search google.com,那么www就代表www.google. com了,这个关键字后可以跟多个域名。
    • domain关键字和search类似,不同的是domain后面只能跟一个域名。

网络测试工具

  • ping
    • 执行ping命令的主机会向对端主机发送一个ICMP的echo请求包,对端主机在接收到这个包后会回应一个ICMP的reply回应包。
    • -c: 指定ping的次数
    • -i: 指定ping包的发送间隔
    • -w: 如果ping没有回应,则在指定超时时间后退出
  • host
    • host命令是用来查询DNS记录的,如果使用域名作为host的参数,命令返回该域名的IP;
    • $host 要查询的域名 指定DNS服务器 (而不是用/etc/resolv.conf文件中定义的DNS查询,eg: host www.google.com 8.8.8.8)
  • traceroute
    • 在IP包结构中有一个定义数据包生命周期的TTL(Time To Live)字段,该字段用于表明IP数据包的生命值,当IP数据包在网络上传输时,每经过一个路由器该值就减1,当该值减为0时此包就会被路由器丢弃。这种设计可用于避免出现一些由于某种原因始终无法到达目的地的包不断地在互联网上传递(可以形象地称之为“幽灵包”),减少无谓的网络资源耗用。
    • 路由器也不是“无声无息”地将TTL值为0的IP包丢弃的,它会同时给发送该IP数据包的主机发送一个ICMP“超时”消息,主机在接收到这个ICMP包后就同时能得到该路由的IP地址。
    • 基于以上两点,设计出(构造出从ttl为1递增的数据包)检测数据包是如何经由路由器的工具—traceroute;
    • traceroute如何确认该IP包成功地被目的主机接收了呢?因为目的主机即便收到了TTL值为1的数据包也不会发送ICMP通知给源主机的。这时traceroute所做的工作就是发送一个UDP包给目的主机,同时制定该UDP接收的端口为主机不可能存在的端口,主机在接收到这样的包后,由于端口不可达,则主机会返回一个“端口不可达”的通知,这样就能确认目的主机是否可以接收到数据包。
  • 常见网络故障排查
    • 硬件故障
      • 网卡物理损坏、链路故障等。
    • 软件故障
      • 网卡驱动故障、兼容性问题。
    • 排查步骤:
      1. 第一步是要确认网卡本身是否能正常工作?利用ping工具可以确认这点。输入ping127.0.0.1,然后看是否能正常ping通?这里的127.0.0.1被称为主机的回环接口,是TCP/IP协议栈正常工作的前提。如果ping不通,一般可以证实为本机TCP/IP协议栈有问题,自然就无法连接网络了。不过,出现这种现象的概率比较低。
      2. 第二步是要确认网卡是否出现了物理或驱动故障,使用ping本机IP地址的方式,如果能ping通则说明本地设备和驱动都正常。
      3. 第三步要确认是否能ping通同网段的其他主机。这一步主要是确认二层网络设备(比如交换机或者HUB)工作是否正常。如果ping不通往往说明二层网络上出现了问题,可能涉及交换机的端口工作模式、vlan划分等因素。
      4. 第四步要确认是否能ping通网关IP。如果数据包能正常到达网关,则说明主机和本地网络都工作正常。
      5. 第五步确认是否能ping通公网上的IP,如果可以则说明本地的路由设置正确,否则就要确认路由设备是否做了正确的nat或路由设置。
      6. 第六步确认是否能ping通公网上的某个域名,如果能ping通则说明DNS部分设置正确。

进程管理

进程的观察:ps、top

  • ps
    • -A: 列出所有的进程,和-e有同样的效果;
    • -a: 列出不和本终端有关的所有进程;
    • -w: 显示加宽可以显示较多信息;
    • -u: 显示有效使用者相关的进程;
    • aux: 显示所有包含其他使用者的进程;
STAT 进程状态
D 不可中断
R 运行中
S 休眠
T 暂停
Z 僵尸进程
W 没有足够的内存可分配
< 高优先级的进程
N 低优先级的进程

  命令ps输出的只是当前查询状态下进程瞬间的状态信息,如果要想及时动态地查看进程就需要使用top命令。要想查看每个逻辑CPU的使用情况,可以在top显示界面中按数字键1,进程信息区中的信息只是top默认显示的11个字段,如果要显示更多的字段,可以在top显示界面中按字母键f。

cpu信息:

标志字段 含义
us 用户空间占用的CUP百分比
sy 内核空间占用的CPU百分比
ni 改变过优先级的进程占用的CPU百分比
id 空闲CPU百分比
wa I/O等待百分比
hi 硬中断占用的CPU百分比
si 软中断占用的CPU百分比

top命令动态进程信息中每列的含义:

字段 含义
PID 进程id
USER 进程所有者
PR 进程优先级
NI nice值,该字段的取值范围是-20~19,数值越低代表优先级越高,也就能更多地被操作系统调度运行
VIRT 进程使用的虚拟内存总量,单位为kb,VIRT=SWAP+RES
RES 进程使用的未被换出的物理内存大小,单位kb,RES=CODE+DATA
SHR 共享内存大小,单位为kb
%CPU 上次更新到现在的CPU时间占用百分比
%MEM 进程使用的物理内存百分比
TIME+ 进程使用的CPU时间总计,单位为1/100秒
COMMAND 进程名称(命令名/命令行)

在top显示页面快捷键(可以按问号(?)键进入帮助模式):

  • P键:表示按照CPU的使用率排序
  • M键:表示按照Memory的使用率排序
  • N键:表示以PID排序
  • T键:表示按照CPU使用时间排序
  • K键:表示kill进程
  • R键:表示可以renice一个进程等

进程的终止:kill、killall

  这些命令的原理都是向内核发送一个系统操作信号以及某个进程的标识号,使得内核对指定标识号的进程进行相应的操作。

kill [ 信号代码 ] 进程ID

命令kill后可以跟的信号代码一共有64种,使用kill -l就可以看到具体有哪些。常用的一般只有3个,即HUP(1)、KILL(9)、TERM(15),分别代表重启、强行杀掉、正常结束。

使用kill-1重启进程的时候实际上是不会改变主进程的PID的,也就是说只是发生了原地重启,或者说“软重启”。

更快的获取进程PID:pidof

  -9强行停止进程这个命令有其天然的危险,就是进程可能会直接被系统终止,而没有清理之前申请的内存,这会造成一定程度的“内存泄露”,因此一般情况下不建议使用。而-15这个参数就比较温和了,它会使进程正常退出,它也是Linux默认的程序中断信号(也就是在不加参数的情况下默认使用的信号)。

  killall命令简单而且更为安全,它可以直接使用进程的名字而不是PID。(eg:$killall httpd)

查询进程打开的文件:lsof(list open files)

$lsof [ options ] filename

常用参数列表:

  • lsof filename: 显示打开指定文件的所有进程
  • lsof -c string: 显示COMMAND列中包含指定字符的进程所有打开的文件
  • lsof -u username: 显示所属于user进程打开的文件
  • lsof -g gid: 显示归属于gid的进程情况
  • lsof +d /DIR/: 显示目录下被进程打开的文件
  • lsof +D /DIR/: 同上,但是会搜索目录下的所有目录,时间相对较长
  • lsof -d FD: 显示指定文件描述符的进程
  • lsof -n: 不将IP转换为hostname,默认是不加-n参数
  • lsof -i: 用以显示符合条件的进程情况
  • lsof -i [ 46 ] [ protocol ] [ @hostname | hostaddr ] [ :service | port]
    • 46指IPv4或IPv6
    • protocol指TCP或UDP
    • hostname指主机名
    • hostaddr是IPv4地址
    • service是/etc/service中的service name
    • port是端口号

使用lsof命令还有个更实用的功能,就是可以通过其恢复被删除的文件—但这是有条件的,必须是文件正在被某个进程使用,而且该进程未停止(也就是依然拥有打开文件的句柄)。

进程优先级调整:nice、renice

  如果一个进程在启动时并没有设定nice优先级,则默认使用0。普通用户也可以给自己的进程设定nice优先级,但是范围只限于0~19。

  Linux使用了“动态优先级”的调度算法来确定每一个进程的优先级,一个进程的最终优先级=优先级(PR)+nice优先级。

  nice命令仅限于在启动一个进程的时候同时赋予其nice优先级。(eg: nice -n -10 ./my_job.sh)

  对于已经启动的进程,可以用renice命令进行修改,不过,这需要先查询出该进程的PID(使用ps命令)。(eg: renice -10 -p PID)

也可以使用top提供的功能来修改进程优先级,前提也是要查到该进程的PID,然后在top界面中按r键,在出现的PID to renice后输入PID,然后在出现的renice PID *** to value后输入修改后的nice优先级既可。

Visual Interface

vi编辑器的模式转换

vi光标移动操作:

|键|动作| |–|—| |h| 光标左移 | |j| 光标下移 | |k| 光标上移 | |l| 光标右移 | |$| 移到本行末尾 | |G| 移到整个文件的末尾 | |:n| 移动到第n行 | |Ctrl+f| 往下移动一页 | |Ctrl+b| 往上移动一页 | |Ctrl+d| 往下移动半页 | |Ctrl+u| 往上移动半页 |

vi编辑操作:

|键|动作| |–|—| |dw| 删除光标往后的第一个单词| |d$| 删除光标至最后的所有文本| |x | 向后删除一个字符| |X|向前删除一个字符| |yy | 复制光标所在的行| |p| 将复制的文本粘贴在光标下面一行| |u|撤销操作| |Ctrl+r| 重做操作| |i | 在当前光标处添加内容| |I | 在当前光标所在行的第一个非空处添加内容| |o | 在当前光标下一行插入新行并开始编辑| |O | 在当前光标上一行插入新行并开始编辑|

替换文本:

指令 动作
:n1,n2s/word1/word2/g 将n1到n2行之间的所有word1替换成word2
:1,$s/word1/word2/g 将第一行到最后一行的所有word1替换成word2
:s/word1/word2/g 将本行的word1替换成word2
:s/word1/word2 将本行第一次出现的word1替换成word2

vimtutor: 《vim教程》


comments powered by Disqus