「Linux」- 挂载 FTP 到本地目录,CurlFtpFS
CurlFtpFS,基于 FUSE 与 cURL,将 FTP Server 挂载到本地目录。在 Google上 搜索了几篇文章,排名靠前的都是 CurlFtpFS 工具。
安装应用
通过仓库直接安装
# Ubuntu 16.04 TLS
apt-get install curlftpfs
通过源码编译安装
去官网下载CurlFtpFS源码,安装过程参考 INSTALL 中件。
安装的可执行程序
curlftpfs,主程序文件,将ftp主机挂在到本地目录中。
curlftpfs
curlftpfs,主程序文件,将ftp主机挂在到本地目录中。
命令行语法格式
curlftpfs [options] host path
命令描述
该程序可以将远程的FTP目录挂在到本地的文件夹中,然后将远程FTP的目录映射到本地。
curlftpfs所有于传输相关的特征都依赖于libcurl(man 3 libcurl)库。 在FUSE之上实现的文件系统。可以去FUSE主页查看相关内容(原主页实在SourceForge上,后来挪到Github了)。
FTP 有关的选项(FTP OPTIONS)
-v/–verbose
Make libcurl print verbose debug output.
-o 以下的选项需要使用-o选项来指定,多个参数之间使用逗号(,)分割:
cacert=<file>
(SSL) Pass a string naming a file holding one or more certificates to verify the peer with.
Note that option is by default set to the system path where libcurl’s cacert bundle is assumed to be stored, as
established at build time.
capath=<directory>
(SSL) Tells curlftpfs to use the specified certificate directory to verify the peer. The certificates must be in PEM
format, and the directory must have been processed using the c_[……]
「Eudev」
Eudev,软件包包含用于动态创建设备节点的程序。
安装的可执行程序
udevadm Generic udev administration tool: controls the udevd daemon, provides info from the Udev database, monitors uevents, waits for uevents to finish, tests Udev configuration, and triggers uevents for a given device
udevd A daemon that listens for uevents on the netlink socket, creates devices and runs the configured external programs in response to these uevents
参考文献
LFS / Eudev-3.2[……]
「udevadm」
UDEVADM(8) udevadm UDEVADM(8)
NAME
udevadm – udev management tool
SYNOPSIS
udevadm [–debug] [–version] [–help]
udevadm info options
udevadm trigger [options]
udevadm settle [options]
udevadm control command
udevadm monitor [options]
udevadm test [options] devpath
udevadm test-builtin [options] command devpath
DESCRIPTION
udevadm expects a command and command specific options. It controls the runtime behavior of
systemd-udevd, requests kernel events, manages the event queue, and provides simple debugging
mechanisms.
OPTIONS
–debug
Print debug messages to standard error.
–version
Print version number.
-h, –help
Print help text.
udevadm info [options] [devpath|file]
Queries the udev database for device information stored in the udev database. It can also query the
properties of a device from its sysfs representation to help creating udev rules that match this
device.
-q, –query=TYPE
Query the dat[……]
「Ext4」- fourth extended filesystem
参考文献
Wikipedia/ext4 Ext4 (and Ext2/Ext3) Wiki
章节列表
「Linux」- 分区扩展,增大分区,磁盘扩展,调整硬盘分区 「Linux」- 缩小 Ext4 分区(调整文件系统大小、缩小文件系统、扩大文件系统) 「Ext4」- 找到受坏块影响的文件 「fsck.ext4」[……]
「Ext4」- 找到受坏块影响的文件
问题描述
如果在物理磁盘中出现了坏块,那么使用该坏块的文件将无法正常读取(比如在复制时会显示I/O错误)。那么我们该如何定位受坏块影响的文件呢?
本文将通过一系列方法在文件系统中找到受坏块影响的文件。
注意事项
进行坏块检测是文件系统无关的,而文件定位是文件系统相关的。所以,不同文件系统要使用不同处理工具。例如,在ext2/ext3/ext4中使用debugfs命令,而其他的文件系统要使用其他工具。
针对磁盘操作具有一定的危险性,注意数据备份!!!
本文内容是对「archlinux/Identify damaged files」的学习与整理,并未进行实际操作与验证。我们的目的是了解”查找受坏块影响的文件的“方法。
环境概述
本文是针对Ext4文件系统。
确定文件系统的块大小
使用tune2fs命令确定文件系统块大小:
#!/bin/sh
tune2fs -l /dev/sdxy | grep -i Block
找到文件系统的坏块值
你可能已经使用badblock命令找到坏块值,但是该值不一定是文件系统坏块值。这是由于badblock命令所使用的块大小,与文件系统的块大小不同(或者说不一定相同)。所以有以下两个选择。
使用相同块大小
#!/bin/sh
badblock -b “<file system block size>” -v /dev/sdxy
该命令扫描特定分区,并且使用文件系统块大小,所以输出的坏块位置即是文件系统中的坏块值。
使用不同块大小
如果已经使用badblock扫描磁盘,但是扫描时的块大小并不是文件系统的块大小,则需要进行转换:
(original block number) / (filesystem_block_size / badblocks_block_size)
original block number * badblocks_block_size / filesystem_block_size
上面的两个公式是等价的,都基于「相同位置 = 块位置 x 块大小 = 文件系统块大小 * 文件系统块位置」这一点。
开始文件系统调试
进入debugfs交互模式
执行debugfs命令,进入debugfs的交互模式:
# debugfs
debugfs 1.45.4 (23-Sep-2019)
debugfs: open /dev/sdxy
ncheck inodenumber
打开分区
在debugfs的交互模式中,使用open命令打开分区:
debugfs: o[……]
「Linux」- 分区扩展,增大分区,磁盘扩展,调整硬盘分区
问题描述
事实证明:不分区,没有太多好处;分区不合理,也有很多坏处的;应该是使用LVM的。
理想环境:目前,我们的SWAP分区在机械硬盘上,想换到固态硬盘上。这很简单,固态硬盘切个分区,然后mkswap(8)一下,挂载一下就行了。事情本该就这么简单,但是每次落实的时候都会遇到各种问题,不是操作复杂,而是情形总是和预想的不一样,会有各种状况。
现实情况:在我们的环境里,固态硬盘一共三个分区,分别挂载了不同的文件系统,已经没有空间来创建新的分区了。而且由于分区不合理,导致目前部分分区空余了大量的空间。所以怎么办呢?那些年我们还接触LVM呢。有的时候真的是,我们今天遇到的问题,其实前人很早之前就遇到过了。
解决方案:我们的办法是:缩小原有的某个磁盘的分区,从我们的固态硬盘上切出8G的分区,然后创建SWAP分区。目前还不打算迁移到LVM中,因为迁移到LVM需要做大量的工作(备份数据、创建LVM、然后回迁数据),而且也没有找到一个直接转换到LVM而无需迁移数据的方法,但是有个工具(「blocks」)。
环境概述
操作系统:Kali Linux Rolling
磁盘分区:/dev/sdb1 /dev/sdb2 /dev/sdb3
# df -h | grep /dev/sdb /dev/sdb1 49G 26G 21G 56% /opt /dev/sdb2 30G 15G 14G 52% /root /dev/sdb3 32G 3.3G 27G 12% /usr/local
操作步骤
(1)将/dev/sdb3分区缩小到7G大小,然后从富余的20G空间中切出8G用作交换分区,剩下的留作备用。
(2)第(1)步是主要的操作,至于后续的创建交换分区就不再介绍了。本文也侧重第(1)步的讲解。
注意事项
我们会先进行测试,确保我们的操作过程是正确的。
在实际的操作过程中,我们会新进行数据备份,以防止数据丢失。
扩容步骤
#1 用于执行测试的设备
我们有一个SD卡,16G,使用情况如下:
# df -h | grep /dev/mmcblk0p1
/dev/mmcblk0p1 15G 8.5G 5.3G 62% /mnt/os
里面放了三个操作系统的镜像,MD5如下:
# find ./ -type f -print0 | xargs -0 md5sum
adfcff7187115681d63d4da5cae0a296 ./cn_windows_7_professional_with_sp1_x86_dvd_u_677162.iso
660aab9894136872770ecb6e1[……]
「Linux」- 缩小 Ext4 分区(调整文件系统大小、缩小文件系统、扩大文件系统)
问题描述
环境信息: 1)/dev/mapper/dt-libvirt ext4 295G 101G 179G 37% /var/lib/libvirt 2)我们需要将其缩小到 110G 磁盘空间; 3)操作系统:Ubuntu 21.04
解决方案
注意事项
磁盘调整操作有风险,请注意数据**备份**!
为了校验数据一致性,在磁盘调整之前与之后,我们都会执行如下脚本,用于检查数据一致性:
# find ./ -type f -print0 | xargs -0 -i md5sum ‘{}’
第一步、缩小文件系统
systemctl stop libvirtd.service # 移除磁盘占用,否则无法 umount
umount /var/lib/libvirt
# e2fsck -f /dev/mapper/dt-libvirt
e2fsck 1.45.7 (28-Jan-2021)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/mapper/dt-libvirt: 54/19660800 files (0.0% non-contiguous), 27925391/78643200 blocks
# resize2fs /dev/mapper/dt-libvirt 110G
resize2fs 1.45.7 (28-Jan-2021)
Resizing the filesystem on /dev/mapper/dt-libvirt to 28835840 (4k) blocks.
The filesystem on /dev/mapper/dt-libvirt is now 28835840 (4k) blocks long.
第二步、缩小分区
针对普通分区:通过 cfdisk 命令,重新创建分区表即可。
针对 LVM 环境:
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home dt -wi-ao—- 50.00g
libvirt dt[……]
「fsck.ext4」
Is it possible to find out which files are deleted during a filesystem recovery check?[……]
「FHS」- 文件系统层次标准,Filesystem Hierarchy Standard
/ (a.k.a ROOT)
Linux提供的系统文件
/boot
存放引导系统的文件,内核存在于该目录总中。通常命名为/boot/vmlinuz或类似的目录。
/proc
当前运行的进程,供高级用户使用
ioports,计算机的输入输出硬件列表 cpuinfo,计算机处理器方面的信息 version,操作系统版本,除此之外uname命令也能输出这些信息 uptime,系统正常运行时间,可以使用uptime命令来获取更加人性化的输出。 xxx,进程ID为xxx的进程的信息。 self,正在运行的当前进程的信息。
/sys
sysfs – Wikipedia
sysfs,是由Linux Kernel提供的伪文件系统,它通过虚拟文件将关于各种内核子系统、硬件设备、相关设备驱动程序的信息从内核的设备模型导出到用户空间。除了提供有关各种设备和内核子系统的信息之外,导出的虚拟文件也用于其配置。
sysfs,提供的功能类似于BSD操作系统中的sysctl机制,不同之处在于sysfs被实现为虚拟文件系统,而不是特制的内核机制,而在Linux中,sysctl配置参数是在作为procfs一部分的/proc/sys/中,而不是挂载在/sys/的sysfs。
sysfs挂载在/sys下。如果在初始化期间未挂载,则可以使用以下命令挂载:mount -t sysfs sysfs /sys
如udev或HAL等程序,通过sysfs访问有关硬件及其驱动程序(内核模块)的信息。脚本已被写入先前通过procfs获取的访问信息,一些脚本通过其属性来配置设备驱动和设备。
https://en.wikipedia.org/wiki/Sysfs https://www.kernel.org/doc/Documentation/filesystems/sysfs.txt https://lkml.org/lkml/2002/10/19/8 https://lkml.org/lkml/2002/11/4/213 https://lkml.org/lkml/2001/10/17/147 https://lkml.org/lkml/2001/11/1/38 https://www.kernel.org/pub/linux/kernel/people/mochel/doc/papers/ols-2005/mochel.pdf https://www.kernel.org/doc/Documentation/filesystems/sysfs.txt https://wiki.debian.org/ramfs https://lwn.net/Articles/54651/ https://lwn.net/Articles/[……]
「GVfs」- 文件系统的抽象层
安装
从发行版的源中安装
#!/bin/bash
# Kali GNU/Linux Rolling
apt-get install gvfs gvfs-backends gvfs-bin gvfs-common gvfs-daemons gvfs-fuse gvfs-libs
参考文献
Wikipedia/GNOME Virtual file system[……]
「GNOME」- 禁用设备自动挂载
内容简介
在GNOME中,当插入新的存储设备时,比如USB存储,会自动进行挂载。
那如何禁用呢?因为有时我们并不需要自动挂载,在我们插上设备之后,可能需要进行一些其他维护性的工作,我们要挂载到特定的目录,进行某些特定的操作。
本文将介绍如何禁用设备的自动挂载。
环境介绍
GNOME
GNOME Shell 3.30.2
在命令行中禁用
针对当前用户的设置:
#!/bin/sh
gsettings set org.gnome.desktop.media-handling automount false
gsettings set org.gnome.desktop.media-handling automount-open false
# 在Red Hat的Knowledgebase中,他说需要重启gdm服务。
# 但是,我执行了上述命令之后立即生效,不需要重启。
systemctl restart gdm.service
针对所有用户的设置:
#!/bin/sh
cat <<CT > /etc/dconf/db/local.d/00-media-automount
[org/gnome/desktop/media-handling]
automount=false
automount-open=false
CT
在DConf中禁用
使用dconf-editor命令打开「dconf Editor」编辑工具,与命令行操作是等价的,只是这里是通过图形化工具进行操作。
打开「dconf Editor」之后,在搜索中,搜索automount关键字,最后将对应的值(automount、automount-open)设置为FALSE即可。
注意事项
设置后是立即生效的。但是插上USB设备后,为什么在文件管理器中还是显示新的设备?此时的设备并没有挂载,当你鼠标浮动到设备上时,显示“Mount and opne XXXX”提示。
如果验证修改是否生效,可以使用mount | grep /dev/sdxx命令进行检验。
参考文献
How to disable media automount in GNOME How can I use gsettings to disable device automount in Ubuntu 16.04? Disabling USB automount in GNOME3[……]
「Quota」- 磁盘配额
什么是磁盘配额?
用于限制用户或者组在指定的分区上可用的磁盘空间或文件个数。
常见概念及使用范围
用户配额和组配额
既可以对用户进行配额,也可以对组进行配额。
磁盘容量限制和文件个数限制
既可以限制用户的可用磁盘空间,也可以限制用户可创建的文件数。
软限制和硬限制
软限制为一个告警界限,达到软限制后,用户将收到警告。
硬限制是真正的限制,达到这个限制之后,用户就不能在使用磁盘。
宽限时间
当用户已使用空间介于软限制和硬限制之间,用户收到警告,但是只警告指定的天数,这个天数就是“宽限时间”。如果在宽限时间内,用户不处理(比如删除文件以减少已使用空间),则到达宽限时间后,用户可用空间直接降到软限制的大小。
注意事项
只能限制普通用户和组,不能用于限制root用户; 只能针对于分区; 既可以限制用户占用的磁盘空间大小,也可以限制用户占用的文件个数;
检查内核是否支持磁盘配额
配置磁盘配额
以分区/dev/sda1为例。并假设/dev/sda1,挂载在/mnt/quota/中。我们的目标是限制www用户使用的磁盘空间及创建的文件数。
首先你需要进入/dev/sda1的挂载目录/mnt/quota/中。
#1 开启分区的磁盘配额功能
以usrquota、grpquota挂载分区:mount -o remount,usrquota,grpquota /dev/sda1
#2 创建磁盘配额配置文件
创建初始化的磁盘配额文件:quotacheck -avug
此时会在/mnt/quota/中创建aquota.user、aquota.group这两个文件。
#3 设置用户的磁盘配额
用户和组的磁盘配额信息分别保存在aquota.user、aquota.group这两个文件中,但是不能直接编辑它们,需要使用edquota(8)命令进行编辑。
例如,我们要限制www用户的可用磁盘空间和创建文件个数:edquota -u www
上述命令会打开vi编辑器进行编辑。输出中有七个列,分别是:文件系统、已使用块数、软限制、硬限制、已使用inode数、软限制、硬限制。
#4 修改宽限时间
如果要修改宽限时间,则执行:edquota -t
依旧是启动vi编辑器进行编辑。
#5 启动磁盘配额
配置完成后,执行quotaon -vug /mnt/quota/来启动磁盘配额。
如果要关闭磁盘配额,则可以使用quotaoff(8)命令。
#6 磁盘配额查询
如果要查看磁盘配额的使用情况,可以使用quota命令:quota -vsu www
或者repquota命令:reqquota[……]
「SSHFS」- 通过 SSH 挂在远程目录
sshfs用于将远程服务器的目录挂载到本地目录中,可以达到像编辑本地文件一样直接编辑远程服务器文件,而不再需要那种“繁琐”操作(先ssh到远程服务器,再执行vim编辑文件,当然某些情况下,还是需要这种“繁琐”操作的)。
虽然sshfs不支持Windows系统,但是Windows中可以使用替代品win-sshfs,一样的效果。
在 Linux 中,使用 sshfs 工具
https://github.com/libfuse/sshfs Solving SSHFS ‘Permission Denied’ How To Use SSHFS to Mount Remote File Systems Over SSH
sshfs -o allow_other,defer_permissions,IdentityFile=~/.ssh/id_rsa \
root@xxx.xxx.xxx.xxx:/ \
/mnt/droplet
allow_other:允许其他用户访问
在 Windows 中,使用 win-sshfs 工具
安装依赖
由于win-sshfs依赖于Dokan,所以先安装Dokan后,再安装win-sshfs。 Dokan项目地址:https://github.com/dokan-dev/dokany Doken下载地址:https://github.com/dokan-dev/dokany/releases 有关Doken版本的选择及安装,参考:https://github.com/dokan-dev/dokany/wiki/Installation
因为使 Windows XP 系统,所以使用 0.6.0 版本。文档有说明:https://github.com/dokan-dev/dokany/wiki/Installation
双击运行 DokanInstall_0.6.0.exe 进行安装。
下载并安装
win-sshfs项目地址:https://github.com/Foreveryone-cz/win-sshfs win-sshfs下载地址:https://github.com/Foreveryone-cz/win-sshfs/releases
双击运行 win-sshfs-0.0.1.5-setup.exe 进行安装。
附加说明
如果访问有问题,Dokan和win-sshfs的下载也可以使用:http://pan.baidu.com/s/1hrGcHkK
使用方法
如图所示,点击 <Mount> 后,会将 10.10.30.2 的 / 目录挂载到 H 盘:
常见错误列表[……]
「XFS」- Extents File System
Attr – extended attributes on XFS filesystem objects http://savannah.nongnu.org/projects/attr
参考文献
Wikipedia/XFS 百度百科/xfs[……]
「inotify」
参考文献
Homepage: https://github.com/rvoicilas/inotify-tools/wiki Wikipedai / inotify: https://en.wikipedia.org/wiki/Inotify man 7 inofity: http://man7.org/linux/man-pages/man7/inotify.7.html
章节列表
「inotifywait」- 检测在目录中发生修改的文件 「inotify-tools」[……]
「inotify-tools」
检查内核是否支持 inotify 特性
inofity 是在 2.6.13 引入的。执行 ll /proc/sys/fs/inotify 命令:
输出以上三项表示支持 inotify 特性。
安装 inotify-tools 工具
从发行版的源中安装
apt-get install inotify-tools
使用源码编译安装
参考:https://github.com/rvoicilas/inotify-tools/wiki#user-content-everyone-else
安装的可执行程序
inotifywatch – 使用 inotify 收集文件系统访问统计信息;显示统计数据;
inotifywait – 检测文件变化;输出发生修改文件;
参考文献
Home · inotify-tools/inotify-tools Wiki[……]
「inotifywait」- 检测在目录中发生修改的文件
inotifywait, 使用inotify来等待发生文件更改。
# inotifywait -m ~/
Setting up watches.
Watches established.
/home/k4nz/ OPEN .ICEauthority
/home/k4nz/ ACCESS .ICEauthority
/home/k4nz/ ACCESS .ICEauthority
…
补充说明
如果想要知道哪个进程修改了文件,需要使用 auditd 工具。
参考文献
man 1 inotifywait, version 3.14 shell script – How to use inotifywait to watch a directory for creation of files of a specific extension linux – Find which process is modifying a file – Unix & Linux Stack Exchange[……]
「Linux」- 内核
查看内核模块的对应文件
-「How to find kernel module for a given device?」
# modinfo -F filename nouveau
禁用内核模块
-「How do I disable a kernel module persistently?」 修改/etc/modprobe.d/blacklist.conf中加入blacklist wacom配置行。
# sysctl
「archlinux/sysctl」 用于在运行时检查和修改内核参数。[……]
「Linux」- 内核升级
CentOS 7.x
How to Upgrade the Linux Kernel on CentOS 7 | PhoenixNAP KB
# 升级系统
yum update -y
# 添加 ELRepo 仓库
rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 查看可用内核版本
yum list available –disablerepo=’*’ –enablerepo=elrepo-kernel
# 安装新内核
yum remove -y kernel-headers kernel-tools kernel-tools-libs
yum –enablerepo=”elrepo-kernel” install -y kernel-ml kernel-ml-devel \
kernel-ml-headers kernel-ml-tools kernel-ml-tools-libs kernel-ml-tools-libs-devel
# 重新启动系统,并手动选择内核版本,验证功能
# 略……
# 设置默认内核版本
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
版本回退、降级
Ubuntu 20.04 TLS
How to remove a newer kernel while booted with the older kernel?
# apt-get install -y <Old Version>
# apt-get remove -y “<New Version>”
// 在卸载过程中,可能会安装更新版本的内核。
// 该场景多是:当前内核版本不是最新的,但也不是最旧的
// 解决方法是卸载自动安装的新内核
# apt-get remove -y “<Newer Version>”
参考文献
How to Upgrade the Linux Kernel on CentOS 7 How to set default boot kernel on Linux ( CentOS / RHEL 7 ) 22 | 答疑(三):文件系统与磁盘的区别是什么?[……]
「CentOS 7」- Disable plymouth
系统启动时间分析:systemd-analyze time
禁用 Plymouth 功能:
#!/bin/sh
# 修改
vim /etc/default/grub
# 在「GRUB_CMDLINE_LINUX_DEFAULT」追加:nouveau.modeset=0 rd.plymouth=0 plymouth.enable=0
# 备份
cp /boot/grub2/grub.cfg{,.backup}
# 更新
grub2-mkconfig -o /boot/grub2/grub.cfg
# 如果使用了 EFI 功能
grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
# 重启
参考文献
Disable plymouth and boot much faster than before![……]
「Debian」- 禁用Nouveau驱动
问题描述
禁用 nouveau 内核模块
解决方案
查看相关的模块文件:
# modinfo -F filename nouveau
/lib/modules/4.16.0-kali2-amd64/kernel/drivers/gpu/drm/nouveau/nouveau.ko
查看模块文件所属的包:
# apt-file search ‘/kernel/drivers/gpu/drm/nouveau/nouveau.ko’
linux-image-4.19.0-kali4-amd64: /lib/modules/4.19.0-kali4-amd64/kernel/drivers/gpu/drm/nouveau/nouveau.ko
linux-image-4.19.0-kali4-amd64-dbg: /usr/lib/debug/lib/modules/4.19.0-kali4-amd64/kernel/drivers/gpu/drm/nouveau/nouveau.ko
linux-image-4.19.0-kali4-rt-amd64: /lib/modules/4.19.0-kali4-rt-amd64/kernel/drivers/gpu/drm/nouveau/nouveau.ko
linux-image-4.19.0-kali4-rt-amd64-dbg: /usr/lib/debug/lib/modules/4.19.0-kali4-rt-amd64/kernel/drivers/gpu/drm/nouveau/nouveau.ko
这是内核自带的驱动模块,没有办法卸载。
需要通过 /etc/modprobe.d/ 的 blacklist 来禁用:
# cat /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
更新内核的 initramfs 文件:
# update-initramfs -u
重启系统。
待办事项
TODO 为什么要执行update-initramfs -u命令? TODO 内核模块是如何加载的,为什么单纯使用modprobe的blacklist无效 TODO 如何安装英伟达显卡驱动,并配置XORG来启用
关键文档
How to disable Nouveau kernel driver NVIDIA CUDA Installation Guide for Linux Debian Wiki/KernelModuleBlacklisting
参[……]
「Linux」- 当开机启动时,自动加载内核模块
CentOS 6.5
Remember to load your kernel modules at boot How to load modules on boot CentOS 6.x
以 BONDING 模块为例:
#!/bin/sh
cat > /etc/sysconfig/modules/bonding.modules <<EOF
#!/bin/sh
exec /sbin/modprobe bonding 2>&1
EOF
chmod 755 /etc/sysconfig/modules/bonding.modules
CentOS 7.4
Products & Services/Product Documentation/Red Hat Enterprise Linux/7.4/Kernel Administration Guide
以 virtio-net.ko 模块为例:
#!/bin/sh
cat > /etc/modules-load.d/virtio-net.conf <<EOF
# Load virtio-net.ko at boot
virtio-net
EOF[……]
「sysctl」- 停止内核向控制台输出消息
当系统启动成功后,在 TTY 中,内核还是在不停的写入消息,影响操作;
这个消息是内核写入的,不时 MESG,WALL 等命名写入的,所以单纯的使用mesg n命令是无效的;
需要修改/etc/sysctl.conf文件:
# Uncomment the following to stop low-level messages on console
kernel.printk = 3 4 1 3
然后,执行sysctl –system使修改生效;
参考文献
How to stop kernel messages from flooding my console?[……]
「Linux」- control groups
内容简介
本部分介绍与cgroups有关的内容。
cgroups – control groups
它是Linux内核的一个特性,用于限制、管理进程使用的资源。
与nice(1)及/etc/security/limits.conf相比,cgroups更加灵活,它可以管理一组进程。
简单示例
在Linux中,有些应用程序十分消耗内存。比如火狐浏览器就是一个“内存大户”,还有Eclipse开发工具。
我们这里演示如何如何限制Eclipse使用的内存:
#!/bin/sh
# 安装
apt-get install cgroup-tools
# 配置
cgcreate -g memory:eclipse-demo
echo 1G > /sys/fs/cgroup/memory/eclipse-demo/memory.limit_in_bytes
cgexec -g memory:eclipse-demo /path/to/eclipse
# 验证
多种使用方式
由非常多的cgroups配置管理工具,这里只简单介绍几种:
(1)通过命名行工具,如cgcreate, cgexec等命令(以及/etc/cgconfig.conf配置文件),并且需要由开机脚本支持才能实现开机自动及自动加载。
(2)通过systemd管理(推荐)。
本文只介绍这两种方式。
通过命令行
Setting Up Linux cgroups – Control Groups How to Limit CPU Usage of a Process on Linux Limit memory for browser on Fedora
通过systemd服务
How to manage processes with cgroup on Systemd
Running Firefox in a cgroup (using systemd)
附加说明
#1 如果应用程序使用的内存达到限制后,会发生什么?
-「What’s the Linux kernel’s behaviour when processes in a cgroup hit their memory limit?」 在默认情况下,由OOM监管cgroups。在启用OOM时,如果内存达到限制,进程会被OOM Killer立即结束。在禁用OOM时,如果内存达到限制,进程会被暂停,直到释放出新空间(但是实际情况是Eclipse一直挂在那里没有反应,所以最后我还是决定默默地启动OOM功能)。
如果要禁用OOM Killer可以执行echo 1 > /c[……]
「CentOS 7」- dracut-initqueue timeout
关键命令:dracut -f -v
关键点:update kernel initramfs LVM
参考文献
Can’t boot due to “Dracut initqueue timeout” YouTube/Fix Fedora boot label error message Change VM – ‘Warning: dracut-initqueue timeout’ at startup Kernel panic on boot following “dracut Warning: LVM rootvg/rootlv not found”[……]
「Linux」- 语言,本地化
安装并切换其他语言
Add new locale at Ubuntu 16.04 · GitHub
# apt-get install language-pack-en-base language-pack-en
# localectl set-locale LC_CTYPE=en_US.utf8
安装语言包
Fcitx – ArchWiki/#Emacs Locale – ArchWiki
通过图形化界面的方法(Ubuntu 21.04,GNOME 桌面系统): 1)Settings ⇒ Region & Language ⇒ Manage Installed Languages ⇒ Install / Remove Languages… ⇒ Chinese (simplified) ⇒ Apply; 2)无需重启,执行 locale -a 能够查看到 zh_CN.utf8 语言;
在命令行中,执行命令安装:
apt-get install locales-all
在 Debian 中,可能已经安装语言环境,但是需要手动配置: 1)编辑 /etc/locale.gen 文件,取消 zh_CN.UTF-8 UTF-8 注释; 2)运行 locale-gen 命令即可; 3)重新运行上述 Emacs 启动命令;
相关链接
The Base Specifications Issue 7[……]
「Linux」- 本地语言设置
CentOS 7
使用localectl命令:
# localectl status
# localectl list-locales
# localectl set-locale LANG=<locale_name>
# localectl –help
更多的内容可以参考手册localectl(1)手册。
CentOS 6.X
通过配置文件修改:
/etc/sysconfig/i18n # 系统级配置文件
$HOME/.i18n # 用户级别配置文件
/etc/profile # 定义LANG=变量即可
这并不需要重启,用户重新登录即可。
参考文献
How to Set Up System Locale on CentOS 7 How to Change the System locale in CentOS / RHEL 5,6[……]
「Linux」- 操作系统日志管理
日志的保存路径
5.10. /var/log : Log files and directories
在 Linux 中,按照 FHS 规范,日志应该保存在 /var/log/ 目录中。 FHS 规定 wtmp、messages、lastlog 三个日志文件,但并没有规定其他日志类型所用的日志文件名。
日志的写入方式
我们可以将日志直接写入 /var/log/ 目录中 多数 Linux 发行版会提供两个日志系统:systemd-journald、rsyslog
systemd-journald
提供改进的日志管理服务,用于记录内核、启动早期、标准输出、守护进程的日志;
它将这些日志写入结构化事件日志中,日志会被收集到中央数据库。在默认情况下,重启之后便会丢失;
这些日志可以由 systemd-journald 转发到 rsyslog 中进一步处理;
rsyslog
该服务会根据日志类型、日志优先级处理这些日志,并写入不同的文件中(/var/log/)
相关文档
systemd-journald.service(8) rsyslogd(8) rsyslog.conf(5)
常见日志文件
注意事项:针对不同的 Linux 发行版,同种日志文件的写入路径及文件名可以有所差异
/var/log/message => 大多数系统日志记录于此; /var/log/secure => 安全与身份认证相关的消息和错误的日志 /var/log/maillog => 与邮件服务相关的消息的日志 /var/log/cron => 与定时任务有关的日志 /var/log/boot.log => 与系统启动有关的日志 /var/log/kern.log => Linux Kernel
/var/log/Xorg.0.log /var/log/Xorg.0.log.old /var/log/alternatives.log /var/log/apache2/ /var/log/apt/ /var/log/auth.log /var/log/bootstrap.log /var/log/btmp /var/log/chkrootkit/ /var/log/couchdb/ /var/log/daemon.log /var/log/debug /var/log/diamond/ /var/log/dpkg.log /var/log/dradis/ /var/log/elasticsearch/ /var/log/exim4/ /var/log/faillog /var/log/filebeat/ /var/log/firebird/ /v[……]
「rsyslog」- 日志服务
日志发送及处理流程
1)应用程序使用 syslog 协议,发送日志到 rsyslog 服务,并发送设备及优先级; 2)当 rsyslog 服务收到日志后,根据设备与优先级,将日志写入到不同文件中;
第一步、发送日志到服务
使用 logger 命令可以向 rsyslog 服务发送日志:
# 从命令行写入日志
logger -p local7.notice “testing”
local7:设备,还有其他设备 notice:优先级,还有其他优先级 “testing”:日志内容
第二步、将日志写入文件
至于日志将被写入哪个文件,需要在 /etc/rsyslog.conf 中配置。多数发行版支持 /etc/rsyslog.d/*.conf 配置文件。
配置文件的格式如下:
# 将设备 local7,优先级 notice 日志写入 /var/log/misc.log 中
local7.notice /var/log/misc.log
# 到设备 local7 的所有消息,都不要写入 /var/log/misc.log 中
local7.none /var/log/misc.log
# 到设备 local5 的所有消息,部分优先级,全部写入 /var/log/local5.log 中
local5.* /var/log/local5.log
可用的日志设备
日志设备定义在 /usr/include/sys/syslog.h 文件中,用户不能够随便定义设备名称,参考 rsyslog.conf(5) 手册。
可用的日志优先级
编码
优先级
严重性
0
emerg
系统不可用。该日志消息将写入用户终端中。
1
alert
必须立即采取措施
2
crit
严重状况
3
err
非严重错误状况
4
warning
警告状况
5
notice
非常但重要的事情
6
info
信息性事件
7
debug
调试级别消息
注意事项
某些应用程序不使用 rsyslog 服务,而直接将日志写入 /var/log 目录中。比如 Samba 将日志写入 /var/log/samba/ 目录。[……]
「CentOS 7」- Journald
内容简介
本文介绍在CenOS 7中如何使用Journald服务以及journalctl命令进行日志管理。
持久化日志
需要修改/etc/systemd/journald.conf配置文件中[Journal]部分的Storage属性。
在CentOS Linux release 7.4.1708 (Core)中,默认Storage=auto配置。还可以配置为:
# “volatile”,将日志存储在内存中,即/run/log/journal目录,如果有必要会自动创建。
# “persistent”,日志将保存在磁盘中,即/var/log/journal目录,如果有必要会自动创建。但是,如果在启动期间磁盘不可写,比如无法成功创建/var/log/journal目录,那依旧会写入/run/log/journal目录,如果有必要会自动创建。
# “auto”,类似于”persistent”属性,但是不会自动创建/var/log/journal目录,因此目录/var/log/journal的存在与否,决定了日志的写入位置。
# “none”,关闭所有的存储,接收到的所有日志数据将被丢弃。将被转发到其他的目标,比如控制台、内核日志缓冲,syslog服务等等。
而”auto”是默认值。所以想要持久化日志,执行如下命令即可:
#!/bin/sh
# 创建目录
mkdir /var/log/journal
# 使用systemd中定义的指令进行初始化
systemd-tmpfiles –create –prefix /var/log/journal
# 重启以生效
systemctl restart systemd-journald
清理日志
可以使用–vacuum-size=选项与–vacuum-time=选项清理日志,但是这只能用于清理归档的日志:
#!/bin/sh
# 查看日志使用空间,包括归档与活跃的日志
journalctl –disk-usage
# 根据时间及大小清理日志
journalctl –vacuum-time=10d
journalctl –vacuum-size=2G
参考文献
manpath.be/journald.conf How do I display log messages from previous boots under CentOS 7? Clear systemd journal[……]