首页
归档
友情链接
关于
Search
1
在wsl2中安装archlinux
241 阅读
2
nvim番外之将配置的插件管理器更新为lazy
133 阅读
3
2018总结与2019规划
133 阅读
4
从零开始配置 vim(15)——状态栏配置
120 阅读
5
PDF标准详解(五)——图形状态
102 阅读
软件与环境配置
读书笔记
编程
Thinking
FIRE
菜谱
翻译
登录
Search
标签搜索
c++
c
学习笔记
windows
文本操作术
编辑器
NeoVim
Vim
win32
emacs
VimScript
读书笔记
linux
elisp
文本编辑器
Java
反汇编
OLEDB
数据库编程
投资理财
Masimaro
累计撰写
362
篇文章
累计收到
32
条评论
首页
栏目
软件与环境配置
读书笔记
编程
Thinking
FIRE
菜谱
翻译
页面
归档
友情链接
关于
搜索到
32
篇与
的结果
2021-10-16
arch linux 安装
好长时间都没有更新自己的博客了,我简单翻阅了一下自己的更新记录,上一次更新好像还是在5月份左右,距今也有快半年,这半年也是遇到了很多事情,有不好的,也有好的。这半年我对在日常生活工作中使用Linux系统产生了一些兴趣,从零开始折腾这一系列的内容,主要从安装、配置、以及尝试各种软件来取代Windows的主导地位,也产生了一些心得,这里我想分几篇博客来聊聊我是如何慢慢使用arch Linux 来替代以前的Windows机器为何选择arch Linux我本身有一台6年前买的联想的笔记本,随着每次系统的更新,也变得越来越卡了,终于有一点我忍不了想着要不退回到windows 7吧,windows 10这台机器已经有点不行了。恰巧我最近在看一本关于计算机发展史的书,书中提到自由软件运动,那种运动有一种人人为我,我为人人的理想主义色彩,我想既然不能编写自由软件造福一方,至少应该享受自由软件带来的好处,而且国内经常爆出各种软件窃取用户隐私的新闻。何不趁此机会转移到自由软件阵营呢?说做就做,自由软件的基础自然是需要一个自由的操作系统,Linux是目前使用最为广泛的自由操作系统。在看了各种Linux发行版本之后我决定使用arch Linux,主要有以下几个原因:更新方式比较激进,arch Linux采用滚动更新的方式,这意味着用户能享受最新的软件版本,当然过激的更新行为会导致一些问题,比如常见的滚挂。我自认为我不缺少动手能力,这个我有信心能自己解决arch Linux 丰富的软件源使它能够安装其他发行版Linux无法安装的软件丰富的wiki文档,你能遇到的问题几乎都可以在里面找到答案最小化安装,arch Linux自身是最精简的系统,几乎精简到不能再精简。因此比起其他发行版本的Linux来说,它提供更高自由度的可配置性。安装困难,我一直觉得对于自己专业内的事情,要做就做最困难的,既然它的安装使用最为困难,那我就用它,当彻底征服了这一块内容,带来的成就感是无法比拟的。而且熟悉了它的安装过程,又例如提高对Linux的认识基于上述几点理由,我开始了漫长的折腾之路arch Linux 安装安装主要参考 arch wiki) 好在文档大部分都有中文版本,对于英语不好的人来说阅读起来也不会有过多的阻碍制作U盘启动项首先去官方指定的镜像站下载安装包,然后使用相应的工作制作U盘启动项,windows上我使用的是rufus、Linux或者mac上直接使用如下命令写入到U盘sudo dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress oflag=sync上述命令的含义是制作一个镜像文件,源文件内容保存在if参数所指定的位置,输出到 of 所指定的位置, status=progress 表示现实制作进度, oflag=sync表示以同步的方式写入,即所有数据写入完成命令结束,而不是刚写入就结束需要注意的是,sdx 是u盘在系统中的命名,一般插入U盘后,在shell上使用fdisk -l可以看到,另外有的U盘可能经过分区,显示出下面还有sdx1、sdx2等分区,要写到sdx,而不是sdx1或者sdx2将U盘插入待装机的电脑上,进入bios调整启动顺序和安全设施,如果使用uefi方式启动的话,需要调整启动方式为uefi only 而不是 legacy/csm接下来就可以启动电脑,进入arch Linux的安装界面了联网设置进入到安装界面的第一步需要连接上网络,这里使用 iwctl 进行网络连接配置iwctl #进入交互式命令行 device list # 列出设备名,比如无线网卡一般叫做 wlan0 station wlan0 scan #扫描Wi-Fi station wlan0 get-networks #列出扫描到的Wi-Fi名称,例如要连接到esi-0这个Wi-Fi station wlan0 connect esi-0 #尝试连接,这个时候需要输入密码成功后就连上互联网了,可以使用 ping archlinux.org 来试试网络是否成功连上更新系统时间后续在访问https之类的站点时会验证客户端和服务器的证书和时间的,有时候时间不统一,在访问时可能会报无效的证书之类的错误使用命令timedatectl set-ntp true更新之后可以使用 timedatectl status 检查服务状态磁盘分区与格式化根据arch wiki上的说法,采用uefi的启动方式时,至少需要一个boot或者efi 分区作为efi系统分区(大小不能小于280M)、一个根分区。这里假设硬盘大小为100G,我采用如下的分区方案efi 分区 /efi 1G根分区 / 40G用户主目录 /home 剩余全部空间,越大越好跟windows 做类比的话,根分区相当于c 盘,主要用来装系统相关的内容,用户分区相当于D盘或者其他盘,用来放用户数据,后续如果系统挂了,重装系统的话,不会破坏用户目录的内容,甚至如果用户目录在其他物理盘上,后面换机器了直接将这块盘挂载到其他机器上,数据直接就能用了首先将磁盘分区表转化为gpt类型lsblk #显示分区状况 parted /dev/sdx #执行parted命令, 进行磁盘类型变更 (parted)mktable #输入mktable 修改磁盘分区表类型 new disk label type? gpt #输入gpt,修改分区表为gpt类型 quit #最后退出parted交互式命令 接下来使用cfdisk 命令对磁盘进行分区cfdisk /dev/sdx #使用cfdisd对磁盘进行分区free space 表示未分区的部分,上下键用来选择区域,左右键用来选择操作先选择new新建分区,然后输入大小,最后回车,重复几次这个操作,按照之前定义的大小来完成分区记得完成之后,将选项调整到wirte 在退出前将分区写入到磁盘。完成之后使用fdisk -l 查看分区接下来格式化磁盘中的各个分区efi 分区格式化为 vfat 格式根分区和用户分区格式化为 ext4格式mkfs.ext4 /dev/sda2 mkfs.ext4 /dev/sda3 mkfs.vfat /dev/sda1接下来将磁盘挂在到当前系统的文件目录下,使磁盘能正常被系统访问到mount /dev/sda2 /mnt mkdir /mnt/efi mkdir /mnt/home mount /dev/sda1 /mnt/efi mount /dev/sda3 /mnt/home系统安装折腾了这么多东西,终于要开始正式安装系统了,arch linux提供了一个脚本用来自动安装系统内核pacstrap /mnt base base-devel linux linux-firmware这句命令可以帮助我们将系统所需要的包安装到/mnt 这个目录也就是磁盘上等待一段时间,安装就完成了,先别着急重启,还有一些内容需要安装pacstrap /mnt dhcpcd vim sudo networkmanager # dhcpcd networkmanager 是网络相关的软件包,后期缺少可以通过网络下载,联网软件没有的话只能白瞎 系统自身配置到这里基本已经完成了安装部分的工作了,接下来要进行的就是重启前的基本配置了生成磁盘分区的记录文件genfstab -U /mnt >> /mnt/etc/fstab生成之后可以使用cat或者 vim 之类的命令复查一下生成的是否有误接下来切换到新安装的系统上arch-chroot /mnt在新系统中先在/etc/hostname中设置主机名,在文件中输入你想要的主机名,例如叫 arch接下来在文件/etc/hosts中设置与其匹配的条目,可以加入以下内容127.0.0.1 localhost ::1 localhost 127.0.1.1 arch.localdomain arch接着设置时区,在/usr/localtime 下用 /usr 中合适的时区创建符号连接ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime将系统时间同步到硬件时间hwclock --systohc接下来进行本地化操作,程序如果需要本地化文件,都需要依赖 locale,它规定了地域、货币、时区日期的格式、字符排列方式和本地化标准。需要在这两个文件中设置 locale.gen 与 locale.conf编辑 /etc/locale.gen 然后去掉 en_US.UTF-8 UTF-8 和其他需要的地区前的注释,例如作为中文用户可以去掉 zh_CN.UTF-8 UTF-8 以显示中文编辑完成之后使用如下命令生成 localelocale-gen在/etc/locale.conf 文件中指定系统使用的语言,这里推荐使用英文,否则在出错的时候可能会出现中文乱码,不便与排错echo 'LANG=en_US.UTF-8' > /etc/locale.conf设置root 密码passwd root根据cpu的不同,安装对应的微码,以确保处理器能稳定运行pacman -S intel-ucode #intel pacman -S amd-ucode #amd安装引导程序为了能在机器加电之后正常找到Linux所在位置,需要安装引导程序,来引导操作系统的启动。pacman -S grub efibootmgr # 使用grub做引导程序,efibootmgr 是uefi方式启动需要的 grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=arch #将启动项取名为arch 启动类型为efi的64位系统 系统启动位置在 /efi 接下来可以稍微对启动配置做一些修改,编辑 `/etc/default/grub` 文件,去掉 `GRUB_CMDLINE_LINUX_DEFAULT` 一行中最后的 `quit` 参数,同时把`log level` 的数值从3改到5,这样是为了后续如果出现系统错误方便排查。同时加入 `nowatchdog` 参数,这样可以显著提升开关机速度修改完成之后生成grub所需的配置文件grub-mkconfig -o /boot/grub/grub.cfg这样就完成了安装exit umount -R /mnt reboot一切顺利的话,重启之后应该就能进入系统了。新系统基础配置网络配置之前我们下载了与网络相关的两个工具networkmanager和dhcpcd,用来管理网络和dhcp自动分配IP地址systemctl enable --now NetworkManager # 启动networmmanager服务 nmcli device wifi list # 查看Wi-Fi列表 nmcli device wifi connect ssid password password #连接Wi-Fi,ssid表示Wi-Fi名,后面一个password表示连接wifi的真实密码网络连接成功之后,使用pacman将系统更新到最新版本pacman -Syyu创建非root用户为了系统安全防止自己某天抽风不小心输入类似 rm -rf / 之类的危险命令,平时最好使用非root登陆。 对于系统操作使用sudo来提升权限useradd -m -G wheel -s /bin/bash arch创建一个名为arch的用户,将用户组归属到wheel中,同时创建用户目录, 并且指定shell使用bash接下来使用 passwd arch 来修改用户密码由于系统中并没有安装vi,所以默认会使用vi命令的一些命令都会失效。所以需要将 vi 链接到 vimln -sf /usr/bin/vim /usr/bin/vi使用visudo 将文件中 #%whell ALL=(ALL) ALL 这行的注释去掉使用su arch 将当前用户切换到arch。可以使用命令sudo pacman -Syyu来更新系统,同时测试一下输入用户密码之后能否执行一些root命令设置交换文件在桌面环境中,交换分区或文件用来实现休眠(hibernate)的功能,即将当前环境保存在磁盘的交换文件或分区部分。除此之外,某些特定软件需要 swap 才可以正确运行。交换文件与分区性能相同,且交换文件更为灵活,可随时变更大小,增加与删除dd if=/dev/zero of=swapfile bs=1M count=4096 status=progress #设置4G的交换分区,大小根据系统的实际内存来决定,一般最好略大于物理内存 chmod 600 /swapfile mkswap /swapfile # 格式化swap文件 swapon /swapfile # 启用swap文件最后往/etc/fstab中追加如下内容/swapfile none swap defaults 0 0开启32位软件库支持与ArchLinuxCN库的支持为了系统的稳定,官方关闭了32位软件以及aur软件库,但是仅仅只依靠官方源中的软件时不够用的,这里我们要打开这两个库vim /etc/pacman.conf去掉[multilib]一节中两行的注释,来开启 32 位库支持。在文档结尾处加入下面的文字,来开启 ArchLinuxCN 源。[archlinuxcn] Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch执行 sudo pacman -Syyu 更新pacman数据库然后需要安装 archlinuxcn-keyring 包以导入 GPG keysudo pacman -S arhclinuxcn-keyring有时候因为密钥环的问题,导致这一步安装报错,可以依次执行下面的命令sudo pacman -syyu sudo pacman -S haveged sudo pacman -Syu haveged sudo systemctl start haveged sudo systemctl enable haveged sudo rm -fr /etc/pacman.d/gnupg sudo pacman-key --init sudo pacman-key --populate archlinux sudo pacman-key --populate archlinuxcn然后再重新安装,即可解决问题最后安装 yay 用来下载archlinuxcn库中的软件结尾至此,已经完成了对系统的安装到基础配置,现在已经有了一个基本可用的操作系统了,但是目前系统仍然只有一个基本的黑框框,作为日常使用还远远不足,至少还需要一个桌面环境,后面的博文会陆续介绍我是如何安装并配置一个基本的桌面环境。最后到一个基本可用于日常生活和工作中的操作系统。
2021年10月16日
17 阅读
0 评论
0 点赞
2018-04-27
Python处理正则表达式超时的办法
title: Python处理正则表达式超时的办法tags: [python3, 正则表达式超时, re模块]date: 2018-04-27 21:40:21categories: Pythonkeywords: python3, 正则表达式, re模块, linux信号最近在项目中遇到一个问题,就是需要采用正则匹配一些疑似暗链和挂马的HTML代码,而公司的老大给的正则表达式有的地方写的不够严谨,导致在匹配的时候发生卡死的现象,而后面的逻辑自然无法执行了。虽然用正则表达式来判断暗链和挂马可能不那么准确或者行业内很少有人那么做,但是本文不讨论如何使用正确的姿势判断暗链挂马,只关注与正则超时的处理。在使用正则表达式的时候,如果正则写的太糟糕,所消耗的时间是惊人的,并且有可能会一直回溯,而产生卡死的现象,所以一般的大型公司都会有专门的人来对正则进行优化,从而提高程序效率。一般来说如果可能的话不要让用户来输入正则进行匹配。但是现在既没有专门的人进行正则的优化,本人也对正则了解的不够,所以只能从另外的角度来考虑处理超时的问题。首先我想到的方法是另外开启一个线程来进行匹配,而在主线程中进行等待,如果发现子线程在规定的时间内没有返回就kill掉子线程。这也是一个方案,但是我现在要介绍另外一种方案,该方案来自我在网上看到的一篇博客.博客地址该博客给出了另外一种办法,就是采用信号的方式,在正则匹配之前定义一个信号,并规定触犯时间和处理的函数,如果在规定时间内程序没有结束那么触发一个TimeoutError的异常,而主线程收到这个异常时就会中断执行,并处理这个异常,这样就从正则匹配中解脱出来,达到了我们要的结果。这个方法有两个不足之处:信号这个东西是Linux独有的,在Windows下不适用信号只能在主线程中使用,而如果在子线程中进行正则匹配,那么这个方法就不适用我的项目正在运行在Linux系统上,所以针对第一个不足来说可以接受,但是我的正则匹配都是在子线程中,所以乍看之下这个方案也不太靠谱,但是好在我在后面的评论中发现博主给出了针对第二种不足的解决方案——开辟一个子进程,将正则匹配放到子线程中,这样一来可以充分利用多核(毕竟Python中的多线程是个伪多线程),二来可以分方便的使用该方案解决问题,下面是实际的代码import re import multiprocessing import signal def time_out(b, c): raise TimeoutError def search_with_timeout(pipe, word, value): signal.signal(signal.SIGALRM, time_out) signal.alarm(1) r = re.compile(word) try: ret = r.search(value, re.I) b_ret = True if ret != None else False pipe.send(b_ret) except TimeoutError: pipe.send(False)在上面的代码中先的定义了一个信号,给定1s中以后触发,触发的函数为time_out然后执行正则表达式,如果在这1s中内无法完成,那么处理函数会被调用,会跑出一个异常,此时主线程终止当前任务的执行,进入到异常处理流程,这样就可以终止正则匹配,从而正常的返回。由于这个部分是一个新进程自然就涉及到不同进程之间的通信,在这个例子中我使用了管道进行通信。由于Python在创建子进程的时候可以进行参数的传入所以我只需要一个管道将数据从子进程中写入,再从朱金城中读取就好了。下面是调用该子进程的代码:pipe = multiprocessing.Pipe() p = multiprocessing.Process(target = search_with_timeout, args = (pipe[0], word, left_value)) p.start() p.join() #等待进程的结束 ret = pipe[1].recv() #获取管道中的数据
2018年04月27日
24 阅读
0 评论
0 点赞
1
...
3
4