跳到主要内容

Linux笔记

文件目录

  1. 创建目录
mkdir -p /test/cxk

-p 可以创建多级目录

  1. 删除目录
rmdir +目录名
rm -rf +目录名

这种情况需要目录为空

  1. 创建文件
touch hello.txt
  1. 拷贝文件
cp [选项] source dest
cp -r test/ /tmp

-r 表示递归,可以把整个目录拷贝

  1. 移动并重新命名文件目录
mv cxk.cpp /tmp
  1. cat查看内容
cat /etc/profile -n

-n 表示显示行号

  1. more和less查看内容
less/more +文件
  1. echo输出内容到控制台
echo $PATH
  1. 软连接:ln -s 相当于快捷方式
ln -s /tmp ~/test/tmp

重定向:
两个>> 追加
一个> 覆盖

echo "hello" > cxk.txt
  1. history

查看历史命令
使用!+编号可以执行

  1. 查看目录大小
du -sh /path/to/directory

用户管理

  1. 添加用户
sudo useradd -d /home/zhangsan -m zhangsan
  • -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
  1. 删除用户
sudo userdel -r zhangsan

-r,它的作用是把用户的主目录一起删除。

  1. 修改用户
sudo usermod -u 1004 zhangsan
  1. 添加口令(密码)
sudo passwd zhangsan
  1. 查看用户的uid
id zhangsan

用户组管理

  1. 添加新的用户组
groupadd group1

新组的组标识号是在当前已有的最大组标识号的基础上加1。

  1. 删除组
groupdel group1
  1. 修改组
sudo groupmod -n group2 group1

修改组group1名字为group2

与用户有关的重要系统文件

  1. /etc/passwd
cat /etc/passwd

用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

  1. /etc/group

组名:口令:组标识号:组内用户列表

查找指令

查找find

  1. 查找/home目录下的hello.txt文件
find /home -name hello.txt
  1. 查找/opt目录下,用户名称为hyf21200107230的文件
find /opt -user hyf21200107230
  1. 查找所有大于200M的文件(+n 大于 -n 小于 n等于)
find / -size +200M

locate 指令

第一次运行,需要先执行 updatedb

locate test.c

which

可以查看某个指令在哪个目录下面

which ls

grep指令和管道符号|

grep [选项] 查找内容 查找文件 -n 显示行号 -i 忽略大小写

cat cxk.txt | grep "yes" -n
grep "yes" -n cxk.txt # 两种都可以

压缩解压

压缩gzip:

gzip cxk.txt 

解压gunzip:

 gunzip cxk.txt.gz

压缩:zip

将/home/文件夹 压缩为myhome.zip

zip -r myhome.zip /home/

解压:

将myhome.zip 解压到/opt/tmp

unzip -d /opt/tmp myhome.zip

tar 指令

tar [option] xxx.tar.gz 打包的内容 -c 打包 -x 解压 zvf 其他选项

压缩

tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt

解压

tar -zxvf pc.tar.gz

权限管理

查看文件的所有者ls

两个人物,第一个是文件的所有者,第二个是所属于的组

ls -ahl

修改文件所有者chown

chown 用户名 文件名

chown tom abc.txt

递归,将test目录下所有文件目录所有者都修改为tom

chown -R tom /home/test

将用户加入组useradd

groupadd  monster
useradd -g monster fox
id fox

修改文件所在组chgrp

chgrp 组名 文件名

groupadd fruit
touch orange.txt
ls -alh
charp fruit orange.txt
ls -alh

改变用户所在组usermod

usermod -g 新组名 usermod -g 目录名 用户名 初始目录

将wzj修改到wudang组

usermod -g wudang wzj

ll显示内容如下:

[root@iZbp12g6txzqa6hwiabh5mZ fox]# ll
总用量 0
-rw-r--r-- 1 fox monster 0 104 12:48 ok.txt
-rw-r--r-- 1 root fruit 0 104 12:53 orange.txt

第0为文件类型

  • d 表示目录
  • l 表示符号链接
  • c 表示字符设备文件(鼠标,键盘)
  • b 表示块设备文件
  • s 表示套接字文件
  • p 表示管道文件

1-3为所有者的权限
4-6为所属组的权限
7-9为其他用户权限

  • r 表示读取权限
  • w 表示写入权限
  • x 表示执行权限
    • 表示没有对应权限

接下来的1代表子目录数量
fox代表用户
monster代表组
0代表大小
10月 4 12:48代表时间
ok.txt代表文件名

修改权限chmod

  • 使用:+,-,=变更权限

u:所有者 g:所有组 o:其他人 a:所有人(u,g,o)

给abc的所有者读写执行权限,所在组读执行权限,其他组读执行权限

chmod u=rwx,g=rx,o=rx abc

给abc的所有者除去执行权限,增加组写的权限

chmod u-x,g+w abc

给abc的所有用户添加读权限

chmod a+r abc
  • 通过数字变更权限(1-7)

r=4 w=2 x=1 rwx=4+2+1=7 例如:chmod u=rwx,g=rx,o=x abc 相当于chmod 751 abc

abc读权限改为rwxr-xr-x

chmod 755 abc

实践

警察和土匪游戏

image.png

# 创建组
groupadd police
groupadd bandit

#创建用户
useradd -g police jack
useradd -g police jerry
useradd -g bandit xh
useradd -g bandit xq

# 3. jack创建文件
su jack
vim jack.txt
chmod 640 jack.txt

# 4. 修改
chmod 644 jack.txt
chmod o=r,g=r jack.txt

# 5. 投靠
su root
usermod -g police xh
su xh
cd /home/jack # 进不去,需要先给目录权限

su root
chmod 770 /home/jack
su xh
cd /home/jack
ll # 此时用户有读权限,但是不可以写,需要切换jack进行授权

su jack
cd /home/jack
chmod g+w

su xh # 此时可以进行读写

任务调度

定时任务设置crontab

crontab +选项

  • -e : 执行文字编辑器来设定时程表
  • -r : 删除目前的时程表
  • -l : 列出目前的时程表
crontab -e
*/1 * * * * date >> /tmp/date.txt

时间符号意义:

符号含义
*任何时间
不连续的时间
-范围
*/n多久

五个*分别代表:

*    *    *    *    *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

一次性定时任务at

需要保证atd进程一直启动,每隔60s检测一次队列

ps -ef |grep atd

案例

两天后的下午五点执行/bin/ls /home

at 5pm +2 days
at> /bin/ls /home

然后需要按两次Ctrl+D才可以退出
查看任务atq
明天17点,输出时间到/root/date100.log

at 5pm tomorrow
at> date > /toor/date100.log

删除任务atrm+编号

atrm 1

磁盘管理

查看所有设备的挂载lsblk

lsblk -f

挂载案例

  1. 先给虚拟机添加一个硬盘

image.png


再使用lsblk查看是否有硬盘加入

image.png

  1. 分区命令:
fdisk /dev/sdb

然后输入m可以查看帮助
输入n添加一个新分区,接下来的选项默认即可
最后需要输入w写入并退出

image.png

  1. 分区完成,接着需要格式化分区,指定分区的类型

ext4 是分区的类型

mkfs -t ext4 /dev/sdb1

image.png

  1. 挂载分区:

mount 设备名称 挂载目录

mkdir newdisk
mount /dev/sdb1 /newdisk/

image.png


如果想要卸载:
umount 设备名称 或者挂载目录

!!!注意,用命令行挂载重启后会失效

  1. 永久挂载

编辑/etc/fstab文件,

image.png


按已有的格式添加一个,可以使用UUID,也可以直接用/dev/sdb1
接着需要使用:

mount -a

立刻生效,此时重启后也会生效

磁盘情况查询df

  • 查询系统整体磁盘使用情况
df -h
  • 查询指定目录磁盘占用情况,默认为当前目录

-s 指定目录占用大小汇总 -h 带计量单位 -a 含文件 --max-depth=1 子目录深度 -c 列出明细的同时,增加汇总值

du -h

查询/opt目录的磁盘占用情况,深度为1

du -hac --max-depth=1 /opt/

磁盘情况实用命令

  1. 统计/opt文件夹下文件的个数
ls -l /opt |grep "^-" |wc -l
  1. 统计/opt文件夹下目录的个数
ls -l /opt |grep "^d" |wc -l
  1. 统计/opt文件夹下文件的个数,包括子文件夹里的
ls -lR /opt |grep "^-" |wc -l
  1. 统计/opt文件夹下目录的个数,包括子文件夹里的
ls -lR /opt |grep "^d" |wc -l
  1. 以树状显示目录结构
tree /home

网络配置

虚拟机通信原理

image.png


查看配置

ifconfig

网络环境配置

自动获取

image.png

指定ip

image.png


再打开Vmware的虚拟网络编辑器,设置VMnet8的IP为192.168.200.0

image.png


再将NAT设置网关为192.168.200.2

image.png

主机名与hosts映射

  • 查看主机名:
hostname
  • 修改主机名:重启生效
vim /etc/hostname

如何通过主机名能够找到某个linux系统?
C:\Windows\System32\drivers\etc\hosts中指定即可
在最后加入

192.168.200.200 hyf21200107230-virtual-machine

此时在Windows中直接可以ping通虚拟机

ping  hyf21200107230-virtual-machine

同理,在虚拟机中通过主机名ping主机:
需要在/etc/hosts中加入

192.168.31.186 Xiaoxin

访问www.baidu.com的全过程

  1. 浏览器首先会检查本地缓存,看是否有与该网址相关的缓存数据。如果有并且未过期,浏览器会先调用这个IP完成解析;如果没有,就检查DNS解析器缓存,如果有直接返回IP完成解析。这两个缓存,可以理解为本地解析器缓存。
  2. 一般来说,当电脑第一次成功访问某一个网站后,在一定时间内,浏览器火操作系统会缓存他的IP地址(DNS)解析记录
ipconfig /displaydns # DNS域名解析缓存
ipconfig /flushdns # 手动清理dns缓存
  1. 如果本地解析器缓存没有找到对应映射,检查系统中hosts文件中有没有配置对应的域名IP映射,如果有,完成解析并返回
  2. 如果本地DNS解析器缓存和hosts文件中均没有找到对应的IP,则到域名服务DNS进行解析域

image.png

监控网络状态netstat

netstat [选项]

-an 按一定顺序排序 -p 显示哪个进程在调用

netstat -anp |grep sshd

网络检测命令ping

进程管理

显示系统执行的进程ps

-a 显示所有进程信息 -u 以用户格式显示 -x 显示后台进程的运行参数 -e 显示所有进程 -f 全格式

ps -aux 
ps -ef

杀死进程kill

  • kill [选项] 进程号:通过进程号杀死进程
  • killall 名称 :通过名称杀死进程

-9表示立刻停止

kill 11421
killall gedit
kill -9 bash对应的进程号

查看进程树pstree

-p 显示进程的PID -u 显示进程的所属用户

pstree -pu

动态监控top

top -d 数字几秒刷新一次
交互操作:

  • P cpu使用率排序
  • M 内存使用率
  • N PID排序
  • q 退出

监视特定用户:
先输入u,然后输入用户名

终止进程:
先输入k,然后输入要结束的进程id号,信号量可以输入9强制杀死

服务管理

service管理指令systemctl

很多服务不再使用service而是systemctl

查看service管理的服务

ls -l /etc/init.d/

systemctl [start|stop|restart|reload|status] +服务名
关闭和启动network

systemctl stop network
systemctl start network
  • systemctl设置服务的自启动状态
  1. systemctl list-unit-files [|grep 服务名]查看服务开机启动状态
  2. systemctl enable 服务名
  3. systemctl disable 服务名
  4. systemctl is-enable 服务名

案例:

systemctl status firewalld # 查看防火墙状态
systemctl stop firewalld # 关闭
systemctl start firewalld # 启动
systemctl disable firewalld #永久生效 重启也生效

运行级别

Linux系统有7个运行级别(runlevel):常用的是3和5

  • 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
  • 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登录
  • 运行级别2:多用户状态(没有NFS)
  • 运行级别3:完全的多用户状态(有NFS),登录后进入控制台命令行模式
  • 运行级别4:系统未使用,保留
  • 运行级别5:X11控制台,登录后进入图形GUI模式
  • 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

运行级别自启动chkconfig

查看管理服务:chkconfig --list
chkconfig --level 5 服务名 on/off
案例:对network服务进行操作,在3级别运行,关闭自启动

chkconfig --level 3 network off
chkconfig --level 3 network on

防火墙相关firewall

打开端口

firewall-cmd --permanent --add-port=111/tcp

打开后需要重新载入才可以生效

firewall-cmd --reload

查询是否开放:

firewall-cmd --query-port=111/tcp

关闭端口:

firewall-cmd --permanent --remove-port=111/tcp

rpm包管理Centos

查询指令rpm

  • 查看已安装的rpm列表
rpm -qa |grep xx
  • 查询软件包是否安装

rpm -q 软件包名

rpm -q firefox
  • 查询软件包信息

rpm -qi 软件包名

rpm -qi firefox
  • 查询软件包中的信息

rpm -ql

rpm -ql firefox
  • 查询文件所属的软件包

rpm -qf

rpm -qf /etc/passwd
rpm -qf /root/install.log
  • 卸载rpm包

rpm -e rpm包的名称

rpm -e firefox	

存在依赖,可以加参数--nodeps

rpm -e --nodeps foo
  • 安装rpm包

rpm -ivh RPM包名称

i=install 安装 v=verbose 提示 h=hash 进度条

rpm ivh firefox

yum安装包

yum可以自动处理依赖性关系,一次安装所有依赖的软件包

  • 查看服务器是否有要安装的软件
yum list |grep xx
  • 安装指定的yum包
yum install xxx 	

JAVAEE环境搭建

JAVA

  1. 先将Java安装包上传到服务器/opt/java
  2. 使用tar -zxvf +压缩包名进行解压
  3. 移动到/usr/local/Java
  4. 配置环境变量 vim /etc/profile
export JAVA_HOME=/usr/local/Java/jdk1.8.0_381
export PATH=$JAVA_HOME/bin:$PATH
  1. source /etc/profile让环境变量生效

Tomcat

  1. 上传安装包到服务器/opt/tomcat
  2. tar -zxvf apache-tomcat-8.5.93.tar.gz
  3. 进入tomcat的bin目录
  4. ./startup.sh

MySQL

  1. 上传安装包到/opt/mysql 或者直接wget http://dev.mysql.com/get/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
  2. 解压文件tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
  3. centos自带的mariadb数据库和mysql冲突,需要先删除
  4. 查询mariadb相关安装包rpm -qa|grep mari
  5. 删除安装包rpm -e --nodeps mariadb-libs
  6. 查询mariadb相关安装包rpm -qa|grep mari
  7. 依次执行下面安装
rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
  1. 启动mysql systemctl start mysqld.service
  2. Mysql自动给root用户设置随机密码,运行grep "password" /var/log/mysqld.log可看到当前密码
  3. 登录mysql -u root -p使用刚刚查看的密码登录
  4. 如果需要简单密码,可以设置密码策略set global validate_password_policy=0
  5. 设置密码set password for 'root'@'localhost' =password('cxk123456');
  6. 运行flush privileges;使密码生效

设置远程访问

首先登录 数据库:
然后 show databases,选择use mysql
select user,host from user; 查看root的 权限
设置root可以远程访问:update user set host = ‘%’ where user = ‘root’;
刷新 权限 :flush privileges
查看是否变化:select user,host from user;

image-20240818193323055

Shell编程

需要把#!/bin/bash放在文件开头
执行:可以使用sh +文件或者 +x可执行权限

变量

系统变量:$HOME $PWD $SHELL $USER
显示所有系统变量set
定义变量:变量名=值
撤销变量:unset 变量
静态变量:readonly 变量
将命令的返回值赋值给变量

  1. A=date``
  2. B=$(date)

设置环境变量:

  1. export 变量名=变量值 将shell变量输出为环境变量/全局变量
  2. source 配置文件 立刻生效
  3. echo $变量名查询环境变量

多行注释:

:<<!
内容
!

位置参数变量:

#!/bin/bash
echo "0=$0 1=$1 2=$2"
echo "所有的参数=$"
echo "$@"
echo "参数的个数=$#"

运算符

基本语法$((运算式))$[运算式]expr m + n
案例:求出命令行的两个参数的和

#!/bin/bash
sum=$[$1+$2]
echo "sum=$sum"

条件判断

  1. =字符串的变焦
  2. 两个整数的比较
    1. -lt 小于
    2. -le 小于等于
    3. -eq 等于
    4. -gt 大于
    5. -ge 大于等于
    6. -ne 不等于
  3. 按照文件权限判断
    1. -r 读
    2. -w 写
    3. -x 执行
  4. 按照文件类型判断
    1. -f 文件
    2. -e 存在
    3. -d 目录

案例:

#!/bin/bash
#判断 "ok"是否等于"ok"
if [ "ok"="ok" ]
then
echo "equal"
fi


# 23是否大于22
if [ 23 -ge 22 ]
then
echo "大于"
fi

# 判断文件是否存在
if [ -f /root/shcode/cxk.sh ]
then
echo "存在"
fi

多分支:

#!/bin/bash

if [ $1 -ge 60 ]
then
echo "success"
elif [ $1 -lt 60 ]
then
echo "fail"
fi

case语句:

#!/bin/bash

case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac

for循环
for 变量 in 值1 值2 ...
do
代码
done

#!/bin/bash

# $*是把输入的参数当作一个整体,所以只会输出一句话
for i in "$*"
do
echo "num is $i"
done

# $@ 来获取输入参数,这时候是分别对待,有几个参数就输出几句话
for i in "$@"
do
echo "num is $i "
done

# for 的第二种语法
sum=0
for ((i=1;i<=100;i++))
do
sum=$[$sum+$i]
done
echo "sum=$sum"

while语句
语法:
while [条件]
do
代码
done

#!/bin/bash

sum=0
i=0
while [ $i -le $1 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo "执行结果:$sum"

读取控制台read

read 选项 参数

-p 指定读取时候的提示符 -t 等待的时间

#!/bin/bash
# 从控制台读num1
read -p "请输入一个数字num1=" num1
echo "你输入的Num1=$num1"

# 10s内读取,否则为空
read -t 10 -p "请输入第二个数字10s内=" num2
echo "你输入的num2=$num2"

函数

系统函数

  • basename 返回路径最后/的部分,常用于获取文件名
# 返回 /home/aa/test.txt 的test.txt部分
basename /home/aa/test.txt
  • dirname 返回路径最后/的前面部分
dirname /home/aaa/a.txt

自定义函数

[function] funname[()]
{
Action;
[return int;]
}
调用:
funname []

案例:输入两个参数的和

function getSum(){
sum=$[$n1+$n2]
echo "sum=$sum"
}

read -p "输入n1=" n1
read -p "输入n2=" n2

getSum $n1 $n2

综合案例

  1. 每天凌晨2:30备份数据库cxk 到/data/backup/db
  2. 备份开始和备份结束能给出相应的提示
  3. 备份后的文件要求以备份时间为文件名,打包为.tar.gz的格式,
  4. 备份的同时,检查是否有前10天备份的文件,如果有就删除
#!/bin/bash

# 备份目录
backup=/data/backup/db

# 当前时间
datetime=$(date +%Y-%m-%d_%H%M%S)
echo $datetime

# 数据库的地址
host=localhost
#数据库用户名
db_user=root
# 数据库密码
db_pw=cxk123456
# 备份 数据库名
database=cxk

# 创建备份目录,如果不存在,就创建
[ ! -d "${backup}/${datetime}" ] && mkdir -p "${backup}/${datetime}"


# 备份数据库

mysqldump -u$db_user -p$db_pw --host=$host -q -R --databases ${database} | gzip > ${backup}/${datetime}/$datetime.sql.gz

# 将文件处理成tar.gz
cd $backup
tar -zcvf $datetime.tar.gz $datetime

# 删除对应的备份目录

rm -rf ${backup}/${datetime}


# 删除10天前备份的文件
find $backup -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "备份数据库$database结束"

然后设置crontab任务调度

crontab -e

里面写上

30 2 * * * /usr/sbin/mysql_db_backup.sh

查看是否可以

crontab -l

定制自己的Linux系统

基本原理

启动流程分析

  1. 首先Linux需要通过自检,检查硬件设备有没有故障
  2. 如果有多个启动盘,需要在BIOS中选择启动磁盘
  3. 启动MBR中的bootloader引导程序
  4. 加载内核文件
  5. 执行所有进程的父进程,老祖宗systemd
  6. 欢迎界面

定制Linux

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

编译内核

https://www.kernel.org
先去官网下载一个内核,并且上传到ubuntu
安装需要的包

sudo apt-get install  libncurses5-dev   openssl libssl-dev
sudo apt-get install build-essential openssl
sudo apt-get install pkg-config
sudo apt-get install libc6-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install libelf-dev
sudo apt-get install zlibc minizip
sudo apt-get install libidn11-dev libidn11