简介
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
shell
# 显示所有文件,Linux中以.开头的文件均为隐藏文件,如.bachrc、.ssh
ls -a
# 仅显示所有目录
ls -d
# 以长格式显示
ls -l
# 查看文件inode属性
ls -i
# 以人类可读性高的方式显示文件大小
ls -h
cd
change directory
shell
# 更改当前目录到/home/centos
cd /home/centos
# 更改当前目录到本目录
cd .
# 更改当前目录到上一级目录
cd ..
# 更改当前目录到当前用户家目录
cd ~
# 更改当前目录到移动到本目录之前上次cd到的目录
cd -
mkdir
make directory
shell
# 创建若干目录
make a
make a b
make a a/b
# 递归创建目录
make -p a/b
rmdir
remove empty directories
删除若干空目录
shell
rmdir a b c
rmdir
tree
查看树型目录结构
Plain
tree
文件相关命令
touch
修改文件访问时间和数据修改时间
Linux中每个文件都有三个时间相关属性,数据访问时间(Access Time)、数据修改时间(Modify Time)、属性改变时间(Change Time),没有文件创建时间
数据访问时间在文件被访问时更新,如cat命令读取文件内容,数据修改时间在文件内容被修改时更新,如echo "something" >> file,属性改变时间在文件属性改变时更新,如文件名、文件内容、文件权限、文件拥有者、文件所属组、文件数据访问时间、文件数据修改时间等属性变化均会更新
注:touch修改数据访问时间和数据修改时间,而数据访问时间和数据修改时间的修改会引起属性改变时间的更新
Plain
# 修改数据访问时间和数据修改时间,文件不存在时创建
touch .bashrc
# 仅修改数据访问时间,文件不存在时创建
touch -a .bashrc
# 仅修改数据修改时间,文件不存在时创建
touch -m .bashrc
# 修改数据访问时间和数据修改时间,但文件不存在时不创建
touch -c .bashrc
stat
查看文件或文件系统的统计信息
Plain
# 查看文件.bashrc文件的信息
stat .bashrc
# 查看文件.bashrc文件所在文件系统的信息
stat -f .bashrc
cat
concatenate
一次性输出文件内容
Plain
cat file
head
显示文件前n行信息,默认为前10行
Plain
head .bashrc
head -n 20 .bashrc
tail
显示文件后n行信息,默认为10行
Plain
# 显示文件后20行信息
tail -n 20 .bashrc
# 追踪日志文件后30行
tail -n 30 -f user-service-2024-01-18.log
more
less
ln
make link
创建链接文件
Plain
ln xxx hard-file
●不论是修改源文件(test文件),还是修改硬链接文件(test-hard文件),另一个文件中的数据都会发生改变。
●不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件(inode号是262147的文件)都可以被访问。
●硬链接不会建立新的inode信息,也不会更改inode的总数。
●硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode号是重新计算的。
●硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的Linux来讲过于复杂。
Plain
ln -s xxx soft-file
-
软链接的源文件必须写绝对路径,否则建立的软链接文件就会报错,无法正常使用。
-
比如软链接可以链接目录,也可以跨分区来建立软链接。
-
软链接和源文件的inode号是不一致的
文件和目录都能操作的命令
rm
Plain
rm file
rm -i file
rm -f file
# 删除文件或者目录
rm -r file dir
# 强制删除文件或目录
rm -rf file dir
cp
shell
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
shell
mv a b
# 交互式移动或重命名,若目标文件b已存在,询问是否覆盖
mv -i a b
# 强制移动或重命名文件,若目标文件b已存在则覆盖
mv -f a b
# 不强制移动或重命名文件,若目标文件b已存在则不覆盖
mv -n a b
# 移动文件并显示移动信息
mv -v a b
权限相关命令
权限简介
安装完操作系统后绝大多数文件的所有者为root,所属组也为root
Plain
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
超级用户可以修改任意文件的权限,普通用户只能修改所有者为该用户的文件
shell
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对某文件无任何权限,依然可以操作该文件
shell
# 例如/home/centos,仅允许centos操作,但root用户可以删除centos下的文件
drwx------. 2 centos centos 62 Jan 16 08:25 centos
chown
change file owner and group
当希望将一个所有者为root的文件能让普通用户拥有最高权限时,应当修改该文件所有者为普通用户(root依然能访问),而非修改其他人权限为最高权限(会影响其他普通用户)
shell
chown a-user a-file
chown a-user:user-group a-file
chgrp
change group
shell
chgrp a-group a-file
umask
umask默认权限是Linux权限的一种,主要用于让Linux中新建文件和目录拥有默认权限
Windows中通过继承上级目录权限赋予文件和目录初始权限
umask,权限掩码
/etc/profile
shell
# 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
shell
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
Plain
man ls
man -f ls # 等价whatis
man -k ls # 等价apropos,根据关键字搜索man
man useradd
1 普通用户可以执行的系统命令和可执行文件的帮助
2 内核可以调用的函数和工具的帮助
3 C语言函数的帮助
4 设备和特殊文件的帮助
5 配置文件的帮助
6 游戏的帮助(个人版Linux中有游戏)
7 杂项的帮助
8 内核的帮助
info
Plain
info ls
help
help命令只能获取Shell内置命令的帮助,help本身就是一个内置命令,但man和info不是
Plain
help help
注:绝大多数命令会有-h或--help参数用以查看该命令的帮助信息
Plain
man -h
info -h
用户相关命令
shell
useradd user
passwd user
Windows中新建用户都属于users用户组
Linux中新建用户会同时建立一个与用户名同名的用户组作为该用户用户组
网络相关命令
ifconfig
ip
shell
# 查看ip地址
ip address
ifdown
禁用网卡
shell
ifdown eth0
ifup
启用网卡
shell
ifup eth0
ping
通过ICMP协议进行网络探测,测试网络中主机的通信情况。
shell
# 默认一直探测
ping baidu.com
# 指定探测10次
ping -c 10 baidu.com
write
wall
netstat
shell
yum install -y net-tools
查看网络连接、路由表
shell
# 显示使用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命令用于主动将内存中的数据写入磁盘,该命令在关机时会自动执行。
shell
sync
shutdown
shell
# 立即重启
shutdown -r now
# 18:00重启
shutdown -r 18:00
# 10分钟后重启
shutdown -r +10
# 立即关机
shutdown -h now
# 18:00关机
shutdown -h 18:00
reboot
shell
reboot
halt
关机
shell
halt
poweroff
关机
shell
poweroff
init
shell
# 关机
init 0
# 重启
init 6
压缩和解压缩相关命令
zip
压缩.zip文件
shell
# 压缩文件a、b、b为xxx.zip
zip xxx.zip a b c
# 压缩当前目录中所有文件和文件夹为current_dir.zip
zip -r current_dir.zip .
unzip
解压缩.zip文件
shell
unzip xxx.zip
gzip
压缩.gz文件
shell
# 压缩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
shell
# 解压缩
gunzip xxx.gz
# 解压缩目录下的压缩文件
gunzip -r xxx
zcat
若压缩的文件为文本文件,则可直接通过.gz文件查看内容
shell
zcat xxx.gz
bzip2
压缩.bz2文件
shell
# 压缩文件,不保留源文件
bzip2 xxx.log
# 压缩文件,保留源文件
bzip2 -k xxx.log
# 解压缩文件
bzip2 -d xxx.bz2
# 注:bzip2命令不能压缩文件夹
bunzip2
解压缩.bz2文件
shell
bunzip2 xxx.bz2
bzcat
若压缩的文件为文本文件,则可直接通过.bz2查看内容
shell
bzcat log.bz2
Linux中打包和压缩是两个步骤,通常会先将若干文件打包为.tar文件,然后再压缩为.gz文件,最终结果为.tar.gz文件
tar
shell
# -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格式