Browsed by
Category: archlinux

Running Arch Linux with customized kernel in QEMU

Running Arch Linux with customized kernel in QEMU

本文为内核爱好者们介绍一个便利的运行内核的方式,使用 QEMU + virtio 启动一个装载着自定义内核的 Arch Linux。 0x00 构建内核 我们使用 Arch Linux 发行版使用的 .config 作为配置文件, 可以省却很多自己配置 Kernel Options 的繁琐工作。将配置文件放入 kernel source tree 后,使用 make oldconfig 就可以通过一个交互的命令行将最新的内核里的可配置参数补全到我们使用的 Arch Linux 的 .config 文件中。 我们有两种方式获取到 Arch Linux (和其他发行版) 的 .config 文件: 使用 zcat 读取 /proc/config.gz 的内容并且保存为 .config 直接复制 `/usr/lib/modules/$(uname -r)/build/.config 若要使用方法 1 ,内核需要开启 Enable access to .config through /proc/config.gz 这一选项需要我们将 IKCONFIG_PROC 设置为 y (相关依赖 option 项目也需要满足) 配置文件准备好后,我们就可以开始构建内核了,如果你会频繁构建内核,建议使用 ccache 来缓存编译的中间目标文件 “*.o”。ccache 具体配置方法这里不多做介绍,简单说下使用方法,很简单,只需要在 gcc,cc,g++,c++ 的前面加上 ccache 即可,e.g 使用 ccahe 编译内核的构建命令可以这样写: make CC=”ccache gcc” -j8。注意:ccache 不会提升首次编译的速度,它会将这些中间文件缓存起来,在后续的…

Read More Read More

Building your own live streaming site using Nginx RTMP & video.js

Building your own live streaming site using Nginx RTMP & video.js

As I said in twitter I will update my blog at least once a week, so now I am writing this week’s blog (Although this article doesn’t contain too much technical detail) I just built my personal live server, for the trail version on bilibili is expired. And I don’t want to send sensitive personal data to that platform, so I decided to build one on my own. Previously I built a live stream service using my raspberry pi, and only…

Read More Read More

[Archlinux] 如何解决搜狗输入法炸掉的问题

[Archlinux] 如何解决搜狗输入法炸掉的问题

近期不知道什么蜜汁更新导致fcitx-sogoupinyin可能由于魔幻的力量崩溃。而且看错误毫无头绪(炸在奇怪的glibc的函数里) 因此这里提供一个玄学尝试的办法 rm ~/.config/SogouPY pgrep fcitx | xargs kill 再启动fcitx 以及sogou-qimpanel 也许就能救回来哦~ 【又水了一篇文章】

ArchLinux on MBP Installation Guide [大部分内容适合普通ArchLinux安装] 上

ArchLinux on MBP Installation Guide [大部分内容适合普通ArchLinux安装] 上

TL;DR 这两天OS X的虚拟机挂了,两个月的工作成果都丢了,因为本人是重度Archlinux依赖用户既然虚拟机这么难用(不能用全部内存&有快照损坏的风险)因而,唯一的选择就是在MBP上装Archlinux了。同时因为这是第一次用UEFI的模式Dual boot Archlinux + OS X,并且是第一次使用KDE而不是一直用的Gnome,因而踩了很多坑,所以本文会比较长( 本文介绍的是在MBP上Dualboot OS X + ArchLinux 使用KDE并配置好所需的必备软件的整个过程 ArchLinux 优点 如果连这个都不知道的话那么说明可能温豆师/污班图还是比较适合你((其实是很麻烦不想写因为已经写烂大街了 那么我们就开始吧OwO 材料准备 一个容量足够装下ArchISO的U盘 一台Macbook 畅通的网络 一些干粮(不然熬久了会饿的) rEFInd 不确定是否要禁用Apple的 Configuring System Integrity Protection 如果在操作引导过程中遇到问题,那么就设置一下这个 足够大的空间(用OS X 自带的 Disk Util 将要用来装Arch的空间划分出来,不用管文件系统,反正一会儿也得删) 引导安装 EFI 介绍 EFI boot是比 BIOS Boot 要先进的 boot 方式,古老的 BIOS 需要让CPU先进入16bit的实模式,仅仅能执行有限的一些 BIOS 提供的中断,并且 BIOS因为是直接用CPU的汇编编写的,对硬件平台有非常高的依赖,包括在BIOS下运行的驱动,尤其网络驱动,还要独立的给每一个架构的CPU编写一套独立的驱动,维护难度和开发难度都比较高,而 EFI 加载的驱动是以 EFI 字节编码 ,独立于CPU架构,因而更优,且BIOS无法支持大于 2TiB 的硬盘,因而对目前的很多机器这都是致命的瓶颈 (参考资料), 因而目前的个人PC开始采用 UEFI (EFI的一个更新版本)进行系统的引导。 引导过程以及ESP EFI 的引导不同与 BIOS,不需要将 Bootable program 放在 first sector ,而是将引导程序放在 ESP 中 ESP (EFI System Partition) 存放了EFI引导的必备程序,路径格式需要符合此规范<EFI_SYSTEM_PARTITION>/BOOT/BOOT<MACHINE_TYPE_SHORT_NAME>.EFI (此行摘自wikipedia) 例如/efi/BOOT/BOOT (具体识别哪个路径,以及能否识别不同的路径跟固件的实现有关,具体讨论如下…

Read More Read More

将内核编译到自定义的目录下

将内核编译到自定义的目录下

参考wiki: https://wiki.archlinux.org/index.php/Kernels/Traditional_compilation 使用ArchLinux作为构建Linux的环境 方法如下 假设我们的customized directory为kernel-build 我们必须在kernel-tree目录结构下对内核进行编译,假设kernel-tree目录名为linux-kernel 下面是具体的操作: make menuconfig # Change the local version in General Settings make -j8 make modules -j8 sudo make modules_install 在 make menuconfig 的时候,最好对内核版本进行修改,使之不会在make modules_install的时候覆盖掉现有内核的modules 修改途径为General Setup里的Local Version项 这样执行之后,应该在arch/ARCH/boot/下面存在bzImage内核镜像,并且modules应该被安装在了/lib/modules/<linux-version>-<localversion> 下 下一步操作, 修改linux.preset文件,并创建initrd文件 ## Change to kernel-build directory cp ../arch/<arch>/boot/bzImage [image-name] cp /etc/mkinitcpio.d/linux.preset . 修改linux.preset文件, 修改完毕后的内容类似下面 # mkinitcpio preset file for the ‘linux’ package ALL_config=”/etc/mkinitcpio.conf” ALL_kver=”/home/void001/linux-kernel/kernel-build/vmlinuz” PRESETS=(‘default’ ‘fallback’) #default_config=”/etc/mkinitcpio.conf” default_image=”/home/void001/linux-kernel/kernel-build/initramfs-linux.img” #default_options=”” #fallback_config=”/etc/mkinitcpio.conf” fallback_image=”/home/void001/linux-kernel/kernel-build/initramfs-linux-fallback.img” fallback_options=”-S autodetect” 我们需要修改ALL_kver, default_image, fallback_image三个选项,使其将image保存到指定的目录下 然后使用 mkinitcpio -p ./linux.preset 创建initrd, initrd-fallback,目前kernel-build目录应该有如下文件: ╰─➤ ls…

Read More Read More

tmux 终端效率利器

tmux 终端效率利器

重度终端使用者的话如果没有一个好的终端多任务管理的工具是非常痛苦的, tmux是一个非常好用的终端多任务多session多窗口管理工具 功能十分强大 具体的介绍可以看这里 https://raw.githubusercontent.com/tmux/tmux/master/FAQ 效果图     tmux的manpage十分长,不是所有的功能都会常用到,这里有一个cheatsheet记录了常用的功能 https://tmuxcheatsheet.com/ tmux-powerline 非常美观实用的一个tmux工具 github repo  https://github.com/erikw/tmux-powerline 下面是各种个人配置的tip 修改tmux默认Ctrl b为其他键位 set-option -g prefix C-a 修改tmux窗口的名字 并保持名字不会更改 echo “export DISABLE_AUTO_TITLE=true” >> ~/.zshrc 然后source配置文件让设置生效 在tmux中开启新的窗口的时候,默认以最初启动tmux的时候的路径开启,这样很不方便,配置~/.tmux.conf让其以当前目录创建新的窗口和分割,增加如下三行配置 bind c new-window -c “#{pane_current_path}” bind ‘”‘ split-window -c “#{pane_current_path}” bind % split-window -h -c “#{pane_current_path}” 向所有当前window的pane(窗口)内输入同样的指令 :set-option synchronize-panes on/off  

[Docker] 新建一个Docker Image并push到dockerhub

[Docker] 新建一个Docker Image并push到dockerhub

Preface 软件开发测试过程中的环境配置一直是令人头疼的事情,Docker正是为了解决这种问题而诞生的一套工具,现在已经发展成为了一个生态,使用Docker,可以轻松的部署你的项目,并且保证不同slave机器的环境配置完全一致,当你提交一个patch(commit)之后,想要测试项目的运行的时候, 只需要docker run <your-image>就可以轻松的搭建好项目运行环境,并且访问配置好的服务器端口,就可以访问到刚刚修改后的项目了~ 同时docker结合DroneCI TravisCI等CI平台,使得软件测试也变得十分容易 NEUOJ的健壮性测试,就是在自建的私有DroneCI服务器上运行的 但是因为之前我是直接使用的centos的镜像,没有进行修改,所以之前我们每一次运行测试,都需要下载一大堆软件包,然后才开始运行代码测试, 既费时又费流量(每一次都需要安装200MB的东西) 因而自己新建一个Docker镜像包含这些所有的软件包能省去很多时间以及流量 新建一个Docker镜像 使用docker build命令可以轻松的创建Docker Image 创建docker image需要Dockerfile, Dockerfile描述了这个image要用到的base镜像, 你可以从一个已经存在的镜像开始创建, 也可以Build From Scratch Dockerfile的每一个指令的格式如下 INSTRUCTION args 常用的INSTRUCTION有 FROM: 表示镜像的base是什么,scratch的话表示无base RUN: 执行Shell命令,并将结果打包到images中 CMD: docker run images的时候执行的命令 MAINTAINER: 维护者 以下是一个示例Dockerfile # NEUOJ Test Script Ver1.0 FROM centos:7 MAINTAINER VOID001 <[email protected]> #- uname -a RUN yum install wget -y RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm RUN yum install git -y RUN yum install openssh-clients -y RUN rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm # Add php7 Source RUN yum repolist…

Read More Read More

[Proxy] SOCKS5 转 HTTP 神器

[Proxy] SOCKS5 转 HTTP 神器

Shell是支持配置http, https proxy的使你的指令请求自动的转到你配置的代理服务器端口 然而SOCKS5的proxy是不支持从Shell直接配置的, 这时候你就需要一个工具将其转发啦 ArchLinux官方源就有这个神器polipo 配置十分简单,这里就不说啦~ 使用的时候 systemctl enable polipo.service systemctl start polipo.service

[ArchLinux] 使用systemd创建自定义的开机启动项

[ArchLinux] 使用systemd创建自定义的开机启动项

为了满足日常工作开发需要, 窝需要Cisco的VPN agent在开机额时候就启动, 而Arch不像Ubuntu用/etc/initrc下编写启动脚本, 下面简单记录一下编写vpnagentd的启动脚本以及启动的设置为开机启动的过程 首先在 /usr/lib/systemd/system下创建一个文件叫做vpnagentd.service然后写入如下内容   [Unit] Description=Cisco VPN Service Wants=NetworkManager.service After=NetworkManager.service [Service] Type=forking ExecStart=/opt/cisco/anyconnect/bin/vpnagentd PIDFile=/var/run/vpnagentd.pid ExecReload=/usr/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target 这里的ExecStart填写的是你要启动的vpnagentd所在的路径, 其他的参数都一目了然, WantedBy暂时先不解释(因为窝也没研究呢QAQ) 然后 执行 systemctl enable vpnagentd.service  然后就可以啦  

[C Linux 内核] 文件系统(以ext2为例)

[C Linux 内核] 文件系统(以ext2为例)

ext2文件系统的总体结构 每一个文件系统, 由若干个块组构成, 文件系统的最前面是大小固定(大小不能由用户指定,PC标准规定启动块大小为1KB)的一个启动快(Boot Block) 然后是若干块组, 每个块组内含有的信息为: 超级块(Super Block) 块组描述符表(Group Descriptor Table GDT) 块位图(Block Bitmap) inode位图(inode Bitmap) inode表(inode Table) 数据块(Data Block) 其中, 超级块是描述该文件系统(注意,不是该块)的基本信息,如 块大小, 文件系统版本号 等信息, 可以通过 dumpe2fs 的头部信息查看到superblock信息, 在该文件系统中,每一个块组的头部, 都有一份Superblock信息的copy 块组描述符表,  存储该块组的基本信息,每一个Block group一个 块位图, 每一个bit代表该块组中的一个块, 如果这个块被使用了, 则该bit为1 否则为0 inode位图, 和楼上类似,只不过这次每一个bit代表的是该inode块中的一个块, inode位图单独占一个块 inode表: 存储文件的基本描述信息, 如 文件类型, 权限, 大小, 文件的时间戳信息等, 都存储在inode块内, 多个inode块构成inode表, 而且特殊的, 一些不占用磁盘空间的文件 ,如 /dev/tty 这种设备文件, 内存映象文件等, 都只占用inode block,而不占用Data block 数据块: 数据块内数据的存储根据不同filetype有不同的情况:   对于regular file, 文件的数据存储在数据块中 对于目录文件, 该目录下的所有文件名和目录名存在数据块中, 注意, 一个 regular file的文件名不保存在他的数据块中, 而是保存在他目录的数据块中 对于符号链接, 如果目标路径短,则存在inode中, 否则, 要分配一个数据块来保存这个符号链接名 设备文件, FIFO socket等特殊文件没有数据块,只有inode块,…

Read More Read More