
linux
文章平均质量分 76
记录linux以及相关知识
赶路人儿
一个十年以上编程人员,擅长使用java、python、C++等语言,具有广告投放、个性化推荐引擎等超大规模系统开发经验。
展开
-
linux SSH互信不生效问题排查
日志中很清楚的反应了因为/root目录权限的问题,导致互信失败。后来发现172.172.230.210 上的/root 目录的权限为777,修改为700或者750问题解决。根据日志可以看到,app用户被锁。发现仍然需要输入密码。确保SELINUX=disabled。原创 2024-02-01 21:27:54 · 1273 阅读 · 0 评论 -
yumdownloader介绍和使用示例
有时候公司的服务器外网权限控制的很严,不允许连接到外网。如果安装系统离线源之外的工具使用yum会直接报错;如果使用离线rpm安装的话,有很多依赖需要下载安装。yumdownloader神器的出现完美的解决这这个问题原创 2023-12-06 21:35:32 · 3978 阅读 · 0 评论 -
linux 防火墙iptables
iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用;现在又叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。原创 2023-09-25 11:30:59 · 366 阅读 · 0 评论 -
网络知识——局域网和交换机
介绍了局域网内通信的原理,涉及到DHCP获取ip、DNS、网关等信息;ARP协议获取局域网内ip地址;以及如何通过路由表进行转发,访问不通网段的机器原创 2023-09-22 18:01:46 · 7653 阅读 · 0 评论 -
在shell脚本中使用通配符(*)删除、移动某个目录
先说结论:在shell脚本中使用通配符(*)删除、移动某个目录,需要将拼接好的路径保存在一个变量中,然后在rm或者mv命令后面跟这个变量。如果在rm或mv命令后面进行拼接,则不生效。从打印中可以看到,如果将拼接的路径保存到一个变量后,打印出来的是将通配符(*)展开后的结果,所以对于rm或者mv命令会生效。如果在rm或mv命令后拼接则rm、mv命令不生效。原创 2023-08-04 00:21:46 · 950 阅读 · 1 评论 -
GMP库使用以及java中的BigInteger和BigDecimal
GMP library全称是GNU Multiple Precision Arithmetic Library,即GNU高精度算术运算库。在网络安全技术领域中各种加密算法的软件实现始终有一个共同话题是如何在普通的PC机上实现大数运算。普通的PC机内部字长最多时32位或64位,但各种加密算法中为了达到一定安全强度,都要求在128位、512位或1024位字长下进行加减乘除等数学运算,这叫做“大数运算在此前提下,如何在普通的PC机上高效快速的实现大数运算成为加密算法在普通PC机上软件实现的重要问题。原创 2023-06-07 00:10:35 · 2251 阅读 · 0 评论 -
This account is currently not available.
【代码】This account is currently not available.原创 2023-06-01 10:55:35 · 755 阅读 · 0 评论 -
java伪随机数生成器
随机数分为:伪随机数和真随机数。后者具有:随机性、不可预测性、不重复性的特点,一般来说都是通过自然界物理信息来生成,例如使用硬件采集器手机温度等信息。伪随机数分为:弱伪随机数和强伪随机数,后者可以用于密码学领域。本文重点介绍在java下的伪随机数生成方法,包括:Random、ThreadLocalRandom和SecureRandom。原创 2023-01-15 22:33:13 · 2515 阅读 · 2 评论 -
TLS 1.3 带来了什么?
简单来说,TLS 1.3 又是一次人类对安全性和 RTT 的斗争。实现了前向安全,只留下目前安全的算法,连接所需的耗时进一步降低至 1-RTT,特殊情况下可以实现 0-RTT。原创 2023-01-03 21:56:04 · 1796 阅读 · 0 评论 -
RST及java socket关闭后读写的各种异常
方法关闭了Socket,虽然TCP规定半关闭状态下B仍然可以接收数据,但close动作关闭了该socket上的任何数据操作,如果此时A继续write,B将返回RST,A的该次write无法立即通知应用层(因为write仅把数据写入发送缓冲区),只会把状态保存在tcp协议栈内,下次write时才会抛出。都关闭,已经排队等待发送的数据会被尝试发送,最后(默认)发送FIN。,它会发送FIN但依然可以读取数据;后,无论是发送FIN/RST关闭的,之后再读写均会抛。发送FIN,4次挥手,连接关闭,一切都很和谐。转载 2022-12-21 21:27:59 · 738 阅读 · 0 评论 -
SO_REUSEPORT socket选项介绍以及在nginx上的配置
SO_REUSEPORT是socket的一个选项:1)开启内核的网络链接分配负载均衡:允许多个进程/线程 bind/listen相同的IP/PORT,提升了新链接的分配性能。2)在内核级解决了惊群问题:每个进程可以 bind/listen相同的IP/PORT,相当于每个进程拥有独立的 listen socket 的完全队列,避免了共享 listen socket 的资源争抢,提升了并发的吞吐。内核通过哈希算法,将新链接相对均衡地分配到各个开启了 reuseport 属性的的进程。原创 2022-12-15 18:32:39 · 3321 阅读 · 0 评论 -
Java 和 HTTP 的那些事(四) HTTPS 和 证书
介绍了java体系下https和ssl知识点转载 2022-11-07 22:19:15 · 1772 阅读 · 0 评论 -
一文详解 HTTPS 与 TLS证书链校验
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议,是一种通过计算机网络进行安全通信的传输协议。HTTPS利用SSL/TLS来加密数据包,经由HTTP进行通信。其设计的主要目的是,提供对网站服务器的身份认证、保护交换数据的隐私与完整性。SSL/TLS握手协商:用非对称加密的手段传递密钥,然后用密钥进行对称加密传递数据。转载 2022-11-07 21:55:23 · 8649 阅读 · 3 评论 -
openssl之SSL签名相关介绍
openssl命令介绍,以及生成ssl签名原创 2022-10-31 21:33:59 · 1934 阅读 · 0 评论 -
SSL证书验证原理和https加密
SSL证书验证原理,以及https加密原理原创 2022-10-28 22:19:36 · 5646 阅读 · 0 评论 -
理解LINUX的MEMORY OVERCOMMIT
一个保守的操作系统不会允许memory overcommit,有多少就分配多少,再申请就没有了,这其实有些浪费内存,因为进程实际使用到的内存往往比申请的内存要少,比如某个进程malloc()了200MB内存,但实际上只用到了100MB,按照UNIX/Linux的算法,物理内存页的分配发生在使用的瞬间,而不是在申请的瞬间,也就是说未用到的100MB内存根本就没有分配,这100MB内存就闲置了。这都是有风险的机制,重启有可能造成业务中断,杀死进程也有可能导致业务中断,我自己的这个小网站就碰到过这种问题,转载 2022-10-13 22:21:10 · 791 阅读 · 0 评论 -
java socket设置keepalive
java socket编程中有个keepalive选项,看到这个选项经常会误解为长连接,不设置则为短连接,实则不然。socket连接建立之后,只要双方均未主动关闭连接,那这个连接就是会一直保持的,就是持久的连接。keepalive只是为了防止连接的双方发生意外而通知不到对方,导致一方还持有连接,占用资源。其实这个选项的意思是TCP连接空闲时是否需要向对方发送探测包,实际上是依赖于底层的TCP模块实现的,java中只能设置是否开启,不能设置其详细参数,只能依赖于系统配置。首先看看源码里面是怎么说的源码的意思是转载 2022-06-27 00:08:50 · 2919 阅读 · 0 评论 -
网络编程中的SO_REUSEADDR和SO_REUSEPORT参数详解
在BSD中,SO_REUSEADDR选项有两个用户:setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR,(const void *)&reuse , sizeof(int));目的:当服务端出现timewait状态的链接时,确保server能够重启成功。注意:SO_REUSEADDR只有针对time-wait链接(linux系统time-wait连接持续时间为1min),确保server重启成功的这一个作用。举个time_wait的连接通过so_reuseaddr选项原创 2022-06-19 22:36:49 · 5924 阅读 · 0 评论 -
SO_REUSEADDR和SO_REUSEPORT在不同OS上的表现
TCP套接字的SO_REUSEADDR和SO_REUSEPORT选项,以及他们在不同操作系统中的表现。翻译 2022-06-19 12:03:37 · 1550 阅读 · 0 评论 -
Linux 使用 adduser 与 useradd 添加普通用户的正确姿势
前言在 Linux 操作系统中,添加用户可以使用useradd和adduser这两个命令。曾经在添加用户的实践中遇到过一些坑,比如使用useradd命令添加用户后无法正常使用,对adduser和useradd傻傻分不清楚。网上找到的相关内容很碎片化,初看会让人一脸懵逼,这促使我对这些知识进行了整理。本文所有指令需要在 root 权限下执行。非 root 用户需要加sudo前缀,或使用sudo -i命令切换到 root 账户操作。adduser 和 useradd 的区别对...转载 2022-05-30 10:47:35 · 12704 阅读 · 0 评论 -
The Uses of the Exec Command in Shell Script
一、概述当我们创建 Bash 脚本时,我们可能希望将所有 echo 语句的输出重定向到一个日志文件中,而无需在每个 echo 语句之后显式指定重定向运算符和日志文件名。 Bash exec 命令是一个强大的内置实用程序,可用于此目的。在本教程中,我们将了解如何使用 exec 命令将错误和输出日志添加到 shell 脚本。我们还将探索该命令在 shell 脚本中的其他用途。2. 基础每当我们在 Bash shell 中运行任何命令时,都会默认创建一个子 shell,并生成一个新的子进程来执行该翻译 2022-05-24 00:12:48 · 202 阅读 · 0 评论 -
基于B树实现(⽂件)索引存储
1、为什么⽂件索引要使⽤B-tree 实际上⽂件索引的数据结构⽆⾮就是 B树 和 B+ 树,但实际上在内存中也可以应⽤这种数据结 构,但是意义不⼤,因为这种结构就是为⽂件存储设计的, 为了减少磁盘IO,加速查找 ,那为什么 要使⽤这两种数据结构呢,第⼀ 这是树形结构,所以在保存的时候可以按照有序的规则去储存索引信息 ,第⼆ 这个树形结构每⼀个节点可以保存多个关键字也就是相当于可以存储多个索引,这样的话⼀次I/O就会尽可能多的知道下⼀步 的位置及当前是否命中索引 .2、为什么把索引存储在⽂件中 想转载 2022-05-04 17:39:37 · 1325 阅读 · 0 评论 -
shell脚本打日志技巧
执行shell脚本时,常常会打印一些日志到控制台,根据输出的日志,来判断脚本功能正确与否。但是,太多日志打印的话,会让阅读变得很困难,从日志信息里面找到我们关心的那部分也变得很不方便了。所以,有一个好用的shell脚本日志接口是非常有必要的,本文将聊聊实践中日志打印的一些技巧。1、封装一个日志函数最简单的方式,是在shell脚本中通过echo来打印,缺点是要改动时需要每处都修改,所以我们可以封装一个函数:#!/bin/bashfunction log(){ echo "$@"}转载 2022-04-13 20:48:04 · 11405 阅读 · 0 评论 -
nmon linux监控工具
nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具,它能在系统运行过程中实时地捕捉系统资源的使用情况,记录的信息比较全面,并且能输出结果到文件中,然后通过nmon_analyzer工具产生数据文件与图形化结果。nmon是IBM开发的,具有免费,体积小,安装简单,耗费资源低的特点。可监控的类型包括:内存使用情况 磁盘适配器 文件系统中的可用空间 CPU使用率 页面空间和页面速度 异步I/O,仅适用于AIX 网络文件系统(NFS) 磁盘I/O速度和读写比率 服务器详原创 2022-01-26 10:48:37 · 1248 阅读 · 0 评论 -
Kubernetes 时代的云容器平台:各家云产品模式逐渐丰富
摘要Kubernetes 出现后,在云上面出现了一种产品“容器平台”,它打破了既有 IaaS、PaaS 的边界,各种容器平台在商业模式上也略有区别。本文介绍 Kubernetes 容器平台的三种模式,以及华为云、金山云、腾讯云、阿里云的容器平台产品。Kubernetes 容器平台的三种模式Kubernetes 时代的容器平台,不能用传统的 IaaS、PaaS 的边界去划分。这是由于 Kubernetes 本身是一个容器编排引擎,它自身由多个部分组成,因此不同的 Kubernetes 交付方式转载 2021-12-09 12:04:51 · 2232 阅读 · 0 评论 -
ssh指定密码登陆远程服务器
1、ssh远程登录ssh登录远程服务器,一般都通过ssh key方式免密码登陆;也可以指定用户名、密码来登陆远程服务器;如下:ssh IP -l user -p port #或者ssh user@IP -p port然后回车 输入密码可以看到:ssh登陆不能在命令行中指定密码,属于交互式的操作。sshpass 的出现,解决了这一问题。它允许你用 -p 参数指定明文密码,然后直接登录远程服务器。 它支持密码从命令行、文件、环境变量中读取。2、mac sshpass 安装1)下原创 2021-11-29 20:35:09 · 64058 阅读 · 0 评论 -
fread,fwrite数据写入磁盘的流程
1、fwrite,fflushfread,fwrite>> CLib buffer内存缓冲(用户空间) -->fflush>>page cache内核缓冲--->fsync>>磁盘fflush:标准I/O函数(如:fread,fwrite)会在内存建立缓冲,该函数刷新内存缓冲,将内容写入内核缓冲,要想将其写入磁盘,还需要调用fsync。(先调用fflush后调用fsync,否则不起作用)。https://blog.csdn.net/lhb0709.转载 2021-10-23 19:49:11 · 1445 阅读 · 0 评论 -
Linux 文件预读
Linux文件预读算法磁盘I/O性能的发展远远滞后于CPU和内存,因而成为现代计算机系统的一个主要瓶颈。预读可以有效的减少磁盘的寻道次数和应用程序的I/O等待时间,是改进磁盘读I/O性能的重要优化手段之一。本文作者是中国科学技术大学自动化系的博士生,他在1998年开始学习Linux,为了优化服务器的性能,他开始尝试改进Linux kernel,并最终重写了内核的文件预读部分,这些改进被收录到Linux Kernel 2.6.23及其后续版本中。从寄存器、L1/L2高速缓存、内存、闪存,到磁盘/光盘/磁带转载 2021-10-08 19:18:46 · 605 阅读 · 0 评论 -
Linux内核Page Cache和Buffer Cache关系及演化历史
在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘。这里提到的脏页(dirty page)即为页缓存(page cache)。块缓存(buffer cache),则是内核为了加速对底层存储介质的访问速度,而构建的一层缓存。他缓存部分磁盘数据,当有磁盘读取请求时,会首先查看块缓存中是否有对应的数据,如果有的话,则直接将对应数据返回,从而减少对磁盘的访问。两层缓存各有自己的缓存目标,我转载 2021-10-08 13:27:24 · 244 阅读 · 0 评论 -
简述Linux 2.6 中的直接 I/O 技术
简介: 对于传统的操作系统来说,普通的 I/O 操作一般会被内核缓存,这种 I/O 被称作缓存 I/O。本文所介绍的文件访问机制不经过操作系统内核的缓存,数据直接在磁盘和应用程序地址空间进行传输,所以该文件访问的机制称作为直接 I/O。Linux 中就提供了这样一种文件访问机制,对于那种将 I/O 缓存存放在用户地址空间的应用程序来说,直接 I/O 是一种非常高效的手段。本文将基于 2.6.18 版本的内核来讨论 Linux 中直接 I/O 的技术的设计与实现。https://www.ibm.com/.转载 2021-09-26 11:27:04 · 565 阅读 · 0 评论 -
多线程下的fwrite和write
Linux下的文件操作,有人喜欢用C库的文件流操作(标准IO),有人喜欢用Linux的文件IO。一般来说,C库的文件操作会更高效一些,因为C库自己做了文件缓存的处理。今天,主要研究多线程下的fwrite与write,每个线程都对相同的FILE*或者fd进行写操作,看看结果是否为预期行为。1、实验描述:定义三个线程向同一个文件中写入数据:线程1~3分别写入"aaaaaa\n","bbbbbb\n",和"cccccc\n"各一百万次。如果写入文件的操作是“线程安全”的,那么最终的文件行数应该是3百万行,转载 2021-09-25 16:40:25 · 2216 阅读 · 1 评论 -
MMAP和DIRECT IO区别
在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO。本篇文件打算详细全面,深入浅出。剖析文件IO的细节。从多个角度探索如何提高IO性能。本文尽量用通俗易懂的视角去阐述。不copy内核代码。阐述之前,要先有个大视角,让我们站在万米高空,鸟瞰我们的文件IO,它们设计是分层的,分层有2个好处,一是架构清晰,二是解耦。让我们看一下下面这张图。1、穿越各层写文件方式:程序的最终目的是要把数据写到磁盘上, 但是系统从通用性和性能角度,尽量提供一个折中转载 2021-09-24 14:53:12 · 523 阅读 · 0 评论 -
Linux 编程中的API函数和系统调用的关系
API:(Application Programming Interface,应用程序编程接口):指的是我们用户程序编程调用的如read(),write(),malloc(),free()之类的调用的是glibc库提供的库函数。API直接提供给用户编程使用,运行在用户态。我们经常说到的POSIX(Portable Operating System Interface of Unix)是针对API的标准,即针对API的函数名,返回值,参数类型等。POSIX兼容也就指定这些接口函数兼容,但是并不管API具体转载 2021-09-22 22:36:34 · 1264 阅读 · 0 评论 -
linux下so动态库一些不为人知的秘密
linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面知识。一、动态链接库依赖问题基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看 :# ldd /bin/lslinux-vdso.so.1 => (0x00007fff597ff000)libselinux.so.1 => /lib64/libselinux.so.1 (0x00000036c2e00000)libr转载 2021-09-18 17:02:48 · 1274 阅读 · 0 评论 -
linux系统调用的三种方法
系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口。当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数。下面介绍Linux 下三种发生系统调用的方法:1、通过 glibc 提供的库函数:glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库,即运行时库。glibc 为程序员提供丰富的 API(Application Programming Interfa原创 2021-09-04 16:03:59 · 4248 阅读 · 1 评论 -
MBR分区表为什么最大只能识别2TB硬盘容量
1. 前言最近公司的服务器硬盘坏了,需要换一个新的硬盘,容量是2TB,用的fdisk进行分区,期间搜索分区工具,看到了关于MBR(Master Boot Record)与GPT(GUID partition table)硬盘分区表的一些区别,其中说到MBR分区表最多只能管理2TB的容量,对此查了一下《鸟哥的私房菜》发现是简化过的,并没有解决疑惑,于是查了一些资料,总结如下。2. 机械硬盘的结构2.1. 基本结构机械硬盘主要由磁盘盘片、磁头(header)、主轴与传动轴等组成,数据就存转载 2021-08-31 11:20:37 · 7052 阅读 · 1 评论 -
fork()后copy on write的一些特性
Linux上,通过fork()创建一个子进程之后,kernel并不会急于为子进程分配新的内存空间(比如建立页表,拷贝父进程内存空间等)。这是因为,很多时候,子进程会立即调用exec()加载一个新的可执行文件。如果kernel在fork()之后就为子进程复制内存空间,那么子进程调用exec()之后所有的空间又要重新建立,之前的操作全部作废。所以Linux的fork()机制引入了copy on write技术。简单的说就是,fork()之后的子进程和父进程共享同一个地址空间。当父进程或子进程对内存进行修改时,k转载 2021-08-23 20:28:41 · 625 阅读 · 0 评论 -
LVS+Keepalived 实现高可用负载均衡
一、Keepalived介绍keepalived是在Linux系统下的一个轻量级的高可用解决方案,是使用C语言编写的,在 Keepalived 中实现了一组检查器,可以根据服务集群中服务器的健康状态,自动的进行动态主备切换、管理。VRRP(Virtual Router Redundancy Protocol)虚拟路由器冗余协议,是一种容错的主备模式的协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间原创 2021-06-25 11:54:41 · 4663 阅读 · 5 评论 -
goroutine调度器
Goroutine是Go语言原生支持并发的具体实现,你的Go代码都无一例外地跑在goroutine中(哪怕是go的runtime也不例外)。你可以启动许多甚至成千上万的goroutine,Go的runtime负责对goroutine进行管理。所谓的管理就是“调度”,粗糙地说调度就是决定何时哪个goroutine将获得资源开始执行、哪个goroutine应该停止执行让出资源、哪个goroutine应该被唤醒恢复执行等。goroutine的调度是Go team care的事情,大多数gopher们无需关心。但适原创 2021-02-06 17:48:51 · 416 阅读 · 1 评论 -
Linux上线程的实现
0、Linux线程历史在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销。针对线程的这两大意义,分别开发出了内核级线程和用户级线程两种线程模型,分类的标准主要是线程的调度者在核内还是在核外。前者更利于并发使用多处理器的资源,而后者则更多考虑的是上下文切换开销。在目前的商用系统中,通常都将两者结合起来使用,既提供核心线程以满足smp系统的需要,也支持用线程库的方式在用户态实现另一套线程机制,此时一个核心线程同时成为多个用户态线程的调度者。正如很多技术一原创 2021-02-02 21:32:44 · 599 阅读 · 0 评论