flutter安装
直接通过克隆官方仓库安装是最舒服的
git clone -b dev https://github.com/flutter/flutter.git
flatpak卸载软件
flatpak list
flatpak uninstall app_id
flatpak uninstall --unused
相关概念
在这里有时候并不严格区分目录和文件。
物理磁盘:/dev/sd--
虚拟磁盘:/dev/vd--
文件系统:一个可以被挂载的东西就行
超级区块:记录文件系统整体信息。包括统计信息和挂载信息
inode:用于记录文件的属性,权限信息,涉及的数据区块号码等,一个文件或目录唯一对应一个inode。。注意,这货是可以间接分级来扩大的(当文件使用的数据区块非常多)。
数据区块(block):记录实际文件内容,也是可以分级的(当目录的子目录非常多)
ext2
- inode与block的规划在格式化的时候就固定,无法更改
- 多个区块群组
- 最前面有一个启动扇区,可以放引导程序
- 最大文件系统总容量和最大单一文件限制
- 一个区块(就是数据块)只能存在一个文件的数据。就是只能属于一个文件。
- 区块群组的超级块保存了文件系统超级快的部分副本。
文件系统同步
可以使用sync把内存的脏数据写入磁盘。一般执行reboot等正常关机操作之前都会执行。
日志式文件系统
提高了文件系统状态检查的效率
简单操作
df -h
df -ah
du -h
du -sh ./ 查看目录下文件占用总大小
dumpe2fs
/proc
挂载在内存里面,磁盘占用是0
/dev/shm
利用内存虚拟出来的空间,读写贼快,但是不能持久保存
硬链接和软连接
文件名只和目录有关,文件内容则与inode有关。
首先,从使用的角度讲,两者没有任何区别,都与正常的文件访问方式一样,支持读写,如果是可执行文件的话也可以直接执行。
硬链接
硬链接只是在目录下新增一个链接到某个inode的文件名而已。
您可以为一个文件创建一个或多个硬链接。但无法为目录,在不同文件系统或者,不同分区上的文件创建硬链接。
注意
-
硬链接只能用于文件,不能用于目录,而且不能跨文件系统
-
链接到一起的文件,他们是等价的
-
删除一个硬链接,并不会删除文件。只有当硬链接数是0的时候,文件才会被删除
把a.txt链接到b.txt
ln a.txt b.txt
这里要求b.txt不能已经存在
软连接
软链接类似于 Windows 快捷方式,它是指向文件或目录的间接指针。与硬链接不同,符号链接可以指向不同的文件系统,不同分区上的文件或者目录。
ln使用-s选项就是软链接。
ln -s a.txt as.txt
注意
-
修改软连接文件的内容就是修改指向文件的内容,就是说,软连接和硬链接在使用上是一样的。只是删除的时候不一样
-
删除a.txt会导致as.txt无法访问
硬链接: 与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块
软链接: 保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径。lsblk 查看磁盘分区状态
-
loop分区是一种特殊放分区格式。允许将文件看做分区
blkid 列出设备的UUID等参数
parted 查看设备分区信息
- sudo parted /dev/nvme0n1 print
gdisk(GPT)/fdisk(MBR) 磁盘分区
-
分区之后使用sudo partprobe更新分区表信息
删除一个分区
-
进入设备sudo gdisk /dev/nvme0n1
-
输入p查看分区信息
-
输入d进行删除,这个时候会提示选择哪个分区,输入对应的数字即可
-
(退出程序)输入w使用更改,q放弃更改
-
sudo partprobe更新分区表信息
增加一个分区
第3步输入n根据提示进行即可,需要注意+容量的表达方式,
在选择起始扇区的时候。+10G,+15M这些。
就是在调整结束扇区的地方调整容量的,别的默认就行。grep 命令加个-v就是相反的
mkfs磁盘格式化
通过设备名称进行
直接输入mkfs.然后两个TAB键查看备用选项即可
sudo mkfs.ext4 /dev/nvme0n1p4
可以使用-f强制格式化
挂载-mount命令
-
挂载点的目录应该为空,文件系统和挂载点应该一一对应
-
通过设备名挂载(例如NTFS文件系统找不到UUID) sudo mount /dev/nvme0n1p4 ~/wk
-
通过UUID挂载,假设设备的UUID是abc,那就是sudo mount UUID=‘abc’ ~/wk
-
文件互相挂载,把a目录挂载到b目录下, sudo mount --bind a/ b
-
重新挂载根目录(用于维护目的), sudo mount -o remount,rw,auto ./c
-
-o用于指定挂载选项,后面挂载loop的时候就是加了-o loop
-
-t用于指定文件系统类型
卸载-umount
-
直接使用挂载点卸载(设备可能被挂载在多个目录下)挂载点为b,sudo umount ./b
-
使用设备名卸载,sudo umount /dev/nvme0n1p4
-
文件系统的检查需要在卸载的情况下进行
磁盘、文件系统参数自定义 -自己查,不重要
启动挂载/etc/fstab和/etc/mtab
系统挂载的限制
-
根目录必须而且最先挂载
-
别的挂载点必须是已经建立的目录
-
所有挂载点、所有分区同一时间只能挂载一次
-
如果进行卸载,必须把工作目录挪到别的地方
/etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/nvme0n1p6 during installation
UUID=540359f1-3ed7-487b-8063-30005f43cde7 / ext4 errors=remount-ro 0 1
# /boot was on /dev/nvme0n1p5 during installation
UUID=fd155910-6436-4c47-942d-85c8856ec3ac /boot ext4 defaults 0 2
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=0425-3BC4 /boot/efi vfat umask=0077 0 1
/swapfile swap swap default 0 0
第一列 设备标识
-
设备文件名 /dev/sda
-
UUID,如UUID=XXXX
-
LABEL,LABEL=XXXX
第二列 挂载点
第三列 磁盘分区的文件系统,例如xfs,ext4等
第四列 文件系统参数
-
async/sync
-
auto/noauto
-
rw/ro
-
exec/noexec
-
user/nouser
-
defaults 同时具有这些权限,一般设置为这个就可以
第五列 一般是0
-
能否被dump备份命令作用,dump现在一般不用了
第六列 是否以fsck检验扇区,现在一般是0
实际文件系统的挂载是记录到/etc/mtab和/proc/mounts下,修改文件系统挂载的时候会同时修改这个两个文件
-
特殊设备文件loop挂载
知道这个玩意可以把一个文件当分区玩就好了
使用dd命令建立一定尺寸的空文件
sudo dd if=/dev/zero of=/dev/shm/ddout.txt bs=1M count=512
在这里if是输入文件,of是输出文件
bs是block size
count就是总的块数
所以ddout.txt的文件的大小是bs*count
内存交换分区的创建
-
获得文件系统,可以使用物理分区或者dd命令创建文件,或者fallocate -l 2G swapfile
这里执行sudo dd if=/dev/zero of=/dev/shm/ddout.txt bs=1M count=512 -
修改文件的权限。
sudo chmod 0600 ddout.txt
sudo chown 0:0 ddout.txt -
创建分区格式
sudo mkswap ddout.txt -
启动交换分区和观察
free -h sudo swapon ./ddout.txt swapon -s sudo swapon -a #启动所有交换分区 sudo swapoff ./ddout.txt
-
设置自启动挂载。注意,使用物理分区的时候可以使用UUID,
但是在使用交换文件的时候,只能使用设备名(交换文件的路径)删除交换分区
先swapoff,然后删除自动挂载配置,然后删除分区或者文件
-
login shell和nologin shell
取得shell的时候需要输入账号密码(完整流程)就是login shell,剩下的就是non-login shell.
二者获得shell后读取的配置文件不同
所以在图形化界面直接打开终端是non-login,直接执行bash获得的终端也是。
先sudo init 3,然后登录shell,那绝对是login shell实锤。
non-login shell
先/etc/bash.bashrc后读取~/.bashrc
login shell
-
先读取 /etc/profle
-
在~中找 .bash_profile,然后找.bash_login,然后找.profile。
这三个文件,就按照这个顺序找。找到一个之后就不往下找了。就是说这三个文件只有一个会被执行。 -
但是这三个文件里面,一般都会再次调用~/.bashrc
场景分析
在我的ubuntu 22.04当中
登录shell
-
/etc/bash.bashrc
-
/etc/profile
-
~/.bashrc
-
~/.profile
non-login shell
-
/etc/bash.bashrc
-
~/.bashrc
常见设置
-
一般的使用情况不需要严格区分login shell和non-login shell
-
给个人设置环境变量,在~/.bashr就够用
-
设置全局环境变量,一般用/etc/environment 。
** 注意了,environment不是shell脚本,只能定义,不具有执行功能,就是别引用变量扩展(刀了符号)和export关键字等 **扩展
-
.bash_history
-
.bash_logout 登出的时候执行sudo parted /dev/nvme0n1 print
tee命令进行双向数据重定向
(ls /media/ross/FS/check > /dev/null) || sudo mount --bind /media/ross/OS/FS /media/ross/FS > /dev/null &2>1
echo -n 表示不换行输出,-e进行转义之后输出(when 字符contain $var)
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES; 处理MYSQL数据库安装之后的问题
系统初始化
tilix-这是一个非常不错的终端工具
而且输入法,用默认的就行
sudo apt install gnome-tweaks 字体调整工具,必须要装,不装没办法调整字体大小
MarkText MarkDown格式编辑器,嘎嘎舒服
sudo ubuntu-mainline-kernel.sh -i 可以用这个脚本管理内核,已经放在/usr/local/bin了
安装桌面环境: 先sudo apt install gnome-shell,再sudo apt install ubuntu-gnome-desktop 注意:这是有顺序的!
卸载内核:dpkg --list | grep linux-image sudo apt remove linux-image-6.2.0-26-generic 注意:很容易导致系统无法开机,最好备份重要内容
更新内核到6.2: sudo apt update && sudo apt full-upgrade 命令,即可获得 Linux 6.2 内核更新。
如果这个不管用,直接使用sudo apt install linux-image-generic-hwe-22.04
安装新内核的方式,好像可以直接按照软件形式来管理sudo apt install linux-image-X.X.X-XX-generic sudo update-grub
5.19.0-50 6.2.0-06
安装snap商店: sudo apt update sudo apt install snapd :直接安装snapd就好了,不需要安装apt install snap了
实际上.deb包可以用apt安装,而且更舒服。因为apt封装了dpkg
终止程序安装:apt 安装到一半,直接强制终止了。后续想进行apt软件管理一直提示运行apt install --fix-broken ,
进行dpkg 操作一直提示运行:sudo dpkg --configure -a 重新配置dpkg。这个时候直接把sudo dpkg --configure -a
显示的有问题的软件包直接使用dpkg卸载即可
数据流重定向
find ./ archive* > /dev/null 2>&1
把stdout>/dev/null,把2>到1.实际上就是把输出都定向到/dev/null
find ./ archive* > /dev/null 2>err.txt
把二者输出到不同的文件
**注意,>1和>2这种,>和数字中间是没有空格的。
利用cat把输入写到文件
cat > catfile.txt
输入一堆内容,然后按CTRL+d结束
这个时候键盘输入的内容就会写到这个文件
cat > catfile.txt < ~/.bashrc
把.bashrc的cat内容定向到catfile
cat > catfile.txt << "E"
当键盘输入"E"的时候结束输入
a&&b ,a成功才执行b
a||b ,a失败才执行b
管线命令
管线命令使用| 符号,
只接受前一个命令的stdout,不管stderr.
必须能够把前一个命令的stdout当成自己的stdin来处理
less more head tail
cut命令以行为单位处理数据,就是把数据分成几列,选出我们想要的列
echo $PATH | cut -d ':' -f 5
用:分割,取出第五个数据
-f也可以用3,5表示多个选中的片段
last用于查看历史登录信息
还有grep,一堆骚操作,配合正则表达式
还有sort,uniq,wc管道命令
ss -tln 查看处于监听状态的端口
tee命令-双向重定向
-a表示追加
last | grep "root" | tee -a root.txt | more
查看root用户的启动时间段,同时追加到文件中。
如果没有-a,那就是覆盖。
tr 删除或替换信息中的文字
last | tr "[a-z]" "[A-Z]"
把小写全部变成大写
cat psw.txt | tr -d ':'
把 :删了
unix2dos和:dos2unix可以把文件里面的换行符进行正确转换
col 处理tab和空格的转换
join 处理两个文件之间的数据
paste 把两个问题贴在一起,中间用tab隔开
expand把tab变成空格
split -l 10 config.yaml cfg-
-l按照10行一个文件划分,可以使用-b然后带上单位表示大小
cfg表示prefix
管道命令当中-号的用途
可以在命令中引用管道
mkdir myacv&&tar cvf - archive | tar xvf - -C myacv
把archive打包之后又马上解压到myacv
xargs命令 就是产生参数的意思
xargs [-0epn] command
读取stdin中的数据,以空白字符作为分割,作为command命令的参数
可以让非管道命令完成管道命令的功能
就是让普通命令也能引用输入流
-0 把特殊字符还原成一般字符,例如\ 空白等
-e 接一个字符串表示结束符号,处理到这个字符串就停止工作
-p 每次执行都询问意思
-n 接一个数字,command命令执行的时候要使用几个参数
date命令可以查看日期
脚本的执行方式差异
使用source的时候直接在当前shell(进程)执行。
直接执行则会创建一个新的子 shell(子进程)去执行。
子进程结束之后,子进程对shell的环境变量的操作不会影响到父进程.
直接执行shell脚本s.sh的方式(在子进程中执行)
s.sh 直接输入路径
./s.sh
bash s.sh
在当前进程执行
. s.sh 这个点执行方式真的很奇怪
source s.sh
test命令的测试功能 善用判断式
没有输出,一般都是利用返回值
test -e psw.txt&& echo "文件存在" || echo "文件不存在"
test -f psw.txt&& echo "文件存在" || echo "文件不存在"
存在而且是文件
test -d psw.txt
存在而且是目录
-r -w -x 文件属性判断
也可以比较两个文件
比较两个数字
判断字符串
-a -o ! 分别是and or 和not
很多权限的限制对root是无效的
使用file命令查看文件相关信息
test -d /media/ross/FS/check || sudo mount --bind /media/ross/OS/FS /media/ross/FS
snap正在下载的时候取消安装
snap changes 获得ID
snap abort id 进行取消操作
判断符号[]的使用
注意安排空格。因为要和正则表达式和通配符那些区分
[]每个组件都需要空格来分割
[]里面的变量都用""括起来
[]里面的常数最好都以""或者''括起来
假设用B表示空格的话 [B"$HOME"B== B"$MALL"B]
[ "${yn}""n" -o "${yn}""N" ] && echo "Oh interrupt" 注意-o表示or
字符串比较最好用=,因为==的支持范围有限,比如我的ubuntu就不支持
脚本默认变量
$# 参数的个数
$@ 表示"$1" "$2"...
$* $1c$2c$3 c是分隔字符,默认是空格,这里是*
s.sh op1 op2 op3
$0 $1 $2 $3
$0表示脚本的名字
在脚本中执行shift可以拿掉变量导致$1这些参数变量的内容被改变
shift -n 不写-n就是1
变量的设置规则
不能直接接空格
没有设置的变量默认是空的
双引号内的字符串是可以有特殊字符的,单引号一视同仁
使用$
或者$()把命令的执行结果放进来
可以使用\对特殊字符进行转义
使用unset取消变量
查看变量
使用env查看 所有环境变量
set查看所有变量(包括自定义 的)
重要的变量
PS1 命令提示符
$ 本shell的PID
? 上个命令执行的返回值
环境变量可以被子shell继承,自定义变量不会
export单独使用可以查看所有环境变量,
配合变量名使用可以把变量变成环境变量
语系的设置locale
如果别的变量没有设置,设置LANG或者LC_ALL就可以,记得export
linux的终端环境是无法显示中文的
read 读取键盘输入
-p 提示字符
-t 等待的秒数
declare 定义变量
单独使用可以查看所有变量
-a 数组类型
-i 整数
-x export相当于
变量类型默认是字符串
数组类型的访问类似C语言
history命令
n 列出最近几条
-a f 把新增的命令写到f中 。如果没有加f,默认就是.bash_history
-r f 把f的内容读到目前这个shell的history记录中
-w f 把目前的历史记录写到f中
当系统登出的时候,系统会把最近$HISTFILESIZE条记录写到.bash_history中
.bash_logout只有在longin shell登出的时候才会执行
路径和命令查找顺序
- 以绝对/相对路径执行 ,这种没什么好找的,给啥是啥
- alias查找别名进行执行
- bash内置命令执行
- 通过$PATH环境变量查找到的第一个命令执行
/etc/issue 登录与欢迎信息,有一堆预定义的特殊字符可以获取相关信息
/etc/motd 每个用户登录之后都会看到的信息,但是ubuntu好像没有
stty -a 查看当前的快捷键内容
通配符,一般就是* ? [] [^] [a-z]这些
特殊符号,常用的就是命令后面加&可以变成后台任务去执行
shell脚本的规范
-
!/bin/bash 声明使用的脚本
- 程序内容的说明 -功能,版本,作者等
- 主要环境变量的声明
- 主要程序部分
- exit n 返回值
数值运算
echo -e "ab==$((ab))" a和b可以是变量或者数值,(())是必须的
默认只支持整数,使用bc支持小数
通过bc计算Pi(圆周率)
善用判断式
test -z str 判定字符str是空,-n就是非空(不给参数就是-n)
test str1 == str2
test str1 != str2
条件判断式 if语句
if [expr1] ; then
commands...
elif [expr2];then
comands...
else
comands
fi
使用case -esac 判断,就是case语句
function功能
不定循环
while循环
while [condition]
do
commands...
done
until循环
until [condition]
do
commands...
done
固定循环
for循环
for var in con1 con2 con3 ...
do
comands...
done
这里的do必须要单独一行
for ((i=1;i<=${n};i=i+1))
do
commands...
done
脚本调试
使用sh -x 可以把脚本的执行过程也显示出来
echo命令
echo -e 开启转义功能,可以用\n表示换行等
善用[]
[ ! -d archivdse ] 这里的!要在-d的前面
[]是test命令的另一种形式
在登出时执行命令 使用trap命令
trap 'source /home/ross/bin/pzwlogoutOp.sh; ' EXIT
export HISTTIMEFORMAT="%H:%M:%S %m-%d "
历史命令记录时间
sed命令的功能非常强大
限定电池充电上限
echo 80 | sudo tee /sys/class/power_supply/BAT0/charge_control_end_threshold
重启之后就会失效,如果有必要,可以创建一个服务
启动引导修复
-
先通过启动盘启动
启动盘可以直接执行sudo,不需要密码 -
然后把待修复系统的根分区挂载进来,这里挂载到/u.我的EFI启动文件在/dev/nvme0n1p1,Boot分区是 /dev/nvme0n1p5,根分区是/dev/nvme0n1p6
sudo mkdir /u ;sudo mount /dev/nvme0n1p6 /u
把boot分区挂载进来,这里是挂到/u/boot
sudo mount /dev/nvme0n1p6 /u/boot
挂载EFI分区,一般都在硬盘的第一个分区。如果是双系统的话,会和windows住一起。就是有EFI文件的那个分区。挂载到/u/boot/efi
sudo mount /dev/nvme0n1p0 /u/boot/efi
然后执行这个sudo grub-install --boot-directory=/u/boot (boot分区当前的实际位置) /dev/nvme0n1p5(硬盘的名字,这里是nvme0n1)
sudo grub-install --boot-directory=/u/boot /dev/nvme0n1
重启,如果成功,执行sudo update-grub
主机身份变更导致ssh不能正常连接的问题(例如 更新系统内核,重装系统等)的修复
ssh-keygen -f "/home/ross/.ssh/known_hosts" -R "119.8.51.206"