OS / Linux
文章平均质量分 69
介绍 Linux 相关知识。
Ruo_Xiao
己所不欲,勿施于人。
展开
-
Linux / ld 和 ld.so 命令的区别
而命令 ld.so 相应的配置文件是 /etc/ld.so.conf,这是个文本文件,里面可以增加修改 so 库的搜索路径(与windows下是有区别的,windows下动态库是先搜索当前目录,再去环境变量 PATH 中搜索,再到系统路径下去搜索),当然也可以通过定义一个 $LD_LIBRARY_PATH 的环境变量来指定运行时的搜索路径。ld 链接器,它的生命周期是发生在 compile-time 的,它的一些参数是编译时期 gcc 给传递的。比如,指定需要链接什么库。原创 2023-02-15 14:14:29 · 717 阅读 · 0 评论 -
Linux 中,profile 文件中 umask 022 的含义
在 Linux 的 profile 文件中,包含以下语句。umask 决定目录和文件被创建时得到的初始权限,“022”时初始权限为“rwxr-xr-x”,即“755”。1、查看 umask 的值。2、设置 umask。转载 2023-02-02 11:04:11 · 1459 阅读 · 0 评论 -
linux / lsusb
USB 现在已经拥有超过 30 亿端口的年出货量,是迄今为止最常用的接口技术,笔记本电脑、平板电脑、智能手机和其他各种设备都依赖于这种技术来进行功率和数据传输。今天 USB 已经远远超出其最初提供的功能,所支持的数据速率和功率水平都提高了几个数量级。USB,是英文 Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,早期用于规范电脑与外部设备的连接和通讯。命令对你的系统上的 USB 设备做一个诊断。会显示连接到 USB 总线上的设备信息和驱动信息。下面介绍如何理解输出。转载 2023-02-02 10:58:21 · 309 阅读 · 0 评论 -
linux / Generic Netlink
Genetlink 消息是命令驱动式的,即每一条消息的 genlmsghdr 中都指明了当前消息的 cmd 消息命令,这些消息 cmd 命令由用户自行定义。由于 netlink 协议最多支持 32 个协议簇,目前 Linux4.1 的内核中已经使用其中 21 个,对于用户需要定制特殊的协议类型略显不够,而且用户还需自行在 include/linux/netlink.h 中添加簇定义,但有时不方便,为此 Linux 设计了这种通用 Netlink 协议簇,用户可在此之上定义更多类型的子协议。原创 2023-01-30 15:49:35 · 1272 阅读 · 1 评论 -
Linux / struct stat 结构体简介
若一目录具有 sticky 位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或 root 来删除或改名,在 linux 中,最典型的就是这个 /tmp 目录啦。这两个方法区别:stat 没有处理字符链接(软链接)的能力,如果一个文件是符号链接,stat 会直接返回它所指向的文件的属性;两个函数的第一个参数都是文件的路径,第二个参数是 struct stat 的指针。struct stat 这个结构体是用来描述一个 linux 系统文件系统中的文件属性的结构。转载 2023-01-28 14:21:53 · 615 阅读 · 0 评论 -
Linux 中三种引号(单引号、双引号、反引号)的区别
单引号可保证其内部所有字符不被 shell 解析,如单引号与 grep、sed、awk 命令配合使用,则单引号内部字符将直接发送给 grep、sed、awk 命令进行正则表达式的解析。第一条命令使用了双引号,允许 shell 对转义符进行解析,shell 把四个 \ 解析成 2 个 \ 传递给grep,grep 再把 2 个 \ 解析成一个 \ 查找;反引号的功能是命令替换,在反引号(``) 中的内容通常是命令行,程序会优先执行反引号中的内容,并使用运行结果替换掉反引号处的内容。转载 2023-01-16 13:26:06 · 12362 阅读 · 0 评论 -
Linux / grep 中的正则表达式
Linux 附带有 GNU grep 命令工具,它支持扩展正则表达式 extended regular expressions,而且 GNU grep 在所有的 Linux 系统中都是默认有的。放在括号内的表达式,即包在 "[:" 和 ":]" 之间的字符类的名字,它表示的是属于此类的所有字符列表。2、你可以仅仅只搜索出以单词 sys 开始的行,即不显示 systemd 等。你可以分别使用 ^ 和 $ 符号来正则匹配输入行的开始或结尾。2、搜索大小写任意的 vivek(即不区分大小写的搜索)转载 2023-01-16 11:34:04 · 1228 阅读 · 0 评论 -
linux / proc
由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取 proc 文件时,proc 文件系统是动态从系统内核读出所需信息并提交的。进程所打开的每个文件都有一个符号连接在该子目录里,以文件描述符命名,这个名字实际上是指向真正的文件的符号连接,(和 exe 记录一样)。请注意 pwd 命令通常是 shell 内置的,在这样的情况下可能工作得不是很好(casper 注: pwd 只能显示 /proc/20/cwd, 要是想知道它的工作目录,直接 ls -al /proc/20 不就好了)。原创 2023-01-16 07:11:14 · 532 阅读 · 2 评论 -
如何判断 Linux下 网卡是虚拟还是物理网卡?
ifconfig 命令可以查看 Linux 系统中正在使用的网卡,包括物理网卡和虚拟网卡,如果想要查看Linux 系统中全部的网卡,可以查看 /proc/net/dev 文件,那如何区分网卡是虚拟还是物理的呢?这些目录就代表的是虚拟网卡对应的目录。不过是做了 bond 还是通过 brctl 添加的,都会把相应的网卡名添加到这个目录。查看 /sys/devices/virtual/net/ 这个文件。转载 2023-01-12 17:32:46 · 1573 阅读 · 0 评论 -
Linux 中 Shell -- /sbin/nologin 的理解
举例来说,在各个系统账号中,打印作业有 lp 这个账号管理,www 服务器有 apache 这个账号管理,它们都可以进行系统程序的工作,但就是无法登录主机而已。在 Linux 系统中,shell 解析器分为多种,其中我们常用的 shell 解析器为 /bin/bash、/bin/sh。系统账号的 shell 使用 /sbin/nologin,此时无法登录系统,即时给了密码也不行。在这些 shell 里,有一个特殊的 shell -- /sbin/nologin。3、修改 test 用户的密码。原创 2023-01-05 17:36:13 · 2276 阅读 · 0 评论 -
最全面的 linux 信号量解析
在做这个之前,要确定所有对这个有名信号量的引用都已经通过 sem_close() 函数关闭了,然后只需在退出或是退出处理函数中调用 sem_unlink() 去删除系统中的信号量,注意如果有任何的处理器或是线程引用这个信号量,sem_unlink() 函数不会起到任何的作用。字创建一个新的 IPC 结构。由于有名信号量的值是保存在文件中的,所以对于相关进程来说,子进程是继承了父进程的文件描述符,那么子进程所继承的文件描述符所指向的文件是和父进程一样的,当然文件里面保存的有名信号量值就共享了。转载 2022-12-29 17:00:22 · 6020 阅读 · 2 评论 -
MMU 和 IOMMU
(2)如果将这个物理设备通过透传的方式进入到虚拟化虚拟机里,虚拟机的设备驱动配置设备的DMA 后,hypervisor 必须在透传设备 DMA 访问时刻,对 DMA 访问进行截获,将其中 DMA 访问的虚拟机物理地址,转换为 hypervisor 为虚拟机分配的物理地址,也就是需要将虚拟机透传设备DMA 访问做 vpaddr(虚拟机物理地址)----> ppaddr(物理机物理地址)。)即转换快表,又简称快表,可以理解为 MMU 内部专用的存放页表的 cache,保存着最近使用的 PTE 乃至全部页表。转载 2022-11-09 19:07:38 · 4118 阅读 · 0 评论 -
了解 OVS
在 OVS 中,ovs-vswitchd 从 OpenFlow 控制器获取流表规则,然后把从 datapath 中收到的数据包在流表中进行匹配,找到匹配的 flows 并把所需应用的 actions 返回给datapath, 同时作为处理的一部分,ovs-vswitchd 会在 datapath 中设置一条 datapath flows 用于后续相同类型的数据包可以直接在内核中执行动作,此 datapath flows 相当于 OpenFlow flows 的缓存。关于 datapath,转载 2022-10-24 18:11:52 · 1500 阅读 · 0 评论 -
关于 Hypervisor的理解
这与操作系统级虚拟化技术不同,该技术让所有的实例共享一个内核(所谓操作系统级虚拟化技术就是指容器),即使 guest operating system 能够在 user space 不同,例如有同样的内核的 Linux distribution。Xen 的实现方法是运行支持Xen 功能的 kernel,这个 kernel 是工作在 Xen 的控制之下,叫做 Domain0,使用这个 kernel 启动机器后,你可以在这个机器上使用 qemu 软件,虚拟出多个系统。相比较,KVM 就简化的多了。原创 2022-10-21 14:03:16 · 3929 阅读 · 0 评论 -
vagrant 说明
Vagrant 是基于 Virtualbox 的虚拟机来构建你的开发环境,而 Docker 则是基于 LXC(LXC) 轻量级容器虚拟技术。当你添加一个 box 时,Vagrant 会打开它并内部存储,原始的 .box 文件是不被保留的。此命令是用于将已安装的 box 重新打包为 .box 文件。指定 box 的名字、提供者、版本号需要可通过 vagrant box list 命令检索到。Docker 就是在内核容器技术(Cgroup 和 Namespace)的基础上,提供了一个更高层的控制工具。原创 2022-10-18 07:27:30 · 368 阅读 · 0 评论 -
linux / dbus
1、列出所有的 dbus 服务。2、如何列出系统服务的接口。原创 2022-10-17 17:12:18 · 1100 阅读 · 0 评论 -
Linux / 线程绑定到 CPU 指定核心
如果当前 pid 所指定的进程此时没有运行在 mask 所指定的任意一个 CPU 上,则该指定的进程会从其它 CPU 上迁移到 mask 的指定的一个 CPU 上运行。该函数获得 pid 所指示的进程的 CPU 位掩码,并将该掩码返回到 mask 所指向的结构中,即获得指定 pid 当前可以运行在哪些 CPU 上。如果 pid 的值为 0,则表示指定的是当前进程,使当前进程运行在 mask 所设定的那些 CPU 上。该函数设置进程为 pid 的这个进程,让它运行在 mask 所设定的 CPU 上。转载 2022-10-12 09:36:41 · 521 阅读 · 0 评论 -
Linux inotify功能及原理(inotify_init、inotify_add_watch、inotify_rm_watch、read)
一、inotify 主要功能它是一个内核用于通知用户空间程序文件系统变化的机制。开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如 hotplug、udev 和 inotify 就是这种需求催生的。inotify 是文件系统变化通知机制,在监听到文件系统变化后,会向相应的应用程序发送事件。转载 2022-10-12 09:07:09 · 878 阅读 · 0 评论 -
printf、fprintf 和 freopen() 进行重定向
所谓流,通常是指程序输入或输出的一个连续的字节序列,设备(例如鼠标、键 盘、磁盘、屏幕、调制解调器和打印机)的输入和输出都是用流来处理的,在 C 语言中,所有的流均以文件的形式出现 —— 不一定是物理磁盘文件,还可以是对应于某个输入/输出源的逻辑文件。当调试信息的量比较大,需要一些时间或者其他辅助工具来搜索过滤时,仅仅利用显示屏幕来输出调试信息是不够的,这时我们经常将这些信息输出到所谓的日志文件(log)中,之后再仔细的分析log文件来发现问题。不过,我们这里推荐使用的并不是初学 C 语言时使用的函数。转载 2022-09-28 15:03:12 · 763 阅读 · 0 评论 -
fopen 与 open 的区别
如果从文件 IO 的角度来看,open 属于低级 IO 函数,fopen 属于高级 IO 函数,低级和高级的简单区分标准是:谁离系统内核更近,低级文件 IO 运行在内核态、高级文件 IO 运行在用户态。open 返回文件描述符,而文件描述符是 unix 系统下的重要概念,unix 下的一切设备都是文件的形式操作,如网络套接字、硬件设备等、当然包括操作普通正规文件(Regular File)。open 是 unix 系统调用函数(包括 Linux),返回的是文件描述符,它是文件描述符表里的索引。转载 2022-09-28 10:39:20 · 269 阅读 · 0 评论 -
linux 中 systemctl 详细理解及常用命令
systemd 是 Linux 系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。.service 文件定义了一个服务,分为[Unit]、[Service]、[Install] 三个小节。restart:立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思。.wants文件定义了要执行的文件集合,每次执行,.wants文件夹里面的文件都会执行。主要有四种类型文件.mount、.service、.target、.wants。转载 2022-09-27 16:12:19 · 1805 阅读 · 0 评论 -
Docker 内核技术原理之 Namespace
Docker 的空间隔离使用的是 namespace(命名空间),它是内核提供的一种空间隔离,在一个空间下,每个进程看到的视图是一致的,相应的如果不在一个空间下看到资源视图是不一致的。从字面理解是创建一个命名空间的意思,这是由于历史原因导致的,因为Mount Namespace 是第一个 namespace,内核的开发者可能也没有预料到后续还有其它的namespace 的加入,所以就先把 CLONE_NEWNS 给占用了。可见,namespace 的隔离其实并不充分,除了上面的隔离能力,其他的都一样。转载 2022-09-26 14:31:05 · 434 阅读 · 0 评论 -
浅谈 dup 和 dup2 的用法
如上,这里没有像使用 dup 的时候显示的调用 write 函数将标准输入的内容写入到指定文件中,而是将标准输出重定向到指定文件中,然后调用 printf 函数将标准输出的内容重定向到指定文件中。如上打开一个文件,我们先写入文件内容“hello fd”,然后将 fd 的描述符拷贝到 dup_fd 的文件描述符上,然后将标准输入的内容写入到 dup_fd 的文件中。关于 dup 函数,当我们调用它的时候,dup 会返回一个新的描述符,这个描述一定是当前可用文件描述符中的最小值。且其是一种原子操作。转载 2022-09-23 15:40:13 · 3336 阅读 · 0 评论 -
deb包安装 / 卸载/升级时,preinst、postinst、prerm、postrm 的执行顺序
因需要将自己的应用打包为 deb 包,在考虑到安装、卸载、升级不同场景下进行测试,总结 DEBIAN 路径下的控制文件执行如下:1、首次安装某 deb 包时,执行 dpkg -i test_v1.deb 安装,DEBIAN 下面控制脚本按如下顺序执行:。2. 若卸载 deb,但保留配置档,执行 dpkg -r test,DEBIAN 下面控制脚本按如下顺序执行:。3. 若卸载不保留配置档,执行 dpkg -P test,DEBIAN 下面控制脚本按如下顺序执行:。转载 2022-09-17 09:25:01 · 3808 阅读 · 0 评论 -
SIGINT、SIGKILL、SIGTERM 信号区别
产生结果: 当前进程收到该信号,注意该信号时无法被捕获的,也就是说进程无法执行信号处理程序,会直接发送默认行为,也就是直接退出。由于 SIGINT、SIGTERM 都是可以被捕获的,也就是会执行信号处理函数的,故按照信号处理函数逻辑,可能进程不会退出,即不一定能终止,所以要处理好 exit(0)。产生结果:当前进程会收到信号而其子进程不会收到。与 SIGKILL 的不同:SIGTERM 可以被阻塞、忽略、捕获,也就是说可以进行信号处理程序,那么这样就可以让进程很好的终止,允许清理和关闭文件。转载 2022-09-16 13:58:39 · 1219 阅读 · 0 评论 -
OS / linux / passwd 文件和 shadow 文件
现在的 Unix / Linux 系统中,口令不再直接保存在 passwd 文件中,通常将 passwd 文件中的口令字段使用一个“x”来代替,将 /etc/shadow 作为真正的口令文件,用于保存包括个人口令在内的数据。通常在 Linux 系统中,用户的关键信息被存放在系统的 /etc/passwd 文件中,系统的每一个合法用户账号对应于该文件中的一行记录。此外,需要注意的是,如果 passwd 字段中的第一个字符是“*”的话,那么,就表示该账号被查封了,系统不允许持有该账号的用户登录。转载 2022-09-15 18:32:37 · 1483 阅读 · 0 评论 -
date 命令详解
date -d "-1 day" +%Y%m%d # 显示后一天的日期。$ date -d "-1 year" +%Y%m%d # 显示前一年的日期。$ date -d "-1 month" +%Y%m%d # 显示上一月的日期。$ date -d "+1 month" +%Y%m%d # 显示下一月的日期。$ date -d "+1 year" +%Y%m%d # 显示下一年的日期。字符串前后必须加上双引号;转载 2022-08-21 10:16:24 · 16086 阅读 · 0 评论 -
libudev 使用说明书
创建一个新的monitor,函数的第二个参数是事件源的名称,可选"kernel"或"udev"。基于"kernel"的事件通知要早于"udev",但相关的设备结点未必创建完成,所以一般应用的设计要基于"udev"进行监控。调用udev_device_get_action可以获得一个字符串"add"或者"remove",以及"change","online","offline"等,但后三个未知什么情况下会产生。增加一个基于设备类型的udev事件过滤器,例如"block"设备。...............转载 2022-07-29 17:10:48 · 929 阅读 · 0 评论 -
Linux / 用户态和内核态的切换耗费时间的原因
系统调用一般都需要保存用户程序得上下文(context),在进入内核的时候需要保存用户态的寄存器,在内核态返回用户态的时候会恢复这些寄存器的内容。这是一个开销的地方。因此,如果一个程序需要从用户态进入内核态,那么它必须执行系统调用语句。当int中断执行时就会由用户态栈转向内核态栈,系统调用时需要进行栈的切换,而且内核代码对用户不信任,需要进行额外的检查。当程序中有系统调用语句,程序执行到系统调用时,首先使用类似int80H的软中断指令,保存现场,去系统调用,在内核态执行,然后恢复现场,...转载 2022-07-25 18:51:00 · 1250 阅读 · 0 评论 -
两个结构体 ifconf 和 ifreq
所以我们需要在程序开始时对ifconf的ifc_len和ifc_buf进行初始化,接下来使用ioctl获取所有接口信息,完成后ifc_len内存放实际获得的接口信息总长度并且信息被存放在ifc_buf中。用ioctl获得本地IP地址、MAC地址或者子网掩码时要用到两个结构体ifconf和ifreq,它们对于大多数人来说都是比较陌生的,这里给大家一种比较简单的理解方法,当然只一种帮助。ifc_len表示用来存放所有接口信息的缓冲区长度。......转载 2022-07-16 14:07:01 · 2877 阅读 · 0 评论 -
深入分析 LD_PRELOAD
是 系统的一个环境变量,它影响程序的运行时的链接(Runtime linker),它允许在程序运行前定义优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。1、程序的链接程序的链接可以分为以下三种静态链接库,在 Linux 下文件名后缀为 ,如 。在编译链接时直接将目标代码加入可执行程序。动态链接库,在 Linux 下是 文件,在编译链接时只需要记录需要链接的号,运行程序时才会进行原创 2022-07-13 06:25:42 · 9118 阅读 · 0 评论 -
辨别 Linux 下的 >、>>、>& 与 &> 以及反弹 shell 语句的理解
今天看到在 Linux 中反弹 shell 时,对常用的反弹 shell 语句产生了好奇。其实理解它最关键的地方还是在与对于几个看上去相似的符号的理解。我写下来对于它们的看法,不对的地方请大家帮忙斧正。有三种标准的文件描述符:还可以自己定义文件描述符,可以用于交换输出流。详见:bash - What does "3>&1 1>&2 2>&3" do in a script? - Unix & Linux Stack Exchange > 用于将标准输出重定向至文件。>> 和 > 相比的区别在于:转载 2022-07-12 06:33:08 · 3985 阅读 · 0 评论 -
linux / dev、devfs、udev 和 sysfs 关系
sysfs 把连接在系统上的设备和总线组织成为一个分级的文件,它们可以被从用户的空间存取到。简单介绍 sysfs 文件系统,您可能想知道 sysfs 是怎么认出系统中存在的设备以及应该使用什么设备号。对于已经编入内核的驱动程序,当被内核检测到的时候,会直接在 sysfs 中注册其对象;对于编译成模块的驱动程序,当模块载入的时候才会这样做。一旦挂载了 sysfs 文件系统(挂载到 /sys),内建的驱动程序在 sysfs 注册的数据就可以被用户空间的进程使用,并提供给 udev 以创建设备节点。1、sysfs转载 2022-07-05 06:42:49 · 519 阅读 · 0 评论 -
linux / 字符设备和块设备区别
Linux 中 I/O 设备分为两类:字符设备和块设备。两种设备本身没有严格限制,但是,基于不同的功能进行了分类来。(1)字符设备提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节自 / 字符来读写数据。举例来说,键盘、串口、调制解调器都是典型的字符设备。(2)块设备应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘、软盘、CD-ROM 驱动器和闪存都是典型度的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写知只能以块(通常是 512转载 2022-07-04 06:37:25 · 398 阅读 · 0 评论 -
Linux变量的定义、赋值、查看、删除(export、echo、unset)
概念:变量就是一个字符串,可以指向一个内容,该内容可以是路径、命令、数字、字符串等...变量的分类:环境变量:或者叫做全局变量。自定义变量:或者叫做局部变量。下面是一个演示案例:$LANG 内容为 en_US.UTF-8,则 var="lang is $LANG" 等价于 var="lang is en_US.UTF-8" (SAW:Game Over!)...转载 2022-06-24 16:11:19 · 6981 阅读 · 0 评论 -
Linux 命令中的 $() 和 ${} 的区别
小括号里面是 Linux 命令,作用就是执行里面的命令后返回执行的结果;和 ``(反引号)作用一样。 与 ``(反引号)都是用来作命令替换的。命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。栗子:意思是执行 date 命令,返回执行结果给变量 todaydate,也可以写为: 比如: 其实是要执行 里面的命令 ,然后用执行的结果替换 内容。 等价于: 变量替换,大括号里面是变量,取变量的值替换 。一般情况下, 与 是没有区别的,但是用转载 2022-06-24 15:59:48 · 3008 阅读 · 0 评论 -
Linux 函数调用劫持的方法总结(带图)
Ring3中劫持Ring0中劫持Kernel Inline Hooksyscall table 修改内核调试机制 Kprobe在 Linux 中,动态库加载的时候,会按照以下顺序进行搜索:方法原理:通过 LD_PERELOAD 定义在程序运行前优先加载的动态链接库为自己编写的动态库。例子:劫持 gets() 函数设置 LD_PRELOAD 编写一个测试程序 test.c 函数调用劫持效果 2.1、Kernel Inline Hook原理:一个系统调用会调用子函数的,这是通过段内偏移的方式完成转载 2022-06-24 07:34:07 · 937 阅读 · 0 评论 -
linux中 popen 和 system 区别和联系
(SAW:Game Over!)转载 2022-06-21 07:18:07 · 697 阅读 · 0 评论 -
linux / in_addr 的用法
一、原型结构体 in_addr 用来表示一个 32 位的 IPv4 地址。in_addr_t 一般为 32 位的 unsigned int,其字节顺序为网络顺序(network byte ordered),即该无符号整数采用大端字节序 。其中每 8 位代表一个 IP 地址位中的一个数值。例如 192.168.3.144 记为 0xc0a80390,其中 c0 为192,a8 为 168,03 为 3,90 为 144打印的时候可以调用 inet_ntoa() 函数将其转换为 char * 类型。转载 2022-06-20 18:05:01 · 3550 阅读 · 1 评论 -
linux shell 进制转换
2、16 进制转 10 进制:0xf > 153、16 进制转 8 进制:0xF > 17(SAW:Game Over!)原创 2022-06-20 17:53:57 · 208 阅读 · 0 评论