简介
Multics(大而全)项目失败,吸取教训启动Unix(小而精),Linus Benedict Torvalds受Unix启发开发初始版本Linux内核,Git也由其开发,目的是为了更好的管理Linux内核开发。Unix是商业软件,Linux是开源软件。
Linux Logo,企鹅
Linux的发行版本可以分为两类,一类是商业公司维护的发行版本,以Red Hat Enterprise Linux为代表,一类是社区组织维护的发行版本,以Debian为代表,两者最大的区别是包管理方式。社区中常用的是CentOS和Ubuntu,CentOS为RHEL的社区版本,Ubuntu基于Debian发展而来。
Windows与Linux的区别
文件名、目录名、命令
Windows不区分大小写dir和DIR都行
Linux区分大小写,cd和CD中只有cd行
Linux中硬件被抽象为设备文件,在/dev下
Windows中使用设备管理器管理硬件;
Linux的用户界面不与内核绑定,服务器通常会使用无图形环境的操作系统镜像,Windows用户界面与内核绑定。
UNIX/Linux可以粗糙的分为三层,基础是硬件,第一层是内核,第二层是Shell,第三层是应用层。
安装LInux
虚拟机软件VMware安装linux
VMware网络适配器支持五种网络连接
-
桥接模式,虚拟机网卡和宿主机网卡均连接到虚拟机软件提供的VMnet0虚拟交换机上,虚拟机和宿主机地位平等。虚拟机与宿主机处于同一局域网,可以相互ssh登录,虚拟机可连接互联网,可连接路由器下所有机器构成的局域网(举例,路由器A,宿主机B,宿主机C,在宿主机B上创建虚拟机D、E且均使用桥接模式,在宿主机C上创建F、G且均使用桥接模式,则B、C、D、E、F、G地位相等,可互相ssh)
-
NAT模式,虚拟机网卡和宿主机的虚拟网卡VMnet8连接到虚拟机软件所提供的VMnet8虚拟交换机上,VMware为虚拟机提供了一个虚拟NAT服务器和一个虚拟DHCP服务器,可以相互ssh登录,虚拟机可连接互联网,可连接宿主机与使用NAT模式的所有虚拟机构成局域网
-
仅主机模式,虚拟机和宿主机使用VMware的VMnet1虚拟网卡进行通信,无NAT服务,虚拟机仅可连接主机,不可连接局域网和互联网
-
自定义,手动选择虚拟网卡,VMnet1即为仅主机模式,VMnet8为NAT模式
-
LAN区段,可划分不同虚拟网络
U盘安装Linux
分区
格式化,格式化的目的是写入文件系统,而非清空数据
文件系统类型:ext3、ext4(兼容ext3)、fat32(Windows上一代文件系统)、NTFS(Windows新一代文件系统)
分区和格式化后,Windows中分配一个盘符即可使用,Linux需要将该分区挂载到某个目录,另外,Linux中硬件被抽象为文件,分区自然被抽象为文件
IDE硬盘 /dev/hd[a-d]
SCSI/SATA/USB 硬盘 /dev/sd[a-p]
软盘 /dev/fd[0-1]
光驱 /dev/cdrom或/dev/sr0
打印机(25针)/dev/lp[0-2]
打印机(USB)/dev/usb/lp[0-15]
鼠标 /dev/mouse
无人值守安装
大批量服务器(如万台大集群)操作系统安装,搭建一台操作系统安装服务器,将其他所有未安装的服务器作为客户端,客户端修改启动方式为网络启动,从安装服务器下载所需的软件,并安装至客户端
Linux使用建议
Linux使用建议
-
将文件放在合适的Linux目录结构中
-
不在服务器高负载时运行高负载命令,如执行大范围搜索命令
-
远程配置防火墙或者ssh时不要将自己踢出服务器,在机房本地配置或者写个定时任务,每五分钟清空防火墙规则,等测试完了关掉定时任务
-
指定合理的密码并定时更新,合理保存密码
-
合理分配权限
-
定期备份重要数据和日志(重要)
命令
命令格式
命令 [选项] [参数]
命令用于执行一系列动作,选项用于调整命令的功能,参数用于指定命令的操作对象。选项可以分为ls -all
形式的长选项或者ls -l
形式的短选项,通常短选项是长选项的缩写形式,但并非所有长选项和短选项一一对应。
命令提示符,Linux用这个符号标识登录的用户权限等级。若为超级用户,提示符就是#
,若为普通用户,提示符就是$
。
目录相关命令
ls
list
# 显示所有文件,Linux中以.开头的文件均为隐藏文件,如.bachrc、.ssh
ls -a
# 仅显示所有目录
ls -d
# 以长格式显示
ls -l
# 查看文件inode属性
ls -i
# 以人类可读性高的方式显示文件大小
ls -h
cd
change directory
# 更改当前目录到/home/centos
cd /home/centos
# 更改当前目录到本目录
cd .
# 更改当前目录到上一级目录
cd ..
# 更改当前目录到当前用户家目录
cd ~
# 更改当前目录到移动到本目录之前上次cd到的目录
cd -
mkdir
make directory
# 创建若干目录
make a
make a b
make a a/b
# 递归创建目录
make -p a/b
rmdir
remove empty directories
删除若干空目录
rmdir a b c
rmdir
tree
查看树型目录结构
tree
文件相关命令
touch
修改文件访问时间和数据修改时间
Linux中每个文件都有三个时间相关属性,数据访问时间(Access Time)、数据修改时间(Modify Time)、属性改变时间(Change Time),没有文件创建时间
数据访问时间在文件被访问时更新,如cat命令读取文件内容,数据修改时间在文件内容被修改时更新,如echo “something” >> file,属性改变时间在文件属性改变时更新,如文件名、文件内容、文件权限、文件拥有者、文件所属组、文件数据访问时间、文件数据修改时间等属性变化均会更新
注:touch修改数据访问时间和数据修改时间,而数据访问时间和数据修改时间的修改会引起属性改变时间的更新
# 修改数据访问时间和数据修改时间,文件不存在时创建
touch .bashrc
# 仅修改数据访问时间,文件不存在时创建
touch -a .bashrc
# 仅修改数据修改时间,文件不存在时创建
touch -m .bashrc
# 修改数据访问时间和数据修改时间,但文件不存在时不创建
touch -c .bashrc
stat
查看文件或文件系统的统计信息
# 查看文件.bashrc文件的信息
stat .bashrc
# 查看文件.bashrc文件所在文件系统的信息
stat -f .bashrc
cat
concatenate
一次性输出文件内容
cat file
head
显示文件前n行信息,默认为前10行
head .bashrc
head -n 20 .bashrc
tail
显示文件后n行信息,默认为10行
# 显示文件后20行信息
tail -n 20 .bashrc
# 追踪日志文件后30行
tail -n 30 -f user-service-2024-01-18.log
more
less
ln
make link
创建链接文件
ln xxx hard-file
●不论是修改源文件(test文件),还是修改硬链接文件(test-hard文件),另一个文件中的数据都会发生改变。
●不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件(inode号是262147的文件)都可以被访问。
●硬链接不会建立新的inode信息,也不会更改inode的总数。
●硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode号是重新计算的。
●硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的Linux来讲过于复杂。
ln -s xxx soft-file
-
软链接的源文件必须写绝对路径,否则建立的软链接文件就会报错,无法正常使用。
-
比如软链接可以链接目录,也可以跨分区来建立软链接。
-
软链接和源文件的inode号是不一致的
文件和目录都能操作的命令
rm
rm file
rm -i file
rm -f file
# 删除文件或者目录
rm -r file dir
# 强制删除文件或目录
rm -rf file dir
cp
cp a b
# 若源文件a为软连接,则目标文件b为软连接,对硬链接无效
cp -d a b
# 交互式复制,若目标文件b已存在,询问是否覆盖
cp -i a b
# 指定目标文件b为源文件a的硬链接文件
cp -l a b
# 指定目标文件b为源文件a的软链接文件
cp -s a b
# 复制后目标文件保留源文件的属性,如所有者、所属组、权限、时间
cp -p a b
# 递归复制
cp -r a b
# 等价于 cp -rpd
cp -a a b
mv
mv a b
# 交互式移动或重命名,若目标文件b已存在,询问是否覆盖
mv -i a b
# 强制移动或重命名文件,若目标文件b已存在则覆盖
mv -f a b
# 不强制移动或重命名文件,若目标文件b已存在则不覆盖
mv -n a b
# 移动文件并显示移动信息
mv -v a b
权限相关命令
权限简介
安装完操作系统后绝大多数文件的所有者为root,所属组也为root
dr-xr-xr-x. 5 root root 4096 Jan 12 23:15 boot
d 文件类型,Linux中判断文件类型取决于该标志而非后缀名
- 普通文件
b 块设备文件,例如/dev/sda1
c 字符设备文件
d 目录文件
l 软连接
p 管道符文件
s 套接字文件
r-x 文件所有者权限
r-x 文件所属组权限
r-x 其他人权限
r 读权限
w 写权限
x 执行权限
- 无权限
.表示该文件受SELinux安全规则管理
chmod
超级用户可以修改任意文件的权限,普通用户只能修改所有者为该用户的文件
u表示所有者 user
g表示所属组 group
o表示其他人 other
a表示所有人 all
chmod u+x file
chmod g+x, o-x file
chmod a=rwx
chmod -R 777 dir
数字权限 r4 w2 x1
chmod 755 file
644 一般文件基本权限
755 可执行文件基本权限、目录基本权限
777 最高权限
一般文件r权限表示可以读取文件数据,如使用cat、more、less、head、less等命令查看文件
一般文件w权限表示可以修改文件数据,如使用vi、vim、echo等命令修改文件
一般文件x权限表示可以执行文件
目录r权限表示可以查看目录下内容,如使用ls命令查看目录下子文件和子文件夹
目录w权限表示可以在该目录下新建、删除、复制文件,如使用touch、rm、cp、mv
目录x权限表示可以切换当前目录到该目录,如使用cd切换工作目录
注意:文件w权限不能删除文件,文件名保存在所在目录的block中,删除文件需要修改所在目录的block即修改目录,需要文件所在目录的w权限
root用户为超级用户,即使root对某文件无任何权限,依然可以操作该文件
# 例如/home/centos,仅允许centos操作,但root用户可以删除centos下的文件
drwx------. 2 centos centos 62 Jan 16 08:25 centos
chown
change file owner and group
当希望将一个所有者为root的文件能让普通用户拥有最高权限时,应当修改该文件所有者为普通用户(root依然能访问),而非修改其他人权限为最高权限(会影响其他普通用户)
chown a-user a-file
chown a-user:user-group a-file
chgrp
change group
chgrp a-group a-file
umask
umask默认权限是Linux权限的一种,主要用于让Linux中新建文件和目录拥有默认权限
Windows中通过继承上级目录权限赋予文件和目录初始权限
umask,权限掩码
/etc/profile
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002 # 普通用户 UID > 199,普通用户权限为 rwxrwxrwx中去掉 -------w-,即rwxrwxr-x
else
umask 022 # 超级用户 UID <= 199,超级用户权限为 rwxrwxrwx中去掉 rwxr-xr-x
umask -p # 第一位代表特殊权限 Set-UID SetGID Sticky BIT
umask 0002
umask -S #
u=rwx,g=rwx,o=rx
帮助相关命令
man
https://www.man7.org/linux/man-pages/index.html
man ls
man -f ls # 等价whatis
man -k ls # 等价apropos,根据关键字搜索man
man useradd
1 普通用户可以执行的系统命令和可执行文件的帮助
2 内核可以调用的函数和工具的帮助
3 C语言函数的帮助
4 设备和特殊文件的帮助
5 配置文件的帮助
6 游戏的帮助(个人版Linux中有游戏)
7 杂项的帮助
8 内核的帮助
info
info ls
help
help命令只能获取Shell内置命令的帮助,help本身就是一个内置命令,但man和info不是
help help
注:绝大多数命令会有-h或–help参数用以查看该命令的帮助信息
man -h
info -h
用户相关命令
useradd user
passwd user
Windows中新建用户都属于users用户组
Linux中新建用户会同时建立一个与用户名同名的用户组作为该用户用户组
网络相关命令
ifconfig
ip
# 查看ip地址
ip address
ifdown
禁用网卡
ifdown eth0
ifup
启用网卡
ifup eth0
ping
通过ICMP协议进行网络探测,测试网络中主机的通信情况。
# 默认一直探测
ping baidu.com
# 指定探测10次
ping -c 10 baidu.com
write
wall
netstat
yum install -y net-tools
查看网络连接、路由表
# 显示使用tcp协议端口的连接状况
netstat -t
# 显示使用udp协议端口的连接状况
netstat -u
# 查看路由表
netstat -r
# 仅显示State为Listing的连接
netstat -l
# 显示PID和程序名
netstat -p
# 使用IP地址和端口号显示,不使用域名与服务名
netstat -n
# 列出所有网络状态,包括socket
netstat -a
# 指定每隔几秒刷新一次网络状态
netstat -c 1
通常会使用netstat -tuln
查看网络状态
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
udp 0 0 127.0.0.1:323 0.0.0.0:*
udp 0 0 0.0.0.0:68 0.0.0.0:*
udp6 0 0 ::1:323 :::*
Proto,网络连接协议,TCP或UDP
Recv-Q,接收到的数据,已经在本地缓冲区,还没有被进程取走
Send-Q,表示从本机发送,对方还没有收到的数据,依然在本地的缓冲区
Local Address,本机IP地址和端口号
Foreign Address,远程主机的IP地址和端口号
State,连接状态
- LISTEN,监听状态
- ESTABLISHED,连接已建立状态
- SYN_SENT,主动发起连接
- SYN_RECV,接收到主动连接的数据包
- FIN_WAIT1,主动中断连接,但未接收到被动方确认
- FIN_WAIT2,主动中断连接,且接收到被动方确认
- TIME_WAIT,主动方等待被动方关闭连接
- CLOSED,连接关闭
关机和重启相关命令
sync
应用向磁盘写入数据,会首先将数据写入内存缓冲区,缓冲区写满会写入磁盘,如果缓冲区未满时机器宕机,则会丢失该部分数据,sync命令用于主动将内存中的数据写入磁盘,该命令在关机时会自动执行。
sync
shutdown
# 立即重启
shutdown -r now
# 18:00重启
shutdown -r 18:00
# 10分钟后重启
shutdown -r +10
# 立即关机
shutdown -h now
# 18:00关机
shutdown -h 18:00
reboot
reboot
halt
关机
halt
poweroff
关机
poweroff
init
# 关机
init 0
# 重启
init 6
压缩和解压缩相关命令
zip
压缩.zip文件
# 压缩文件a、b、b为xxx.zip
zip xxx.zip a b c
# 压缩当前目录中所有文件和文件夹为current_dir.zip
zip -r current_dir.zip .
unzip
解压缩.zip文件
unzip xxx.zip
gzip
压缩.gz文件
# 压缩xxx.log文件,不保留原始文件
gzip xxx.log
# 压缩xxx.log文件,保留原始文件
gzip -c xxx.log
# 压缩xxx目录中所有文件,若xxx目录中有a、b、c三个文件,则压缩结果并非xxx.gz而是xxx/a.gz、xxx/b.gz、xxx/c.gz三个压缩文件
# Linux中打包和压缩分开处理,gzip命令仅压缩
gzip -r xxx
# 解压缩文件
gzip -d a.gz
gunzip
# 解压缩
gunzip xxx.gz
# 解压缩目录下的压缩文件
gunzip -r xxx
zcat
若压缩的文件为文本文件,则可直接通过.gz文件查看内容
zcat xxx.gz
bzip2
压缩.bz2文件
# 压缩文件,不保留源文件
bzip2 xxx.log
# 压缩文件,保留源文件
bzip2 -k xxx.log
# 解压缩文件
bzip2 -d xxx.bz2
# 注:bzip2命令不能压缩文件夹
bunzip2
解压缩.bz2文件
bunzip2 xxx.bz2
bzcat
若压缩的文件为文本文件,则可直接通过.bz2查看内容
bzcat log.bz2
Linux中打包和压缩是两个步骤,通常会先将若干文件打包为.tar文件,然后再压缩为.gz文件,最终结果为.tar.gz文件
tar
# -c 打包 -f 指定打包文件名 -v 显示打包内容
tar -cfv xxx.tar main.java controller/ service/
# -x 解包 -C 指定解包位置
tar -xfv xxx.tar -C ./
# tar打包完成后使用gzip或bzip2进行压缩,获取.tar.gz或者.tar.bz2文件,tar可以一步完成打包和压缩
# -z 压缩和解压缩.tar.gz格式
tar -zcfv xxx.tar.gz main.java controller/ service/
tar -zxfv xxx.tar.gc -C ./
# -j 压缩和解压缩.tar.bz2格式
tar -jcfv xxx.tar.bz2 main.java controller/ service/
tar -jxfv xxx.tar.bz2 -C ./
常用.tar.gz格式
搜索相关命令
whereis
搜索系统命令及其帮助手册
whereis ls
# 仅搜索二进制命令
whereis -b ls
# 仅搜索帮助手册
whereis -m ls
which
搜索二进制命令,若该命令为别名则展示别名细节,并指出实际命令
# cd就是一个二进制命令
which cd
# ls本身是一个二进制命令,位于/usr/bin/ls,但通常系统会设置别名ls='ls --color=auto'从而覆盖原始ls命令
# 执行ls实质执行的是ls='ls --color=auto'
which ls
# alias ls='ls --color=auto'
# /usr/bin/ls
# 同理,ll命令也是一个别名,这种使用whereis是搜索不到的,使用which ll
# alias ll='ls -l --color=auto'
# /usr/bin/ls
locate
yum install locate
locate用于搜索文件,系统命令就是二进制文件,locate仅根据文件名进行搜索,无法进行复杂搜索。locate并非直接搜索磁盘,而是将文件路径存储到locate数据库中,直接在数据库中进行搜索,相比于其他搜索命令,locate搜索快速资源占用小,但数据库并非实时更新,新建文件会搜索不到。
# 查找.bashrc文件
locate .bashrc
# 忽略大小写并查找.bashrc文件
locate -i .bashrc
# 初次安装locate或者新建文件在locate的数据库中是查找不到该文件的
# 该数据库会在用户退出或者重新启动后自动更新,数据库数据存储于/var/lib/mlocate/mlocate.db,若要手动更新
updatedb
locate数据库的配置文件为/etc/updatedb.conf,
# 是否启用搜索限制
PRUNE_BIND_MOUNTS = "yes"
# 禁止搜索的文件系统类型
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs fuse.glusterfs ceph fuse.ceph"
# 禁止搜索文件名中包含.git等的,.gitxxx也不会搜索到
PRUNENAMES = ".git .hg .svn"
# 禁止搜索如下路径下的文件
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /var/lib/ceph"
find
# 文件名
# 按照名称搜索
find / -name .bashrc
# 忽略大小写并按照名称搜素
find / -iname .bashrc
# 文件大小
# 搜索大于10M的文件,k小写、M大写
find / -size +10M
# 搜索小于10M的文件
find / -size -10M
# 时间
# -atime 访问时间 -mtime 数据修改时间 -ctime 状态修改时间
# 查找往前数(不包括今天)第5天访问过的文件,若今天是2024.01.10,则会查找2024.01.05当天访问过的文件
find / -atime 5
# 查找往前数(不包括今天)第5天到现在(不包括第五天)访问过的文件,就是出今天外往前4个完整1天
find / -atime -5
# 查找往前数(不包括今天)第5天过去(不包括第五天)访问过的文件
find / -atime +5
# 总结就是以今天为0天,5表示过去第五天,-5表示(5, 0],+5表示(oo, 5)
# 权限
# 查询指定权限的文件,要求文件权限与给定权限完全一致
find / -perm 666
# 查询具有任意一个身份任意一个权限的文件,要求所有者、所属组和其他人任意一个身份中读写任意一个权限具有就会被查出来
find / -perm +666
# 查询具有三个身份指定的所有权限的文件,如777权限文件完全包含666,会被查出
find / -perm -666
# +表示或 -表示且
# 所有者、所属组
# -uid 用户ID -gid 组ID -user 用户名 -group 组名 -nouser 没有所有者
# 查找所属人为管理员的文件,0是root的uid
find / -uid 0
# 文件类型
# 查找目录
find / -type d
# 查找普通文件
find / -type f
# 查找软链接文件
find / -type l
# 复合逻辑
# -a 与 -o 或 -not 非
# 查询/目录下 文件大小大于2kb的普通文件
find / -size +2k -a -type f