Search Posts

标签: linux

Linux的层级架构与Rust的主要模块crate总结,值得转发收藏

Linux的层级架构

每个操作系统都有一个内核,内核封装了底层硬件设备管理、内存管理、网络数据协议转化和收发传输、文件系统读写等。从这个图可以看到,内核将系统硬件与应用程序进程连接起来,隐藏了上层下层交互的一些细节,各司其职。

这些分层包括:

  • 用户空间程序
  • 编译器
  • 终端
  • 防火墙
  • 系统调用的跨平台API(特定于平台的系统调用包装API)
  • Rust标准库
  • libc(或等效的API)
  • kernel,操作系统的核心模块
  • 系统资源
  • 内存
  • 文件系统
  • 网络
  • 硬件和其他设备(包括键盘、鼠标、监视器、磁盘驱动器)

Rust的标准库的功能划分

而Rust标准库,很好的利用了操作系统内核提供的API。

Rust标准库是Rust程序进入Linux操作系统内核函数的主要接口,它在内部使用libc(在Windows系统使用其他等效的库)来调用内核提供的系统调用。

从Rust程序中发起系统调用,以实现管理和操作各种系统资源(如图)。libc(或其变体)为类UNIX操作系统上的系统调用提供了一个包装器,如Linux内核实现了POSIX标准指定的数百个POSIX API(对于Windows,系统调用有等效的API,也实现了POSIX标准)。

作为标准库,Rust标准库是跨平台的,Rust标准库的系统调用的细节是从Rust开发人员那里抽象出来的。Rust也支持不依赖于标准库的运行方式(no_std 方式),Rust直接操控底层硬件(如应用在嵌入式系统开发场景),此时Rust就做了操作系统本身的工作。

对于大部分软件开发工程师而言,他们用Rust主要开发应用层软件,也就是运行在用户空间的程序。它们基于标准库编写,实现各种业务功能。应用层的软件并非所有模块和函数都涉及到系统调用(例如一些用于操作字符串和处理错误的函数,就无需调用系统调用)。

Rust标准库包括几大领域的模块,包括四大类:

第一类,Rust语言原语

即Rust Language Primitives:Rust 语言的基本元素或基本类型(如下图)。

如有符号整数、布尔值、浮点数、字符、字符串、数组、元组、切片。这些由Rust编译器负责实现。

Rust标准包括原语,并在它们之上构建。

第二类,alloc crate

与堆分配值的内存分配相关的类型、函数和特征。

包括集合(Vec、String等集合)、智能指针类型(Box<T>)、引用计数指针(Rc<T>)和原子引用计数指针(Arc<T>))。

第三类,core crate

作为Rust标准库的基础。充当Rust语言与标准库之间的链接,提供在Rust原语之上实现的类型、特征、常量和函数,并为所有Rust代码提供基础构建块,它是跨平台的,没有任何指向操作系统或其他外部依赖的链接。由于较少直接用到core crate,所以本文不做过多介绍。

第四类,模块(标准库的其他crate)

是标准库的一部分,模块crate包括针对并发、I/O,文件系统、网络、异步I/O、错误处理等功能,以及与特定操作系统相关的函数,Rust的官网对std有专门的文档。例如

  • 为用户程序在多个线程上并发运行的功能在std::thread模块中;
  • 用于处理同步I/O的功能在std::io模块中提供;
  • 针对特定os的模块,主要在std::os模块中实现。

下图展示了Rust标准库各个领域功能涉及到的具体std模块(如std::io、std::os等)

以下着重对第四类的主要 crate 做一介绍,并附上文档地址

Rust的并发控制相关模块 conurrency:

模块名 说明
std::env 模块 包含与环境变量交互的功能,包括读取、设置和删除环境变量。
std::sync 模块 提供了用于实现线程安全共享状态的同步原语,如互斥锁(Mutex)、原子操作(Atomic)和条件变量(Condvar)。
std::thread 模块 提供了创建和管理线程的功能,包括线程的创建、 join、spawn 和同步。
std::process 模块 提供了与操作系统进程交互的功能,包括运行外部命令、启动新进程以及与进程进行通信。

Rust的内存管理相关模块 memory management:

模块名 说明
std::alloc 模块 提供了内存分配器的功能,包括分配和释放动态内存。
std::convert 模块 提供了用于不同类型之间转换的工具函数。
std::ptr 模块 提供了对指针的操作和转换功能,包括对裸指针的操作。
std::borrow 模块 提供了用于管理借用的功能,包括&&mut借用运算符的实现。
std::default 模块 提供了默认 trait 实现的功能,用于为不提供具体实现的类型提供默认行为。
std::rc 模块 提供了引用计数(Reference Counting)的功能,用于实现线程安全的共享内存。
std::cell 模块 提供了可变性的 Cell 和 RefCell 类型,用于在多线程环境下安全地共享可变状态。
std::mem 模块 提供了与内存相关的功能,包括内存布局、内存对齐和内存操作。
std::clone 模块 提供了用于实现克隆(Clone) trait 的功能,用于复制和克隆复杂的数据结构。
std::pin 模块 提供了 Pin 类型,用于固定借用的生命周期,以避免悬垂指针和数据竞争问题。

Rust的文件系统操作相关模块 File system:

模块名 说明
std::fs 模块 提供了与文件系统操作相关的功能,包括文件和目录的创建、读取、写入和删除等操作。
std::path 模块 提供了与文件路径相关的功能,包括路径的解析、构造和操作。

Rust的数据处理相关模块 data processing:

模块名 说明
std::ascii 模块 提供了与 ASCII 码相关的功能,包括对 ASCII 字符的操作和转换。
std::fmt 模块 提供了格式化输出的功能,包括对各种数据类型的格式化和打印。
std::num 模块 提供了对数字类型的抽象和操作,包括整数、浮点数和复数等。
std::cmp 模块 提供了用于比较和排序值的工具,包括比较运算符的实现和排序函数。
std::hash 模块 提供了用于计算哈希值的功能,包括对各种数据类型的哈希函数实现。
std::ops 模块 提供了一些基本的运算符和操作符的实现,包括数学运算符、比较运算符和逻辑运算符等。
std::iter 模块 提供了迭代器(Iterator)的功能,包括创建和操作迭代器的方法,以及一些常见的迭代器类型。

Rust的错误处理相关模块 Error handling:

模块名 说明
std::error 模块 提供了错误处理的功能,包括定义错误类型和处理错误的方法。
std::panic 模块 提供了恐慌(Panic)机制,用于处理不可恢复的错误情况。
std::option 模块 提供了 Option 类型,用于表示可能存在或不存在的值,用于处理可能出现空值的情况。
std::result 模块 提供了 Result 类型,用于表示成功或失败的情况,通常用于处理可能出现错误的函数返回值。

Rust的编译处理相关模块 compiler:

模块名 说明
std::hint 模块 提供了一些用于编译器提示的宏,用于影响编译器的优化行为。
std::primitive 模块 提供了一些基本的类型和函数,用于处理数字、字符和布尔值等基本数据类型。
std::prelude 模块 包含了一些基本的函数和宏,这些函数和宏在 Rust 标准库中被广泛使用,并且在每个 Rust 程序中自动导入。

Rust的跨语言调用相关模块: FFI

模块名 说明
std::ffi 模块 提供了与外部函数接口(Foreign Function Interface,FFI)相关的功能,用于与其他语言或库进行交互。

Rust的网络处理功能模块 Networking:

模块名 说明
std::net 模块 提供了与网络编程相关的功能,包括网络协议、套接字(Socket)和网络地址等。

Rust的IO处理模块:

模块名 说明
std::io 模块 提供了与输入输出相关的功能,包括文件操作、缓冲、读写数据等。

Rust的OS特定的功能模块:

模块名 说明
std::os 模块 提供了与操作系统相关的功能,包括文件系统操作、进程管理和系统信息等。

Rust的时间处理模块:

模块名 说明
std::time 模块 提供了与时间和日期相关的功能,包括时间的表示、解析、转换和计算等。
查看余下内容

干货总结Rust的应用范围将会爆发,全栈开发者如何看清2023的历史临界点及未来趋势

Rust 诞生已经有 17 年了,最近我考察了将团队的开发技术栈从 Python 生态转到 Rust 生态的可行性。先说结论:99% 可行。

Rust 生态目前的规模

不是 100% 可行,因为 Python 生态的一些名库还未提供 Rust 版本,但请注意到,那些 Python 生态有的功能,Rust 生态里也大部分有了。毕竟 Rust 已经 17 岁了,经过 17 年的积累,Rust 终于快到 “成年” 了。比如 Rust 的线上 Crate 仓库 lib.rs 现有 127219 个包,Python 的 pypi.org 仓库现有 484174 个包(以上统计截至 2023 年 9 月 28 日)、而 Go 语言在 pkg.go.dev 上有超过 170000 个包(截至 2023 年 4 月)。

为什么我决定从 Python 转换到 Rust?如何通过Rust的强大生态工具,提高开发效率和软件质量?

在我的公号里总结分享了 Rust语言解决问题的能力、它能为使用者提高多少效率、最终创造多少价值。

目前(2023 年)正处在 Rust 大规模应用爆发的临界点。大量软件团队正在用 Rust/Go 重写软件。

下面从三个具有代表性的应用实例以及一些 Rust 语言大事件,向读者分享下这个 “Rust 临界点” 的观点。

详情网页链接查看余下内容

windows压缩的文件建议用7zip格式而非zip或rar格式,能防止在linux下zip和rar解压后中文文件名乱码问题

windows下压缩文件请用7zip,能防止在linux下压缩包内文件名乱码:

以上结论经过测试验证的。确实如此,windows下压缩的zip和rar包,在win下打开里面文件名(含中文名文件)显示正常,但是在linux下用xarchiver 等软件往往显示为乱码,解压后也是乱码。

而如果在win下用7zip格式压缩的,就不存在以上问题。其他方案还有:在win下压缩的zip格式,如果在linux下用7za(p7zip)软件解压,也不会出现中文名乱码问题。

centos下p7zip的安装方法:

yum install  -y p7zip

ubuntu/debian下的安装方法:

apt-get install -y p7zip

效果对比:

linux下用unrar命令解压出的文件名中文乱码,后面括号内带有“无效的编码”字样,解决方法:

linux下,当使用unrar 解压命令解压来自 windows下压缩的rar 文件时:

unrar x rar文件名

问题表现:

rar压缩文件内的文件名如果是英文,解压后显示正常。如果带有中文,解压缩时中文变成乱码,乱码文件名后面带有(无效的编码)字样。如下图所示:

问题原因:

rar文件在win系统创建,文件名默认使用gb2312编码,而gb2312字符编码在linux下用unrar软件解压后,没有正确解码中文。linux下默认的字符(中文也是一类字符)编码方式是UTF-8。

解决方法:

需要用转码工具convmv进行文件名转码

ubuntu/debian 系统下需要先安装 convmv软件:

sudo apt-get install convmv


然后转码当前目录下的文件名乱码文件名为linux下正常显示的文件名:

convmv * -f gb2312 -t utf8 –notest

注意:

由于unrar的这段处理是2014年之前的情况和解决经验。后来unrar软件版本可能有更新,近几年随着linux系统对中文的支持越来越好,这个rar的问题可能不容易发生了。 如果仍遇到这样的问题,不妨用本文提到的方法解决看。… 查看余下内容

yum update 更新软件的时候如何主动跳过内核软件文件的升级

centos/redhat/fedora升级kernel有时候可能会出现服务器无法启动,所以建议您在用yum update方式升级系统软件补丁时排除内核升级。

打开/etc/yum.conf

sudo vim   /etc/yum.conf

在这个文件的[main]段中,下添加一行,如下:

exclude=kernel*

就可以跳过内核升级步骤

生产环境下如果内核必须升级,可以考虑找一台软件硬件配置一样的服务器先测试升级内核( 去掉上面的exclude…配置,然后命令 yum update kernel*),成功后再到生产环境升级内核。… 查看余下内容

CentOS的firewall-cmd用法详细总结

Centos 采用的防火墙firewalld简介:

firewalld 是 CentOS 和其他一些 Linux 发行版中默认使用的防火墙软件,它提供了一种灵活的方式来管理系统的网络安全和连接。

firewalld 使用 D-Bus 接口来管理网络连接,它使用基于区域的策略来控制入站和出站流量,并且可以在运行时动态更新规则。这使得 firewalld 比传统的 iptables 防火墙更加灵活和易于管理。

以下是 firewalld 的一些主要特点:

  1. 支持基于区域的策略:firewalld 使用基于区域的策略来控制入站和出站流量。每个区域都有一个预定义的安全级别和一组服务,这些服务定义了允许访问的端口和协议。你可以轻松地将系统接口分配给不同的区域,并在区域之间移动。

  2. 支持动态更新规则:firewalld 可以在运行时动态更新规则,无需重启防火墙服务。这使得添加或删除规则变得更加方便和快捷。

  3. 支持网络连接跟踪:firewalld 可以跟踪网络连接并在其生命周期内应用相应的规则。这使得 firewalld 能够更好地保护系统安全和隐私。

  4. 支持 IPv6:firewalld 支持 IPv6,可以轻松地管理 IPv6 网络安全。

  5. 支持命令行和图形界面:firewalld 提供了命令行和图形界面两种管理方式。你可以使用命令行工具 firewall-cmd 来管理防火墙,也可以使用图形界面工具 firewall-config 来配置防火墙规则。

总之,firewalld 是一个功能强大且易于管理的防火墙软件,它提供了一种灵活的方式来保护系统网络安全和连接。如果你使用 CentOS 或其他一些 Linux 发行版,firewalld 是一个值得考虑的防火墙解决方案。

firewall-cmd 的不同场景应用举例:

如果通过命令方式修改firewalld防火墙规则,则通过firewall-cmd 命令具体执行,以下是一些实际例子:

firewall-cmd 设置linux防火墙允许80端口对外访问:

firewall-cmd --zone=public --add-port=80/tcp --permanent

查看当前规则:

firewall-cmd --list-all public

允许特定服务通过防火墙:

firewall-cmd --zone=public --add-service=httpd --permanent

让firewall-cmd命令设置的规则马上生效:

firewall-cmd --reload

对于非默认端口的开放,除了要防火墙允许,还要selinux允许,

在centos7等最新的发行版上,默认启用了selinux,而selinux允许指定端口的命令是:

semanage port -a -t http_port_t -p tcp 81
semanage port -a -t ssh_port_t -p tcp 222
semanage port -a -t vnc_port_t -p tcp 5999

除非关闭了selinux(命令 setenforce 0 可关闭 selinux ,如果永久关闭,可编辑/etc/sysconfig/selinux 文件将 SELINUX=enforcing 改成 SELINUX=disabled),才不需要额外执行以上命令。

要指定允许的来源ip和目标端口:

firewall-cmd --permanent --zone=public --add-rich-rule='
  rule family="ipv4"
  source address="10.10.99.10/32"
  port protocol="tcp" port="80" accept'

firewalld 根据nginx访问日志的 503 记录,自动屏蔽特定ip:

iptables 方式:

*/1 * * * * for itm in /usr/bin/tail -2000 /www/wwwlogs/site.com.log
查看余下内容

如何格式化超出 4TB 限制的 Ext4 文件系统

所有文件系统都有限制

Ext 系列的文件系统也不例外。使用标准 4KiB 块大小,32 位 Ext3 的卷限制为 16TB。随着存储介质的进步和容量增加的更大可用性,Ext4 的开发是为了克服这一限制。Ext4 现在将支持高达 1 EB (EiB) 的卷。

这是一个了不起的改进,但是当您实际格式化其中一个卷时会发生什么?如果您的系统运行一些较旧的 fs 工具(如 Debian Squeeze),那么在尝试格式化大型卷时可能会遇到这种情况(假设我们在此示例中在 /dev/vg0/lv_data 处有一个 19TB 的分区)。

# mkfs -t ext4 /dev/vg0/lv_data 
mke2fs 1.42.7 (21-Jan-2013) 
mkfs.ext4: Size of device (0x131a47800 blocks) /dev/vg0/lv_data too big to be expressed in 32 bits using a block-size of 4096.

解决方式

解决方式1:使用 e2fsprogs 工具

尽管 Ext4 文件系统已更新为支持 64 位卷,但这些工具可能不支持。这里的解决方案是获取最新版本的 e2fsprogs 实用程序并自己构建它们。

首先,从sourceforge获取实用程序:

# cd /opt/
# wget -O e2fsprogs-1.42.7.tar.gz 
http://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.42.7/e2fsprogs-1.42.7.tar.gz?r=http%3A%2F%2Fe2fsprogs.sourceforge.net%2F&ts=1361548232&use_mirror=superb-dca3

然后,提取文件并为您的构建进行设置

# tar -xzvf e2fsprogs-1.42.7.tar.gz
# cd e2fsprogs-1.42.7
# mkdir build
# cd build

如果您没有开发工具(如编译器和make),请立即安装它们

# apt-get install build-essential

现在,您已准备好构建工具:

# ../configure
# make
# make install

但是,在实际创建文件系统之前,您需要编辑 /etc/mke2fs.conf… 查看余下内容

linux下ext3文件系统突然变成readonly只读的问题分析和解决方式

ext3是linux下较老的文件系统格式,但目前仍有少部分用户在使用ext3作为linux文件系统格式。

linux下ext3文件系统突然变成readonly 问题线索

#tail  -100  /var/log/messages

 Sep  1 04:02:21 www syslogd 1.4.1: restart.
 Sep  1 11:22:16 www avahi-daemon[2691]: Invalid query packet.
 Sep  1 11:22:57 www last message repeated 14 times
 Sep  1 11:22:57 www avahi-daemon[2691]: Invalid query packet.
 Sep  1 13:45:29 www kernel: ext3_abort called.
 Sep  1 13:45:29 www kernel: EXT3-fs error (device hdb1): ext3_put_super: Couldn't clean up the journal
 Sep  1 13:46:31 www kernel: kjournald starting.  Commit interval 5 seconds
 Sep  1 13:46:31 www kernel: EXT3 FS on hdb1, internal journal
 Sep  1 13:46:31 www kernel: EXT3-fs: mounted filesystem with ordered data mode.
 Sep  1 13:48:25 www kernel: printk: 5 messages suppressed.
查看余下内容

磁盘分区UUID 变化导致 start job is running for /dev/disk/by-uuid/2XX-XXXX 等待时间延迟错误,以及/etc/fstab的原理

磁盘分区UUID 变化导致启动等待的问题、解决过程

用户说分区扩容后,出现启动提示等待1分半时间,然后能进入系统。但感觉每次等待,等久了觉得麻烦,问能否解决。

后根据错误提示,认为/etc/fstab 内容可能有误。

初步认为是EFI分区 有问题。

后与用户沟通确认,扩容时更新了swap分区和根分区的UUID,然后出现上述问题。指导用户将/etc/fstab里的分区的UUID值改成使用扩容后的分区的新UUID,然后重启看到等待问题不再出现。

linux的磁盘的 UUID 变化与/etc/fstab 配置文件的作用:

关于 /etc/fstab 的语法结构和参数作用,可参考 开软技巧 作者在【深入理解Linux】公众号中总结的一篇专题文章:https://mp.weixin.qq.com/s/NEjeNSdkR3LucqI0kN89PQ

现原文《Linux的/etc/fstab文件一些常识。很重要也很简单,现在就看懂它!》摘录如下:

fstab文件包含了你的电脑上的存储设备及其文件系统的信息。它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的文件。具体来说:用fstab可以自动挂载各种文件系统格式的硬盘、分区、可移动设备和远程设备等。对于Windows与Linux双操作系统用户,用fstab挂载FAT格式和NTFS格式的分区,可以在Linux中共享windows系统下的资源。

这个文件的全路径是/etc/fstab。它只是一个文本文件,你能够用你喜欢的编辑器打开它,但是必须是root用户才能编辑它。同时fsck、mount、umount的等命令都利用该程序。

/etc/fstab 是启动时的配置文件,不过,实际 filesystem 的挂载是记录到 /etc/mtab 与 /proc/mounts 这两个文件当中的。每次我们在更动 filesystem 的挂载时,也会同时更动这两个文件喔!

系统挂载的一些限制:

  • 根目录 / 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。

  • 其它 mount point 必须为已创建的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则

  • 所有 mount point 在同一时间之内﹐只能挂载一次。

  • 所有 partition 在同一时间之内﹐只能挂载一次。

  • 如若进行卸除,您必须先将工作目录移到 mount point(及其子目录) 之外。

/etc/fstab 配置文件的各字段解释:

示例:

#                                

#NOTE: If your BOOT partition is ReiserFS, add the notail option to opts.
/dev/sda10        /boot            ext4        noauto,noatime    1 2
/dev/sda6         /                ext4        noatime           0 1
/dev/sda9         none             swap        sw                0 0
/dev/cdrom        /mnt/cdrom       auto        noauto,ro         0 0

其实 /etc/fstab (filesystem table) 就是将我们利用 mount 命令进行挂载时, 将所有的选项与参数写入到这个文件中就是了。除此之外, /etc/fstab 还加入了 dump 这个备份用命令的支持! 与启动时是否进行文件系统检验 fsck 等命令有关。

<file systems> 挂载设备 :

不是我们通常理解的文件系统,而是指设备(硬盘及其分区,DVD光驱等)。它告知我们设备(分区)的名字,这是你在命令行中挂载(mount)、卸载(umount)设备时要用到的。

<mountpoint> 挂载点:

告诉我们设备挂载到哪里。

<type> 文件系统类型:

Linux支持许多文件系统。 要得到一个完整的支持名单查找mount man-page。典型 的名字包括这些:ext2, ext3, reiserfs, xfs, jfs,iso9660, vfat, ntfs, swap和auto, ‘auto’ 不是一个文件系统,而是让mount命令自动判断文件类型,特别对于可移动设备,软盘,DVD驱动器,这样做是很有必要的,因为可能每次挂载的文件类型不一致。

<opts> 文件系统参数:

这部分是最有用的设置!!! 它能使你所挂载的设备在开机时自动加载、使中文显示不出现乱码、限制对挂载分区读写权限。它是与mount命令的用法相关的,要想得到一个完整的列表,参考mount manpage.… 查看余下内容

centos用旧版本的rpm安装包覆盖新版本的已安装的包安装软件

若系统上已安装有其他新版本的包。要用旧版本的rpm包替换,可以rpm -Uvh参数 加上–oldpackage,根据 rpm的说明文档,https://manpages.org/rpm/8

--force Same as using --replacepkgs, --replacefiles, and --oldpackage.

也就是 –oldpackage 相当于–force ,强制安装。也就是以下命令是用旧版本的rpm包 强制替换 新版本的rpm包。

rpm -Uvh /home/libxml2-2.9.1-6.el7_2.3.x86_64.rpm --oldpackage
查看余下内容

Linux系统盘扩展分区和文件系统的操作总结

  1. 前提条件

    • 确保Linux实例的操作系统是Alibaba Cloud Linux 2/3、CentOS 6及以上、Debian 8及以上或者Ubuntu14及以上版本。

       
      说明 

      如果为其他操作系统,扩容操作请参见扩展分区和文件系统_Linux数据盘

    • 已在ECS控制台扩容云盘容量。具体操作,请参见步骤一:扩容云盘容量

    • (强烈建议)已创建云盘快照,做好数据备份。具体操作,请参见创建一个云盘快照

       
      说明 

      扩容分区和文件系统正常情况不会丢失数据。为避免误操作导致数据丢失或异常,建议您创建快照备份云盘数据。

    • 本文档不适用于开启了多重挂载功能且使用了集群文件系统的场景。更多信息,请参见开启多重挂载功能

     

    操作步骤

    本文操作适用于以下云盘扩容场景:

    在文档末尾分别以扩容MBR分区、GPT分区、裸数据盘为例,为您展示了扩容分区和文件系统的命令示例,供您参考。

    您可以尝试使用一键扩容工具。该工具会自动生成扩容命令,并支持一键执行扩容命令,帮助您实现操作系统内的分区和文件系统扩容。

     
    1. 访问EBS控制台工具集下的扩容分区和文件系统工具

    2. 选择待操作的云盘,然后单击提交

    3. 工具将检测操作系统分区状态。如果显示操作系统未扩容分区字样,且解决方案中包含自动生成的命令,则可以按照如下操作进行一键扩容。

       
      说明 

      如果未显示扩容命令,则说明工具暂不支持该种情况,您仍需要参考文档手动执行扩容。

      1. 解决方案区域的云助手工具页签中,确认自动生成的扩容命令,然后单击执行上述远程命令

      2. 在弹出的发送命令对话框单击执行,系统将自动执行扩容命令。

      3. 看到命令执行成功提示后,单击取消关闭对话框。

        即可看到该云盘的分区和文件系统扩容成功。

         

        在ECS控制台上扩容云盘容量后,对应分区和文件系统并未扩容,您还需要进入ECS实例内部继续扩容云盘的分区和文件系统,将扩容部分的容量划分至已有分区及文件系统内,使云盘扩容生效。本文为您介绍如何通过两个步骤完成Linux实例云盘的分区和文件系统扩容。

    准备工作:获取目标云盘信息

    执行扩容分区和文件操作系统前,请先获取待扩容云盘和云盘分区信息。

    方式一:通过命令行获取
    方式二:通过控制台获取
     
    1. 远程连接ECS实例。

      具体操作,请参见通过密码或密钥认证登录Linux实例

    2. 运行以下命令,确认待扩容云盘及其分区信息。

      fdisk -lu

      如图所示,表示该实例有2块云盘,系统盘/dev/vda和数据盘/dev/vdb,我们以数据盘/dev/vdb为例。其中:

      • ①:云盘的设备名称。

      • ②:云盘是否分区及分区名称。

        • 已分区:如果有②处的分区信息表示已分区,Device取值为分区名称(示例中为/dev/vdb1),数字1是分区编号,则需扩容分区和文件系统。

        • 未分区(裸设备):如果没有②处的分区信息表示未分区,为裸设备。则无需执行步骤1:扩容分区,直接执行步骤2:扩容文件系统即可。

      • ③:云盘的分区类型。

        Disk label type值为dos表示MBR分区,值为gpt表示GPT分区。

         
        说明
        • 不同操作系统的显示略有不同。如果没有Disk label type字段,可通过System字段判断。System值为Linux表示MBR分区,值为GPT表示GPT分区。

        • 较低版本的fdisk可能不能正常显示GPT分区表。您可以通过gdisk -l /dev/vdb命令查看分区类型。

      • ④:确认待扩容的分区。

        由于容量= sectors值*512 bytes,图示例中:

        • 云盘/dev/vdb的sectors=125829120,则云盘容量=125829120*512bytes=64.4GB(等于60GiB)

        • 分区/dev/vdb1的sectors=(End-Start)=83886078,则分区容量= 83886078*512bytes=42.9GB(等于40GiB)

        根据计算得出/dev/vdb1分区的容量小于云盘/dev/vdb的容量,即/dev/vdb1分区需要扩容。

         
        说明 

        您也可以通过运行lsblk命令查看哪个分区待扩容。

    步骤1:扩容分区

    本操作以公共镜像Alibaba Cloud Linux 2.1903 LTS 64位操作系统、在ECS实例内部将云盘分区/dev/vdb1由40 GiB扩容至60 GiB(已在控制台扩大容量为60 GiB)为例,请您根据实际环境进行操作。

    1. 可选:根据准备工作获取的信息,如果您的云盘分区类型为MBR且在控制台扩容后容量大于2 TiB,需先转换分区为GPT分区。

      具体操作,请参见转换Linux数据盘的分区类型

    2. 运行以下命令,扩容指定分区。例如扩容分区名称为/dev/vdb1的分区,则执行如下命令。

       
      说明 

      命令参数中的/dev/vdb1之间需要空格分隔,1是分区编号。

      Alibaba Cloud Linux 2/3版本、CentOS 6及以上版本
      Debian 8及以上版本、Ubuntu14及以上
       
      • MBR分区

        type growpart || yum install -y cloud-utils-growpart
        LC_ALL=en_US.UTF-8
查看余下内容
下一页 »
加好友请备注:chinaoss
您可以在微信公众号联系我们
我们将24小时内回复。
取消