来源于腾讯视频Linux开发视频,主要给我自己复习看
1.1.1
unix是一种分时操作系统(分时系统和实时系统的区别https://blog.csdn.net/WZJwzj123456/article/details/83243453)
我的理解:
(1)实时系统要求必须任务要在规定时间里完成,分时系统有些延迟;
(2)实时系统交互能力差,分时系统交互能力强;
(3)实时系统是cpu抢占式的,优先级高的可以打断优先级低的。分时系统不是抢占式的,需要等待低优先级的主动挂起
1.1.2
GNU(GNU is not Unix),旨在消除对软件拷贝、分发和修改的限制
GPL(GNU General Public License)通过协议来保证GNU软件对所有用户自由
LGPL相对于GPL,在商业更友好
BSD(Berkeley Software Distribution)license
copyright和copyleft,前者为著作权,后者为自由和免费
1.1.3
Linux内核版和发行版有什么不同?
发行版多了应用程序,内核是核心程序。
拓展阅读:https://baijiahao.baidu.com/s?id=1603028095502634219&wfr=spider&for=pc
kernel:下面就是硬件了,里面有硬件驱动和系统管理
运行库: 丰富的库,系统应用
shell:用户交互,命令行
实用工具程序:应用程序
EXT3、EXT4是Linux默认的文件系统类型
FAT32和NT
SWAP类型文件系统只在Linux交换分区中被使用
Linux内swap的原理,swap的大小一般为内存的2倍
FHS(Filesystem Hierarchy standard)
区别/bin和/usr博客:https://www.cnblogs.com/fengjunhua/p/7737607.html
/sbin:需要特殊权限的可执行文件
/etc:配置文件,主机名称,网卡地址。关机以后还能保存
/var:放经常变的数据,例如日志、邮件
/proc:虚目录。关机以后内容就没有了,映射进来的端口。操作系统内核信息。
/sys:虚目录
/opt:第三方软件
/mnt:手动挂载目录
主分区加拓展分区不超过4,主分区最多不超过4,拓展分区不超过1,逻辑分区在拓展分区里面(逻辑分区没有数量限制)。一般分区都是格式化过的,空白分区是没有格式化过的。
主分区和扩展分区的区别:
1、主分区
主分区也叫引导分区,Windows系统一般需要安装在这个主分区中,这样才能保证开机自动进入系统。简单来说,主分区就是可以引导电脑开机读取文件的一个磁盘分区,
一块硬盘,最多可以同时创建4个主分区,当创建完四个主分区后,就无法再创建扩展分区和逻辑分区了。此外,主分区是独立的,对应磁盘上的第一个分区,目前绝大多数电脑,在分区的时候,一般都是将C盘分成主分区。
2、扩展分区
扩展分区是一个概念,实际在硬盘中是看不到的,也无法直接使用扩展分区。
除了主分区外,剩余的磁盘空间就是扩展分区了。当一块硬盘将所有容量都分给了主分区,那就没有扩展分区了,仅当主分区容量小于硬盘容量,剩下的空间就属于扩展分区了,扩展分区可以继续进行扩展切割分为多个逻辑分区。
3、逻辑分区:扩展分区是不能直接使用的,他是以逻辑分区的方式来使用的,所以说扩展分区可以分成若干个逻辑分区。他们的关系是包含的关系,所有的逻辑分区都是扩展分区的一部分。扩展分区如果不再进行分区了,那么整个扩展分区就是逻辑分区了。
虚拟机安装,真实内存的1/4,cpu有几核就写几核
使用ISO影像文件安装
推荐:安装时,重启马上按F2切除BIOS界面,Boot里使用+按键把CD-ROM置顶,从光盘启动,避免从VMware Player启动。然后按F10,保存exit
安装完关机以后,提示请移除光盘。在设备状态上不勾选启动时链接。
type pwd
type ls
在vim里查找命令
# 从上往下寻找
/查找内容
# 从下往上寻找
?查找内容
相对路径和绝对路径
# 列出当前条目的自身信息
ls -d
# 递归创建多层目录
mkdir -p
# 目录拷贝命令
cp -a # 全部拷贝
cp -f # A强制拷贝,已经存在的覆盖
# 删除空目录
rmdir -p # 递归删除多层空目录
# 删除非空目录
rm -i# 交互式
# 目录移动改名
mv
# 在一个终端里
while :;do echo "hello LiLi." >> test.txt;sleep 1; done
# 另一个终端里
tail -f test.txt
# 查看日志文件经常是这样操作的
# 在根目录下,寻找文件名字带有cc的文件,从根目录以下开始查找
find / -name "cc"
# 只能寻找可执行文件 ,并在PATH变量里面寻找
which cc
#which 只能寻找可执行文件 ,并在PATH变量里面寻找。
#whereis 从linux文件数据库(/var/lib/slocate/slocate.db)寻找,所以有可能找到刚刚删除,或者没有发现新建的文件。全部匹配
#locate 同上,不过文件名是部分匹配。
#find 是直接在硬盘上搜寻,功能强大,但耗硬盘,一般不要用。
# locate采用索引技术查找
locate cc
vim--->直接进入以后
:q--->是无法直接退出的
:w 文件名字--->保存退出
# 复制
yy
# 粘贴,小写在当前行下面粘贴,大写在当前行上面粘贴
p,P
# 增行
o,O
# 删行
dd
# 命令前面都可以加数字
# /是向下查找?是向上查找
# :s当前行替换,g是global(当前行的所有),c是comfirm
:s/io/IO/gc
# :%s全文替换
:%s/io/IO/gc
# 最后一行
shift+g
# 第一行
gg
vim多行注释:
https://www.cnblogs.com/yangzp/p/10791870.html
# 跳转到第13行
:13
# 行号不显示
:set nonu
# 行号显示
:set nu
# 写在vimrc,这里的点是隐藏文件的意思
vim ~/.vimrc
set nu
set tabstop=4
set autoindent #自动缩进
# 命令模式中的撤销和回撤
小写的u
ctrl+r
# 多个文件并行执行,优势是多文件的内容可以相互之间传递
vim 1.cc 2.cc 3.cc
:args#查看几个文件参数
:first#去第一个文件
:last#去最后一个文件
:next#下一个文件
:prev#上一个文件
使用7z的优点:压缩率高;能够解压rar格式,但是不能压缩rar
.o文件::: 目标文件。就相当于windows里的obj文件 ,一个.c或.cpp文件对应一个.o文件
.a文件::: 是好多个.o合在一起的静态库文件,相当于windows下的.lib文件。给外部程序提供接口,用于静态连接 ,即STATIC mode。多个.a可以链接生成一个exe的可执行文件
.so文件::: 是shared object即动态链接文件,和windows的.dll文件差不多,用于动态连接的。使用时才载入。
.bin文件::: linux下的可执行文件,相当于windows下的.exe文件。
电脑自动挂载是在/media这个目录上
把一个文件挂载到一个目录上
# 查看磁盘
sudo fdisk -l
阅读材料设备文件是什么:https://blog.csdn.net/gnnulzy/article/details/85117183
# iso9660文件格式,/dev/cdrom是设备文件,/mnt是目录(-t有时候可以省略)(这是对光盘设备挂载)
sudo mount -t iso9660 /dev/cdrom /mnt
# iso是文件不是设备,把文件放在回环设备中,然后loop再挂载到/media里(对光盘镜像文件的挂载)
sudo mount -o loop -t iso9660 mycd.iso /media
# 由于光盘只读,挂载完会有一个警告,而u盘不会
# 使用-a卸载的时候提示设备正忙,需要等一会,也不是错误
# 卸载设备和目录等效
# 更新软件列表
sudo apt-get update
# 升级某款软件
sudo apt-get upgrade vim
# $$为当前进程,查看指定进程只要将-p后面跟着pid号就行
top -p $$
# 查看进程编号
pidof gedit
shutdown可以指定时间再关机。
reboot和shutdown需要sudo
man cront
# 查看第5章crontab
man 5 crontab
# 编辑crontab
crontab -e
# 进入crontab里以后/1是每隔1分钟,不加/是每个时间的第5分钟
# m h dom mon dow command
*/1 6,8-10 * * * tar czf /home/iotek/dabao.tgz /home/iotek/*.deb
# 重启cron服务
sudo service cron restart
# 查看日期
date
# 设置系统时间
sudo date -s "5:58:55"
# 查看crontab的help文档
crontab -h
# 删除
crontab -ri
# 回头看crontab还存在吗
crontab -l
du -s /home/iotek
du -h /home/iotek/examples.desktop
分区是对设备文件的一种写入
按m查看help文件形式
按n是add分区
p是主分区,e是拓展分区
设置分区号码(默认)
设置扇区(默认)
按p是打印
拓展分区是不能直接使用的,需要划分成逻辑分区
按n
按l----划分出逻辑分区
现在不想把逻辑分区改成linux的,改变这个id
最终把linux的改成fat32类型的
按大写的L能list所有分区的类型(16进制表示)
再按p可以看到分区类型得到改变,但是没有最终写入设备文件中,记得要输入w!!!!
syncing同步到disks里了
最后sudo fdisk -l查看一下
# 本机地址链接
ping 127.0.0.1
# 发送6次就停下来
ping -c 6 127.0.0.1
# 域名也行
ping www.baidu.com
ifconfig只是临时改变网络接口地址
lo是虚拟网卡,本地回环,网络协议上兜一圈然后回来
硬件地址mac地址是网卡的身份证,ip地址可以变网卡地址不能变
#增加一个网关
sudo route add default gw 192.168.248.3
# 删除网关
sudo route del default gw 192.168.248.2
# 查看路由表
netstat -r
# 增加一个用户,但是没有目录,创建不完整
sudo useradd bencai
# 删除该用户
sudo userdel bencai
# 创建有目录的用户
sudo useradd -m bencai
# 给用户设置密码
sudo passwd bencai
# 登入用户
su bencai
whoami
exit
# 普通用户$符号root用户#状态
sudo -i
# 在指定用户中进行操作
sudo -u bencai ls /home
# sudo能够执行的命令
sudo -l
# 报错user01不在sudoers的文件夹中
sudo bencai
# 退出bencai环境,进入到root权限中
sudo -i
# 将user01加入到sudo组中
gpasswd -a user01 sudo
# 改lo的ip地址
sudo ifconfig lo 127.0.0.8
sudo usermod -L user01
# 从当前用户切换到user01失败
su user01
# 但是管理员可以
sudo -i
su user01
whoami
exit
passwd user01
# 解锁用户
sudo usermod -U user01
less /etc/passwd# 系统用户是不能在用户界面里登入的,只有bencai,user01这些可以登入
sudo less /etc/shawdow
sudo groupadd user02
tail /etc/group
sudo groupdel user02
# 指定id
sudo groupadd -g 1007 user02
有效群组?
当groups查看用户所属群组的时候会跳出来很多。当ioteck用户touch一个File文件,只有iotek这个群组的人才能访问这个文件。现在想让bencai小组的人去访问。首先群组里要有bencai,然后把bencai变成有效群组(第一个群组即为有效群组)
# 把用户iotek加入到bencai中去
sudo gpasswd -a iotek bencai
# 把用户bencai从最后一个变成第一个
newgrp bencai
whoami
groups
touch test.out
# 可以看到test.out的群组已经改变
ls -l
# 把用户iotek从bencai中
# 限制组群访问
sudo gpasswd -R bencai
# 查看文件时发现bencai出现
less /etc/gshadow
# 查看目录本身属性
ls -ld newdir
# 以非数字的形式看
umask -S
# 普通文件是没有可执行权限
# 删除一个目录
rmdir
# chown也可以改群组,只能搞定一个,所以递归用chgrp
# :前面是用户,:后面是群组
sudo chown iotek:iotek newdir
sudo chown :iotek newdir
ftp文件传输,异步传输文件
ftp用文件名和登入口令来登入
ftp有两种传输模式,二进制和文件模式。二进制文件未发生格式转换,文件损失少
上传到服务器,下载到本地
使用账户和口令登入
ls不加!是列出服务器上的目录;ls加!是列出当前的目录
除了两种传输模式,数据连接的模式:主动/被动模式
被动模式打开
主动模式,服务器主动连接你
被动模式,服务器被动等待你去连接
bi是二进制模式
ascii是文件模式
上传成功
下载成功
退出
查看进程号
卸载 或使用auto-remove
只有ping的通才能在线安装
apt下载的文件在这个路径里
# 离线安装
sudo dpkg -i vs*.deb
# 查看当前状态
sudo service vsftpd status
anonymous_enable匿名登入
一般打开local_enable和write_enable(指能够上传。否则只能下载)
欢迎界面
保证新配置好的文件被重新读取,重启重新加载
sudo apt-get install ssh
# 安装包
ls /var/cache/apt/archives/openssh*
vim /etc/ssh/sshd_config
alias
type ls
which ls
/bin/ls
alias myls='ls -ld --color=auto'
myls
ls -l test[0-9, a-z].sh
ls -l test[0-2]*.???
# 后台运行
gedit&
#[3] 28374 3代表作业号,28374代表pid
# 把作业3换回到前台,前台占用
fg %3
为什么引用有时候要加{}?
当后面马上要接英文。区别,究竟是一个变量名还是变量名加字符串
主机名,ip地址都在一个配置文件里。开机后读取这个配置文件
bashrc只改变当前用户
改变所有的etc目录下
# 查看所有的环境变量
env
# 环境变量保存在这两个文件中(全局的)
less /etc/bash.bashrc
less /etc/profile
# 一般不要去改全局的
# 家里的
less ~/.profile
less ~/.bashrc
# PS(Prompt Sign):命令提示符
PS1='\u@\w\$:'
# 加载修改后的文件
. ~/.bashrc
# 重启启动shell
echo $PS1
ps相关资料
https://www.jianshu.com/p/d4b905e76528
# 导出环境变量
export PS1
# 产生子shell
bash
# 环境变量的好处是运行命令时,不用在加入路径
ls
/bin/ls
# 效果一样
cp bin/ls ils
# 直接运行ils不成功
/home/dwz/ils #能运行
# 临时添加环境变量
PATH=/home/dwz/ils:$PATH
echo $PS1
# \u是当前用户,:@无意义格式,\$普通用户是$,特权用户是#
PS1='\u:@\$'
sudo -i
exit
# PS2是换行符的提示符
# ls -l \然后回车,换行
echo $$
echo $0
# 杀死当前shell
kill -9 $$
# echo $?
# 0是成功, 1是失败
dasfhj #乱输入
echo $? #返回非0
# 命令后加&是发送到后台运行
sleep 10000&
# [1] 28628
echo $!
kill -9 $!
# 查看当前后台任务
jobs
任务一:
vim test.txt
\文本内容
ls -ld $1
ls -l $1
\
# .相当于source,把该文件加载到当前shell里来运行
. test.txt /home
任务二:
vim test.txt
\文本内容
ls -ld $1
ls -l $1
shift
ls $2
\
# 传进去三个地址,超出txt里面的变量数。遇见shift,自动往后推一个参数,$2指的是/ect.最后显示/home和/etc
. test.txt /home /var /ect
#
# grep -v 不包含字段
ps aux | grep "bash" | grep -v "grep"
# 标准错误信息是不能通过管道传递的
# newdir是正常文件,asdhiffeljh是错误信息。最后错误信息并没有通过管道筛选,也直接输出了
ls -l newdir asdhiffeljh | grep test
覆盖重定向是把原来的文件清空
追加重定向是在文件的尾部添加
缺省了文件描述符1
# cat缺省条件下,键盘输入什么就输出什么.ctrl + d 结束
cat output.txt
cat < output.txt
# 遇到EOF结束,EOF可以自己取END,BBB都行
cat << EOF
> asfdjh
> asfhjk
> asdfhjk
> EOF
# 错误文件虽然不能写入output.txt文件中,但是把原来的文件清空了
ls -l djbfa/ > output.txt
# 目标:想把正确信息和错误信息全都输入文件中
# 正确信息进去了,错误信息没有进去
ls -l dfka/ /home/dwz > output.txt
# 错误信息进去了,正确信息没有进去
ls -l /home/dwz dfka/ 2 > output.txt
# 正确操作
ls -l /home/dwz dfka/ & > output.txt
ls -l | grep bencai > output.txt
# cat本来输出到stdin重定向输入到output2.txt中
cat < output.txt > output2.txt
cat > output3.txt << FF
设备文件原来都是在内存中,然后都输入到
#!/bin/bash
# 方案一,符号级联:
test -x test2.sh && echo "ok" || echo "failure"
# 方案二,if-else分支:
# []前后均有空格
if [ -x $1 ]
then
echo "ok"
# 一行里两个命令,要加分号
elif [ -x $2 ];then
echo "$2 executable"
else
echo "fail"
fi
# 方案三,case分支:
# 赋值=不能有空格
Value=$3
case $Value in
a)
echo "A"
# 有两个分号
;;
b)
echo "B"
;;
# *通配符
*)
echo "C"
;;
esac
#!/bin/bash
Count=1
# 第一种
#while [ -x $1 ]
# 第二种
until [ -x $1 ]
do
[ $Count -ge 5] && break
echo "running..."
let Count++
done
# 第三种
Count=1
for Var in aa bb cc dd ee ff
do
echo "loop $Count"
echo "$Var running..."
let Count++
done
#!/bin/bash
#------------------------
#--选出10个3的倍数,从给定的自然数开始
#------------------------
#--输入
read -p "请输入一个自然数:" Input
if [ $Input -gt 0] 2 > /dev/null ; then
echo "你输入的是自然数,从此自然数开始的10个3的倍数为"
else
echo "你输入的不是自然数,程序异常退出。"
exit
fi
#--处理并输出
Count=0
Num=$Input
while [ $Count -lt 10 ]
do
let Num2=$Num%3
if [ $Num2 -eq 0 ] ; then
echo "$Num"
let Count++
fi
let Num++
done
/dev/null的内容:https://www.cnblogs.com/songgj/p/8998049.html
当输入不是自然数的时候,会把错误输入到/dev/null中
!!!注意:这里有两个$1,含义却不一样。echo “$1 你好”这里表示"$1 海同"这个参数,而nihao “$1 海同”这里代表文件外部输入iotek这个参数(见下图)
# 删除一个变量
unset today
# 变量today里面为空
echo $Today
# 显示friday
echo ${Today:=friday}
# 显示friday
echo $Today
unset Torrow
# 缺省报错
echo ${Torrow:?"no set value"}
Torrow=sunday
# 显示输出sunday
echo ${Torrow:?"no set value"}