February 11, 2025
从 Pelican 到 Hugo:博客静态网站框架切换(一)
很久以前就用jekyll搞过博客,jekyll是github page文档默认的例子,但是是基于ruby的,因为我最主要学的是python,那时候找了一个python的静态网站生成框架叫pelican。但几年下来感觉不如一个go的静态网站框架hugo发展的好,pelican 大概是 12k 的 star,而 hugo 有 77k 多,所以想尝试一下看看能不能切换到hugo。
这次打算写两篇,第一篇关于初始化了hugo框架并且用python脚本将pelican的markdown文件转换成hugo的,并且在本地运行起来,第二片写如何用部github action部署到Github Pages,也对主题,中英文多语言等进行调整和优化。
除了github上的受欢迎程度,我也大致问了以下chatgpt——hugo和pelican对比的主要优缺点,这里简单赘述:
- 构建速度极快(go的性能优势?)
- 社区活跃,主题和插件都较为丰富
- 多语言支持
- 配置简单,只需要yaml和toml文件,不需要实际写go代码(相比较pelican需要写python代码)
我现在使用的环境是windows的wsl2的ubuntu,所以具体代码以此为例:
一:备份 Pelican 分支
确保备份 Pelican 的分支,避免意外丢失数据或者需要快速重新上线pelican的blog时候,可随时恢复到原先的状态。
git clone https://github.com/gccpacman/gccpacman.github.io
git checkout -b pelican
git push -u origin pelican
二:安装 Go语言
浏览器到go官网下载并安装golang:
cd Downloads
sudo su -
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.23.6.linux-amd64.tar.gz
编辑.zprofile
加入环境变量 (因为我用的zsh):
# golang
export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin
三:安装hugo
ubuntu其实可以用apt或者snap安装,但我想要用最新的版本,就用go来安装了:
go install github.com/gohugoio/hugo@latest
安装完成后验证:
hugo version
四:创建hugo必要的文件
如果是一个新项目,按照Hugo官方文档安装完成 Hugo 后应该执行:
April 6, 2022
编译Linux From Scrach(LFS) --(2)下载LFS相关的源码并从创建目录和用户
按照文档里的链接,每行一个链接的方法,创建wget-list-sysv和needed-patches-list,源码我放在我的github仓库: https://github.com/gccpacman/LFS-ubuntu2204
0) 假设已经完成了LFS(1)的步骤 – 宿主机分区,设置LFS环境变量等
1) 在$LFS/sources/目录下,创建wget-list-sysv,执行以下命令批量下载源代码tar包
# wget-list-sysv
wget --input-file=wget-list-sysv --continue --directory-prefix=$LFS/sources
2)在$LFS/sources/patches目录下,创建needed-patches-list,执行以下命令批量下载源代码tar包
# needed-patches-list
wget --input-file=needed-patches-list --continue --directory-prefix=$LFS/sources/patches
3) 创建基本LFS Linux目录结构
mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin}
for i in bin lib sbin; do
ln -sv usr/$i $LFS/$i
done
case $(uname -m) in
x86_64) mkdir -pv $LFS/lib64 ;;
esac
mkdir -pv $LFS/tools
4) 创建LFS宿主机用户, 并且将$LFS下的目录chown给lfs用户
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs
# enter passwords for lfs user
# grant lfs $LFS directory permission
chown -v lfs $LFS/{usr{,/*},lib,var,etc,bin,sbin,tools}
case $(uname -m) in
x86_64) chown -v lfs $LFS/lib64 ;;
esac
5) 初始化lfs用户的bashrc和bash_profile, 添加LFS, LFS_TGT等环境变量
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
PATH=$LFS/tools/bin:$PATH
CONFIG_SITE=$LFS/usr/share/config.site
export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
EOF
April 6, 2022
编译Linux From Scrach(LFS) --(1)准备编译linux主机环境和磁盘分区
大概一年多以前看到了一个项目叫做Linux From Scrach,大致意思就是现在有无数的Linux发行版,但是最好的发行版就是你自己编译的。我倒是没有打算真的用自己编译的发行版,但是既然有时间就不妨看看能不能编译出来。于是下载了官方指导LFS安装的stable版本的PDF(https://www.linuxfromscratch.org/lfs/downloads/stable/),打算尝试看看。
0) 准备一台linux操作系统的主机
之前已经在自己的一台台式主机上安装了Ubuntu22.04 Desktop,打算以此作为LFS的编译环境。毕竟是裸金属的机器,有i7和固态硬盘加持,编译的效率应该就不用担心了。
1) 在ubuntu22.04主机根据LFS文档安装了缺失的编译依赖环境
sudo apt install qemu-system-x86
sudo apt install binutils
sudo apt install bison
sudo apt install coreutils
sudo apt install findutils
sudo apt install gcc
sudo apt install build-essential
sudo apt install m4
sudo apt install patch
sudo apt install perl
sudo apt install texinfo
sudo apt install xz
sudo apt install gawk
2) 确认是否正确安装所有依赖version_check.sh
#!/bin/bash
# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
MYSH=$(readlink -f /bin/sh)
echo "/bin/sh -> $MYSH"
echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
unset MYSH
echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1
if [ -h /usr/bin/yacc ]; then
echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
echo yacc is `/usr/bin/yacc --version | head -n1`
else
echo "yacc not found"
fi
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1
if [ -h /usr/bin/awk ]; then
echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
echo awk is `/usr/bin/awk --version | head -n1`
else
echo "awk not found"
fi
gcc --version | head -n1
g++ --version | head -n1
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
python3 --version
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1 # texinfo version
xz --version | head -n1
echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
then echo "g++ compilation OK";
else
echo "g++ compilation failed";
fi
rm -f dummy.c dummy
输出:
September 25, 2019
WSL无缝使用windows的Vagrant
同时安装windows和wsl下的linux版本的vagrant,配置环境变量就可以使用。linux下vagrant的好处很多,首先文件的换行和权限的烦恼没有了,然后可以使用一些revision工具,例如ansible,在vagrantfile初始化的时候带来很多好处
下载地址:https://www.vagrantup.com/downloads.html
Windows下安装就直接exe了
Linux我的是Ubuntu,因此就下官网的deb包
dpkg -i vagrant_amd64.deb
需要在Linux的Home目录下的
.bashrc
或者.zshrc
添加以下行,这样可以把windows的路径转换成WSL里的Linux路径:
export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS=“1”
- 大功告成,在
wsl
输入vagrant
,如果出现帮助信息就说明配置成功了
PS: 需要注意的是,wsl里的vagrant,不能读取Linux下的Vagrantfile
,需要Vagrantfile存在于windows文件系统,因为本质上vagrant还是在windows上执行,调用Virtualbox等虚拟机的SDK,也就是说你的Vagrantfile,必须位于类似于\mnt\c\
这样的windows挂载盘符目录下。
May 4, 2018
在虚拟机里跑资源占用超低的Linux桌面环境i3
现在的电脑是SurfacePro3,如果安装了Linux桌面环境,如Gnome或者xfce等,跑虚拟机会很吃力了,但是不是不能跑,重点是优化后把Linux的资源降下来非常流畅,而且还可以使用桌面应用。i3是个比xfce4更加轻量级的桌面管理器,Tiling的桌面可以保证所有打开的窗口都平铺满桌面,然后通过快捷键和鼠标切换应用,这边只讲述下我的安装过程,以及如何安装Vmware插件以支持剪切板,自动缩放虚拟机分辨率等:
首先要安装i3:
$ sudo yum install i3 # centos $ sudo apt install i3 # debian & ubuntu $ sudo pacman -S i3 # archlinux
备份并修改i3的配置文件,可以参考我的github,或者直接下载替换:
cp ~/.config/i3/config ~/.config/i3/config.bak wget https://raw.githubusercontent.com/gccpacman/vm-i3wm-config/master/config cp config ~/.config/i3/config
因为我的是高分屏,默认vmware不支持,但是可以修改i3的dpi让文字和界面看起来舒服:
echo "Xft.dpi: 118" >> ~/.Xresources
安装lightdm/gdm后,,设置session成i3,并且因为是虚拟机不想每次开机都输入用户名密码,可以设置自动登陆:
4.1
lightdm
修改/etc/lightdm/lightdm.conf
:[SeatDefaults] autologin-user= {{your username}} autologin-user-timeout=0 user-session=i3
4.2
gdm
修改/etc/gdm3/daemon.conf
:[daemon] AutomaticLoginEnable=true AutomaticLogin=teotfw
4.3 或者直接disable x-manager, 用startx方式启动
sudo systemctl set-default multi-user.target echo "exec i3" > ~/.xinitrc startx # reboot并login后执行
根据你的系统安装open-vm-tools
December 4, 2017
ArchLinux休眠后唤醒,wifi和蓝牙无法正常使用的解决方法
Manjaro Linux
从17.02
版本开始匹配了Surface Pro 3, 这里必须非常感谢下Manjaro Team的工作,我现在可以再次在Surface上用畅快的用Linux了。
具体可以看reddit上的这篇文章: https://cd-rw.org/t/running-linux-on-the-surface-pro-3/175/37。
我实际安装的版本是17.1pre3
,不管是蓝牙,触摸板,WIFI,touchpad,音量键,甚至触摸屏都可以正常使用,甚至都不用升级内核。
唯一的问题是启用休眠以后,wifi和蓝牙功能失灵了,即使通过重启NetworkManager.service
也无法解决,因此基本上就是硬件驱动的问题,网上关于其他一些笔记本在休眠后无法解决的问题基本上就是用lsmod查到和wifi相关的模块,然后重新加载的方法,但是没有和surface pro有关的内容。
找了几篇stackoverflow文章做了多次尝试,然后通过lsmod | grep wifi
和lsmod | grep bluetooth
查出来的模块,依次尝试,终于找到了正确的模块。
和wifi相关的模块是mwifiex_pcie
, 和蓝牙相关的模块是btusb
。
因此要做的操作就是rmmod
和modprobe
,休眠后执行下面的命令后,wifi和蓝牙就可以正常工作了。
sudo rmmod -v btusb
sudo rmbanbenmod -v mwifiex_pcie
sudo modprobe -v btusb
sudo modprobe -v mwifiex_pcie
但是这样就是每次都得再休眠后执行这些命令好像也略麻烦,最后看到又休眠后自动执行脚本的方法,pm
和systemctl
的休眠脚本位置不同,我对pm
没印象,觉得arch的休眠几乎肯定是systemctl
的,于是直接尝试了systemctl
,systemctl
的脚本位置在/usr/lib/systemd/system-sleep
,这里的脚本会在sleep或者休眠时被调用。
我的脚本/usr/lib/systemd/system-sleep/wakeup_suspend_dev.sh
的内容是:
#!/bin/bash
case $1 in
pre)
rmmod btusb
rmmod mwifiex_pcie
;;
post)
modprobe btusb
modprobe mwifiex_pcie
;;
esac
pre
是在休眠之前执行rmmod
的操作,post是在休眠之后执行modprobe
的操作。需要注意的是必须把这个脚本加可执行权限:
sudo chmod +x wakeup_suspend_dev.sh
February 6, 2016
Linux安装Dnscrypt
为什么就不言而喻不加解释了,就算你没有翻墙的打算,也建议你有一个优秀和安全的dns,因为国内的运营商除了干掉国外域名,还会帮你的国内网址投广告,甚至利用你进行ddns攻击。。
很早以前dnscrypt这个东西就在热炒,后来不知道什么原因谈起的人也比较少了。因此我决定重新尝试一下是不是还有用呢。答案是肯定的。不过如果你只是在本机上使用,那么如果是桌面系统,似乎我有看到dnscrypt是有windows/macOS的客户端的,但是手机怎么办呢。这个时候就是树霉派发挥作用的时候了。
树梅派安装dnscrypt相对与ubuntu之类的发行版其实也大同小异(我也没有试过ubuntu,arch上倒是非常简单,两三个命令就可以搞定),不过有些依赖包包括dnscrypt都是需要手动编译的。
安装编译工具:
sudo apt-get install libtool pkg-config build-essential autoconf automake
安装一个叫做libsodium的依赖,因为apt工具里没有包含这个依赖,因此需要手动编译,去https://download.libsodium.org/libsodium/releases找最新的版本,下载并且编译:
mkdir build cd build/ wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.3.tar.gz tar -zxvf libsodium-1.0.3.tar.gz cd libsodium-1.0.3/ ./configure make sudo make install
下载dnscrypt编译:
wget https://github.com/jedisct1/dnscrypt-proxy/releases/download/1.6.1/dnscrypt-proxy-1.6.1.tar.bz2 tar -jxvf dnscrypt-proxy-1.6.1.tar.bz2 cd dnscrypt-proxy-1.6.1 ./configure make -j2 make install
January 8, 2016
Linux把用户态systemd服务改成系统服务,开机自启动迅雷(xware)
OK.. 怎么给xubuntu装个迅雷远程呢,迅雷的Linux版本Xware-Desktop,目前是很稳定的,而且有很详细的官方教程: https://github.com/Xinkai/XwareDesktop/wiki/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E
这个就是针对ubuntu的,所以原封不动的执行就行了。
但是我的需求有点不一样,迅雷xware版自己提供了几个开机自启动选项: 1)由用户态systemd托管 2)由用户态upstart托管 3)简单的自动启动。
这三个选项的特点就是都是以用户态启动,事实上,xware的配置文件也确实是保存在用户的HOME目录下的.xware-desktop里的。
但是我希望Linux开机的时候并不会自动登录,更何况我的linux是运行kodi的,我也不会去手动登录,因此用户态的服务是不会自动启动的。
但是我希望一开机,xware就自动打开,开始执行下载任务。因此依赖原来的代码显然不太符合我的需求,就自己写一个系统的service吧。
还好几乎不需要改变xware用户态的服务,就可以搞定。用户态的服务创建在用户目录的$HOME/.config/systemd/user
下,代码是这样的:
[Unit]
Description=Xware Service
After=network.target
[Service]
Type=simple
ExecStart=/opt/xware-desktop/xwared --log-novomit
[Install]
WantedBy=default.target
而系统服务在Ubuntu 14.04上位于/etc/systemd/system/
目录下, 因此可以先把这个拷贝过来,然后稍作修改即可,修改的文件如下所示:
[Unit]
Description=Xwared Service
After=network.target
[Service]
Type=simple
User=kodi
Group=kodi
ExecStart=/opt/xware-desktop/xwared --log-novomit
[Install]
WantedBy=multi-user.target
其实就是简单的加入了User和Group的选项而已,让系统知道以哪个用户启动,这样就可以了。
January 6, 2016
Linux创建自定义的应用程序启动器
eclipse在linux下,下载以后不需要安装,直接在目录下执行.\eclipse就可以运行了,不过同时,每次都要切换到该目录去执行eclipse似乎也比较麻烦。 又没有办法在应用程序菜单里找到,即使是gnome下,按super然后全局搜索,也找到这个。
不过好在linux是自由的系统,自己建一个应用程序的启动器一点问题都没有。
比如我的eclipse装在/opt/eclipse-jee/
下,怎么新建一个启动器呢?
所有用户共享的应用启动器的目录是/usr/share/applications/
目录,那么用户自定义的启动器目录在哪里?找了下用户目录下的.config/,没有找到,只好去百度google了一下,原来启动器是在.local/下,具体是.local/share/applications
.
新建一个eclipse.desktop的文件,然后输入以下内容:
[Desktop Entry]
Encoding=UTF-8
Name=Eclipse J2ee
Comment=Official desktop version of Telegram messaging app
Exec=/opt/eclipse-jee/eclipse
Icon=/opt/eclipse-jee/icon.xpm
Type=Application
Categories=Development;
Categories就是类目,可以输入多个。编辑保存,不需要再做任何操作,eclipse就可以搜索到了。
参考: How do you create a custom application launcher in Gnome Shell?
January 5, 2016
ArchLinux将nvidia driver替换成开源的nouveau解决显卡驱动问题
昨天还装完arch兴高采烈,今天就差点放弃整个系统,罪魁祸首就是当年被linus喷了的nvidia.
Archlinux装了使用nvidia驱动,一开始发现根本就没有加载,装了和没装没啥区别,但是跑的好好的阿跑的好好的,结果不小心手贱点了nvidia-xconfig
的应用,莫名其妙的起不来了。(这个原因我想了半天才想出来,不然我实在是无力吐槽他妈跑了一天多好好的什么也没干突然就起步来的情况,一度怀疑是显卡硬件坏了)
于是抢救三个多小时,/var/log/xorg.0.log
里的报错也莫名其妙,比如:
not detect device nvidia, no screen found.
简直是日到狗。于是想着解决办法应该是彻底不要装nvidia的驱动, 用intel的集成显卡,照例来说应该也ok阿,于是直接删掉驱动:
pacman -R nvidia nvidia-utils
然后reboot, 没想到发生的事情更加奇葩了,连命令行就出不来了,直接黑屏了我草。
心里十万个草尼马,还好安装过arch的人毕竟还是知道有个arch-chroot, 放入安装介质(我的是u盘),重启, mount各种好盘:
mount /dev/sda2 mnt
arch-chroot /mnt /bin/bash
然后咋办呢,突然在arch的官方教程里出现了一个词: nouveau(还好我还有台电脑阿,这时候如果只有一台电脑要在手机上查资料的话。。。我tm会不会放弃linux直接装个windows都不知道,我就是对自己那么没信心阿)
nouveau是个什么呢,简单的解释就是个nvidia的开源驱动。。。虽然还不是对其了解,但是还是对开源两个字报有信心,而且也是死马当活马医了。。。于是:
pacman -S xf86-video-nouveau
据说还有什么3d的实验特性支持, (还可以pacman -S mesa mesa-libg1
, 额这好像和我目前十万火急的状态没啥关系)
然后咋办呢。。。nouveau已经装好了,nvidia也已经卸载了,这样就ok了么,好像还不行
lsmod | gerp nvidia
dmesg | grep nvidia
两个命令显示,nouveau还没有work,系统还是在用nvidia,继续查arch wiki 的 nouveau页,删除mod的方法是
modprobe -r nvidia
然后加入nouveau的mod:
modprobe nouveau
先就这样吧,从安装盘里推出来
umount -R /mnt
然后reboot,重启试试, 尝下startx还是不幸, 并且我们在dmesg | grep nouveau里看到了nouveau报错。。。额什么情况:
January 5, 2016
Linux搭建VNC服务器
服务器端:
1)在终端安装tigervnc:
$ sudo apt-get install tigervnc
2)启动tigervnc
$ vncserver
提示你输入vnc的密码:
enter your password (length 8)
然后终端会显示New ‘X’ desktop is kodi-kodibuntu:1
3)(可选)如果需要改变桌面,例如不想用xvnc,可以编辑$HOME/.vnc/xstartup
的内容。具体操作暂略。
4)(可选)如果需要开机启动,一个是用supervisor,另外就是在/etc/systemd/system/下手动写一个服务。具体操作暂略。
在客户端:
安装tigervnc:
$ sudo pacman -S tigervnc (archlinux)
或者
$ sudo apt-get install tigervnc (ubuntu/debian)
直接运行vncviewer或者在终端输入:
$ vncviewer
端口默认是5900+n,根据New ‘X’ desktop is kodi-kodibuntu:1, 因为服务器上的提示是:1, 所以端口就是5901
输入你的ip地址是端口: 192.168.1.xxx:5901
会提示让你输入密码:
进去后就是vnc的桌面了, 在xubuntu下测试,不需要配置服务器上的$HOME/.vnc/xstartup
就可以直接进入xfce4桌面
更正,采用默认的.vnc/xstartup配置虽然能用,但是会有一些样式问题,比如图标无法显示。所以还是改一下好了:
$ cp ~/.vnc/xstartup ~/.vnc/xstartup.bak
$ vim ~/.vnv/xstartup
删除所有的内容,重启vncserver
$ vncserver -kill :1
$ vncserver
进去以后基本商就是和你直接进入桌面一样的xfce了。
January 4, 2016
Linux安装deluge下载工具自动远程下载
上一篇装完kodi后,我的旧电脑就彻底变成了一个kodi/XBMC媒体中心,那么比如我要下载新的美剧什么的,好像就还是不那么方便。 p2p的torrent一直是我的最爱。deluge是一个跨平台的操作系统,支持linux, windows 和mac,还有远程控制等功能,什么是远程下载呢。我们都知道有迅雷远程下载,那么deluge其实也是一样,就是你在一台电脑操作,有一个下载链接,然后你可以直接在这台电脑上添加这个下载链接,唯一不同的是下载的任务被添加到了远程的机器上,文件也会下载到远程的机器上。 这样的需求正符合我媒体中心的需要,我找到新的片源,并不需要下载到我的计算机,而是可以让我的Kodi在播放电影的同时,又可以执行下载的任务。
服务器端:
安装:
$ sudo apt-get install deluged deluge-web
新建一个deluge用户和用户组:
$ sudo adduser --system --gecos "Deluge Service" --disabled-password --group --home /var/lib/deluge deluge
把用户添加到deluge用户组adduser <username> deluge
,便于用户操作torrent和下载到的文件,在我的kodi的xubuntu,当然就是kodi用户了:
$ sudo adduser kodi deluge
需要临时登录deluge用户配置远程管理, 因此如果系统不允许没有密码的用户登录,则需要给deluge设置一个密码
$ sudo passwd deluge:
然后再登录deluge用户:
$ su deluge
$ deluge-console "config -s allow_remote True"
$ deluge-console "config allow_remote"
修改远程控制的密码,格式是<username>:<password>:10
:
$ cp ~/.config/deluge/auth ~/.conf/deluge/auth.bak
$ vim ~/.config/deluge/auth
退出deluge:
$ exit
执行deluge的守护进程:
January 4, 2016
Linux安装并开机进入Kodi媒体中心
把2G的硬盘拆到了一台旧电脑上,并且给旧电脑装了xubuntu,打算直接打造一个媒体中心。目前知道有里那个用的不错的东西,KODI(XBMC)是一个很不错的选择。当然用PLEX也是个不错的选择,整理资料库方面PLEX更加强大。不过KODI是开源和免费的,既然用了linux,就用个开源的吧。况且我发现kodi还有不少的好处,并且更加轻量级。
其实Kodi有个基于ubuntu的发行版叫做kodibuntu,直接装得话效果其实也差不多。但是我还是喜欢从ubuntu去扩展,毕竟任何基于ubuntu的版本,相对ubuntu的开发肯定是有所滞后的。和Android的Rom一个道理。不过kubuntu因为是非常流行的发行版不用担心这个问题。
下面的步骤基本上是参考了askubuntu的一个答案Autostart Kodi on Vivid,只不过它是在纯净的server版本安装,而desktop版则因为有自身的启动器,需要将其禁用掉而已。
1)安装kodi: sudo apt-get install kodi
2)创建一个kodi的用户,并添加到和视频播放有关的组 sudo adduser –disabled-password –disabled-login –gecos "" kodi sudo usermod -a -G audio kodi sudo usermod -a -G video kodi sudo usermod -a -G input kodi sudo usermod -a -G dialout kodi sudo usermod -a -G plugdev kodi sudo usermod -a -G tty kodi
sudo dpkg-reconfigure x11-common 弹出的选项框选择任何人(anybody)
sudo vim /etc/systemd/system/kodi.service 输入以下内容:
[Unit] Description=Job that runs Kodi After=default.target graphical.target getty.target sound.target
January 3, 2016
调整Linux主分区的大小
在安装我笔记本商的archlinux的时候,root分区和主分区是分开的,后来为了尝试KaliLinux,就把home分区牺牲掉,放弃了/home的单独分区。可是如今60G的空间已经不够用了。
于是打算重新调整一个root分区的大小。我分区之前,256G硬盘的分区表大概是这样的,boot分区在最前,大概500M,,home分区紧随其后,66G左右,然后是8G的swap交换空间。还剩下170G左右的剩余空间。
我的目标是把swap分区弄到最后,其他都扩展给HOME分区。
依稀记得装arch的时候,swap并不是多大不了的事情,甚至说可以不需要swap。于是我打算先把swap禁用掉,然后删除。再重新创建swap分区,然后resize以下Root分区的大小基本就可以大功告成了。不过调整root分区的大小是不可以在当前系统下完成的。因此很有必要弄一个usb的镜像,通过镜像系统进去后调整没有mount的swap分区。
在linux下把镜像刻录到usb是非常方便的。接上U盘以后,可以通过lsblk
查看一下u盘的设备路径,比如我的是/dev/sdc
,基本上可以通过大小就能判断出来了。
sdc 8:32 1 7.2G 0 disk
├─sdc1 8:33 1 1.1G 0 part
└─sdc2 8:34 1 2.2M 0 part
然后找到镜像的位置,输入以下命令,耐心等待几分钟就可以了。我因为之前刚刚用过kubuntu,所以也懒得在刻录别的。其实要实现分区大小调整,基本上只要能跑起来的发行版都可以。不过ubuntu下有个预装的工具叫gparted
,可以免掉一些麻烦。
sudo dd bs=4M if=/data/OS_ISOs/Linux/xubuntu-15.10-beta2-desktop-amd64.iso of=/dev/sdc
几分钟之后就刻录完成。
接下来在arch上,先把swap分区禁用掉,还是通过lsblk
, 记录/root分区和swap分区是哪个。
─sda2 8:2 0 66.4G 0 part /
─sda4 8:4 0 8G 0 part [SWAP]
我的是/dev/sda4
, 禁用swap:
sudo swapoff /dev/sda4
然后编辑分区表。
sudo cp /etc/fstab /etc/fstab.bak # 备份下,万一弄错了还可以恢复系统
sudo vim /etc/fstab
在swap的那个设备前面加一个"#",注释掉swap的分区。
接上u盘,重启。因为是Xubuntu,所以选择try xubuntu
以后,非常友好的进入的gui的界面。
然后只要在“开始”菜单(原谅我的windows叫法),找到gparted
,一切就很容易了。
December 29, 2015
Docker搭建openvpn server
I always intersted in build services in my own VPS. specially things like a server can help me free browser the internet. But sometimes the connection between my own pc and the vps server are not quite good. So things not always go luck.
I find out openvpn is quite useful these days. So I’m thinking I will build one of my own. I picked one of my VPS for the test. It was installed with Ubuntu 14.04 and has 512MB memory. Here are the steps of how I did it:
October 30, 2015
Linux利用ssh反向端口转发暴露内网端口
从本地Host用SSH连接到目标主机,怎么让目标主机也可以连接本地的SSH呢? 答案很简单,只要把本地主机的SSH端口转发到目标主机即可。可以先查看一下SSH命令的man手册:
man ssh
注意里面的R参数,就是要用到的参数:
-R [bind_address:]port:host:hostport
Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side. This works by allocating a socket to listen to port
意思就是把一个远程主机的端口用于本地端口的端口转发。于是对应于假设远程主机IP:192.168.172.11, 本地ssh端口是默认的22,我们可以这样做:
ssh -R 17999:localhost:22 sourceuser@192.168.172.11
这一步完成以后,远程的17999端口会映射到本地主机的22端口,于是我们在远程终端,输入命令:
ssh -p 17999 127.0.0.1
这样就很方便的又重新连接到了本地的ssh。同样的技巧可以用于一些暴露本地端口的操作,例如你身处一个局域网里,且没有权限去操作路由。你却想要暴露一个本机的ip,比如说80,让远程的主机访问你的http服务,用同样的方式可以很轻易的做到。
October 29, 2015
Tmux的复制和黏贴
tmux确实是一个吊炸的东西,功能和那个和他类似的鼻祖screen相比,确实多出了不少。比如他又一个可以对终端的内容进行复制和黏贴的功能。 这里假定你设置的快捷键前缀是Ctrl+a: 进行复制的操作是:
Ctrl+a [
开始复制- 把光标移动到开始复制的位置(上下左右键,或者Ctrl+n/p/b/f键移动光标)
Ctrl+Space
开始选择内容,类似vim的按下V的效果- 完成选择,
Alt+w
完成复制 - 然后到你想要黏贴的地方,
Ctrl+a ]
黏贴成功
需要注意的是, Ctrl+space在windows和linux的某些桌面环境下,都是输入法切换键,所以如果这个方法不成功,很可能是因为快捷键冲突的原因了。那么解决方法一个是把冲突的快捷键解决掉,另一个这是通过配置.tmux.conf。其实上面的快捷键默认的快捷键,模仿的按键是emacs,因为我不用emacs(因为我不用emacs,所以也只觉得很不习惯),其实还有另外的一种快捷键模式是模仿vim的,不过需要你在tmux配置文件里配置一下, 把下面这行加入.tmux.conf里:
set-window-option -g mode-keys vi
设置成这样以后,重新载入配置(可以用ctrl+a :
然后输入source-file ~/.tmux.conf
.
然后复制黏贴的操作就变成了:
Ctrl+a [
开始复制- 把光标移动到开始复制的位置(上下左右键,或者Ctrl+n/p/b/f键移动光标)
Space
开始选择内容,类似vim的按下V的效果- 完成选择,
Enter
完成复制 - 然后到你想要黏贴的地方,
Ctrl+a ]
黏贴成功
May 14, 2015
Linux将Socks代理转换成Http代理
安装polipo:
sudo apt-get update
sudo apt-get install polipo
编辑polipo配置文件 /etc/polipo/config
:
### Basic configuration
# Add your proxy's address
proxyAddress = 192.168.0.1
# Allow from anyone in the 192.168.0.* range to connect to your proxy
allowedClients = 192.168.0.0/24
重启服务:
sudo /etc/init.d/polipo restart
参考:
April 19, 2015
Linux搭建PPTP VPN Server
安装server
# On CentOS 6 x64: rpm -i http://poptop.sourceforge.net/yum/stable/rhel6/pptp-release-current.noarch.rpm yum -y install pptpd # On Ubuntu 12.10 x64: apt-get install pptpd
编辑 /etc/pptpd.conf 添加以下行:
localip 10.0.0.1 remoteip 10.0.0.100-200
localip本机ip(vpn的服务器ip), remoteip-分配给客户端的ip, 应该处于同一网段
添加pptp用户名和密码到 /etc/ppp/chap-secrets :
#client server secret IP user1 pptpd 24odfjafdi34 * user2 pptpd 3f3faf3fsdfI * #Where client is the username, server is type of service – pptpd for our example, secret is the password, and IP addresses specifies which IP address may authenticate. By setting ‘*’ in IP addresses field, you specify that you would accept username/password pair for any IP.
添加DNS服务器地址到 /etc/ppp/pptpd-options: