Shawn's Blog

xargs 基本用法

0X00 简单用法 内容比较少,主要是介绍一下 xargs ,直接开始吧~ 首先假定各位能够熟练运用基础的管道操作,能够理解 ps aux | grep nginx | awk -F ' ' {print $1} 这样的命令。 我们日常使用管道的时候肯定会用到 ls | grep xxx | grep xxx | rm 这样的操作,想从一堆文件里筛选出自己需要的文件并将其删除/移动/复制等。但其实这样的操作是不行的,因为前面管道传过来的是数据流但是 rm 命令却并不能处理它。如果想实现这种效果就可以用 xargs 将其进行转换了,如下图所示使用 ls | grep bbb | grep "[3-5]" | xargs rm 就可以完成任务。 此处 xargs 的功能就是将前面的数据流逐行分解并一个个丢给 rm 去执行。不过通常的管道都是一个命令执行一次,配合 xargs 之后就是做一个循环了,将管道前面的的输出逐行取出作为参数交给下一个命令去执行。我这里画了一个简易的图,也许能够便于理解。 其实如果只是找到文件并删除的话,还有更简单的方法啦,例如 find . -regex…

虚拟化、容器、Docker

0X00 虚拟化 首先虚拟化 Virtualization 它是一种技术,通过软件技术虚拟一张网卡(例如 Linux Bridge)、虚拟一个磁盘分区(例如 vmdk 文件)甚至直接虚拟一整台电脑(例如 VMware/VirtualBox)出来都是虚拟化技术的实装。 虚拟机就是通过虚拟化技术虚拟了一整套电脑所需的硬件,例如CPU、内存、磁盘、网卡等等,然后将它们拼在一起就是一台虚拟机了。 0X01 容器 区分这些的重点就在容器 Container 这里了。最早接触容器的时候很多人都说简单理解成轻量化虚拟机,不需要开关机、不需要操作系统、甚至是秒级启动的。当时我就死活不理解,明明是虚拟机为啥不需要操作系统不需要开关机的呢,其实但凡当时多解释几句,也就不会有这种困扰了。 tips: 这里说的容器仅仅指代 Linux 容器 容器的本质是进程 。在 Linux 环境下创建一个进程,如果我们将它与其它进程隔离开,让它发现不了其它进程、再分配虚拟网卡、临时的文件系统等等等等,那它其实就是一个「容器」了。所以容器的本质是进程…

容器的单进程模型

0X00 Linux 的进程关系 既然想搞清楚容器的单进程模型,那自然需要先复习一下 Linux 下的基本进程关系了。你说你用的是 Windows Container?不懂,不会,打扰了😢 我们知道 Linux 下会有一个 PID=1 的进程来带动其他进程,以前 PID=1 的进程是 init 后来大家都在用 systemd ,这里就不多说了,只来回顾一下「孤儿进程」和「僵尸进程」这两个概念。 这里来模拟一个场景,默认 PID=1 的是 systemd 1. 打开运行一个新进程 2. 新进程 fork 了一个子进程出来 3. 子进程持续运行 4. 此时父进程终止了 5. 子进程成为孤儿进程 (因为他的父进程挂了) 6. 该子进程会交由 systemd 接管 7. 当子进程结束之后 systemd 会替它「收尸」,也就是释放、回收资源之类的 还有另一个场景:某菜鸡程序员(可能是我)写了个程序,现在运行起来了。该进程会 fork 新进程,每隔一会儿就会 fork 一个,但是该进程并没有 wait/waitpid 这种操作(俗称管杀不管埋)。所以当子进程结束后资源并没有被回收,甚至…

部署 Kubernetes 集群时遇到的一些问题

0X00 🛡️叠buff * 我是个 Kubernetes 纯新手,并不懂很多原理和概念,可能会有误导; * 我只是将自己遇到过的问题列出来,如果你想找「权威」请看官方文档; * 每个人的基础环境不同,Kubernetes 版本也不同,参考应该学会变通; * 此处记录的仅为个人部署过程中遇到的问题记录,并非「教程」或「指南」; 0X01 正文 注意交换分区 部署 Kubernetes 的节点是不允许使用交换分区的,临时禁用可以 swapoff -a。然后在 /etc/fstab 中将交换分区的自动挂载给注释掉就可以了。 不使用 docker Kubernetes 已经不建议使用 docker 作为容器运行时了,可以考虑使用 containerd 或者 CRI-O。注意这里提到的 Dockershim 已经移除并不意味着不能再用 Docker 了,而是说 Kubernetes 并不会原生支持 Docker 了,以后 Docker 的地位和其他运行时的地位相同了。 Containerd 的默认配置 如果使用 Containerd 作为容器运行时的话,安装好 Containerd…

使用 kind 飞快的创建一个 Kubernetes 集群

0X00 为嘛用 kind 作为一个纯新手想要学习 Linux、MySQL、Python... 的第一步往往都是先装一个来看看,当然 Kubernetes 也不例外。装 Linux 也许跟着教程在虚拟机里一会儿就装好了,尤其是现在很多发行版本都有图形化安装界面了,但是 Kubernetes 就不一样了,如果你去部署一套 K8S 集群的话极有可能会遇到一系列问题,包括但不限于: * 交换分区没关,导致服务异常 * 搞不清楚 CRI-O/docker/containerd 之间的关系 * 刚装好的 kubelet 服务疯狂重启 * cni 网络插件搞不明白,导致 kubeadm init 一直不成功 * 缺少内核模块导致的集群初始化异常 * 缺少内核参数导致的集群初始化异常 * 想用 crictl 却怎么都看不到 container 状态 这些在熟手眼里可能根本不是问题,但是对于第一次接触的人来说还是挺麻烦的。所以我们需要一种简单的方式来快速部署一个 Kubernetes 来看一看试一试,而不是上来就先部署一套三四个节点的真正意义上的集群。 Kubernetes…

属于 Python 程序员的小技巧

0X00 这是一个描述 下面介绍几个我自己常用的小技巧,均可以在日常工作中给自己带来一些小小的便利🤪 0X01 临时 web 服务器 如果你电脑上装了 Python3 则可以使用 python3 -m http.server --bind 0.0.0.0 2333 这个命令在当前目录启动一个简单的 web 服务,监听在 0.0.0.0:2333 上。这样一来别人就可以访问你的 ip 来下载当前目录下的文件了。不过使用这个方法的时候要注意自己当前的工作目录哈,不要傻乎乎的在自己的 $HOME 下面用这个命令,小心别人下载你的隐私数据喔。 不过如果你搞不懂什么是「监听、0.0.0.0、端口」的话,还是先去搞一下计算机网络吧。 0X02 使用 pdb/ipdb 调试脚本 我们都知道用 pdb 模块可以逐行调试 Python 脚本,只需要在脚本里 import pdb 然后在需要打断点的地方加上 pdb.set_trace() 就可以了。但其实 Python 还有一个三方库叫做 ipdb 是 pdb 的升级版,应该各位也都知道吧,通过简单的 pip install 就可以装好。不论是…

「累」

0X00 正文 这篇内容可能是目前为止我所有博客内容里最特别的一篇了,今天不想写什么技术类文章,只是想发发牢骚,说说自己想说但一直没啥机会吐槽的事情。不知道各位有没有那种情况,其实自己是很乐观很开心的一个人,但就是偶尔会突然觉得很累,很烦,很焦虑。这些事情说大可能并不大,只是打个游戏可能某一关打不过去而已;说小可能也不小,甚至跟全国乃至全球数以亿计人口的健康相关。那接下来我就要开始吐槽了,也许会有些负能量,但把自己的「负能量」一股脑输出出来没准就能让自己变得更好呢 hhhhh tips: 这些内容不分前后顺序、没有主次关系、不一定符合你的看法、甚至你觉得我就是在胡说八道,但我不在乎~ 我就想随随便便看个综艺 本来我很早就看 _今晚80后脱口秀_ 的,虽然我并不是 80 后。也挺喜欢听他们说脱口秀的,不管是现在已经转行的王自健还是后面一直在说的蛋蛋建国什么的。后来 80 后脱口秀就不播了,我也就没再关注过脱口秀了。知道某天偶然间发现了 _脱口秀大会_…

LVM 的创建扩容与压缩

0X00 介绍 阅读并了解 LVM 需要了解:Linux 基本操作、分区概念、文件系统概念 首先 LVM 的全称是 _Logical Volume Manager_ 逻辑卷管理。传统的方式是将一个磁盘分成类似于 sda1/sda2/sda3 的分区,然后再将这些分区格式化成类似于 ext4/xfs 这种文件系统,最后将文件系统挂载到某个目录上。但是这种方式下对磁盘空间进行重分配是比较麻烦的,将新安装的磁盘融入到现有系统中也是比较费力的,这就是 LVM 需要解决的问题。 总结下来 LVM 拥有这些功能 1. LVM 可以方便的对现有逻辑卷进行压缩(初次分配多的空间不会浪费,可以压缩出来) 2. 空闲的空间可以随时重新分配给逻辑卷(传统模式只能将空间分给最后一个分区,或者创建新分区) 3. 新加入的磁盘也可以为其他逻辑卷扩容(传统模式并不方便为某个现有分区扩容) 4. 可以将两块磁盘融合创建出一个更大的逻辑卷(两块 1T 磁盘可以创建出 2T 的分区) 特别需要注意的,RAID0 也可以将两个 1T 的磁盘合并为一个 2T 的,并且理论读写速度都会翻倍,但是这和 LVM…

如何使数据库中的密码更安全:哈希、加密和加盐

0X00 前言 设计一个系统,不论是 Web 还是其他的什么形式,通过用户名和密码认证也是一个再正常不过的事情了。但是如何保存密码却是一个值得讨论的问题,相信各位最开始的一个有用户名和密码的程序多半也是用明文存储的密码吧 🤓 这里总结了六种比较常用于密码存储的方式,接下来可以逐一进行简单的分析以帮助我们更好的保护用户的密码 一清二白:明文存储密码,直接存 password 掩耳盗铃:使用 BASE64 之类的编码,存储为 cGFzc3dvcmQ= 盘古之法:使用早已不再安全的 md5 之类的摘要算法,存储为 5f4dcc3b5aa765d61d8327deb882cf99 祖宗之法:使用也已经不再安全的 sha-1 之类的摘要算法,存储为 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 凑合能用:使用现代的安全的例如 sha-256 之类额算法,存储为 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 现代手段:采用系统化的多次迭代的加盐哈希方式加密,例如常见的…

git stash 命名 / git stash 用法「重置版」

0X00 前言 本篇文章是这篇「使用 git stash save 将暂存区命名」的重置版。因为根据 Google 的统计数据我得知某些问题的关键词搜索出来之后我的博客排行会比较靠前,所以把最容易被各位点击到的文章做了个重置计划,改进之前的一些不足,争取能够说的更清楚一些,也能节省各位一点点时间,希望能真正的帮助到从搜索引擎点进来的各位~ 0X01 极度精炼的使用说明 可以使用 git stash save "message" 的方式为 stash 起来的变动命名,方便后面再次使用。 stash 起来过后可以使用 git stash list 来查看已经被 stash 的列表,这里可以看到已经有两条了,值得注意的是 stash 的 id 每次都在更新,最近 stash 的是 0,1 就是上次 stash 的,以此类推 如果需要从新应用某个 stash 的改动,可以使用 git stash apply STASH_ID 的方式,例如使用 git stash apply 1 就可以重新应用 id 为 1 的这个 stash。如果要丢弃掉某个 stash 的话使用 git stash…