to inspire confidence in somebody.

0%

最近遇到了网站不断被一些国外的IP扫描的问题,想了想,决定将所有非国内的客户端全部封锁,只允许国内的用户进行访问。

首先需要找到所有国内的IP段,这个比较简单,ipip.net的github提供了一个china_ip_list项目,记录了目前所有国内的IP地址段,每月更新。
这个列表可以通过wget https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt直接进行下载。

有了IP列表,接下来的事情相对简单不少,虽然理论上可以通过iptables针对文件里的每一个IP段添加规则,但是这样会添加几千条规则,不是最优解,所以就借助ipset和iptables进行封锁。

阅读全文 »

安装

1
sudo yum install libguestfs-tools      # Fedora/RHEL/CentOS
2
sudo apt-get install libguestfs-tools  # Debian/Ubuntu

挂载

1
mkdir -p /tmp/mnt
2
guestmount -a xxxx.qcow2 -m /dev/sda1 --rw /tmp/mnt

其中/dev/sda1参数是目标文件中的分区名称,如果输入错误,会报错并提示正确的分区名。

卸载

1
guestunmount /tmp/mnt

参考

guestfs-recipes - libguestfs, guestfish and virt tools recipes页面提供了libguestfs其他工具的一些使用方法,可供参考。

最近往K8s集群中添加节点的时候,发现部分节点的kubelet进程无法启动,导致节点处于NotReady状态。journalctl -u kubelet查看日志可以发现类似的日志:

1
....
2
Nov 29 23:32:13 localhost kubelet[3830]: I1129 23:32:13.311881    3830 server.go:333] Adding debug handlers to kubelet server.
3
Nov 29 23:32:13 localhost kubelet[3830]: W1129 23:32:13.311922    3830 cni.go:203] Unable to update cni config: No networks found in /etc/cni/net.d
4
Nov 29 23:32:13 localhost kubelet[3830]: E1129 23:32:13.312092    3830 kubelet.go:2192] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
5
Nov 29 23:32:13 localhost kubelet[3830]: I1129 23:32:13.382130    3830 kubelet_node_status.go:278] Setting node annotation to enable volume controller attach/detach
6
Nov 29 23:32:13 localhost kubelet[3830]: I1129 23:32:13.383695    3830 cpu_manager.go:155] [cpumanager] starting with none policy
7
Nov 29 23:32:13 localhost kubelet[3830]: I1129 23:32:13.383705    3830 cpu_manager.go:156] [cpumanager] reconciling every 10s
8
Nov 29 23:32:13 localhost kubelet[3830]: I1129 23:32:13.383713    3830 policy_none.go:42] [cpumanager] none policy: Start
9
Nov 29 23:32:13 localhost kubelet[3830]: F1129 23:32:13.384272    3830 kubelet.go:1384] Failed to start ContainerManager failed to initialize top level QOS containers: failed to update top level BestEffort QOS cgroup : failed to set supported cgroup subsystems for cgroup [kubepods besteffort]: Failed to set config for supported subsystems : failed to write 4611686018427387904 to hugetlb.1GB.limit_in_bytes: open /sys/fs/cgroup/hugetlb/kubepods.slice/kubepods-besteffort.slice/hugetlb.1GB.limit_in_bytes: no such file or directory
10
Nov 29 23:32:13 localhost systemd[1]: kubelet.service: main process exited, code=exited, status=255/n/a
阅读全文 »

最近一段时间在折腾虚拟化,想把SR-IOV硬件直通给用起来,所以免不了要利用lspci这个工具,用来查看当前系统连接的所有PCI/PCIe设备。其实之前也有用到过,也有一些不理解的地方,只是当时无脑跟着文档设置,也就没多关心了,这次需要好好的理解一下相关的概念什么的。

首先很简单,看看不加参数直接调用lspci命令的输出结果,下面的是我笔记本上的输出:

1
00:00.0 Host bridge: Intel Corporation Broadwell-U Host Bridge -OPI (rev 09)
2
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 5500 (rev 09)
3
00:03.0 Audio device: Intel Corporation Broadwell-U Audio Controller (rev 09)
4
00:04.0 Signal processing controller: Intel Corporation Broadwell-U Processor Thermal Subsystem (rev 09)
5
00:14.0 USB controller: Intel Corporation Wildcat Point-LP USB xHCI Controller (rev 03)
6
00:16.0 Communication controller: Intel Corporation Wildcat Point-LP MEI Controller #1 (rev 03)
7
00:19.0 Ethernet controller: Intel Corporation Ethernet Connection (3) I218-LM (rev 03)
8
00:1b.0 Audio device: Intel Corporation Wildcat Point-LP High Definition Audio Controller (rev 03)
9
00:1c.0 PCI bridge: Intel Corporation Wildcat Point-LP PCI Express Root Port #1 (rev e3)
10
00:1c.3 PCI bridge: Intel Corporation Wildcat Point-LP PCI Express Root Port #4 (rev e3)
11
00:1c.4 PCI bridge: Intel Corporation Wildcat Point-LP PCI Express Root Port #5 (rev e3)
12
00:1d.0 USB controller: Intel Corporation Wildcat Point-LP USB EHCI Controller (rev 03)
13
00:1f.0 ISA bridge: Intel Corporation Wildcat Point-LP LPC Controller (rev 03)
14
00:1f.2 SATA controller: Intel Corporation Wildcat Point-LP SATA Controller [AHCI Mode] (rev 03)
15
00:1f.3 SMBus: Intel Corporation Wildcat Point-LP SMBus Controller (rev 03)
16
01:00.0 SD Host controller: O2 Micro, Inc. SD/MMC Card Reader Controller (rev 01)
17
02:00.0 Network controller: Intel Corporation Wireless 7265 (rev 59)
阅读全文 »

之前线上运行的K8S集群出现了一个Pod IP无法访问问题,调查了一下,发现和CalicoIP地址的分配策略相关,具体表现为一个/26的IP Block192.168.100.0/26分配给了A机器之后,在另外一台B机器上又出现了该IP Block内的一个IP 192.168.100.10,同时因为A机器上有该IP Block的blackhole路由blackhole 192.168.100.0/26 proto bird,所以导致A机器上所有的Pod访问192.168.100.10时因为黑洞路由原因直接失败。

遇到这个问题之前,只是通过文档大致了解Calico的IP分配策略,没有深入源码看看实际的情况,现在出现了相关问题,还是需要阅读一下相关代码,当然在这过程中也发现了一些问题,有些问题Calico官方也没有很好的解决。

阅读全文 »

前段时间将家里的树莓派3B系统换成了ArchLinux Arm,这样就可以用上64位指令集,不过遇到了一个问题,在没有连接HDMI时系统无法启动,刚开始还以为是什么其他的原因,因为之前接上显示器开机一切正常,但是换个地方不接显示器就启动不了,后来把显示器搬到旁边,一插上HDMI,立马就进入启动了。

定位到和HDMI相关之后,搜索了一下,刚开始以为和系统有关,后来搜到了Won’t boot without HDMI connected (solved)这个帖子,发现不是系统问题,是个简单的配置问题,很简单,在/boot/config.txt中,加入一行hdmi_force_hotplug=1就可以了,直接重启,没有接显示器也可以正常启动了。

这个配置信息在Video options in config.txt有详细的解释,意思是强制认为HDMI已经连接,直接开启HDMI输出。

阅读全文 »

今天在我们的环境中遇到了一个比较诡异的问题,我们在一台虚拟机上想要挂载一个CephFS,但是出现了一个failed: No such process的诡异问题,具体表现如下:

1
]# mount -t ceph mon1.ichenfu.com:6789,mon2.ichenfu.com:6789,mon3.ichenfu.com:6789:/ /tmp/data
2
mount: mount mon1.ichenfu.com:6789,mon2.ichenfu.com:6789,mon3.ichenfu.com:6789:/ on /tmp/data failed: No such process
阅读全文 »

在Libvirt里,一个Domain是一个运行在虚拟机器上的操作系统的实例,它可以指一个运行着的虚拟机,或者用于启动虚拟机的配置。
那么,对于一个Domain而言,主要有哪些状态呢?,他们的转换关系是什么?可以参考文档VM lifecycle。其中,状态主要包括以下:

阅读全文 »

随着Git仓库不断的被修改,整个仓库会变得越来越大,其中最主要的原因是历史提交特别的多,这个对于想立即阅读最新代码或者CI/CD场景下不是特别友好。

面对这种场景,可以利用git提供的浅克隆功能,只clone少部分历史到本地,这样可以极大的减少clone的仓库大小,以PHP源代码代码为例:

阅读全文 »

在Linux下,可以对进程使用的资源做一些限制,比如,可以使用的内存、可以使用的线程、最大能打开的文件数等等,这些也就是我们常说的rlimit,在bash里,可以非常方便的用ulimit这个内置的命令查看和修改这些限制,那么到底这些限制有那些,是怎么来的呢?

首先,在C编程环境下,系统提供了三个接口:int getrlimit(int resource, struct rlimit *rlim);int setrlimit(int resource, const struct rlimit *rlim);int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);分别用来获取当前进程的限制、设置当前进程的限制以及根据Pid设置对应进程的限制。

那么具体有哪些限制,也就是接口中的resource参数有哪些,可以参考man里的信息,这里大致翻译一下:

阅读全文 »