linux笔记

Linux

磁盘分区相关

磁盘分区的作用

1.让数据更加安全,对一个分区的数据进行重整时不会影响到另外分区的数据

2.提高性能,分区后数据集中在磁盘的柱面上,搜索时数据更加集中,提高读取速度

磁盘可以分成主分区、拓展分区、逻辑分区(在拓展分区上划分)

(一块磁盘最多四个主分区,或者三个主分区加一个拓展分区)

命名:

/dev/sda(SCSI接口类型磁盘第一块)

/dev/sdb (SCSI接口类型磁盘第二块)

/dev/hda(IDE接口类型磁盘第一块)

/dev/hdb(IDE接口类型磁盘第二块)

每块分区的序号1-4是留给主分区和拓展分区的,故逻辑分区的编号一定是从5开始的

cat:获取展示文件的所有内容 (tac 从后往前显示 cat命令倒置)

nl:显示非空行文件内容同时显示行号 (cat -n 显示文件所有行的行号)

more/less:一行一行显示文件内容 不同的是less可以上下翻页

head/tail:只查看文件头/尾几行

od:以某种编码形式查看文件 (-h 以十六进制查看 -c以字符形式查看)

wc:显示文件信息(显示形式:行数、单词数、字符数)

image-20201012110516909


diff:查看两个文件的差异

用法:diff 1.txt 2.txt

显示表达式如下:

0a1 --在1.txt 文件的第0行加了一行

3c3 --两个文件在第三个有所不同


uniq:显示出删除文件重复行的结果 -c显示出重复行的数量

image-20201012111307640

Chmod命令


ls-l命令 列出查看一个目录下的文件和子目录的详悉信息

image-20201005102750929

ls -ld 显示当前目录的详细信息

image-20201108191250664

第一个字符

p表示命名管道文件

d表示目录文件

l表示符号连接文件

-表示普通文件

s表示socket文件

c表示字符设备文件

b表示块设备文件

Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。

img

chmod命令用于改变指定文件的权限(读写执行)

相关参数

u表示文件拥有者,g表示与文件拥有者同组用户,o表示其他用户,a表示所有用户

+表示增加权限,-表示取消权限,=指定权限

r读,w写,x可执行

八进制表示

image-20201005103744367

案例

image-20201005103823915

特殊权限位

SUID(Set UID)

有时在文件的执行位x处会出现's'字段 ,说明设定了suid

image-20201012104722932

这个权限位的功能是:只要用户对某个文件有执行权限,那么当他去执行文件的时候,系统会默认他会以这个文件的所有者去执行,一旦文件执行结束,身份切换也随即消失。

例如,当一个普通用户执行passwd命令改密码,虽说/etc/passwd对于普通用户来说是没有任何权限的,但是因为passwd命令设定了suid,所以普通用户在执行的时候,相当于以root(/etc/shadow文件所有者)的身份去修改密码,但是这个命令结束,普通用户还是普通用户。

SGID(Set GID)

与SUID类似,设定后,当一个用户执行一个文件,他会认为是与这个文件所者同组的用户的身份来执行文件

SBIT(Sticky Bit)

是很多个用户在同一个目录下都能写文件和删除文件,但是大家都只能操作自己的文件,不能操作其他人的文件,只有root和该目录的所有者才能操作目录下的文件。

chgrp


Linux chgrp(英文全拼:change group)命令用于变更文件或目录的所属群组。

chown


Linux chown(英文全拼:change ownerp)命令用于设置文件所有者和文件关联组的命令。

image-20201005104352746

Linux的LVM管理


绝大多数都是使用MBR(Master Boot Recorder)都是通过先对一个硬盘进行分区,然后再将该分区进行文件系统的格式化,在Linux系统中如果要使用该分区就将其挂载上去即可,windows的话其实底层也就是自动将所有的分区挂载好,然后我们就可以对该分区进行使用了。

参考:

https://www.cnblogs.com/shoufeng/p/10615452.html 概念

https://zhuanlan.zhihu.com/p/62597195 逻辑卷过程

LVM指Logical Volume Manager,逻辑卷管理,是一种对磁盘空间的动态管理(对比与标准分区)

实现方法

一种将一至多个硬盘的分区在逻辑上进行组合, 当成一个大硬盘来使用。当硬盘空间不足时, 可以动态地添加其它硬盘的分区到已有的卷组中(提高磁盘分区管理的灵活性

未用LVM的坏处

(1) 不同的分区相互独立, 单独的文件不能跨分区存储, 容易出现硬盘的利用率不均衡;

(2)如果一个文件系统/分区满了,按传统的基于分区式的文件系统,就必须重新分区/建立文件

(3)如果要把硬盘上的多个分区合并在一起使用, 只能采用重新分区的方式, —— 需要做好数据的备份与恢复.

具体实现

四个逻辑卷基本概念

①PE  (Physical Extend)  物理块

②PV  (Physical Volume)  物理卷:可以是整个物理硬盘,可以是raid设备

③VG  (Volume Group)  卷组:一个卷组包含至少一个物理卷

④LV  (Logical Volume)  逻辑卷

image-20201005105920293

1.将物理硬盘格式化成PV(Physical Volume 物理卷

将硬盘sda sdb 格式化成PV, 这个过程是将LVM是将底层的硬盘划分为了一个一个的PE(Physical Extend)。

LVM磁盘管理中PE默认大小为4M,PE就是我们逻辑卷管理的最基本单位.

2.创建一个VG(Volume Group)

在将硬盘格式化成PV以后,我们第二步操作就是创建一个卷组,也就是VG(Volume Group),卷组在这里我们可以将其抽象化成一个空间池,VG的作用就是用来装PE的,我们可以把一个或者多个PV加到VG当中,因为在第一步操作时就已经将该硬盘划分成了多个PE,所以将多个PV加到VG里面后,VG里面就存放了许许多多来自不同PV中的PE

我们通过上面的图片就可以看到,我们格式化了两块硬盘,每个硬盘分别格式化成了3个PE,然后将两块硬盘的PE都加到了我们的VG当中,那么我们的VG当中就包含了6个PE,这6个PE就是两个硬盘的PE之和。通常创建一个卷组的时候我们会为其取一个名字,也就是该VG的名字。

3.基于VG创建我们最后要使用的LV(Logical Volume)

当我们创建好我们的VG以后,这个时候我们创建LV其实就是从VG中拿出我们指定数量的PE

创建逻辑卷其实就是我们从VG中拿出我们指定数量的PE,VG中的PE可以来自不同的PV,我们可以创建的逻辑卷的大小取决于VG当中PE存在的数量,并且我们创建的逻辑卷其大小一定是PE的整数倍(即逻辑卷的大小一定要是4M的整数倍)。

4.将我们创建好的LV进行文件系统的格式化,然后挂载使用

在创建好LV以后,这个时候我们就能够对其进行文件系统的格式化了,

我们最终使用的就是我们刚创建好的LV,其就相当于传统的文件管理的分区

我们首先要对其进行文件系统的格式化操作,然后通过mount命令对其进行挂载,

这个时候我们就能够像使用平常的分区一样来使用我们的逻辑卷了。

image-20201108194925940

LVM总结:

(1)物理磁盘被格式化为PV,空间被划分为一个个的PE

(2)不同的PV加入到同一个VG中,不同PV的PE全部进入到了VG的PE池内

(3)LV基于PE创建,大小为PE的整数倍,组成LV的PE可能来自不同的物理磁盘

(4)LV现在就直接可以格式化后挂载使用了

(5)LV的扩充缩减实际上就是增加或减少组成该LV的PE数量,其过程不会丢失原始数据

Linux权限掩码umask


linux中umask函数主要用于,在创建新文件或者新目录的时候,指定用户创建的新文件新目录的权限默认值

image-20201005142043845

image-20201005142422223

umask默认为0022

0:特殊权限位

022:用户权限位 权限掩码值,实际权限为777-022=755 (rwx r-x r-x)

如果用户创建的是目录,则默认所有权限都开放,为777,默认为:drwxrwxrwx

新建文件:666-022=644; 新建目录:777-022=755.

可以更改权限掩码

image-20201108202033489

Linux用户有关

创建新用户 adduser + 用户名

image-20201005145650840

切换用户 su+用户名

linux /etc/passwd 文件

是系统用户配置文件,存储额系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作

image-20201005145810202


读者可能会问,Linux 系统中默认怎么会有这么多的用户?这些用户中的绝大多数是系统或服务正常运行所必需的用户,这种用户通常称为系统用户或伪用户。系统用户无法用来登录系统,但也不能删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。


/etc/passwd展示了七个字段,分别以冒号隔开

七个字段详细信息如下:

用户名 (magesh): 已创建用户的用户名,字符长度 1 个到 12 个字符。

密码(x):代表加密密码保存在 /etc/shadow 文件中。、

用户 ID(506):代表用户的 ID 号,每个用户都要有一个唯一的 ID 。**UID 号为 0 的是为 root 用户保留的**,UID 号 1 到 99 是为系统用户保留的,UID 号 100-999 是为系统账户和群组保留的。

**群组 ID (**507):代表群组的 ID 号,每个群组都要有一个唯一的 GID ,保存在 /etc/group文件中。

**用户信息**:代表描述字段,可以用来描述用户的信息

**家目录**(/home/mageshm):代表用户的家目录。

**Shell**(/bin/bash):代表用户使用的 shell 类型。


Linux /etc/shadow(影子文件)

/etc/passwd 文件,由于该文件允许所有用户读取,易导致用户密码泄露,因此 Linux 系统将用户的密码信息从 /etc/passwd 文件中分离出来,并单独放到了此文件中。

/etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。

内容

image-20201005150824927

用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

Find 命令

find -name '*.c' --找出所有.c结尾的文件(默认指当前目录下的文件)

find /tmp -name '*.c' --找出/tmp中所有.c结尾的文件

find . -type f --将当前目录下的所有一般文件列出来

-type 参数意义

d: 目录

c: 字型装置文件

b: 区块装置文件

p: 具名贮列

f: 一般文件

l: 符号连结

s: socket

find -size 0 --找出当前目录下的空文件

-size +1M (大于1M)

-size -1K (小于1K)

find -size 0 -exec ls -l {} ; --找出所有大小为零的文件并展示详细信息

注意 :;前有空格

-exec 将直接执行语句

find -size 0 -ok rm {} ; --找出所有大小为零的文件并删除他们

-ok 会让你是否确定执行

find . -ctime -20 --找出所有最近20天内更新过的文件

-20 最近20天内

+20 距现在20天前

find . -type f -perm 644 -exec ls -l {} ;

​ --查找前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:

image-20201223095208091

which命令

显示在环境变量下符合条件的文件

image-20201012155827939

几种“找文件“命令对比

which:根据PATH环境变量去找存在的可执行文件

whereis:在一些特定目录里面找,可以用whereis -l 展示这些特定目录

locate:在/var/lib/mlocate中找文件,

find:在硬盘中找文件,是速度最慢但最全的搜索方法

sort命令

sort用来对获取到的信息进行特定方式的排序

sort 1.txt --默认排序方式是以第一个字段以ASCII 码次序排序

sort -u 1.txt --排序忽略重复行

sort -r 1.txt --以默认排序的倒序排序显示

sort -r 1.txt o 2.txt --将1.txt的逆序重定向到2.txt

sort -n 1.txt --特别指用number即数值的形式排序

sort -k3 1.txt --以第三个字段排序

sort -t: -k3 1.txt --以冒号作为分隔符,以第三个字段排序

cut命令

cut命令用来显示行中的指定部分,删除文件中指定字段。cut经常用来显示文件的内容。

试验文档

[root@localhost text]# cat test.txt 
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98

cut -f 1 test.txt --显示test里面第一个字段结果

cut -f 2,3 test.txt --显示text第二、三字段

cut -f2 -complement test.txt --显示除了第二个字段以外内容

cut -d: -f1,2 text.txt --以冒号作为分隔符分隔字段 ,显示第一、二字段

cut -d' ' -f 1,2 1.txt --以空格作为分隔符分隔字段,显示第一、二字段

paste命令

按列合并两个文本的内容

image-20201019111942412

同样地,可以用重定位符 :paste ts1 ts2 > ts3.txt

paste -d: ts1 ts2 --d参数指定连接分隔符

grep命令

grep全程global search regular expression(RE) and print out the line。

全局正则搜索然后打印出来,是一个强大的搜索命令

grep 123 1.txt(grep 123 1.txt) --在1.txt里面搜索’123'

grep -n 123 1.txt --打印结果显示行号

image-20201019145600942

grep -v 123 1.txt --打印没有包含123的结果

grep -i abc 1.txt --查询过程忽略大小写

grep -c abc 1.txt --显示含有abc的行的数量

grep -E --使用延伸型正则表达式 (存在 + ? | () 等符号时使用)建议直接用egrep

sed命令

sed命令用来处理文本

sed -e 4a 123 1.txt --在1.txt 第四行后面添加'123'

nl /etc/passwd | sed '2d' --显示passwd内容 并且将第二行删除

nl /etc/passwd | sed '3,$d' --显示passwd内容 并且将第三行到之后的行删除

nl /etc/passwd | sed '2i drink tea' --在第二行前一行插入'drink tea'

nl /etc/passwd | sed '2,5c No 2-5 number' --将第2-5行替代成'No 2-5 number'

sed '/[1]*$/d' /tmp/hello.c --删除空行

sed -i '/[2]*$/d' /tmp/hello.c --删除空行 并且写入文件

sed -n '5,10p' /tmp/databook --打印5-10 行的内容

awk命令

和sed差不多也是处理文本的工具

awk -F: '\ <s18\ ' {print $1,$3} ' /etc/passwd --以冒号作为分隔符 打印s18开头的项目的第一第三个字段

awk -F '[ ,]' --设置多个分隔符

awk '$2~/[3]/' /tmp/passwd --打印/tmp/passwd第二列中以kK开头的行

awk '$4<2.5 ' /tmp/student_record --数学表达式

awk '$3=="CS" && $<3.5' /tmp/student_record --逻辑表达式匹配


正则表达式各种符号:https://tool.oschina.net/uploads/apidocs/jquery/regexp.html

重定位与管道符

重定向

重定向分输入重定向和输出重定向,即改变输入输出方向

正常来说,标准输入设备是键盘,标准输出设备是显示器

image-20201102150835901

用法

输出重定向中'>'表示覆盖 ; ‘ >>’表示追加

image-20201102151126046

也可以使用复合命令

command>file1 2>file2 :以覆盖的方式,命令的正确输出结果写入file1 把错误结果写入file2

(会首先创建两个文件file1 file2)

command >file 2>&1 :以覆盖的方式,命令的正确和错误输出结果都写入file

输入重定向

wc -l < /etc/passwd :将/etc/passwd作为输入执行wc -l(统计行数)

wc -l<<END :将使用特定的分界符‘END’作为命令输入的结束标志.

image-20201102152703224

command< input_file>output_file : 将input_file作为输入文件执行command命令 输出到output_file

cate 2>/dev/null : 将输入的错误指令返回结果 丢入dev/null(类似垃圾桶)

管道命令(|)

管道命令可以将一条指令的执行结果做第二条指令的输入

image

管道命令只处理前一个命令的正确输出,不处理错误输出

image-20201102154703438

如图只有正确的命令执行结果会作为第二条指令的输入

错误的指令直接通过标准输出打印到屏幕

cat /etc/passddd /etc/passwd 2>/dev/null | grep -n 'root'

将输入错误结果丢入/dev/null 正确指令作为grep的输入执行

区别

管道触发两个子进程执行"|"两边的程序;而重定向是在一个进程内执行

linux进程管理

ps命令process status,常用ps -ef 、ps aux查看进程

两者区别:是Unix系统的两种风格,System V 和BSD风格,绝大多数linux都可以同时使用这两种方式的

ps命令

ps -ef

-e显示所有进程

-f full显示详细信息

UID PID PPID C STIME TTY TIME CMD
用户 进程id 父进程id cpu百分比 启动时间 所在终端 进程占用cpu 命令参数
root 1 0 0 06:50 ? 00:00:10 /sbin/init
root 40 1 0 12:33 pts/0 00:00:03 /java/
?b表示与终端无关

ps aux

a显示所有进程

u使用基于用户的信息输出格式,增加用户名、cpu内存占用率等信息

x同时显示没有控制终端的进程(TTY ?)

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 1.2 19221 2989 ? S 12:20 00:09 /sbin/ini
该进程使用的虚拟內存量(KB) 该进程占用的固定內存量(KB) 进程的状态 该进程实际使用CPU运行的时间
D      //无法中断的休眠状态(通常 IO 的进程);
R      //正在运行可中在队列中可过行的;
S      //处于休眠状态;
T      //停止或被追踪;
W      //进入内存交换 (从内核2.6开始无效);
X      //死掉的进程 (基本很少见);
Z      //僵尸进程;
<      //优先级高的进程
N      //优先级较低的进程
L      //有些页被锁进内存;
s      //进程的领导者(在它之下有子进程);
l      //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
+      //位于后台的进程组;

ps -lax

UID PID PPID PRI NI WCHAN
用户id 进程id 父进程id 优先级 nice值 进程正在等待的资源类型
越小越优先

ps o

o参数可以指定ps输出的字段,并且利用某个字段排序

ps -axo pid,ppid,%mem,%cpu,cmd --sort=-%cpu
显示指定字段,用%cpu降序排序

image-20201116153250238

nice命令

进程的nice值 在-20~19之间,nice越小优先级越大,默认nice为0

nice 可以给要启动的进程赋予 NI 值,但是不能修改已运行进程的 NI 值。

例如

nice -n -5 sudo service apache2 start 

type命令

type命令用来显示指定命令的类型

image-20201116160437653

image-20201116160517293

linux前后台切换管理

image-20201123103741204

“后台任务”的特点

继承当前session的标准输出和标准错误输出,因此,后台任务的所有输出依旧会在命令行下显示出来

不继承当前session的标准输入,因此,你将无法对该任务输入命令。如果它试图读取标准输入,就会暂停执行(halt)。

command &

将command指令放在后台执行

bg

将任务转为后台执行

bg%1 将进程号为1的进程转入后台执行

fg 将任务转为前台执行

bg%2 将进程号为2的进程转入前台执行

ctrl Z 停止当前进程,并放入后台

jobs 显示当前后台的进程

linux命令执行操作符

分号(;)可以用作串行执行多条语句 ,如:pwd;who|wc -l

单个与符号(&)cmd1&cmd2 用作两条指令并行执行

与符号(&&) cmd1&&cmd2 :当cmd1执行成功了,执行cmd2;若cmd1没有执行,则也不执行cmd2

或符号(||)cmd1&&cmd2 :当cmd1执行成功了,不执行cmd2;若cmd1没有执行,则执行cmd2

kill命令与信号量

用来中断一个进程,无论它是前台后台进程

kill -l 查看所有信号量

image-20201123111309596

常用:1(HUP)重新加载进程、9(KILL)强制杀死进程、15(TERM)正常停止一个进程

kill -9 pid --强制终止进程

linux计划任务

Crontab命令

cron服务:指定时间周期性执行某个任务,依赖于系统后台crond进程

crontab -e 编辑crontab

image-20201123142526134

(分钟|小时|日|月|周|指令)

crontab -l 查看计划

at命令

at服务用于指定某个时间一次性执行某个任务,依赖于系统后台atd进程

‘at + 时间’进入at指令交互模式

image-20201123143831733

输入指令ctrl D 退出

at -l / atq --查看设置的一次性计划任务

at -c +jobname --查看一次性计划任务具体内容(包含一些环境变量)

at -d --删除计划任务

命令格式

at 3:30pm    
at 15:30
at 10:10 today
at now+2min           ——2分钟后执行
at 4pm + 3 days        ——3天以后的下午4点运行此job
at 10am Jul 31         ——在7月31日上午10点运行此job
at 1am tomorrow        ——明天上午1点运行此job
at 4:00 2020-12-12     ——在2020-12-12日的凌晨4点执行
at -t 09201430         ——9月20日的下午2:30运行此job
at -t 202009201430     ——2020年的9月20日的下午2:30运行此job
# man at
at now + 5 minutes    任务在5分钟后运行
at now + 1 hour       任务在1小时后运行
at now + 3 days       任务在3天后运行
at now + 2 weeks      任务在两周后运行

shell编程

shell启动时,会用到三个文件?

登录模式(login_shell):先读/etc/profile 在(/.bash_profile、/.bash_login、~/profile)找到存在的第一个

在读取/etc/profile时也会调用一些别的配置文件

非登录模式(non-login_shell):仅读取.bashrc里的内容

通常shell脚本用.sh 结尾表示,在文件的开头写"#!/bin/bash"

.bash_history:记录前一次登录以前所执行的命令,这一次登录的命令记录缓存在内存中,当注销后写入.bash_history

内置命令和非内置命令

内置命令如cd、echo、exit等,这些命令由shell程序识别,通常在linux系统加载运行时shell就被加载并驻留在系统内存中。

执行速度比外部命令快,因为内部命令shell不需要创建子进程。

非内置命令如ls,在系统加载时并不随系统一起被加载到内存中,而是在需要的时候才将其调入内存。

对于非内置命令,执行命令过程,会先fork一个子shell,由这个子shell去执行bash的代码

而执行内置命令相当于调用shell进程的一个函数,不创建新的进程

type命令

用于区别内置命令和非内置命令

type -t name :显示类型 如file 、alias、builtin

image-20201130150457815

type -p name :当后面跟非内置命令时,显示完整文件名

image-20201130150708957

type -a name : 显示出在PATH中 所有包含name的命令

image-20201130150822958

环境变量

foo="hello world" 设置一个局部变量 (只有当前shell有效)

// foo = ls -l 反单引号内写命令 可以将命令结果赋给环境变量

echo $foo 输出环境变量内容

set | grep foo 显示在用户的局部变量和用户环境变量表中的‘foo’行

env | grep foo显示在用户的用户环境变量表中的‘foo’行

export foo 把用户局部变量foo写入环境变量

set、env和export区别

env是环境变量的缩写,指列出所有环境变量

export也是列出环境变量 ,但相比起env,更详细;但它主要作用还是将自订变量转化为环境变量(环境变量可以在子Shell中沿用)

set 用来查看所有变量 包含环境变量和自定义变量

为什么环境变量的数据可以被子程序所引用呢?

  • 当启动一个 shell,操作系统会分配一记忆区块给 shell 使用,此内存内之变量可让子程序取用
  • 若在父程序利用 export 功能,可以让自订变量的内容写到上述的记忆区块当中(环境变量);
  • 当载入另一个 shell 时 (亦即启动子程序,而离开原本的父程序了),子 shell 可以将父 shell 的环境变量所在的记忆区块导入自己的环境变量区块当中。

设置环境变量的方法

  • /etc/profile中添加,所有用户有效
  • /etc/.bash_profile 中添加,单一用户有效
  • export 变量名 当前shell有效
  • declear -x 变量名

source命令

source命令用来在当前bash环境下读取并执行文件 ,和. 的用法一样


  1. \t ↩︎

  2. \t ↩︎

  3. Kk ↩︎

posted @ 2021-07-10 14:35  cjz12138  阅读(69)  评论(0编辑  收藏  举报