首页 > 系统相关 >linux基础

linux基础

时间:2024-02-07 22:22:42浏览次数:33  
标签:文件 shell sudo 基础 dev linux 挂载 txt

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

  1. inode与block的规划在格式化的时候就固定,无法更改
  2. 多个区块群组
  3. 最前面有一个启动扇区,可以放引导程序
  4. 最大文件系统总容量和最大单一文件限制
  5. 一个区块(就是数据块)只能存在一个文件的数据。就是只能属于一个文件。
  6. 区块群组的超级块保存了文件系统超级快的部分副本。

文件系统同步

可以使用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更新分区表信息

    删除一个分区

  1. 进入设备sudo gdisk /dev/nvme0n1

  2. 输入p查看分区信息

  3. 输入d进行删除,这个时候会提示选择哪个分区,输入对应的数字即可

  4. (退出程序)输入w使用更改,q放弃更改

  5. 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

内存交换分区的创建

  1. 获得文件系统,可以使用物理分区或者dd命令创建文件,或者fallocate -l 2G swapfile
    这里执行sudo dd if=/dev/zero of=/dev/shm/ddout.txt bs=1M count=512

  2. 修改文件的权限。
    sudo chmod 0600 ddout.txt
    sudo chown 0:0 ddout.txt

  3. 创建分区格式
    sudo mkswap ddout.txt

  4. 启动交换分区和观察

    free -h
    sudo swapon ./ddout.txt
    swapon -s
    sudo swapon -a #启动所有交换分区
    sudo swapoff ./ddout.txt 
    
    1. 设置自启动挂载。注意,使用物理分区的时候可以使用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

  1. /etc/bash.bashrc

  2. /etc/profile

  3. ~/.bashrc

  4. ~/.profile

    non-login shell

  5. /etc/bash.bashrc

  6. ~/.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登出的时候才会执行

路径和命令查找顺序

  1. 以绝对/相对路径执行 ,这种没什么好找的,给啥是啥
  2. alias查找别名进行执行
  3. bash内置命令执行
  4. 通过$PATH环境变量查找到的第一个命令执行

/etc/issue 登录与欢迎信息,有一堆预定义的特殊字符可以获取相关信息
/etc/motd 每个用户登录之后都会看到的信息,但是ubuntu好像没有

stty -a 查看当前的快捷键内容

通配符,一般就是* ? [] [^] [a-z]这些
特殊符号,常用的就是命令后面加&可以变成后台任务去执行

shell脚本的规范

  1. !/bin/bash 声明使用的脚本

  2. 程序内容的说明 -功能,版本,作者等
  3. 主要环境变量的声明
  4. 主要程序部分
  5. 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
重启之后就会失效,如果有必要,可以创建一个服务

启动引导修复

  1. 先通过启动盘启动
    启动盘可以直接执行sudo,不需要密码

  2. 然后把待修复系统的根分区挂载进来,这里挂载到/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"

标签:文件,shell,sudo,基础,dev,linux,挂载,txt
From: https://www.cnblogs.com/panzewen/p/18011398

相关文章

  • Redis基础命令集
    一、基础命令1、ping(心跳命令)若看到PONG响应,则说明客户端与Redis的连接时正常的。2、select(切换数据库)redis默认有16个数据库,默认使用的是0号DB。3、dbsize(查看key数量)查看当前数据库中key的数量。4、flushdb(删除当前库中所有数据)清楚当前DB中的所有数据,不影响其他DB......
  • Linux环境下非GUI制作图形界面方法
    Linux环境下非GUI制作图形界面方法如题,即就是仅仅使用ANSI转义字符实现Linux环境的页面效果,如字体颜色、背景颜色、高亮、固定位置光标、将光标放到指定位置、隐藏字符串等等。具体实现方法在如下代码中,使用方法在注释里可以看到。//#ifndef__PRINT_H__#define__PRINT_H__......
  • linux下进行MCU开发环境搭建
    why为什么要搭建此开发环境?在linux环境下开发可以利用shell命令实现对文件的批处理伟大的程序员应该都用类unix系统!可以实现对底层编译技术的了解,以便于更好的掌握嵌入式技术通用性,采用开源工具,从底层开发项目,可以不受制于特定厂商的ide工具.可以实现通用架构!what......
  • linux系统自动记录登陆用户的操作命令
    ViewCode#--------------------trace_login---------------------------------USER_IP=$(echo-e"`who-uami2>/dev/null|awk'{print$NF}'|sed-e's/[()]//g'`")IP=$(who-uami2>/dev/null|awk'{print$NF}'|......
  • 学习 Redis 基础数据结构,不讲虚的。
    学习Redis基础数据结构,不讲虚的。一个群友给我发消息,“该学的都学了,怎么就找不到心意的工作,太难了”。很多在近期找过工作的同学一定都知道了,背诵八股文已经不是找工作的绝对王牌。企业最终要的是可以创造价值,或者首先需要干活的人,所以实战很重要。今天这篇文章就是给大家分享......
  • Linux Cgroups blkio Subsystem
    前言本文主要会介绍笔者在学习LinuxCgroupsblkioSubsystem时所总结的知识点,其中会涉及到使用方式以及配置方式等方面的相关内容。笔者也会将自己的理解在文中进行阐述,这也算是在和大家交流心得的一个过程。若文中有错误的理解和概念,请大家及时纠正;吸纳大家的建议,对于我来说也......
  • 【视频】小甲鱼零基础入门学习Python(全96集)
    视频下载地址:https://pan.quark.cn/s/c17e3da33a76目录1.第一讲:我和Python的第一次亲密接触2.第二讲:用Python设计第一个游戏3.第三讲:小插曲之变量和字符串4.第四讲:改进我们的小游戏5.第五讲:Python的数据类型6.第六讲:常用的操作符7.第七-九讲:了不起的分支和循环8.第十讲:一个......
  • Linux Control Group
    LinuxCGroup全称LinuxControlGroup,是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。这个项目最早是由Google的工程师在2006年发起(主要是PaulMenage和RohitSeth),最早的名称为进程容器(processcontainers)。在2007年时,因为在Linux内......
  • Linux Namespace
    LinuxNamespace是Linux内核提供的一种机制,用于实现进程之间的隔离。通过使用Namespace,可以将一组进程和资源限制在一个隔离的环境中,使它们看起来像在独立的系统上运行一样。PIDNamespace(进程隔离):PIDNamespace为进程提供了独立的进程ID空间,使得每个Namespace内的进程......
  • UGUI 基础控件
    基础控件ImageSourceImage:图片来源(图片类型必须是“精灵”类型)Color:图像的颜色Material:图像的材质(一般不修改,会使用UI的默认材质)RaycastTarget:是否作为射线检测的目标(如果不勾选将不会影响射线检测)Maskable:是否能被遮罩ImageType:图片类型Simple:普......