Browsed by
分类:archlinux

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 use the most simple configuration of nginx, and it does not play very well. Now I have bought a shiny new VPS from CAT.NET with my partner onion, it’s awesomely fast and fluent, so I use this server to build my live stream service, including a frontend to play the stream.

The tutorial is here: https://docs.peer5.com/guides/setting-up-hls-live-streaming-server-using-nginx/ 

The following guide will show how to build one stream server on Archlinux (Yes, archilnux ONLY, but compatible with many other distro), Just follow the basic steps:

Setting up the RTMP Streaming Server with HLS

  1. Install nginx-rtmp from AUR (nginx-mainline + nginx-rtmp-module may also works, but I have problems when compiling the module using makepkg)
  2. If you have previous nginx configuration, install nginx-rtmp will conflict with nginx, just remove it, no worry about the configuration file you wrote, it will be stored at /etc/nginx/nginx.conf.pacsave
  3. If you have a previous installation of nginx, after install nginx-rtmp  exec the command mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old and mv /etc/nginx/nginx.conf.pacsave /etc/nginx/nginx.conf
  4. Then restart the nginx server and reload the daemon systemctl daemon-reload  && systemctl restart nginx.conf
  5. This restart shouldn’t generate any error except you have error in your previous nginx config
  6. Then create the rtmp.conf file (or whatever you name it)  example configuration can be found here

Here is my rtmp.conf, remember to include it in nginx.conf OUTSIDE the http block like this:

Then you can use OBS or anything else to push to the livestream, in this example, you should push to

In the key field just write something e.g: test

Remember to mkdir /tmp/hls before using the live stream

 

Setting up the Live Stream data service

We need hls.js or videojs with hls supported, I choose the latter one.

create a config in /etc/nginx/sites-available

e.g: live.void-shana.moe.conf

put these lines in the config file

Then when you visit https://example.com/stream/test.m3u8 you will get the live stream playlist of live named “test”.

This *.m3u8 file is a text file that describes every segment to play (segments are named in <name>-<id>.ts format), here is a sample file

The videojs / hls.js will recognize format and parse it, fetch *.ts segments from server then play it one by one, making it looks like a live stream.

Create a webpage to show it

I use videojs with hls support for this, just take a look at view-source://live.void-shana.moe/ you can get a video player that works.

See https://github.com/videojs/videojs-contrib-hls#getting-started for more details

 

Screenshot

TODO

I didn’t find any credential configuration when setting up rtmp stream, this will make it dangerous when someone know my rtmp URI. Bad guy can push nasty live stream / video to my site, currently the URI is complex, and cannot be fetched from frontend (I only expose the hls interface). Future will try to support auth

 

If you have problems when setting up the live stream service & frontend, just feel free to comment below, I am glad to help

[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 (具体识别哪个路径,以及能否识别不同的路径跟固件的实现有关,具体讨论如下

 

识别之后,就会加载相应的程序以及驱动,之后就是.efi程序接管启动过程了

操作

这里采用的是使用rEFInd替换OS X原生的引导。

首先呢我们要将引导准备好, 以下操作在OS X下进行

rEFInd 下载安装程序, 安装好rEFInd

http://www.rodsbooks.com/refind/installing.html 这里的教程应该是有点过时了,安装 refind 现在可以简单的直接运行refind-install指令

refind-install 会自动识别一般的Mac的 EFI 分区并且将refind<arch>.efi复制进去

然后需要修改OS X的默认boot loader,这里使用 OS X 提供的 bless 工具即可  (如果无法写入的话,关闭System Integrety Protection) 

sudo bless --mount /Volumes/ESP --setBoot --file /Volumes/ESP/efi/refind/refind_x64.efi --shortform

然后关机,再次开机之后应该就能看到rEFInd的界面啦~

下一步就是开始进行ArchLinux的安装辣~ 请各位小伙伴准备好ArchLinux的wiki,查看Installation Guide与Macbook这两个词条哦~

基本安装

首先制作好LiveCD,LiveCD的制作和在其他电脑上安装 Archlinux 没有区别,然后重启Boot到ArchLinux LiveCD中即可

然后下面开始ArchLinux安装的基本步骤:

调网络,时间=>分区=>格式化=>挂盘=>装底包=>chroot=>各种基本配置=>装引导=>重启

为了照顾到安装还不熟练的小伙伴们,这里会把每个过程都列出来(其实我也不熟练,也就装了十几次(逃

网络和时间设置

考虑到Macbook大多数没有有线以太网口,这里以无线网链接为例来进行介绍,我们使用wpa_supplicant进行处理。

首先检测自己的网络设备

ip link list  找到自己的无线设备,然后将设备设置为up状态

ip link set <dev> up

然后使用wpa_supplicant链接无线网络,具体用法如下

wpa_supplicant -Dnl80211,wext -i <dev> -c<(wpa_passphrase "YourNetWorkSSID" "YourNetworkPass")  这里解释一下该指令的含义,wpa_supplicant 是用于进行WiFi认证的客户端,指定的参数为:驱动使用 nl80211 或者 fallback 为 wext 驱动(前者为新的netlink interface驱动),使用的网络接口设备为 <dev> ,链接用的配置文件从重定向读入,重定向是一个shell指令,wpa_passphrase用来生成可以被wpa_supplicant读取的配置文件。

测试如果可以链接之后,Ctrl+C 停掉进程,加上-B参数以后台模式运行wpa_supplicant。

下面获取IP,推荐WiFi开启dhcp服务,之后直接通过 linux 的 dhcpcd client 获取 IP 即可

之后就可以尝试

ping archlinuxcn.org 

分区

窝们采用 UEFI 在MBP上 Dual Boot OS X & ArchLinux ,因而分区的创建要注意几点

  •  第一个Archlinux的分区要和OS X分区有128MB的空隙,不然会导致OS X无法正常使用
  •  设置好 UEFI 分区的GUID

分区大家可以使用自己喜欢的工具进行,这里要注意的就是,给Arch分第一个分区的时候要在First Sector中填入+128M(有的工具不支持,窝只在cgdisk里用过) ,然后注意EFI分区大小要大于200MB,并且设好GUID,其他分区自行判断辣~

这里给出本人的一个分区方案

格式化

窝采用了 xfs 作为文件系统, 过一阵子考虑做一个对不同文件系统的对比,介绍的文章(坑)。因而将/home /var / 全部格式化为 xfs格式,把  /boot 格式化为 vfat 格式, 这里给出格式化/boot分区的指令

mkfs.fat -F32 /dev/sdxY

格式化好之后就可以挂盘开始装基础包辣~

挂载硬盘(/boot的挂载是重点)

这里要注意,窝们使用的是 UEFI 的方式 boot 系统,那么要配置好 ESP (EFI System Partition) 使之符合 ESP 的文件目录规范~不过这里说是规范呢,实际上是和具体实现有关的,好在Mac上的(至少窝的macbook pro 15)firmware会遍历/efi下的*.efi文件,找到了就会以此作为boot loader 或者 bootable device (具体寻找顺序,未知,待实验)

OS X已经有现成的 ESP 了, 我们不妨就直接拿来用, 将 apple 的 ESP (在我电脑里是 /dev/sda1)挂载到 /boot/efi 上,在此之前先挂载好 /boot ,其他盘的挂载方式都按照wiki来即可,挂载在 /mnt 下,顺序为先挂 / 的分区,然后挂 /home /var /boot 然后在 /boot 里创建 efi 挂载点,把 esp 挂载到 efi 挂载点上,挂载之后的样子应该和窝上面给出的格式类似。

挂载好之后,并且确定网络正常,就可以开始正式的安装了~

装底包

在安装前先选择好速度较快的镜像, 修改 /etc/pacman.d/mirrolist 将想要使用的镜像放到最前面,即可

然后就可以  pacstrap /mnt base 了~ 这个过程结束之后, archlinux 的基本包就装好了~

chroot & 基本配置

在chroot之前,我们来建立一下开机必备的fstab文件。

fstab 介绍

fstab 是文件系统的静态信息(翻译自man page) 简单理解这个信息就是系统启动的时候对磁盘分区的挂载的指示,如果没有此信息或者此信息存在错误,那么很可能因为磁盘挂载失败导致开机失败。

以下是一个 fstab entry 的示例

用空格和tab将一个entry分为了多个部分:

  •  第一部分是 用于标示分区的部分,可以是分区名(/dev/sda2),也可以是分区 UUID (UUID=xxxx),或者label,或者GPT分区的UUID,Label 不过强烈不建议使用分区名作为分区的标示依据,分区名会根据连接的设备不同而变化,比如目前是/dev/sda的硬盘可能在你连了一个移动硬盘之后就变成/dev/sdb了,这样以来fstab就全乱了
  • 第二部分是挂载点
  • 第三部分是文件系统类型
  • 第四部分是mount时候的选项,比如 ro 只读挂载,还有特定文件系统自带的一些选项
  • 第五部分(未知)
  • 第六部分是mount的顺序,编号越小越先挂载

好了,介绍完fstab了,那么现在我们就来生成fstab,注意一定要在生成的时候加上 -U 选项不然的话生成的就不是以UUID标示分区的fstab,而是以分区设备名标识的了(惨痛的教训

然后接下来就可以chroot了~

之后就是一些必要的设置,以及引导的安装啦

首先我们设置一下时区, 并生成 /etc/adjtime

之后设置必要的语言环境(locale),如果设置语言环境出了问题,就会出现各种神奇的乱码,让你欲罢不能(很烦

国内的用户需要用到的locale应该至少有 en_US.UTF-8 zh_CN.UTF-8 这两个,所以我们把这两行从 /etc/locale.gen 中解除注释 然后生成 locale

在 /etc/locale.conf 中设置好默认语言LANG

然后建立一个 /etc/hostname 文件,里面给自己心爱的 Arch 酱起个名字吧~~

不要忘了给root用户设置一个密码,下一次登录要使用

好啦,经过这些设置之后,我们已经有一个基本功能的 Archlinux 了,下面我们要 Boot 到安装好的 ArchLinux 中,离开 LiveCD,在这之前,我们还有一些事情要做~

 

安装引导程序

refind 需要一个config file来 boot 我们的ArchLinux,这个configfile可以通过 refind-install 生成一个框架,然后我们需要修改一下这几个entry,因为默认生成的 entry 不能用(((

使用refind-install之后,我们应该能在 /boot/ 下看到一个文件 refind_linux.conf ,没错就是他,而且他应该和vmlinuz-linux以及initramfs在一个分区下才正确 。

我们打开这个文件,修改它的内容如下~

恩恩~~ 那么只要重启,就能(应该)看到我们的Arch Linux辣~ 我们将会在真正的ArchLinux而不是ArchISO里进行后续的图形界面设置,以及自定义设置

 

不过在此之前,为了下一步能够进行下去,我们需要安装无线网络工具,比如 netctl 或者 刚刚使用的 wpa_supplicant, 这两个包是没有随着 base 一起装进来的。

 

那么我们这次就说到这里~ 下一篇文章将会介绍详细的设置,以及 MBP 的几个常见使用问题的解决办法

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

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

参考wiki: https://wiki.archlinux.org/index.php/Kernels/Traditional_compilation

使用ArchLinux作为构建Linux的环境

方法如下 假设我们的customized directory为kernel-build

我们必须在kernel-tree目录结构下对内核进行编译,假设kernel-tree目录名为linux-kernel

下面是具体的操作:

在 make menuconfig 的时候,最好对内核版本进行修改,使之不会在make modules_install的时候覆盖掉现有内核的modules

修改途径为General Setup里的Local Version项

这样执行之后,应该在arch/ARCH/boot/下面存在bzImage内核镜像,并且modules应该被安装在了/lib/modules/<linux-version>-<localversion> 下

下一步操作, 修改linux.preset文件,并创建initrd文件

修改linux.preset文件, 修改完毕后的内容类似下面

我们需要修改ALL_kver, default_image, fallback_image三个选项,使其将image保存到指定的目录下

然后使用

创建initrd, initrd-fallback,目前kernel-build目录应该有如下文件:

然后使用

就可以运行我们自定义的Linux Kernel了,可以使用uname -a查看Kernel Version~

不过到这里我们仅仅完成了一个RAMDisk的Kernel,没有任何的文件系统被挂载,只有一个rescue filesystem和busybox的一些东西能使用,为了构建一个能够正常使用的Linux Image,包含一个Distro应该有的程序,下面将通过Linux From Scratch项目一步步构建一个可用的自己的Distro

tmux 终端效率利器

tmux 终端效率利器

重度终端使用者的话如果没有一个好的终端多任务管理的工具是非常痛苦的, tmux是一个非常好用的终端多任务多session多窗口管理工具 功能十分强大 具体的介绍可以看这里

https://raw.githubusercontent.com/tmux/tmux/master/FAQ

效果图

cad50898-6128-49cf-a3d2-c92a08b95e24

 

2ec6c6ef-04af-4546-8a95-36671f19f207

 

tmux的manpage十分长,不是所有的功能都会常用到,这里有一个cheatsheet记录了常用的功能

https://tmuxcheatsheet.com/

tmux-powerline 非常美观实用的一个tmux工具

github repo  https://github.com/erikw/tmux-powerline

下面是各种个人配置的tip

修改tmux默认Ctrl b为其他键位

修改tmux窗口的名字 并保持名字不会更改

然后source配置文件让设置生效

在tmux中开启新的窗口的时候,默认以最初启动tmux的时候的路径开启,这样很不方便,配置~/.tmux.conf让其以当前目录创建新的窗口和分割,增加如下三行配置

向所有当前window的pane(窗口)内输入同样的指令

 

[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的东西)

hhhh

因而自己新建一个Docker镜像包含这些所有的软件包能省去很多时间以及流量

新建一个Docker镜像

使用docker build命令可以轻松的创建Docker Image

创建docker image需要Dockerfile, Dockerfile描述了这个image要用到的base镜像, 你可以从一个已经存在的镜像开始创建, 也可以Build From Scratch

Dockerfile的每一个指令的格式如下

常用的INSTRUCTION有

FROM: 表示镜像的base是什么,scratch的话表示无base

RUN: 执行Shell命令,并将结果打包到images中

CMD: docker run images的时候执行的命令

MAINTAINER: 维护者

以下是一个示例Dockerfile

然后 生成Docker Image的指令为

docker build -t <username>/<imagename> /path/to/your/Dockerfile/directory

e.g docker build -t void001/neuoj-test .

然后 image 就生成好啦~

将Docker镜像push到Docker Registry

镜像生成好了,我们可以用 docker images来从查看 为了使我们的镜像全网络都可以用,我们需要将他push到一个docker registry上,可以理解为和github类似,只不过github托管的是code,docker registry(也叫dockerhub)托管的是镜像 docker官方的registry是 hub.docker.com 我们也可以用docker自己在本地搭建docker registry服务器,这里就不做介绍了

在dockerhub注册一个账号之后,我们在本地使用如下指令就可以登录自己的dockerhub账号

docker login

登录的时候需要提供用户名和密码 然后就会将你的credential保存在本地的一个文件里(~/.docker/config.json) 然后你就可以向docker reg 中你的repo进行推送操作了

这里注意,之前这个镜像的名字一定要为 yourname/your-image 而不能单单是 your-image 不然会导致直接推送到官方的docker lib/image下,而你是没有这个权限的,所以推送失败QAQ确定好镜像名字之后,直接使用

docker push yourname/your-image 就可以将镜像推送到docker registry了~

hhhh

然后就可以在自己的.drone.yml里配置使用我的neuoj-test镜像作为测试用镜像了,已经预装好了所有NEUOJ运行需要的依赖,因而只需要运行测试就可以而不需要每次都安装一大堆软件包了~(镜像下载完之后,会存到本地的docker的lib下,因而只需要pull一次镜像,以后就可以很快的从本地get到这个镜像)

[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然后写入如下内容

 

这里的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有不同的情况:

  1.   对于regular file, 文件的数据存储在数据块中
  2. 对于目录文件, 该目录下的所有文件名和目录名存在数据块中, 注意, 一个 regular file的文件名不保存在他的数据块中, 而是保存在他目录的数据块中
  3. 对于符号链接, 如果目标路径短,则存在inode中, 否则, 要分配一个数据块来保存这个符号链接名
  4. 设备文件, FIFO socket等特殊文件没有数据块,只有inode块, 可以通过 ls -l /dev/tty 以及 对比 ls -l /etc/shadow 发现二者信息的不同

 

下面我们就通过一个例子, 来演示一下, ext2文件系统的具体构成

首先, 在你的Linux下新建一个空的 1M大小的文件, 并把他做成一个 ext2 filesystem 具体做法参考下面的代码, 都是基本的命令, 不做解释

这样之后, 你便得到了一个崭新的ext2文件系统, 它可以像普通的磁盘设备一样被挂载, 下面挂载一下这个文件系统, 看看里面有什么东西

ls -l 看看信息, 然后umount 这个磁盘 我这里给出我改动过后(touch了一个biu 文件之后)的ls -al信息

你们看到的应该没有 biu 这个文件, 现在 我们umount掉这个磁盘, 看看这个磁盘的信息在sample_fs这一个二进制文件中是如何存储的

我们使用  od -tx1 -Ax sample_fs 来dump出整个ext2 filesystem的信息, 然后 对照着  dumpe2fs sample_fs  以及 debugfs sample_fs 的信息,来一个byte一个byte的对应查看

首先 前面的1024个Byte是Boot block, 因为这不是一个可以启动的文件系统, 所以数据没有意义, 然后是superblock ,然后是 GDT 我们按照这个顺序给出相应的分析 在下面的分析文件中, 每一个数据域用” | |” 分割, 对它的解释用 逗号”,”分割

在分析 superblock相应信息的时候, 对照 dumpe2fs 的信息来看, 这里给出一个样例

在查看相应的文件的inode, data block的信息的时候, 对照 debugfs 的信息来看 (使用 debugfs 的 stat 命令)

 

上面只给出了Superblock GDT, block & inode bitmap, 以及 “/”的 inode, 和 datablock的分析, 下面请试着通过上述信息分析lost+found目录的inode, datablock (参考答案在下面)

 

注:这个文件系统只有一个块组 , 每个块大小为1KB, 文件系统总共1024个块, 除去Boot block还有1023 块, 这些都属于

Group 0, 其中 Block 1是 超级块, 接下来的块由GDT给出, 通过GDT知道 BlockBitmap是 Block 6,Inode bitmap是block7, inode总共有128个(超级块的信息给出), 另外在读上面数据的时候,注意要用小端序来阅读(little endin)

空间红包谜题解法(Linux + base64 + HTTP Header + 摩尔斯电码)

空间红包谜题解法(Linux + base64 + HTTP Header + 摩尔斯电码)

题目

解密红包, 支付宝中文口令红包

(后来被人说二维码扫完还得用电脑重输一遍网址好麻烦 = = 于是我就把二维码对应的网址给出来了 : http://1.justquiz.sinaapp.com/voidmengmengda) —- 这就是完整的题干了, 谜题总共有三关, 个人认为难度是递增的, 下面放出每一关的解法

解法

* 第一关

首先看第一关的内容, 网页本身查看源码并没有什么用处, 不过注意到标题, “请用桌面浏览器打开哦~” 桌面浏览器(即Chrome Firefox) 和一般的移动端浏览器的区别就是, 桌面浏览器支持开发者视图, 可以看到更多详细信息, 除了看到源码, 我们还可以看到cookie session storage等东西, 也包括请求的header, 而这一关的线索就藏在了header里, 在服务器Response你的Request的时候, 会在header里带上下一关的线索,  之后我在空间里也对第一关进行了提示, 有十多人在提示之后到达了第二关QAQ 比我预期的少了很多 附上第一关解决的截图(点击可查看大图) 图中的 HintURL 就是第二关的线索

 

* 第二关

( 列出服务器网站目录) 进入到第二关, 你会发现看到一个在线编译器, 以及这样一段提示想信息:

Happy New Year~! Congrats! You have solve the first Challenge! See what you can find here
Remember : This is a BUGGY online Compiler
This is a BUGGY online Compiler 表示这个在线编译器是有bug的, 具体是什么bug就需要大家自己去找了, 这一关我没有再给提示, 大家稍微尝试之后就会发现, 这个online Compiler没有禁止系统指令的执行, (虽然用户权限是正确的, 无法删除root 的文件, 但是还是有很多事情可以做的)  因而编写下面代码到在线编译器里 , (我选用C语言做示例)

执行之后 ,会显示如下信息 :

稍微留心一下, 就会发现, 你列出的目录, 就是你当前访问的网站所在的目录, 同一级 ,再仔细看一眼列表 ,找到提示文件 thisIStheHintYouNeed.html 通过浏览器访问这个文件 , 得到下一关的提示信息, 本关解决. 附上本关解决之后的截图(点击查看大图)

 

* 第三关

这是本谜题的最后一关了, 也是我制作的时候花时间最多的一关(毕竟第一次用CoolEdit 以前从来没玩过QAQ) 通过第二关的最后提示, 得到一个网址 : 在浏览器里访问改网址 得到类似下面的东西(仅截取部分做展示)

看到这种形式的文件, 第一反应就是base64编码, 尝试用在线解码器进行解码 , 结果发现解出乱码了 , 推测这可能是一个二进制文件, 于是用Linux下自带的解码工具 (Windows下也许也有,不过我不清楚00.00) 将文件解码之后, 输出到另一个文件, 注意不要带后缀名, 带后缀名会影响linux对文件类型的推测, 一会儿要进行文件类型的推测 执行下面指令得到解码后的文件 :

然后推测文件类型 , 通过hexdump xxd 等工具并没有看出文件是什么类型的 = = (也许是我自己能力不够) 因此使用linux下的file指令推测文件类型

通过这个可以看出, 这应该是一个媒体文件 , 因此用播放器对其进行播放 , (linux 下有工具 playsound 或者修改后缀名进行播放) 听到电报音, 长短结合,  想到可能是摩尔斯电码, 然后根据摩尔斯电码表对应下来 密码为  100081  转成中文 一零零八一, 输入进口令, 然而并不对 , 这是这一关的最后一个陷阱, 发现不对之后, 回去看一下第二关的提示URL :  最后面 drowssap.txt 看起来是不是很眼熟,  他就是单词password的逆转, 这是重要的提示信息,因此就说明要对摩尔斯电码进行逆转, 那么到底是把所有的数字颠倒顺序, 还是指把点(.) 和划(-) 的表示颠倒? 尝试之后发现 , 逆转得到的密码为  180001  而将点划表示颠倒之后得到的密码为  655536  作为一个程序员, 这两个选择哪个就不难决定了吧~  到此整个谜题全部解开了, 在支付宝页面输入正确的密码对应的中文, 就会拿到红包啦~    

 

 

后记 : 最后也没有人拿到那个红包QAQ,  不过还是有很多人很接近答案了~ 解密红包的乐趣在于解密而不是红包~ 我是玩的很愉快, 大家也玩的很愉快就好~

 

附上解密后的音频文件:

hint

以及摩尔斯电码对照表

数字

字符 电码符号 字符 电码符号 字符 电码符号 字符 电码符号
0 ━ ━ ━ ━ ━ 1 .━ ━ ━ ━ 2 ..━ ━ ━ 3 ...━ ━
4 ....━ 5 ..... 6 ━ .... 7 ━ ━ ...
8 ━ ━ ━ .. 9 ━ ━ ━ ━ .