[Linux] Linux文件系统基本管理

目录

识别文件系统和设备

Linux 中设备

Linux 文件系统

查看设备和文件系统

lsblk命令

df命令

du命令

案例:查看根文件系统中哪个文件占用了最大空间

环境准备

查找过程

挂载和卸载文件系统

环境准备

挂载文件系统

卸载文件系统

卸载失败处理

lsof 命令

fuser 命令

案例:Linux 挂载 NTFS 格式U盘

案例:Linux 挂载 exfat 格式U盘

案例:构建基于 ISO 文件的yum仓库

查找系统中文件

locate

find

根据文件 name 查找

根据文件 type 查找

根据文件 owner 查找

根据文件 perm 查找

根据文件 size 查找

根据文件 time 查找

根据文件硬链接数和 inum 查找

多条件表达式

action


识别文件系统和设备

Linux 中设备

在Linux中,对存储设备的访问由特殊类型文件-块设备(block)提供。挂载块设备前,必须先使用文件系统对其进行格式化。

块设备文件与其他的设备文件一起存储在/dev目录中。设备文件是由操作系统自动创建的。

常见的不同类型接口块设备:

  • 接口:SATA/SAS/USB/SCSI,名称:/dev/sda、/dev/sdb …

  • 接口:virtio-blk,虚拟机磁盘,名称:/dev/vda、/dev/vdb …

  • 接口:NVMe SSD,名称:/dev/nvme0n1、/dev/nvme1n1…

  • 接口:SD/MMC/eMMC,名称:/dev/mmcblk0,/dev/mmcblk1 …

通常,不会将整个存储设备格式化为一个文件系统中,而是将硬盘驱动器划分为多个逻辑存储单元, 这些单元称为分区。各种分区使用不同的文件系统进行格式化或用于不同的用途。 例如,一个分区可以包含用户目录,而另一个分区可以包含系统数据和日志。 如果用户用数据填充主目录分区,则系统分区可能仍然有可用空间。

  • /dev/sda第一个分区为/dev/sda1,第二个分区为/dev/sda2,以此类推。

  • /dev/nvme0n1p1,/dev/nvme0n1p2

  • /dev/vda1,/dev/vda2

  • /dev/xvda1,/dev/xvda2

Linux 文件系统

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。

Linux服务器上的文件是按文件系统层次结构访问的。

管理文件系统需要:

  • 确定存储设备的空间使用情况以及文件系统层次结构中受影响的目录。

  • 存储设备发生故障,而您需要知道哪些文件系统存在风险。

要让文件系统的内容在文件系统层次结构中可用,必须将它挂载到一个空目录上,该目录被称为挂载点

查看设备和文件系统

lsblk命令

查看块设备使用情况

lsblk

  • NAME:块设备名。

  • MAJ:MIN:主要(MAJ)和次要(MIN)设备号。

  • RM:指明设备是否是可移动设备。注意,在本例中设备sdb和srO的RM值等于1,这说明他们是可移动设备。

  • SIZE:本栏列出设备的容量大小信息。例如298.1G表明该设备大小298.1GB,而1K表明该设备大小为1KB。

  • RO:该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。

  • TYPE:本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,Sda和sdb是磁盘,而sr0是只读存储(rom)。

  • MOUNTPOINT:本栏指出设备挂载的挂载点。

df命令

查看文件系统使用情况

df

df -hT
#-h:友好显示单位。-T:显示文件系统类型

查看单个文件系统

df -hT /boot

查看文件或目录存储在哪个设备

df /tmp

du命令

查看目录和文件占用磁盘空间大小

#查看/boot目录及其子目录占用空间
du /boot

#只查看/boot目录占用大小
du -s /boot
#-h:人性化方式显示size

案例:查看根文件系统中哪个文件占用了最大空间

环境准备

创建一个大小为4GB的文件,用0填充该文件

dd if=/dev/zero of=/usr/share/doc/bigfille-4G bs=1M count=4096

查找过程
du -sk /* | sort -n

一个个目录查下去

du -sk /usr/* | sort -n

du -sk /usr/* | sort -n
du -sk /usr/share/* | sort -n
du -sk /usr/share/doc/* | sort -n

方法二:

find / -size +100M 2>/dev/null

挂载和卸载文件系统

环境准备
# 虚拟机添加一块硬盘/dev/sdb
[root@rocky8 ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  20G  0 disk # 格式化文件系统
[root@rocky8 ~]# mkfs.xfs /dev/sdb 
meta-data=/dev/sdb              isize=512    agcount=4, agsize=1310656 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5242624, imaxpct=25=                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2=                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
挂载文件系统

当需要适用文件系统的时候,通过mount命令挂载。

mount 命令语法:

mount [-fnrsvw] [-t vfstype] [-o options] device mountpoint

选项说明:

  • -t vfstype,指明文件系统类型。

  • -o options,指明挂载选项。

  • device,指明要挂载的具有文件系统的设备,可以通过UUID=、、LABEL=、PARTLABEL=、PARTUUID=等方式指明。例如,/dev/sdb,UUID="f20547b2-df53-46e5-b526-a8744be26231" 。

  • mountpoint,指明挂载点位置。

# 创建挂载点
[root@rocky8 ~]# mkdir /data# 显示系统中所有文件系统
[root@rocky8 ~]# blkid# 显示系统中特定文件系统
[root@rocky8 ~]# blkid /dev/sdb
/dev/sdb: UUID="f20547b2-df53-46e5-b526-a8744be26231" TYPE="xfs"# 挂载设备并验证
[root@rocky8 ~]# mount /dev/sdb /data
# 或者
[root@rocky8 ~]# mount UUID="f20547b2-df53-46e5-b526-a8744be26231" /data# 验证
[root@rocky8 ~]# df -h /data
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        20G   33M   20G   1% /data# 创建文件测试
[root@rocky8 ~]# touch /data/file-{00..09}
[root@rocky8 ~]# ls /data
file-00  file-02  file-04  file-06  file-08
file-01  file-03  file-05  file-07  file-09

查看系统当前所有挂载,可以看到挂载的详细信息。

[root@rocky8 ~]# mount
......
/dev/nvme0n1p1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/mapper/rl-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
......
# 括号中属性,是文件系统当前支持的功能。[root@rocky8 ~]# mount |grep ^/dev
/dev/mapper/rl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/nvme0n1p1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/mapper/rl-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
卸载文件系统

当文件系统不使用的时候,通过 umount 命令卸载。

umount命令语法:

umount device | dir

可以通过指定设备或者挂载点,卸载文件系统。

示例:

[root@rocky8 ~]# umount /dev/sdb
# 或者
[root@rocky8 ~]# umount /data
[root@rocky8 ~]# df -h /data
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/rl-root   50G  4.3G   46G   9% /
卸载失败处理
[root@rocky8 ~]# mount /dev/sdb /data
[root@rocky8 ~]# cd /data
[root@rocky8 data]# ls
file-00  file-02  file-04  file-06  file-08
file-01  file-03  file-05  file-07  file-09# 提示挂载点正在忙碌
[root@rocky8 data]# umount /dev/sdb
umount: /data: target is busy.(In some cases useful info about processes that usethe device is found by lsof(8) or fuser(1))
lsof 命令

lsof,list open files,用于查看系统打开的文件。

lsof 命令语法:

lsof [options] [names]

常用选项:

  • -i,查看打开的 Internet 文件。例如 -i @10.1.8.20:22-i :80

  • -p pid,根据进程PID查找特定进程打开的文件。

  • -u uid,根据用户 uid查找特定用户打开的文件。

  • names,是文件或者文件系统设备。

# 新开窗口查看哪个进程在使用挂载点
[root@rocky8 ~]# lsof /data
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    1508 root  cwd    DIR   8,17      156   64 /data
fuser 命令

fuser,用于识别进程打开的文件。

fuser 命令语法:

fuser [-fMuvw] [-a|-s] [-4|-6] [-c|-m|-n SPACE] [-k [-i] [-SIGNAL]] NAME...

常用选项:

  • -k,杀死这些正在访问这些文件的进程。除非使用-signal修改信号,否则将发送SIGKILL信号。

  • -signal,指定发送的信号(signal 使用特定信号替换),缺省信号SIGKILL。

  • -i,交互模式杀死进程。

  • -l,列出所有已知的信号名称。

  • -m,列出文件系统被哪些程序使用。

  • -n,空间,选择不同的名字空间,可是file,udp,tcp。默认是file,也就是文件。

  • -4,仅查询IPV4套接字

  • -6,仅查询IPV6套接字。

  • -u,指定用户名。

# 新开窗口查看哪个进程在使用挂载点
[root@rocky8 ~]# fuser -m /data
/data:                1508c

终止进程,再次卸载

# 返回家目录,再次卸载
[root@rocky8 data]# cd 
[root@rocky8 ~]# umount /data
案例:Linux 挂载 NTFS 格式U盘

思路:默认情况下 Linux不识别NTFS格式文件系统,需要安装相应的模块进行识别。

  1. 安装 epel 仓库

  2. 安装 ntfs-3g (该软件包由epel仓库提供)

  3. 挂载

案例:Linux 挂载 exfat 格式U盘

思路:默认情况下 Linux 不识别 exfat 格式文件系统,需要安装相应的模块进行识别。

# 安装软件
dnf install -y git pkg-config fuse-devel gcc make autoconf automake
git clone https://github.com/relan/exfat.git
cd exfat
autoreconf --install
./configure
make && make installmount.exfat-fuse /dev/spec /mnt/exfat
案例:构建基于 ISO 文件的yum仓库

思路:

  1. 挂载 ISO 文件

  2. 创建仓库指向 ISO 文件中仓库

  3. 测试

# 1. 挂载 ISO 文件
[root@rocky8 ~]# mkdir /dvd
[root@rocky8 ~]# mount /dev/sr0 /dvd
mount: /dvd: WARNING: device write-protected, mounted read-only.# 2. 创建仓库指向 ISO 文件中仓库
#  备份
[root@rocky8 ~]# mkdir /etc/yum.repos.d/old
[root@rocky8 ~]# mv /etc/yum.repos.d/*repo /etc/yum.repos.d/old[root@rocky8 ~]# cat << 'EOF' >  /etc/yum.repos.d/dvd.repo
[BaseOS]
name=rocky 8 BaseOS from dvd
baseurl=file:///dvd/BaseOS
enable=1
gpgcheck=0[AppStream]
name=rocky 8 AppStream from dvd
baseurl=file:///dvd/AppStream
enable=1
gpgcheck=0
EOF# 3. 测试
[root@rocky8 ~]# dnf repolist
repo id &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; repo name
AppStream &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rocky 8 AppStream from dvd
BaseOS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  rocky 8 BaseOS from dvd
[root@rocky8 ~]# dnf clean all
35 files removed
[root@rocky8 ~]# dnf makecache 
rocky 8 AppStream from dvd &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;192 MB/s | 9.1 MB &nbsp; &nbsp; 00:00 &nbsp; &nbsp;
rocky 8 BaseOS from dvd &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 163 MB/s | 2.7 MB &nbsp; &nbsp; 00:00 &nbsp; &nbsp;
Metadata cache created.# 安装软件包
[root@rocky8 ~]# dnf install -y httpd 

查找系统中文件

locate

locate 命令根据文件名及其路径,在 mlocate 数据库中查找文件,并返回结果。数据库中存放文件和文件路径信息。

常规用户查找时,返回的结果仅包含用户有读取权限的目录树中匹配项。

查找文件前,需要root用户手动执行updatedb命令更新mlocate数据库。

[root@rocky8 ~]# updatedb

locate命令语法:

locate [OPTION]... [PATTERN]...

常用选项:

  • -b, --basename

  • -i, --ignore-case

  • -c, --count

  • -r, --regexp

示例:

[root@rocky8 ~]# yum install -y httpd
# 安装后,未跟新数据库,所以检索不到
[root@rocky8 ~]# locate httpd.conf# 更新后查找
[root@rocky8 ~]# updatedb
[root@rocky8 ~]# locate httpd.conf
/etc/httpd/conf/httpd.conf
/usr/lib/tmpfiles.d/httpd.conf# -b选项 查找
[root@rocky8 ~]# locate -b httpd# 扩展
[root@rocky8 ~]# basename /usr/share/doc
doc
[root@rocky8 ~]# dirname /usr/share/doc
/usr/share# -i选项 忽略大小写
[root@rocky8 ~]# locate PASSWD
/etc/PASSWD
[root@rocky8 ~]# locate -i PASSWD# -c选项 返回找到的数量
[root@rocky8 ~]# locate -b -c PASSWD
34# -r选项 正则表达式匹配查找
[root@rocky8 ~]# locate -r 'http.*conf'
find

find 命令在本地文件系统中执行实时查找文件。使用find命令的用户对文件夹必须有读取和执行权限。

语法:

find [path] [expression] [action]
  • path,是查询路径,如果没有指定文件夹,将会查找当前目录及子目录。

  • expression,是查询条件表达式。

  • action,是找到文件后采取的动作。

根据文件 name 查找
[root@rocky8 ~]# touch /etc/PASSWD[root@rocky8 ~]# find /etc/ -name passwd
/etc/pam.d/passwd
/etc/passwd[root@rocky8 ~]# find /etc/ -name '*passwd*'
/etc/security/opasswd
/etc/pam.d/passwd
/etc/passwd
/etc/passwd-[root@rocky8 ~]# find /etc/ -iname passwd
/etc/pam.d/passwd
/etc/passwd
/etc/PASSWD
根据文件 type 查找

-type 根据文件类型查找,支持文件类型:

  • b,block (buffered) special。

  • c,character (unbuffered) special。

  • d,directory。

  • p,named pipe (FIFO)。

  • f,regular file。

  • l,symbolic link。

  • s,socket。

根据文件 owner 查找
  • -user、-uid,属于特定用户。
[root@rocky8 ~]# id demisse
uid=1000(demisse) gid=1000(demisse) groups=1000(demisse)
[root@rocky8 ~]# find / -user demisse
[root@rocky8 ~]# find / -uid 1000
  • -group、-gid,属于特定组
[root@rocky8 ~]# grep wheel /etc/group
wheel:x:10:
[root@rocky8 ~]# find / -group wheel
[root@rocky8 ~]# find / -gid 10
  • -nouser,不属于任何用户;-nogroup,不属于任何组
# 查找系统中不属于任何用户或者不属于任何组的文件
[root@rocky8 ~]# find / -nouser -o -nogroup
根据文件 perm 查找
# 准备文件
[root@rocky8 ~]# mkdir lab
[root@rocky8 ~]# cd lab
[root@rocky8 lab]# touch file-{1..3}
[root@rocky8 lab]# ls -l file*
-rwxr--r--. 1 root root 0 Dec 24 20:28 file-1
-rw-r--r--. 1 root root 0 Dec 24 20:28 file-2
-rw-r--r--. 1 root root 0 Dec 24 20:28 file-3
  • -perm mode,查找文件权限为mode的文件。
[root@rocky8 lab]# chmod 764 file-1
# 查找文件权限为764的文件
[root@rocky8 lab]# find -perm 764 | xargs ls -l
-rwxrw-r--. 1 root root 0 Dec 24 20:28 ./file-1
  • -perm -mode,例如:mode为764,则ugo必须同时满足的最小权限:user至少为7、group至少为6、other为4。
[root@rocky8 lab]# chmod 777 file-1
[root@rocky8 lab]# chmod 764 file-2
[root@rocky8 lab]# chmod 760 file-3
[root@rocky8 lab]# find . -perm -764 | xargs ls -l
-rwxrwxrwx. 1 root root 0 Dec 24 20:28 ./file-1
-rwxrw-r--. 1 root root 0 Dec 24 20:28 ./file-2# 0作为通配符,表示不匹配对应权限位。
# 查找系统中具有suid权限的文件
[root@rocky8 lab]# find / -perm -4000# 查找系统中同时具有特殊权限的文件:suid和sgid
[root@rocky8 lab]# find / -perm -6000 2>/dev/null |xargs ls -l
-rwsr-sr-x. 1 abrt abrt 15344 Oct &nbsp;2 &nbsp;2020 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
  • -perm /mode,例如mode为764,则ugo只要有一个满足即可:user至少为7、group至少为6、other至少为4。
[root@rocky8 lab]# chmod a=- file-1
[root@rocky8 lab]# chmod uo=-,g=rwx file-2
[root@rocky8 lab]# chmod ug=-,o=r file-3[root@rocky8 lab]# find . -name 'file-*' -perm /764| xargs ls -l
----rwx---. 1 root root 0 Dec 24 20:28 ./file-2
-------r--. 1 root root 0 Dec 24 20:28 ./file-3# 查找系统中具有特殊权限的文件:suid、sgid、sticky
[root@rocky8 lab]# find / -perm /7000# 查找系统中具有特殊权限的文件:suid或者sgid
[root@rocky8 lab]# find / -perm /6000
  • -readable -writable -executable,文件具有可读、可写、可执行。
根据文件 size 查找

单位 c(字节)、k(KiB)、M(MiB)、G(GiB)

# 大小等于10M
[root@rocky8 ~]# find -size 10M# 大小大于10G
[root@rocky8 ~]# find -size +10G# 大小小于10k
[root@rocky8 ~]# find -size -10k# 大小等于1M
[root@rocky8 ~]# find -size 1M
# 注意:size会取整为1个单位,所以find -size 1M结果包含小于1M的文件。
# 可以使用1024k取代1M
[root@rocky8 ~]# find -size 1024k
根据文件 time 查找
  • -amin, -cmin, -mmin 单位1分钟。

  • -atime, -ctime, -mtime 单位24小时。

  • -newer file,比file新的文件。

# 10分钟前(正好10分钟)
[root@rocky8 ~]# find -amin 10# 10分钟以前(大于10分钟)
[root@rocky8 ~]# find -amin +10# 10分钟以内(小于10分钟)
[root@rocky8 ~]# find -amin -10
根据文件硬链接数和 inum 查找
# 硬链接数等于、大于、小于3的文件
[root@rocky8 ~]# find -links 3
[root@rocky8 ~]# find -links +3
[root@rocky8 ~]# find -links -3# inode为67160130的文件
[root@rocky8 ~]# ls -i /etc/fstab
67160130 /etc/fstab
[root@rocky8 ~]# find / -inum 67160130| xargs ls -i
67160130 /etc/fstab
多条件表达式
  • 逻辑与: expr1 -a expr2 或者 expr1 expr2
[root@rocky8 lab]# find . -name 'file-*' -perm /764
  • 逻辑或:expr1 -o expr2
# 查找系统中不属于任何用户或者不属于任何组的文件
[root@rocky8 ~]# find / -nouser -o -nogroup# 例如
[root@rocky8 ~]# find / -perm /7000
# 等效与
[root@rocky8 ~]# find / -perm -4000 -o -perm -2000 -o -perm -1000
  • 逻辑非:! expr
[root@rocky8 ~]# find / ! -size -200M 2>/dev/null
/proc/kcore
/proc/59432/task/59432/fd/5
/proc/59432/task/59432/fdinfo/5
/proc/59432/fd/6
/proc/59432/fdinfo/6
[root@rocky8 ~]# ls -lh /proc/kcore
-r--------. 1 root root 128T Dec 24 22:00 /proc/kcore
action
  • -delete,查出找到的文件。
[root@rocky8 ~]# find / -name PASSWD
/etc/PASSWD[root@rocky8 ~]# find / -name PASSWD -delete
[root@rocky8 ~]# find / -name PASSWD
  • -ls,相当于 ls -dils 查看找到的文件。
[root@rocky8 ~]# find /etc/ -name passwd
/etc/pam.d/passwd
/etc/passwd[root@rocky8 ~]# find /etc/ -name passwd -ls
67584593 &nbsp; &nbsp;4 -rw-r--r-- &nbsp; 1 root &nbsp; &nbsp; root &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;188 Apr &nbsp;1 &nbsp;2020 /etc/pam.d/passwd
69030856 &nbsp; &nbsp;4 -rw-r--r-- &nbsp; 1 root &nbsp; &nbsp; root &nbsp; &nbsp; &nbsp; &nbsp; 2315 Dec 24 19:59 /etc/passwd
  • -exec command \;,找到文件后,执行相应的command。
[root@rocky8 ~]# find /etc/ -name passwd -exec echo haha \;
haha
haha
  • -exec command {} \;,找到文件后,可以在命令中对文件操作。
[root@rocky8 ~]# find / -inum 67160130
/etc/fstab
# 将inode为67160130的所有文件复制到当前目录
[root@rocky8 ~]# mkdir findfiles
[root@rocky8 ~]# find / -inum 67160130 -exec cp -a {} ./findfiles \;
[root@rocky8 ~]# ls findfiles/fstab
fstab

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95802.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 Ubuntu 24.04 Server 或 Desktop 上安装 XFCE

在 Ubuntu 24.04 上更改当前桌面环境或添加新的桌面环境并不是一项艰巨的任务。大多数流行的 Linux 桌面环境,包括 XFCE,都可以通过默认的 Ubuntu 24.04 LTS 系统仓库安装。在本教程中,我们将学习如何使用 Tasksel 工具在 Ubuntu Linux 上安装和配置 XFCE。 访问终端并运行…

linux下用c++11写一个UDP回显程序

需求&#xff1a;1&#xff09;从2个UDP端口接收数据&#xff0c;并在同样的端口回显。echo2&#xff09;多个处理线程&#xff0c;多个发送线程&#xff1b;3&#xff09;使用条件变量唤醒&#xff1b;#include <stack> #include <mutex> #include <atomic>…

MySQL 深分页优化与条件分页:把 OFFSET 换成“游标”,再用覆盖索引抄近路

MySQL 深分页优化与条件分页:把 OFFSET 换成“游标”,再用覆盖索引抄近路 这不是“玄学调优”,而是可复制的方案。本文用可复现的 DDL/造数脚本,演示为什么 OFFSET 越大越慢,如何用 条件游标(Keyset Pagination) 替换它,并配上 覆盖索引。还会教你看 EXPLAIN/EXPLAIN A…

Unity 绳子插件 ObjRope 使用简记

Unity 绳子插件&#xff0c;是一个基于物理的、高度逼真且可交互的绳索模拟解决方案。 其性能良好&#xff0c;能够运行在小游戏平台。 一、插件基本 插件资源商店地址&#xff1a; Obi Rope | Physics | Unity Asset Store 官方文档&#xff08;手册&#xff09;&#xff…

demo 通讯录 + 城市选择器 (字母索引左右联动 ListItemGroup+AlphabetIndexer)笔记

一、城市选择器实现笔记1. 双层 for 循环渲染数据结构interface BKCityContent {initial: string; // 字母索引cityNameList: string[]; // 城市列表 }核心实现// 外层循环&#xff1a;字母分组 - 遍历城市数据&#xff0c;按字母分组显示 ForEach(this.cityContentList, (item…

【总结型】c语言中的位运算

位运算包括 & | ^ ~ << >>按位与 将某些变量中的某些位清0同时保持其他位不变。也可以用来获取变量中的某一位。 例如&#xff1a;将int型变量n低8位全置为0&#xff0c;其余位保持不变。 n n & 0xffffff00 如何判断一个int型变量n的第七位。 n & 0x8…

如何在FastAPI中玩转APScheduler,实现动态定时任务的魔法?

url: /posts/4fb9e30bb20956319c783e21897a667a/ title: 如何在FastAPI中玩转APScheduler,实现动态定时任务的魔法? date: 2025-08-16T01:14:26+08:00 lastmod: 2025-08-16T01:14:26+08:00 author: cmdragon summary: APScheduler是Python中强大的任务调度库,支持任务持久化…

GitHub的简单使用方法----(5)

最后一篇简单讲讲git管理远程仓库 1.目的 备份&#xff0c;实现代码共享集中化管理 &#xff08;将本地仓库同步到git远程仓库中&#xff09; git clone 仓库地址 以下图为示例&#xff0c;我打开了一个别人的项目仓库&#xff0c;点击code能看到仓库地址 等待完成即可 如…

C++ STL-string类底层实现

摘要&#xff1a; 本文实现了一个简易的string类&#xff0c;主要包含以下功能&#xff1a; 1. 默认成员函数&#xff1a;构造函数&#xff08;默认/参数化&#xff09;、拷贝构造、赋值重载和析构函数&#xff0c;采用深拷贝避免内存问题&#xff1b; 2. 迭代器支持&#xff1…

【LeetCode每日一题】

每日一题3. 无重复字符的最长子串题目总体思路代码1.两数之和题目总体思路代码15. 三数之和题目总体思路代码2025.8.153. 无重复字符的最长子串 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3…

sharding-jdbc读写分离配置

一主两从&#xff0c;爆红是正常的&#xff0c;不知为啥 spring:shardingsphere:datasource:names: ds_master,ds_s1,ds_s2ds_master:type: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.jdbc.DriverjdbcUrl: jdbc:mysql://192.168.135.100:3306/gmall_produ…

【大模型核心技术】Dify 入门教程

文章目录一、Dify 是什么二、安装与部署2.1 云端 SaaS 版&#xff08;快速入门&#xff09;2.2 私有化部署&#xff08;企业级方案&#xff09;三、界面导航与核心模块3.1 控制台概览3.2 核心功能模块详解3.2.1 知识库&#xff08;RAG 引擎&#xff09;3.2.2 工作流编排3.2.3 模…

homebrew 1

文章目录brew(1) – macOS&#xff08;或 Linux&#xff09;上缺失的包管理器概要描述术语表基本命令install *formula*uninstall *formula*listsearch \[*text*|/*text*/]命令alias \[--edit] \[*alias*|*alias**command*]analytics \[*subcommand*]autoremove \[--dry-run]bu…

设计索引的原则有哪些?

MySQL 索引设计的核心原则是 在查询性能与存储成本之间取得平衡。以下是经过实践验证的 10 大设计原则及具体实现策略&#xff1a;一、基础原则原则说明示例/反例1. 高频查询优先为 WHERE、JOIN、ORDER BY、GROUP BY 频繁出现的列建索引✅ SELECT * FROM orders WHERE user_id1…

使用影刀RPA实现快递信息抓取

最近公司项目有个需求&#xff0c;要求抓取快递单号快递信息&#xff0c;比如签收地点、签收日期等。该项目对应的快递查询网站是一个国外的网站&#xff0c;他们有专门的快递平台可以用于查询。该平台提供了快递接口进行查询&#xff0c;但需要付费。同时也提供了免费的查询窗…

蚁剑--安装、使用

用途限制声明&#xff0c;本文仅用于网络安全技术研究、教育与知识分享。文中涉及的渗透测试方法与工具&#xff0c;严禁用于未经授权的网络攻击、数据窃取或任何违法活动。任何因不当使用本文内容导致的法律后果&#xff0c;作者及发布平台不承担任何责任。渗透测试涉及复杂技…

Varjo XR虚拟现实军用车辆驾驶与操作培训

Patria基于混合现实的模拟器提供了根据现代车辆乘员需求定制的培训&#xff0c;与传统显示设置相比&#xff0c;全新的模拟解决方案具有更好的沉浸感和更小的物理空间需求。Patria是芬兰领先的国防、安全和航空解决方案提供商。提供尖端技术和全面的培训系统&#xff0c;以支持…

Java 10 新特性及具体应用

目录 1. 局部变量类型推断&#xff08;JEP 286&#xff09; 2. 不可修改集合&#xff08;JEP 269&#xff09; 3. 并行全垃圾回收&#xff08;JEP 307&#xff09; 4. 应用类数据共享&#xff08;JEP 310&#xff09; 5. 线程局部管控&#xff08;JEP 312&#xff09; 总结…

【力扣 Hot100】刷题日记

D8 全排列(非回溯法) 全排列原题链接 在刷leetcode的时候&#xff0c;看到这道题目并没法使用像STL的next_permutation方法&#xff0c;感叹C便利的同时&#xff0c;又惋惜Java并没有类似的API&#xff0c;那我们只能从原理入手了&#xff0c;仿写此算法。 其实回溯法更应该…

JetPack系列教程(七):Palette——让你的APP色彩“飞”起来!

JetPack系列教程&#xff08;七&#xff09;&#xff1a;Palette——让你的APP色彩“飞”起来&#xff01; 各位开发小伙伴们&#xff0c;还在为APP的配色发愁吗&#xff1f;别担心&#xff0c;今天咱们就来聊聊JetPack家族里的“色彩魔法师”——Palette&#xff01;这个神奇的…