盒子
盒子
文章目录
  1. 1. Linux 来源与发展概况
  2. 2. Linux 内核
    1. 2.1 系统内存管理
    2. 2.2 软件程序管理
    3. 2.3 硬件设备管理
    4. 2.4 文件系统管理
  3. 3. Linux 发行版列举
  4. 4. Shell
    1. 4.1 基本的 bash shell 命令
  5. 5. man 查看命令使用手册
  6. 6. 浏览文件系统
    1. 6.1 cd 命令,切换目录结构
    2. 6.2 ls 列表命令
    3. 6.3 处理文件
    4. 6.4 文件链接
    5. 6.5 移动文件(相同目录下具有可以重命名文件的作用)
    6. 6.6 删除文件
    7. 6.7 创建目录
    8. 6.8 删除目录
    9. 6.9 查看文件信息及内容(非文本编辑器)
    10. 6.10 file 命令
    11. 6.11 查看整个文件的内容
  7. 7. 进程命令
    1. 7.1 ps 命令
    2. 7.2 实时监控进程
    3. 7.3 结束进程

Linux 操作系统(一)

1. Linux 来源与发展概况

Linux 可以划分为 4 个部分:

  • Linux 内核
  • GNU 工具组件
  • 图形化桌面环境
  • 应用软件
    图片1.png

2. Linux 内核

Linux 第一版内核是 Linus Torvalds 在大学上学时开发的。

Linux 内核负责以下 4 项功能:

  • 系统内存管理
  • 软件程序管理
  • 硬件设备管理
  • 文件系统管理

2.1 系统内存管理

内存管理服务器的可用物理内存虚拟内存(swap space,位于磁盘的交换空间),内核会不断地在交换空间和实际的物理内存之间反复交换存储单元中的内容。

一般按照 LRU(Least Recently Used 最近最少未使用的策略来置换内存),内存存储单元会被按组分成很多块,这些块称为页面 (page),内核会将每个内存页面放在物理内存或 swap space,内核会维护一个内存页面表,来指明哪些页面能位于物理内存内,哪些页面能被换到磁盘上。
图片2.png

查看系统版本

1
2
3
4
5
6
[root@master01 ~]# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)
[root@master01 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@master01 ~]# cat /etc/system-release
CentOS Linux release 7.4.1708 (Core)

查看系统内存使用状况

1
2
3
4
5
6
7
[root@master01 ~]# cat /proc/meminfo 
MemTotal: 1867024 kB
MemFree: 739080 kB
MemAvailable: 1038716 kB
Buffers: 2116 kB
Cached: 421940 kB
...

默认情况下,运行在 Linux 系统的每个进程都有各自的内存页面,进程不能访问其他进程正在使用的内存页面。内核维护着它自己的内存区域。出于安全考虑,用户进程不能访问内核进程使用的内存

2.2 软件程序管理

Linux 操作系统称运行中的程序为进程。

进程分为前台进程后台进程(守护进程 Daemon):前台进程会将输出显示在屏幕上,后台进程会将输出隐藏到幕后。

内核控制着 Linux 系统如何管理运行在系统上的所有进程。

内核创建了第一个进程(init 进程)来启动系统上的所有其他进程,当内核启动时,它会将 init 进程加载到内存中。内核在启动任何其他进程时,都会在内存中给新进程分配一块专有区域来存储该进程用到的数据和代码。

查看进程

1
2
3
4
5
6
7
8
9
10
11
[root@master01 ~]# ps 1
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /usr/lib/systemd/systemd --switched-root --system --deseri
[root@master01 ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:07 ? 00:00:01 /usr/lib/systemd/systemd --switched-
root 2 0 0 07:07 ? 00:00:00 [kthreadd]
root 3 2 0 07:07 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 07:07 ? 00:00:00 [kworker/0:0H]
root 7 2 0 07:07 ? 00:00:00 [migration/0]
...

ps + 进程号:查看该进程信息
ps -ef:查看所有进程,format 显示。

UID:程序被该 UID 所拥有
PID:就是这个程序的 ID
PPID:则是其上级父程序的ID
C:CPU使用的资源百分比
STIME:系统启动时间
TTY:登入者的终端机位置
TIME:使用掉的CPU时间
CMD:所下达的是什么指令

2.3 硬件设备管理

内核的另一个职责是管理硬件设备。任何 Linux 系统需要与之通信的设备,都需要在内核代码中加入该设备的驱动程序代码(drive code)。驱动程序代码相当于应用程序和硬件设备的中间人,允许内核同设备之间交换数据。

在 Linux 内核中有两种方法来插入设备驱动代码:

  1. 编译进内核的设备驱动代码;(old,每次都需要重新编译内核)
  2. 可插入内核的设备驱动模块;(new,用的时候加载进内核,不用时直接从内核移走)

Linux 系统将硬件设备当成特殊文件处理,称为设备文件

  1. 字符型设备文件:处理数据时每次只能处理一个字符的设备。例如,调制解调器,终端;
  2. 块设备文件:处理数据时每次都能处理大块数据的设备。例如,硬盘;;
  3. 网络设备文件:采用数据包发送和接收数据的设备。例如,网卡。
1
2
3
4
5
6
7
8
[root@master01 ~]# cd /dev/
[root@master01 dev]# ll
total 0
crw-rw---- 1 root video 10, 175 Sep 19 07:07 agpgart
crw------- 1 root root 10, 235 Sep 19 07:07 autofs
drwxr-xr-x 2 root root 180 Sep 19 07:07 block
drwxr-xr-x 2 root root 80 Sep 19 07:07 bsg
crw------- 1 root root 10, 234 Sep 19 07:07 btrfs-control

第一列显示了该文件的类别和权限,b 表示(block device)块设备,c(character device)字符型设备。

2.4 文件系统管理

内核必须在编译时就加入所有可能用到的文件系统的支持。
图片3.png

任何供 Linux 服务器访问的硬盘都必须格式化成其中的一种。

Linux 内核采用虚拟文件系统(Virtual File System,VFS)作为和每个文件系统交互的接口。
这为 Linux 内核同任何类型的文件系统通信提供了一个标准接口。当每个文件系统被挂载和使用 时,VFS将信息都缓存在内存中。

3. Linux 发行版列举

  • Red hat:一个主要用户 Internet 服务器的商业发行版
  • Ubuntu:一个免费的学校和家庭用的 Linux 发行版
  • Centos:它是将 Red Hat Enterprise Linux 的源代码重新编译而成的二进制发行方式,而 Red hat 是源代码的发行方式。

4. Shell

  • Shell 是一个交互式工具,它为用户提供了启动程序、管理文件系统上的文件以及管理运行在 Linux 系统上的进程的途径。
  • Shell 的核心是命令行提示符,命令行提示符是 Shell 的交互部分。
  • Shell 允许你在命令行提示符中输入程序的名称,它会将程序的名称传递到内核以启动它。
  • 你也可以将 Shell 命令放在文件中作为程序执行,这些文件被称为 Shell 脚本。

在 Linux 系统上,通常有很多种 Linux Shell 可用,不同的 Shell 有不同的编程特性,有些有利于进行浮点运算、关联数组。
:所有 Linux 发行版默认的 Shell 基本上都是 bash shell。

4.1 基本的 bash shell 命令

Bash Shell 通常在用户登录终端时默认启动。
默认情况下,bash shell 启动时,会默认加载 ~/.bashc, ~/.bash_profile, /etc/bashc 文件中的命令。

Centos 默认 bash shell 提示符:[root@master01 dev]#
格式为:[用户名@主机名 当前目录]#

如何修改?
通过两个内置环境变量 PS1, PS2
PS1:控制默认命令行提示符的格式 [\u@\h \W]$ 在 /etc/bashrc 文件中设置
PS2:控制后续命令行提示符的格式 >

提示符字符串中使用的特殊字符列表(提示符特殊字符都从反斜线\开始,\是转义字符):
图片4.png

PS1=”[\t][\u]$“ 只在当前 shell 命令行提示符会话中有效

5. man 查看命令使用手册

1
2
man date
man more

man 命令,可以使用空格键翻页,上下键和回车键逐行反动,q退出。

6. 浏览文件系统

文件系统的构建方式:
Windows:G:\Hexo\邢大强的blog\db.json
Linux:/opt/hdfsData/phone.csv

Windows 会为每一个物理磁盘分区或存储设备分配一个盘符,每个分区都会有自己的目录结构,Windows 的文件路径会告诉你究竟哪块物理硬盘分区上有文件 db.json,新挂载的 U 盘上的路径可能是 F:\db.json。

Linux 则将文件存储在单个目录结构中,这个目录我们称之为虚拟目录(virtual directory),虚拟目录中包含了所有存储设备的文件路径,并将其并入到一个目录结构中。

:Linux 使用正斜线/ 而不是反斜线\ 来划分目录,因为在 Linux 中反斜线是用来标识转义字符的。

常见的 Linux 虚拟目录结构含义:
图片5.png

6.1 cd 命令,切换目录结构

1
2
3
4
cd /opt/	// 切换到 /opt 目录下
cd - // 切换到上一次执行的目录
cd . // 切换到当前目录
cd .. // 切换到当前目录的父目录

绝对文件路径和相对文件路径

  • 绝对文件路径定义了虚拟目录结构中该目录的确切位置,以虚拟目录的根目录/开始,相当于目录的全名 。用户可以通过绝对文件路径来切换到文件系统中的某个特定位置。
    1
    cd /opt/modules/spark243

   但有时基于当前目录切换更简洁,绝对路径往往过于冗长。

  • 相对文件路径允许用户指定一个基于当前位置的目标文件路径。
    1
    2
    3
    4
    cd ../hadoop277/	// 切换到父目录下的 hadoop277 目录
    cd ./libs // 切换到当前目录下的 libs 目录下
    cd logs/ // 切换到当前目录下的 logs 目录下
    cd - // 切换到上一次执行的目录

6.2 ls 列表命令

列出系统上有哪些文件
ls 命令输出的列表是按字母排序的(按列排序而不是按行排序)

1
2
3
4
5
6
man ls
ls --color
ls -F // 目录后加入/
ls -a // 显示隐藏文件
ls -R // 显示当前目录下包含的目录中的所有文件(文件树)
ls -l(ll) // 输出长列表格式的输出
1
2
3
4
5
6
-rw-r--r-- 1 miracle miracle 21316 May  1 13:19 LICENSE
drwxr-xr-x 2 miracle miracle 4096 May 1 13:19 licenses
drwxr-xr-x 2 root root 6 Jul 21 14:57 logs
-rw-r--r-- 1 miracle miracle 42919 May 1 13:19 NOTICE
drwxr-xr-x 9 miracle miracle 311 May 1 13:19 python
drwxr-xr-x 3 miracle miracle 17 May 1 13:19 R
  • 文件类型,比如目录(d)、文件(-)、字符型文件(c)或块文件(b)
  • 文件的权限(所属用户、所属用户组用户、其他用户)
  • 文件的硬链接总数
  • 文件属组的用户名
  • 文件属组的组名
  • 文件的大小(Bytes)
  • 文件的上次修改时间
  • 文件名或目录名
1
2
3
ls -i		// 显示文件的索引节点号(inode),每个文件都有唯一的索引节点号
ls -l -a -F // 单横线选项可以自由组合
ls -laF

ls 过滤文件功能

1
2
3
4
5
ll LICENSE
ll a?
ll a*
ll {aa,ab}
ll /opt/modules/spark243/

标准路径通配符:?代表一个字符,*代表零个或多个字符,{}中逗号分隔表示多选。

6.3 处理文件

1
2
3
touch test				// 创建空文件(若已存在文件则只改变已有文件的访问时间和修改时间,不改变文件内容)
cp test ../../hdfsData/ // 复制文件到目的位置,通过相对路径
cp test /opt/modules/ // 通过绝对路径

图片6.png

1
2
cp -p	test1 test3	// 保留文件属性
cp -r dir1 dir2 // 递归地复制文件

6.4 文件链接

  1. 符号链接(软链接)
    软链接文件是一个独立的文件(不同的 inode 信息),只需要存储源文件的信息,并不需要存储源文件中的数据。

    1
    2
    cp -s test test3
    ln -s test test3
  2. 硬链接
    创建一个文件(具有和源文件相同的 inode 信息),引用硬链接文件等同于引用了源文件。

    1
    2
    3
    cp -l test test1
    ln test test1
    ls -il // 注意索引节点号和链接计数

:可以创建一个指向同一个文件的多个链接,但不要创建指向其他符号链接文件的多个符号链接。这样会生成一个链接文件链,不但容易混淆,还容易断掉,造成各种各样的问题。

6.5 移动文件(相同目录下具有可以重命名文件的作用)

1
2
mv test2 test6	// (如果 test6 文件存在的话会被覆盖,谨慎使用。)移动文件,源文件的相关属性是不变的。
mv test5 data7/

6.6 删除文件

rm (remove 移除)

1
2
3
4
5
rm (-i) ee	// 提示你是否删除
注意:linux 中没有回收站或垃圾箱,所以文件一旦删除,就无法找回。慎用 rm -rf !!!

rm -f aa // 强制删除而不进行提示
rm -f a* // 路径通配符

6.7 创建目录

1
mkdir dir3

6.8 删除目录

1
2
3
rmdir dir3	// rmdir 命令只能删除空目录
man rmdir
rm -r dir // 递归删除目录中的文件 ,及目录本身

6.9 查看文件信息及内容(非文本编辑器)

stat 命令 可以提供文件系统上某个文件的所有状态信息

1
2
3
4
5
6
7
8
9
[root@master01 hdfsData]# stat test 
File: ‘test’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 2640122 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-09-19 17:51:13.503035041 +0800
Modify: 2019-09-19 17:51:13.503035041 +0800
Change: 2019-09-19 17:51:13.503035041 +0800
Birth: -

文件都是一个个 block 块组成的
stat 没有提供文件类型的信息

6.10 file 命令

用于查看文件类型的工具,它能够探测文件的内部并决定文件是什么类型的。避免打开后内容都是乱码。

1
2
3
4
[root@master01 hdfsData]# file phone.csv 
phone.csv: UTF-8 Unicode (with BOM) text, with CRLF line terminators
[root@master01 bin]# file spark-sql
spark-sql: a /usr/bin/env bash script, ASCII text executable

6.11 查看整个文件的内容

  • cat 命令

    1
    2
    cat phone.csv
    cat -n phone.csv // 给所有行加上行号
  • more 命令
    会显示文本文件的内容,但会在显示每页数据之后停下来(分页,避免大文件加载慢/卡死)

    1
    more phone.csv

   more 命令选项:
   图片7.png

  • less 命令
    是 more 命令的升级版本。
    1
    less phone.csv

   less 命令支持了 more 命令支持的所有参数,同时还多了一些选项,包括 less 可以识别上下键和上下翻页键,大写的 G 直接跳转到文末。

  • tail 命令
    默认情况下它会显示文件末尾的 10 行
    1
    2
    tail phone.csv
    tail -n 20 phone.csv // 可以通过 -n [行数] 指定显示的行数

   图片8.png

1
2
tail -f test	// f 选项会让 tail 命令保持活动状态并不断地显示添加到文件中的内容。这是**实时监测系统日志**的绝妙方式。
echo 'hello' >> test // 另一个命令行窗口不断添加内容到 test 文件,tail 命令窗口会实时显示最新的内容
  • head 命令
    会显示文件开头那些行的内容,默认情况下,它会显示文件前十行的文本。
    1
    2
    head  test
    head -n 20 test

-f 选项 head 命令不支持,因为通常文件的开头不会改变。

head 命令和 tail 命令是你不知道文件内容而想支持大致内容时的利器,而无需加载全部文件。

7. 进程命令

运行在系统上的程序,我们称之为进程。

7.1 ps 命令

ps 命令就是用来监测进程的命令,但是它有数不清的参数,大多数运维工程师只需要掌握他们需要信息的一组参数就足够了。

1
2
3
4
man ps
[root@master01 hdfsData]# ps // 默认情况下只会显示运行在当前控制台下的属于当前用户的进程。
PID TTY TIME CMD
1481 pts/0 00:00:00 bash

PID 是进程号;TTY 是运行在哪个终端的名称;TIME 是进程已占用的 CPU 时间,CMD 是进程名称。

ps 命令支持 3 个不同类型的命令行参数(其他命令都是相同的道理)

  1. Unix 风格的参数,前面加单破折线 -
  2. BSD(伯克利软件发行版,是加州大学伯克利分校开发的 Unix 版本),前面不加破折线
  3. GNU 风格的长参数,前面加双破折线 –
    不同风格的参数其实有很多重叠的地方。
    图片9.png
    图片10.png

只需要记住满足自己需要的参数就可以了,例如如果你想查看系统上运行的所有进程:

1
2
3
4
5
6
7
8
[root@master01 ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:07 ? 00:00:01 /usr/lib/systemd/systemd --switched-
root 2 0 0 07:07 ? 00:00:00 [kthreadd]
root 3 2 0 07:07 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 07:07 ? 00:00:00 [kworker/0:0H]
root 7 2 0 07:07 ? 00:00:00 [migration/0]
...

ps -ef:查看所有进程,format 显示。

UID:程序被该 UID 所拥有
PID:就是这个程序的 ID
PPID:则是其上级父程序的ID
C:CPU使用的资源百分比
STIME:系统启动时间
TTY:登入者的终端机位置
TIME:使用掉的CPU时间
CMD:所下达的是什么指令


1
root       1470    979  0 07:08 ?        00:00:00 sshd: root@pts/0

其中 sshd 进程就是 Secure Shell,也就是 SSH 的服务端的会话,负责监听远程 SSH 连接。
sshd: root@pts/0 就是我们的终端进程会直接启动一个 bash shell 交互命令 行,bash shell 通常在用户登录终端时默认启动。

7.2 实时监控进程

ps 命令只能显示某个特定时间点的信息,如果你想观察进程的趋势,用 ps 命令就不方便了。

top 命令可以实时显示进程信息。

1
2
3
4
5
6
7
8
9
10
11
[root@master01 hdfsData]# top
top - 18:40:40 up 11:33, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 148 total, 2 running, 146 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1867024 total, 625692 free, 662924 used, 578408 buff/cache
KiB Swap: 4063228 total, 4063228 free, 0 used. 972264 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11977 root 20 0 0 0 0 S 0.3 0.0 0:00.34 kworker/0:3
1 root 20 0 125504 3948 2496 S 0.0 0.2 0:02.42 systemd
...
  • 第一行显示了当前时间,系统的运行时间,登入的用户数,以及系统的 CPU 平均负载(最近 1 分钟,最近 5 分钟,最近 15 分钟)3 个值;
  • 第二行显示进程信息,多少进程在运行、休眠、停止或僵化状态;
  • 第三行显示 CPU 信息;
  • 第四行显示系统内存的状态(总共有多少内存,当前使用了多少,还有多少空闲);
  • 第五行显示交换空间的内存状态(总共有多少 swap,当前使用了多少,还有多少空闲)。
  • 进程的详细列表(和 ps 命令输出类似,只列举有代表性的):

    PID: 进程的进程号
    USER: 进程属主的名字
    PR: 进程的优先级
    NI: 进程的谦让度
    S: 进程的状态(D 代表可中断的休眠状态,R 代表在运行的状态,S 代表休眠状态,T 代表停止状态, Z 表示僵化状态)
    %CPU: 进程使用的 CPU 时间比例
    %MEM: 进程使用的内存占可用内存的比例
    TIME+: 进程自启动到目前为止的 CPU 时间总量
    COMMAND: 进程程序名称

默认情况下,top 命令在启动时会按照 %CPU 值来排序,你可以键入交互式命令来重新排序。
图片11.png
图片12.png
常见的有 M 按内存使用率排序,P 按 CPU 使用率排序,q 退出 top 命令

用户在 top 命令的输出上有很大的控制权,用这个工具,你就能经常找出占用系统大部分资源的罪魁祸首了。

7.3 结束进程

在 Linux 上,进程之间是通过信号来通信的。
进程的信号就是预定义好的一个消息,进程能识别它并决定作出相应反应。
图片13.png

  • kill 命令
    默认情况下,kill 命令会向命令行中列出的全部 PID 发送一个 TERM 信号,遗憾的是,kill 命令只能用进程的 PID 而不能用命令名。

    1
    2
    3
    4
    5
    6
    7
    8
    [root@master01 hdfsData]# ./hello.sh &	// 加上&,守护进程,后台运行 
    [1] 15310

    kill 15310
    kill -15 15310
    kill -s TERM 15310
    kill -s KILL 15310
    kill -9 15310
  • killall 命令
    killall 命令支持通过进程名 而不是进程号来结束进程

    1
    2
    killall -help
    kill hello.sh

killall 命令也支持通配符

1
killall hell*
支持一下
扫一扫,支持forsigner
  • 微信扫一扫
  • 支付宝扫一扫