
Linux开发
文章平均质量分 50
Linux开发
优惠券已抵扣
余额抵扣
还需支付
¥99.90
¥299.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
风静如云
这个作者很懒,什么都没留下…
展开
-
Linux:通过ssh实现端口转发
通过以下命令查看进程号。原创 2025-04-18 11:10:23 · 66 阅读 · 0 评论 -
Nginx:通过upstream进行代理转发
注:还有很多参数可以描述server,比如:max_fails,fail_timeout,backup,down等,可以帮助更灵活的使用upstream。有的时候需要将不同的http请求转发到不同的后端http服务器上,以便完成不同的业务模块封装或者负载均衡,这时可以使用upstream进行代理转发。通过server指定后端http服务器,可以看到可以定义多个server,如果按照上例的方式,那么多个后端http服务器会被不同的请求轮询调用。#优先分给负载低的后端http服务器。原创 2025-01-19 20:29:36 · 298 阅读 · 0 评论 -
Linux(openssl):用CA证书签名具有SAN和KeyUsage的CSR
3.1创建目录sign_csr_with_san_keyusage。而签名CSR时也经常需要带上key usage,那么如何实现呢?3通过CA签CSR with SAN and Key usage。3.4查看证书的key usage。介绍了签名CSR时如果带上SAN。3.3用CA证书签名。原创 2024-12-04 10:26:45 · 386 阅读 · 0 评论 -
Systemd: disable和mask的区别
Mask命令的优势在于,它提供了一种更为彻底的方式来阻止服务的运行,从而避免了任何潜在的干扰或冲突。然而,这也意味着,一旦服务被屏蔽,除非进行额外的配置或修改,否则它将无法被重新启动。其作用是切断/etc/systemd/system中指向/lib/systemd/system的链接,从而禁止该服务开机启动,但是依然可以通过手动的方式启动该服务。其作用是将/etc/systemd/system中的服务链接到/dev/null,从而阻止服务通过自动或手动的方式进行启动。原创 2024-11-13 18:02:08 · 201 阅读 · 0 评论 -
Systemd:/etc/systemd/system和/lib/systemd/system的区别
如果在两个目录下有相同的Unit文件,那么位于/etc/systemd/system下的高优先级的Unit文件将起作用。/etc/systemd/system目录下的Unit文件的优先级高于/lib/systemd/system。两个目录下的Unit文件都可以被systemctl进行start或stop。只有位于/etc/systemd/system目录下的Unit才会开机启动。那么这两个目录在使用时有什么区别呢?下的配置文件,很多都是一个指向了。1.systemctl的操作范围。原创 2024-11-13 13:50:47 · 534 阅读 · 0 评论 -
Systemd:tmpfiles
如果文件或子目录的最后使用时间与当前系统时间之差大于“寿命”字段的值,那么这些文件或子目录将被删除,此字段的值是一个时间长度,可以使用下面的时间单位后缀: us(微秒)、ms(毫秒)、s(秒)、m(分)、h(时)、d(天)、w(周)。如果系统管理员想要屏蔽 /usr/lib/tmpfiles.d 目录中的某个配置文件,最佳做法是在 /etc/tmpfiles.d 目录中创建一个指向 /dev/null 的同名符号链接,即可彻底屏蔽 /usr/lib/tmpfiles.d 目录中的同名文件。原创 2024-11-08 21:35:28 · 276 阅读 · 0 评论 -
Systemd:Timer
一旦定时器触发,systemd 将启动与该定时器关联的 .service 单元,从而执行预定的任务。为什么需要启动one.service呢,这是因为OnUnitActiveSec的含义是:Unit上次执行后,等多久再次执行,如果one.service还没被执行过,one.timer是不会定时调用one.service的。注1:可以在.timer里指定Unit,也就是定时到时后需要执行的service,但如果不指定,那么默认会执行和timer同名的service,也就是one.service。原创 2024-11-08 15:38:05 · 195 阅读 · 0 评论 -
System:oneshot类型的service
有的时候,某个进程只在特殊的情况下运行一下即可,不需要一直以服务的形式待命,这种情况下,可以设置service的type为oneshot,然后设置RemainAfterExit=yes。这样设置的service,即使在其进程启动完成之后退出了,systemd 也仍然会认为这个服务还在运行中,将此服务视为活动(active)状态。可以看到进程已经退出了,但是service还是出于active的状态,这样的话,一旦使用。指定的命令就会执行,从而重新开启触摸板。原创 2024-10-21 21:45:19 · 267 阅读 · 0 评论 -
Systemd:控制基于依赖服务状态的启动顺序
可以看到systemd先启动test_log,当test_log通过sd_notify通知systemd其ready后,systemd才会启动test_vlog。介绍了启动顺序和依赖,但是这里面有个问题就是,无法控制依赖服务(test_log)确认其完成启动后(ready),再启动依赖于他的服务(test_vlog)//test_log.service (加入Type=notify)//test_vlog.service (没有变化):当前服务启动完毕,会通过sd_notify通知。原创 2024-10-21 20:58:17 · 232 阅读 · 0 评论 -
Systemd:控制服务的启动顺序和依赖关系
但是基于journal log目前无法看出启动顺序,实际上systemd会首先启动test_log然后再启动test_log,但是需要注意的是,这只保证了调用顺序,不保证test_log启动到了什么状态后再启动test_vlog。可以看到在test_log处于已启动的状态下,重启test_vlog不会对test_log有什么影响。启动了test log和test vlog,这是因为test vlog依赖于test log。只启动了test_vlog,这是因为其依赖的test_log当前已经处于了启动状态。原创 2024-10-20 21:32:25 · 547 阅读 · 0 评论 -
Systemd: service传递进程参数
10月 20 14:07:54 xxx-VirtualBox test_log[7014]: argc:3 is test_log.service。10月 20 14:27:31 xxx-VirtualBox test_log[7251]: argc:3 is bye@:88。10月 20 14:24:14 xxx-VirtualBox test_log[7197]: argc:1 is 1。介绍了如何通过service启动一个服务进程,在实际应用中,有的时候需要传递一些参数给进程,那么该如何传递呢?原创 2024-10-20 14:32:10 · 331 阅读 · 0 评论 -
Systemd:通过journalctl查看log
journalctl -u nginx.service -u php-fpm.service --since today # 合并显示多个 Unit 的日志。$ sudo journalctl -o json #单行输出。$ sudo journalctl -o json-pretty #多行输出。(默认情况下 ,只保存本次启动的日志)(及其以上级别)的日志,共有8级。的日志(需更改设置)原创 2024-10-19 20:38:31 · 193 阅读 · 0 评论 -
Systemd:Unit配置文件
Systemd是Linux的核心守护进程,其功能十分强大,可以管理多种类型的资源,每种资源被称为一个systemd unit,每个unit都需要一个配置文件,该文件的后缀名与资源是一致的。注:Target可以认为是一组Unit,启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit,也是一个通用区块,配置的目标模块通常是特定运行目标的 .target 文件,用来使得服务在系统启动时自动运行。注3:Requires属于强依赖,如果依赖项启动失败或异常退出,那么本Unit也无法启动。原创 2024-10-19 16:25:30 · 277 阅读 · 0 评论 -
Systemd:简介
Systemd是linux系统的守护进程,它要管理正在运行的 Linux 主机的许多方面,包括挂载文件系统、管理硬件、处理定时器以及启动和管理生产性主机所需的系统服务。lrwxrwxrwx 1 root root 20 11月 22 2023 /sbin/init -> /lib/systemd/systemd。可以看到systemd实际上是linux系统的第一个进程,其他进程都是他的子进程。详细信息,请参考官方文档。Systemd的架构。原创 2024-10-19 16:13:21 · 223 阅读 · 0 评论 -
Systemd:systemctl 命令
Target 就是一个 Unit 组,包含许多相关的 Unit。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。2.1.5列出所有正在运行的、类型为 service 的 Unit。2.1.2列出所有Unit,包括没有找到配置文件的或者启动失败的。2.4.2列出一个 Unit 的所有依赖,并展开所有target。2.7.2查看一个 Target 包含的所有 Unit。2.2.2显示远程主机的某个 Unit 的状态。2.3.2显示某个 Unit 的指定属性的值。原创 2024-10-19 15:18:37 · 468 阅读 · 0 评论 -
Systemd:管理进程的加载过程的service配置文件
启动服务时等待的秒数,这一配置对于使用 Docker 容器而言显得尤为重要,因其第一次运行时可能需要下载镜像,严重延时会容易被 Systemd 误判为启动失败杀死。:启动当前服务的命令,可以带有启动参数,比如上例中的:ExecStart=/usr/sbin/sshd -D $SSHD_OPTS。:停止服务时的等待秒数,如果超过这个时间仍然没有停止,Systemd 会使用 SIGKILL 信号强行杀死服务的进程。:指定加载一个包含服务所需的环境变量的列表的文件,文件中的每一行都是一个环境变量的定义。原创 2024-10-19 14:03:39 · 196 阅读 · 0 评论 -
Linux开发:ELF中的段和节的区别
也就是说节是程序在编译后,分类划分的一些区域,用于保存代码的就是代码节(.text),保存已初始化的全局数据的就是全局数据节(.data),保存只读数据的就是只读数据节(.data),保存未初始化的全局数据的就是.bss,节的分类比较细致,实际的程序中有很多节。其实节的概念就是我们常说的段,是根据不同功能组织的分类,比如:代码段(节),全局数据段(节),只读数据段(节),.bss段(节)...[号] 名称 类型 地址 偏移量。原创 2024-09-08 12:08:23 · 240 阅读 · 0 评论 -
Linux工具:objdump
4.显示某段的具体信息:objdump --section=.data -s file_path。./c_symbol: 文件格式 elf64-x86-64。./c_symbol: 文件格式 elf64-x86-64。5.显示动态符号表信息:objdump -T file_path。1.查看符号表信息:objdump -t file_path。./c: 文件格式 elf64-x86-64。./c: 文件格式 elf64-x86-64。原创 2024-09-07 12:52:09 · 269 阅读 · 0 评论 -
Linux工具:readelf
类型: DYN (Position-Independent Executable file)0x0000000000000001 (NEEDED) 共享库:[libstdc++.so.6]0x0000000000000001 (NEEDED) 共享库:[libc.so.6]Elf 文件类型为 DYN (Position-Independent Executable file)原创 2024-09-07 12:20:07 · 238 阅读 · 0 评论 -
GDB:加载符号表
如:strip --strip-debug --strip-unneeded c。介绍了调试coredump时需要通过-g编译程序,从而产生调试程序所需要的信息。如:objcopy --only-keep-debug c c_symbol。通过这种方式可以将符号表文件c_symbol 加回到可执行文件c。c_symbol: 文件格式 elf64-x86-64。c: 文件格式 elf64-x86-64。如:objcopy --strip-all c。可以看到又可以看到有意义的符号信息了。原创 2024-09-06 22:37:20 · 1106 阅读 · 0 评论 -
GDB:调试加载coredump文件
C/C++语言,程序编写不当,就会产生coredump,可以通过gdb进行调试,快速定位coredump的位置。使用两种方式均可以正确的加载core文件,通过以下方式可以快速的定位coredump。可以看到对空指针d进行复制,导致了coreddump。运行程序后,不出所料参数了coredump。可以通过两种方式加载core文件。原创 2024-09-06 22:07:52 · 322 阅读 · 0 评论 -
Linux工具:traceroute探测路由
其工作原理是:主机试图以最小的TTL存活时间(初次为1,后续依次增加)发出探测包,探索包经过路由器时,会将存活时间就会减1,当其存活时间为0时, 路由器会取消探测包的转发,并传送一个ICMP报文给源主机,并会在ICMP报文里包含路由器的IP,这样源主机就会获取依次所需经历的路由设备IP。-m, --max-hop=NUM 设置检测数据包的最大存活数值TTL的大小(default: 64)-g, --gateways=GATES 设置来源路由网关,最多可设置8个。原创 2024-09-02 23:02:25 · 903 阅读 · 0 评论 -
GDB:调试时传递参数
1.运行gdb时通过--args传递参数。2.在gdb中执行run的时候传递参数。3.在run之前通过set传递参数。可以看到参数传递到了程序中。同样参数传递到了程序中。原创 2024-08-24 20:36:32 · 632 阅读 · 0 评论 -
Linux开发:通过readlink读取软连接指向的文件
读取软连接后,保存在buf中的路径的长度,如果返回值长度与bufsiz相等,则代表buf的长度不够,发生了截断。如果输入参数pathname不是软连接,则返回0。buf:保存软连接指向路径的缓存。pathname:软连接的路径。bufsiz:buf缓存的大小。注:该函数不会自动在buf后面补0。可以看到读取到了连接指向的实际路径。原创 2024-08-24 20:14:29 · 258 阅读 · 0 评论 -
Ubuntu22.04:使用root用户
Ubuntu默认是不能使用root用户的,需要使用root权限时,可以通过sudo或sudo su。好处是只需输入当前用户的密码就可以。设置root的用户密码。原创 2024-07-21 21:52:33 · 1293 阅读 · 0 评论 -
Ubuntu22.04:安装Samba
mount时-o参数是可以分开提供的。设置用户xxx访问Samba的密码。3.将用户加入到Samba服务中。1.安装Samba服务。4.配置Samba服务。原创 2024-07-18 10:12:51 · 472 阅读 · 0 评论 -
Ubuntu22.04:安装并配置nfs
no_root_squash:root用户具有对根目录的完全管理访问权限。/nfsroot:指定/nfsroot为nfs服务器的共享目录。no_subtree_check:不检查父目录的权限。rw:挂接此目录的客户端对该共享目录具有读写权限。*:允许所有的网段访问,也可以使用具体的IP。mount完成后在/nfsroot下创建文件。可以看到test文件,说明mount成功了。如果需要指定nfs的版本可以通过。也可以通过mount命令进行查看。表示支持nfs3及nfs4。然后在nfs目录下查看。原创 2024-07-18 09:16:20 · 1983 阅读 · 0 评论 -
Linux开发:Ubuntu22.04安装libcurl4
libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证等,使用libcurl可以很方便的完成高层网络协议编程。原创 2024-07-14 18:40:43 · 906 阅读 · 0 评论 -
Linux开发:Fuse介绍
3.fuse daemon通过读取/dev/fuse将request从内核队列中取出,根据操作调用步骤1中注册的相应回调,也就是回调会具体处理对fuse文件系统的操作请求,当处理完请求后,fuse daemon会将reply通过/dev/fuse传递给fuse driver,此后fuse daemon把requset标记为completed,最终唤醒用户进程。通过fuse内核模块的支持,开发者只需要根据fuse提供的接口实现具体的文件操作时所对应的回调函数,就可以实现一个文件系统。原创 2024-07-13 16:42:07 · 500 阅读 · 0 评论 -
Linux开发:Ubuntu22.04安装Fuse3
解压缩fuse代码,将解压后的目录挪到/home目录(否则后面的测试无法通过)2.通过pip3安装pytest和looseversion。1.首先需要通过apt安装meson和ninja。原创 2024-07-13 00:36:59 · 1126 阅读 · 0 评论 -
Linux开发:进程件通过UDS传递内存文件句柄
通过UDS传递文件描述符,实际上是共享了同一个内核打开文件表项,所以也是共享文件的偏移量,所以上例中需要通过lseek重新设置偏移量,以便于服务器端读取数据。将两者相结合,就可以通过UDS传递一块内存文件句柄也就是内存数据。可以看到成功的传递了内存文件的内容。介绍了通过UDS传递文件描述符。介绍了如果创建一个内存文件。原创 2024-07-10 22:10:27 · 131 阅读 · 0 评论 -
Linux开发:通过memfd_create创建一个内存文件
lrwx------ 1 xxx xxx 64 7月 9 21:57 3 -> '/memfd:mem_file (deleted)'memfd_create提供了一个方法,可以在内存中创建一个匿名文件,但是这个文件在真实的文件系统中却不存在。3.文件的初始大小为0,但是可以通过write向文件中写入数据,或通过ftruncate设置文件的大小。4.函数返回的文件描述符与open返回的并无差异,因此可以通过mmap进行文件内存映射。2.函数返回的文件描述符默认已经设置了读写权限。name:文件的名字。原创 2024-07-10 21:55:27 · 627 阅读 · 0 评论 -
Linux开发:进程间通过Unix Domain Socket传递文件描述符
msg_iov和msg_iovlen,指向一个struct iovec类型的数组,用于要保存要传递的数据,由于没有实际的数据要传递,所以sendFd让其指向了一个空的struct iovec e = {NULL, 0};实际上当需要传递大量的数据时,可以通过UDS直接传递文件描述符,这样接收文件描述符的一方,可以直接从传递过来的文件描述符读取数据。这个宏可以传入要发送的控制信息的长度,获取包含控制信息头的完整长度,但不包含padding的长度。设置了msghdr的控制信息指向的地址,以及控制信息的长度。原创 2024-07-08 22:41:01 · 1344 阅读 · 0 评论 -
Linux开发:进程间通过Unix Domain Socket传递数据
2.客户端可以不bind,bind的目的是给客户端一个明确的UDS文件,这样服务器端可以接收到数据后,向客户端发送响应数据,如果不需要发送响应数据,那么客户端可以不bind,这中情况下服务器端接收到的数据源会是无效的,因为没有客户端sock文件。1.本例是通过类似UDP的 SOCK_DGRAM,也可以通过使用类似TCP的SOCK_STREAM,这种情况下与TCP通信是一样的,服务器端需要listen及accept,客户端需要connect。这两个sock文件是调用bind时创建的。原创 2024-07-06 21:24:50 · 492 阅读 · 0 评论 -
Linux开发:命名管道
Linux同时支持命名管道,与匿名管道的最大差别在于,匿名管道只能在父子进程间传递数据,命名管道则是通过一个FIFO文件可以在所有进程间进行数据传递。若文件当前没有被以写的方式打开,则以O_RDONLY打开时会阻塞;若文件当前没有被以读的方式打开,则以O_RWONLY打开时会阻塞;可以通过O_NONBLOCK指明为非阻塞打开。mode:管道文件的创建权限;程序不能以读写方法打开FIFO文件。可以看到通过命名管道,程序可以直接传递数据。参数:pathname:管道文件名称;2.打开FIFO文件。原创 2024-07-06 14:25:15 · 100 阅读 · 0 评论 -
Linux开发:fork进程时避免产生僵尸进程
由于wait/waitpid是阻塞函数,父进程不一定能找到合适的时机调用,这时可以采用两次fork的方式,这样子进程再fork出一个孙子进程,然后子进程立刻退出,这时孙子进程的父进程是子进程,而子进程已经退出了,所以孙子进程就会被标记为init进程的子进程,init进程会定时的回收子进程,因此就不会存在僵尸进程。可以看到进程5538的状态为Z+,这就代表进程为僵尸进程。1.通过wait/waitpid回收子进程。2.通过两次fork的方式。可以看到这种情况没有僵尸进程。可以看到已经没有僵尸进程了。原创 2024-07-02 21:43:01 · 244 阅读 · 0 评论 -
Linux编程:通过flock实现文件锁
这是因为通过flock加锁是加在了内核的打开文件表项上,所以通过fork或dup会让多个打开文件描述符指向了同一个文件表项,所以进程会继承锁。可以看到子进程是在1719759853退出的,而孙子进程是在1719759882解锁的。可以看到子进程于1719843246 释放锁后,m1即可获得锁,不需要父进程也释放锁。可以看到m1运行后一直等到1719759882,也就是孙子进程释放锁后,才获得了锁。可以说明孙子进程是继承了爷爷以及父进程的锁的。m1还是使用上例的代码,运行输出。先运行mian再运行m1。原创 2024-06-30 23:13:33 · 217 阅读 · 0 评论 -
Linux开发:多进程通过shm_open/mmap共享内存
用于在tmpfs挂载的/dev/shm目录下打开共享内存文件,由于默认的目录已经为/dev/shm,所以。:打开的文件操作属性:O_CREAT、O_RDWR、O_EXCL的按位或运算组合。介绍了通过SYS V的方式进行多进程间共享内存,这种方式属于比较久远的方式。可以看到w写入的数据被r读取到了,从而完成了多进程间的共享内存。POSIX也提供了共享内存的方法,使用起来要更容易些式。其原理是利用Linux的tmpfs(删除通过shm_open创建的文件。:文件共享模式,例如 0777。原创 2024-06-06 22:53:56 · 444 阅读 · 0 评论 -
Linux开发:mmap内存映射文件
有些系统不支持匿名内存映射,则可以使用fopen打开/dev/zero文件,然后对该文件进行映射,可以同样达到匿名内存映射的效果。MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。通常不鼓励用此旗标。MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。start:映射区的开始地址,通常设为 NULL,代表让系统自动选定地址,映射成功后返回该地址。原创 2024-06-06 22:23:04 · 105 阅读 · 0 评论 -
Linux开发:tmpfs文件系统
tmpfs的一大好处就是快,因为它是基于内存,所以读写的速度要比普通的磁盘快的多;简单的说,可以认为是从内存(包括虚拟内存)中取出一定的区域,然后将其虚拟为文件系统挂载在OS上。有时需要每次OS启动后,都要使用tmpfs,这时可通过编辑文件/etc/fstab文件,加入一行。可以看到当前挂载的文件系统中有几个是tmpfs,那么什么是tmpfs呢?这样每次OS启动后都会在/mnt/tmp下挂载一个50MB的tmpfs。通过以下方式可以挂载一个2MB空间的tmpfs。2.修改tmpfs的大小。原创 2024-06-04 21:14:18 · 340 阅读 · 0 评论