[内容] Linux 内存机制

正文:

内容一:Linux 显示内存的命令

# free

或者:

# top

内容二:Linux 内存各项指标和机制

2.1 top 命令显示的 Linux 内存各项指标和机制 (虚拟内存和物理内存之间的机制)

1) VIRT 虚拟内存使用的大小,应用申请的内存量
2) RES 物理内存使用的大小,虚拟内存映射到物理内存的内存量,也就是真实占用的内存量
3) %MEM 物理内存占用总内存的百分比,也就是真实占用的内存比


补充:
输入 top 命令以后,在显示的指标中, VIRT 是指虚拟内存占用率,RES 是指物理内存占用率。
应用使用内存时第 1 步会先申请虚拟内存。在拥有了虚拟机内存以后,只有当需要的时候才会将虚拟内存应用到物理内存。而只有当物理内存被应用了以后才会被消耗。
虚拟内存包含所有的代码、数据和已经被换出去的共享库加号页。虚拟内存同时也包含被分配但是还没有被使用的页,处于此状态的页映射到了内核的 “Zero Page” 所以其不会消耗任何内存。
真实内存占用率应该是检查物理内存的占用率。

2.2 free 命令显示的 Linux 内存各项指标和机制 (物理内存中 free 指标、buffers 指标、cached 指标和 available 指标之间的机制)

1) total 内存的总大小
2) used 正在被使用的内存大小
3) free 表示完全没有被使用的物理内存大小
4) shared 正在被多个进程共享的内存大小
5) buffers 被内核用作块缓冲区 (buffers) 的大小。这些数据暂时存储在内存中,用于提升系统性能,当再次使用时可以在内存中被快速调用。buffers (buffer page) 代表块设备 (硬盘等设备) 所占用的缓存页,对应从硬盘中直接获取的数据,处于内存和硬盘之间,由内核使用 (当 free 状态的内存不够时,它的部分空间会自动释放出来,我们也可以手动释放出它的部分空间来)
6) cached 被内核用作文件系统缓存 (cache) 的大小。这些数据暂时存储在内存中,用于提升系统性能,当再次使用时可以在内存中被快速调用。cached (cache page) 代表普通文件数据 (硬盘里的数据) 所占用的缓存页,对应 vfs 页缓冲层的数据,处于内存和 CPU (处理器) 之间,由应用程序使用 (当 free 状态的内存不够时,它的部分空间会自动释放出来,我们也可以手动释放出它的部分空间来)
7) available = free + buffers (部分空间) + cached (部分空间),也就是估算出来的真实的内存可使用量


补充:释放处于 buffers 和 cached 状态内存的方法

1) 释放 page cache:

# echo 1 > /proc/sys/vm/drop_caches

2) 释放 dentries 和 inodes:

# echo 2 > /proc/sys/vm/drop_caches

3) 同时释放 pagecache、dentries 和 inodes:

# echo 3 > /proc/sys/vm/drop_caches

2.3 free 命令的 Mem 行和 Swap 行的机制 (物理内存和 Swap 内存 (交换内存) 之间的机制)

2.3.1 Linux 内存的种类

1) Linux 物理内存:系统的真实内存,速度快 (也就是 free 命令中显示的第 1 行)
2) Linux Swap 内存:使用硬盘作为临时的内存的空间,速度慢 (也就是 free 命令中显示的第 2 行)

2.3.2 Swap 内存 (交换内存) 被使用的条件

1) Linux 内核会周期性把内存中不常调用的匿名页和共享内存交换至 Swap 内存里。即使现在 Linux 系统的物理内存有剩余空间
2) 当系统的内存不足时,系统会把匿名页和共享内存交换至 Swap 内存里

内容四:查看那些内存可以交换至 Swap 内存以及哪些内存可以被释放

# cat /proc/meminfo 
MemTotal:       65185544 kB
MemFree:        42285372 kB
MemAvailable:   57893528 kB
Buffers:            1656 kB
Cached:         16157600 kB
SwapCached:            0 kB
Active:          4505604 kB
Inactive:       17856228 kB
Active(anon):    1859740 kB
Inactive(anon):  4353236 kB
Active(file):    2645864 kB
Inactive(file): 13502992 kB
Unevictable:          16 kB
Mlocked:              16 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Zswap:                 0 kB
Zswapped:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:       6190160 kB
Mapped:           130544 kB
Shmem:             10400 kB
KReclaimable:     100636 kB
Slab:             234788 kB
SReclaimable:     100636 kB
SUnreclaim:       134152 kB
KernelStack:        8096 kB
PageTables:        26504 kB
SecPageTables:       696 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    32592772 kB
Committed_AS:   13920568 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       58476 kB
VmallocChunk:          0 kB
Percpu:            14464 kB
HardwareCorrupted:     0 kB
AnonHugePages:   5797888 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
Unaccepted:            0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      284800 kB
DirectMap2M:    14784512 kB
DirectMap1G:    51380224 kB


补充:
1) Active(anon) 经常被使用的内存
2) Inactive(anon) 没有被经常使用的内存,也是 Linux 系统可以从物理内存交换至交换分区里的内存
3) Active(file) 经常被使用的页缓存内存
4) Inactive(file) 没有被经常使用的页缓存内存,也是 buffers/cached 中可以被系统回收的内存

参考文献:

https://access.redhat.com/solutions/296313

[步骤] KVM 虚拟机模板的创建 (openSUSE Leap 15 版)

注意:

在创建 KVM 虚拟机之前要先安装 KVM 并创建 KVM 虚拟网络

镜像准备:

在 openSUSE 官网上下载安装系统所需要的镜像:

https://software.opensuse.org/distributions/leap

正文:

步骤一:理解创建 KVM 虚拟机模板的目的

主要用于批量克隆出新的 KVM 机器,节约创建新虚拟机的时间

步骤二:为这个虚拟机创建硬盘文件

1.1 创建硬盘文件

(只在真机上执行以下步骤)

# qemu-img create -f qcow2 /var/lib/libvirt/images/template_opensuse_leap_15_10g.qcow2 10G

(补充:这里以创建 10G 大小的 template_opensuse_leap_15_10g.qcow2 硬盘文件为例)

1.2 确认硬盘文件已创建

(只在真机上执行以下步骤)

# ls /var/lib/libvirt/images/ | grep template_opensuse_leap_15_10g.qcow2

(补充:这里以确认 template_opensuse_leap_15_10g.qcow2 硬盘文件为例)

步骤三:使用 KVM 和刚刚创建的硬盘文件新安装一台虚拟机

3.1 启动 KVM 的 virt-manager

(只在真机上执行以下步骤)

# virt-manager

3.2 在 virt-manager 上的左上角点击文件之后 “点击新建虚拟机”

(只在真机上执行以下步骤)

(步骤略)

3.2.1 选择以本地安装介质的方式安装系统

(只在真机上执行以下步骤)

(图:1)
3.2.2 选择安装系统的系统镜像

(只在真机上执行以下步骤)

(图:2)

(补充:这里以使用 openSUSE-Leap-15.2-DVD-x86_64.iso 系统镜像为例)

3.2.3 设置内存大小和 CPU 核心数

(只在真机上执行以下步骤)

(图:3)

(补充:这里以设置 2048 MiB 内容和 2 核 CPU 为例)

3.2.4 选择用刚刚创建的硬盘文件来安装系统

(只在真机上执行以下步骤)

(图:4)

(补充:这里以使用 template_opensuse_leap_15_10g.qcow2 硬盘文件为例)

3.2.5 给虚拟机命名并选择虚拟网络

(只在真机上执行以下步骤)

(注意:虚拟网络必须提前创建好)

(图:5)

(补充:这里以将虚拟机命名为 template_opensuse_leap_15_10g 并使用 0 网络为例)

3.2.6 开始安装系统

(只在真机上执行以下步骤)

(图:6)
3.2.7 进入 “Language, Keyboard and License Agreement” 后选择系统语言,再点击 “Next”

(只在真机上执行以下步骤)

(图:7)
3.2.8 当出现 “Activate online repositories now?” 时,点击 “No”

(只在真机上执行以下步骤)

(图:8)
3.2.9 进入 “System Role” 后选择 “Server”,再点击 “Next”

(只在真机上执行以下步骤)

(图:9)
3.2.10 进入 “Suggested Partitioning” 后点击 “Guided Setup”

(只在真机上执行以下步骤)

(图:10)
3.2.11 进入 “Partitioning Scheme” 后点击 “Next”

(只在真机上执行以下步骤)

(图:11)
3.2.12 进入 “Filesystem Options” 后 “File System Type“ 选择 “XFS”,再点击 “Next”

(只在真机上执行以下步骤)

(图:12)
3.2.13 回到 “Suggested Partitioning” 后点击 “Next”

(只在真机上执行以下步骤)

(图:13)
3.2.14 进入 “Clock and Time Zone” 后选择时区,再点击 “Next”

(只在真机上执行以下步骤)

(图:14)
3.2.15 进入 “Local User” 后选择 “Skip User Creation” 并点击 “Next”

(只在真机上执行以下步骤)

(图:15)
3.2.16 进入 “Authentication for the System Administrator “root”” 后给 root 设置密码,再点击 “Next”

(只在真机上执行以下步骤)

(图:16)
3.2.17 如果出现 “YaST2 The password is too simple” 则点击 “Yes”

(只在真机上执行以下步骤)

(图:17)
3.2.18 进入 “Installation Settings” 后点击 “Next”

(只在真机上执行以下步骤)

(图:18)
3.2.19 当出现 “Confirm Installation” 时点击 “Install”

(只在真机上执行以下步骤)

(图:19)
3.2.20 当出现 “The system will reboot now…” 时,点击 “Ok”

(只在真机上执行以下步骤)

(图:20)
3.2.21 在安装系统的过程中需要注意的内容总结

(只在真机上执行以下步骤)

1) 一定要使用刚刚创建的 template_opensuse_leap_15_10g.qcow2 作为安装虚拟机的硬件文件
2) 虚拟机网络 “0” 要提前创建好
3) 只分一个分区,只设置一个挂载点挂载到根 “/”,使用标准硬盘,硬盘格式是 XFS
4) 选择最小化安装系统

步骤四:进入新创建虚拟机修改配置

4.1 添加 Console 配置

4.1.1 修改 grub 内核配置文件

(只在虚拟机上执行以下步骤)

# vi /etc/default/grub

将全部内容修改如下:

# If you change this file, run 'grub2-mkconfig -o /boot/grub2/grub.cfg' afterwards to update
# /boot/grub2/grub.cfg.

# Uncomment to set your own custom distributor. If you leave it unset or empty, the default
# policy is to determine the value from /etc/os-release
GRUB_DISTRIBUTOR=
GRUB_DEFAULT=saved
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=8
GRUB_CMDLINE_LINUX_DEFAULT="splash=silent mitigations=auto quiet"
GRUB_SERIAL_COMMAND="serial --unit=1 --speed=115200"
GRUB_CMDLINE_LINUX="biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200n8"
GRUB_DISABLE_LINUX_UUID="true"
GRUB_ENABLE_LINUX_LABEL="true"
GRUB_DISABLE_RECOVERY="true"

# Uncomment to automatically save last booted menu entry in GRUB2 environment

# variable `saved_entry'
# GRUB_SAVEDEFAULT="true"
#Uncomment to enable BadRAM filtering, modify to suit your needs

# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
# GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
#Uncomment to disable graphical terminal (grub-pc only)

GRUB_TERMINAL="gfxterm"
# The resolution used on graphical terminal
#note that you can use only modes which your graphic card supports via VBE

# you can see them in real GRUB with the command `vbeinfo'
GRUB_GFXMODE="auto"
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
# GRUB_DISABLE_LINUX_UUID=true
#Uncomment to disable generation of recovery mode menu entries

# GRUB_DISABLE_RECOVERY="true"
#Uncomment to get a beep at grub start

# GRUB_INIT_TUNE="480 440 1"
GRUB_BACKGROUND=
GRUB_THEME=/boot/grub2/themes/openSUSE/theme.txt
SUSE_BTRFS_SNAPSHOT_BOOTING="true"
GRUB_DISABLE_OS_PROBER="false"
GRUB_ENABLE_CRYPTODISK="n"
GRUB_CMDLINE_XEN_DEFAULT="vga=gfx-1024x768x16"
4.1.2 使修改的 grub 内核配置生效

(只在虚拟机上执行以下步骤)

# grub2-mkconfig -o grub

4.2 将系统自动挂载的硬盘从使用 uuid 换成硬件路径

4.2.1 显示根 “/” 分区的 UUID

(只在虚拟机上执行以下步骤)

# blkid
/dev/vda1: UUID="53ee2f87-89b8-4cd7-a4dc-0957d28f4831" TYPE="xfs" PARTUUID="3d8377ef-01"

(补充:这里的 UUID 是: 53ee2f87-89b8-4cd7-a4dc-0957d28f4831)

4.2.2 在自动挂载文件里将根 “/” 分区的 UUID 换成硬件路径

(只在虚拟机上执行以下步骤)

# vi /etc/fstab

将以下内容:

......
UUID=53ee2f87-89b8-4cd7-a4dc-0957d28f4831 /                   xfs     defaults        0 0

(补充:这里的 UUID 是: 53ee2f87-89b8-4cd7-a4dc-0957d28f4831)

修改为:

......
/dev/vda1 /                   xfs     defaults        0 0

4.3 删除不用的软件

(只在虚拟机上执行以下步骤)

# zypper -n rm firewalld-*

4.4 进行分区扩展

4.4.1 安装分区扩展软件

(只在虚拟机上执行以下步骤)

# zypper -n in growpart
4.4.2 设置开机自动扩容根 “/” 目录
4.4.2.1 创建开机自动扩容根 “/” 目录的配置文件
# vim /etc/init.d/after.local

创建以下内容:

/usr/bin/growpart /dev/sda1
/usr/sbin/xfs_growfs /
4.4.2.2 给开机自启配置文件相应的权限
# chmod 755 /etc/init.d/after.local

4.5 只使用本地软件源(选做)

4.5.1 禁用所有软件源(选做)

(只在虚拟机上执行以下步骤)

# zypper mr -da
4.5.2 添加本地软件源(选做)

(只在虚拟机上执行以下步骤)

# zypper ar -fcg http://10.0.0.254/openSUSE-Leap-15/ lan

(注意: http://10.0.0.254/openSUSE-Leap-15/ 需要根据真实环境的情况进行更改)

4.5.3 添加本地软件源(选做)

(只在虚拟机上执行以下步骤)

# zypper ref

4.6 修改虚拟机系统的名称

(只在虚拟机上执行以下步骤)

# hostnamectl set-hostname template_opensuse_leap_15_10g

4.7 启用 serial 服务实现通过 virsh console 命令控制虚拟机

(只在虚拟机上执行以下步骤)

# systemctl start serial-getty@ttyS0
# systemctl enable serial-getty@ttyS0

4.8 清除虚拟系统的历史命令

(只在虚拟机上执行以下步骤)

# history -c

4.9 关闭虚拟机

(只在虚拟机上执行以下步骤)

# poweroff

步骤五:修改新创建的虚拟机配置文件

删除配置文件里 cdrom 相关的部分

# vim /etc/libvirt/qemu/template_opensuse_leap_15_10g.xml

删除以下内容:

......
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/test/iso/openSUSE-Leap-15.2-DVD-x86_64.iso'/>
      <target dev='sda' bus='sata'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
......

步骤六:此时就可以将此虚拟机的硬件文件作为模板进行批量克隆虚拟机了

(只在真机上执行以下步骤)

(步骤略)

[工具] Shell 批量设置官方软件源 (openSUSE Leap 15.2 版)

介绍

基本信息

作者:朱明宇
名称:批量设置官方软件源(openSUSE 版)
作用:批量设置官方软件源(openSUSE 版)

使用方法

1. 服务器清单 $add_repo_servers_list.txt 每个服务器名占用 1 行,并和此脚本放在同一目录下
2. 在此脚本的分割线内写入相应的内容
3. 给此脚本添加执行权限
4. 执行此脚本

脚本分割线里的变量

add_repo_servers_list.txt #指定存放要设置官方软件源的文件

注意

1. 此脚本执行前必须要先保证执行此脚本的用户能无密码 ssh 远程这些远程服务器
2. 服务器的系统需要是 openSUSE 15.2 版本
3. 服务器系统要配置好可用的软件源(最好是软件数量最多的官方版本)
4. 这些远程服务器要能够连接外网

脚本

#!/bin/bash

####################### Separator ########################

add_repo_servers_list.txt

####################### Separator ########################

cat add_repo_servers_list.txt
read -p "will add opensuse_leap_15.2 repo please input y " a
echo $a

if [ "$a" != "y" ];then
        echo "you don't agree so exit now"
        exit
fi

for i in `awk '{print $1}' add_repo_servers_list.txt`
do
        ssh $i '
        sudo -u root su - root -c "zypper mr -da"
        sudo -u root su - root -c "zypper ar -fcg http://download.opensuse.org/distribution/leap/15.2/repo/oss/ OpenSUSE_Leap_152_x64_update-oss"
        sudo -u root su - root -c "zypper ar -fcg http://download.opensuse.org/distribution/leap/15.2/repo/non-oss/ OpenSUSE_Leap_152_x64_update-non-oss"
        sudo -u root su - root -c "zypper ar -fcg http://download.opensuse.org/update/leap/15.2/oss/ OpenSUSE_Leap_152_x64_oss"
        sudo -u root su - root -c "zypper ar -fcg http://download.opensuse.org/update/leap/15.2/non-oss/ OpenSUSE_Leap_152_x64_non-oss"
        sudo -u root su - root -c "zypper ref"
done

[步骤] 软件源的设置 (openSUSE 版) (本地镜像版)

步骤一:加载本地镜像到系统光驱

(步骤略)

步骤二:挂载本地镜像

# mount /dev/cdrom /mnt

(补充:这里以挂载 /dev/sr1 到 /mnt 目录为例)

步骤三:添加本地镜像里的软件源

# zypper ar file:///mnt/Module-Basesystem openSUSE15-Base

或者:

# zypper ar -f /mnt/Module-Basesystem openSUSE15-Base

(补充:这里以将 /mnt/Module-Basesystem 添加到软件源并命名为 openSUSE15-Base 为例)