飞蚊话 发布的文章

前些日子尝试通过电报来实现短信多终端同步的方案,很成功,并且为了实验稳定性开了一天。到了第二天早晨再看,服务是正常的。但新来的短信就是没再往Tg上面发送。

最先想到的就是梯子有问题了,通过尝试也发现确实是梯子的问题。具体表现就是浏览器会报503错误。

现在使用的是v2ray方法,在刚搭建好的时候也遇到过503问题,所以惯性的认为这次出现这个问题也是由于服务器时间与本地时间不一致导致的(服务器商授时比实际时间快了3分钟,不知道什么毛病)。

不过当我查看服务器时间时候,发现问题好像没那么简单了——因为服务器时间很正常,说明并不是时间出错导致的这个问题——一下子就感觉问题严重了起来。

查看服务状态(systemctl status v2ray),是active,一切如常;查看运行日志(/var/log/v2ray/access.log),一大溜的invalid user。这是认证错误;但是我并没有改过我的config文件(/etc/v2ray/config.json)啊,为什么会失效呢?

上网搜索类似的情况,并没有什么有用的解答。不过在网上冲浪的过程中,v2ray的github页面提交issue的模板让我想到了一个可能的原因:

  • 我的安卓机应用是play商店自动更新的
  • 我的iOS应用是商店自动更新的
  • 我的Archlinux是及时跟进版本的
  • 我的openSUSE刚刚做了一次dup,所有存在新版本的软件都升级到了最新

这些都指向了一个可能的原因:版本不同(github上面就写到了如果客户端和服务端版本不同请注明)。我的客户端全部到了最新而服务端已经很久没有更新过了。

所以先尝试把服务端更新到了最新,再次尝试。

仍然503.

这就真让我百思不得其解了。

不过在查看服务状态时,有一行信息引起了我的注意:它提示读取的配置文件路径是/usr/local/etc/v2ray/config.json

咦?跟网上大多数提到的/etc/v2ray/config.json不一样啊。查看了一下usr的配置文件,里边只有一行:

{}

这就很好的解释了为啥认证会失败了。啥配置都没有,能存在有效用户就怪了。

虽然不知道为什么之前的/etc/v2ray/config.json可以生效,但既然它现在貌似读取的是带usr的路径,那给它补上就得了呗。

不过为了延续之前的路径,做一个软连接可能是更恰当的选择。直接ln -s /etc/v2ray/config.json /usr/local/etc/v2ray——当然,提前把usr那个空的config文件删掉。

尝试重启服务systemctl restart v2ray,查看状态……

退出。

不过下面的信息给出了明确的信息:日志文件无法写入。

那就把日志文件的读写权限给上去就得了呗chmod 666 /var/log/v2ray/*

再次启动服务,成功。尝试通过客户端连接,也成功了。


这问题出现的还挺突然的——因为前一天还是可以正常使用的东西,在啥都没手工动过的情况下就不能用了,还是非常没有头绪去解决的。不过好在没有什么特别令人费解的问题(虽然突然间读取的配置文件路径就变了有些令人费解),很快也就解决掉了。但关键在于网上竟然没有一篇文章能适配到这个问题上,所以还是写下来了。

好像很长时间没怎么更新过博客了,就连一些评论也没再回复过。

所以趁着元旦有点时间,简单说说吧。

工作了

去年8月份开始,正式从学生变成了社会人。不好说是否已经完成了身份的改变,但这身份终究是要如此转变的。

我现在就职在某国企的系统集成子公司的总部。不用想,肯定有很多人感觉朝九晚五,工作轻松。

错了。因为它早在3年前就已经进行了混改了,现实的情况是在我去之前,我们组一共4个人,要支撑全国31家分公司和产业互联网公司的业务。你就可以想象一下在总部的这几个人需要拥有多少个分身了。

但现实终究不是西游记,这些人也不可能拥有分身来协助,所以纵使刚刚到岗的我再不熟悉业务,也算是多了一个帮手。什么意思呢?我到岗的第4天就被安排出差去四川了。

从四川回来,是为期一个礼拜的新员工培训——这可能也是我这半年里边最轻松的一个礼拜。

然后便是无止境的工作。对了,我好像还没有介绍公司的上下班时间:早上八点半,晚上五点,不打卡。

但是工作量使得五点这个下班时间没有什么作用,至少从五点半开始,同事才会陆陆续续的离开。

可能即使是这种程度的加班也比一般的互联网公司下班时间早。但是要知道,公司是不打卡的,不打卡就意味着人力或者领导并不知道你到底是几点离岗的,也就意味着加班是没有加班工资的。

退一万步讲,即使我可以做到正点下班,我的单位在二环里,每天我都要往返于六环外和二环里。而这就使得我一天要上两个班:单位一个班,坐车一个班。

说几个数据你可以体会一下:为了保证八点半到岗,我需要赶六点四十五的车上班;五点半出公司的话,我最早可以在八点二十下车到家。

插空做的视频

所以即使正点出公司,我也没有时间在工作日做视频。所以从工作开始,所有的视频都是在礼拜六日抽空录制的。这也是为什么我不再提供字幕了。没时间打轴维护,也懒得在休息日做这么多工作了。

如果你是从b站关注过来的,你应该还记得我在去年八月份时候发过一条动态,就是更新频率从周更调整至四周三更。这是有计算的。因为我知道不管我去到什么样的公司,我家的位置也就保证了我在工作日是没有时间做额外的事情的——有时间也只是在坐车途中看看书。所以所有额外的工作都要堆到周末完成。而一个月有四个礼拜,四周三更就意味着每个月能空出来一个星期。我又没指定四周三更是哪三周更,所以这一个礼拜有着很大的价值:

  • 如果这个月没什么出差也没什么事,那么空出来的这个礼拜可以录一个视频做备用。
  • 如果有出差,那么出差占用的那个礼拜末正好就是四周三更中不更新的那一周,或者直接使用备用视频发布。

事实上也是这样。在这半年里,我已经使用过几个备用视频了,你可以通过结尾来判断。

很少更新的博客

这半年里边,我视频内容更多的是在进行看板主题的解答。这一部分的内容我个人感觉还真不值得写一篇文章来保存,所以也就没有跟随视频的更新而更新。

即使是自己产出的内容,就现在的情况来看也不是很有时间把视频落到文字上面。

不过之后可能就会有所变化了。为什么呢?因为我想变一变我的流程了——文字不是记录,而是草稿。

也就是说,在确定了视频主题后,先落实到文字,再做成视频。相对于现在临场发挥的录制法,这样兴许还会节省不少剪辑衔接的时间。

啊不说了,明天又该上班了。就祝这里的各位新年(公历)大吉吧。

视频点此

这个不是我想到的方法,因为这种笔记本想做到直通太麻烦了。不过机缘巧合,我在这个博客中看到了方法,尝试之后也成功了,遂来记录一下。

上面的博客有着非常详细的操作步骤及一些基本原理介绍,有兴趣可以阅读一下。不过在我尝试的过程中发现文章漏掉了一些步骤,再加上我的电脑与文章的博客不同,获取vBIOS的过程有些许出入,所以这里只记录一下操作过程,每一步的解释及更多扩展请看原博客。

我的电脑:HP暗影精灵一代,i7-6700hq+950M独显

事前准备:KVM虚拟机拥有一个UEFI启动的Win10,含有QXL显卡、实体机启动的win10、Linux宿主在使用英特尔核显,独显驱动禁用或驱动被卸载

一、隔离独显

  1. lspci -nn | grep NVIDIA,获得类似输出:

    01:00.0 3D controller [0302]: NVIDIA Corporation GP107M [GeForce GTX 1050 Mobile] [10de:1c8d] (rev a1)

    记录中括号[10de:1c8d]中的ID

  2. 编辑或创建/etc/modprobe.d/vfio.conf,内容书写 options vfio-pci ids=刚刚记录的ID
  3. 修改/etc/mkinitcpio.conf,在MODULES里增加vfio_pci vfio vfio_iommu_type1 vfio_virqfd
  4. mkinitcpio -P更新initramfs

二、增加英特尔虚拟核显

  1. 编辑/etc/default/grub,在GRUB_CMDLINE_LINUX中增加i915.enable_gvt=1 kvm.ignore_msrs=1 intel_iommu=on
  2. 编辑或创建/etc/modules-load.d/lantian.conf,增加三行

    kvmgt
    vfio-iommu-type1
    vfio-mdev
  3. grub-mkconfig -o /boot/grub/grub.cfg重新生成grub
  4. 重启
  5. lspci | grep "HD Graphics"记录最开始的PCI地址,如00:02.0
  6. 创建显卡

    sudo su
    echo "af5972fb-5530-41a7-0000-fd836204445b" > "/sys/devices/pci0000:00/0000:刚刚记录的PCI地址/mdev_supported_types/i915-GVTg_V5_4/create"

前面两部的成功性验证:

二.4重启之后,使用lspci -nnk查找英伟达,如果kernel in usevfio,则表明隔离NVIDIA成功;二.6第二行命令可以成功执行,则表明创建虚拟核显成功。

三、增加虚拟显卡进虚拟机

virsh edit 虚拟机名,在</device>前增加

<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='off'>
  <source>
    <address uuid='af5972fb-5530-41a7-0000-fd836204445b'/>
  </source>
</hostdev>

保存后启动虚拟机,如果在设备管理器中多了一个Microsoft 基本显示适配器,则说明增加成功,耐心等待驱动安装成功,便会显示出Intel核显名称了。

一旦驱动安装完成,关闭虚拟机,再次编辑配置。

  • 刚刚增加的hostdev标签,将display='off'更改为display='on'
  • 删除<graphics><video>两块,用如下内容替换

    <graphics type='spice'>
      <listen type='none'/>
      <image compression='off'/>
      <gl enable='yes'/>
    </graphics>
    <video>
      <model type='none'/>
    </video>
  • </domain>前增加

    <qemu:commandline>
        <qemu:arg value='-set'/>
        <qemu:arg value='device.hostdev0.ramfb=on'/>
        <qemu:arg value='-set'/>
        <qemu:arg value='device.hostdev0.driver=vfio-pci-nohotplug'/>
        <qemu:arg value='-set'/>
        <qemu:arg value='device.hostdev0.x-igd-opregion=on'/>
        <qemu:arg value='-set'/>
        <qemu:arg value='device.hostdev0.xres=1920'/>
        <qemu:arg value='-set'/>
        <qemu:arg value='device.hostdev0.yres=1080'/>
        <qemu:arg value='-set'/>
        <qemu:arg value='device.hostdev0.romfile=/vbios_gvt_uefi.rom'/>
        <qemu:env name='MESA_LOADER_DRIVER_OVERRIDE' value='i965'/>
    </qemu:commandline>

    其中,vbios_gvt_uefi.rom从这里下载,并对应修改上面的文件路径。

  • <domain type='kvm'>更改为<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>

启动虚拟机,如果图像正常显示且设备管理器中只有英特尔核显,则说明截至目前,操作都是成功的。

四、获取显卡vBIOS

这部分在实体Windows下进行。

  1. 前往惠普支持官网,下载适合自己的惠普BIOS更新程序
  2. 百度下载MaxwellBiosTweaker备用
  3. 启动更新程序,选择第三项Copy
  4. 解压缩导出的所有bin文件(已知7z可成功解压)
  5. 进入解压出来的文件夹,打开到有.rom文件的文件夹
  6. 打开MaxwellBiosTweaker,依次将.rom拖入文件,如果程序成功显示各种内容,则这个文件是一个显卡BIOS文件
  7. 对于是显卡BIOS的文件, 对照显示的内容,找到是自己显卡的rom文件,复制出来备用

五、编译虚拟机UEFI固件

这部分回到Linux下进行。

# 根据 GitHub 上用户反馈,UEFI 固件编译完成后不能移动位置
# 所以要先找好存放的地方
cd /opt
# 使用root用户进行,避免sudo前缀
sudo su
git clone https://github.com/tianocore/edk2.git
# 安装编译过程中需要的依赖
pacman -S git python2 iasl nasm subversion perl-libwww vim dos2unix
yaourt -S gcc5
# 假设你导出的显卡 BIOS 存放在 /vbios.rom
cd edk2/OvmfPkg/AcpiPlatformDxe
xxd -i /vbios.rom vrom.h
# 编辑 vrom.h,把 unsigned char 数组(在第一行)的名字修改成 VROM_BIN
# 把文件末尾的长度变量(在最后一行)改名为 VROM_BIN_LEN,并记录下长度值,我的是 167936
wget https://github.com/jscinoz/optimus-vfio-docs/files/1842788/ssdt.txt -O ssdt.asl
# 编辑 ssdt.asl,修改第 37 行为 VROM_BIN_LEN 的值
# 然后执行下面这行命令,会报错但是没关系,只要 Ssdt.aml 有了就行
iasl -f ssdt.asl
xxd -c1 Ssdt.aml | tail -n +37 | cut -f2 -d' ' | paste -sd' ' | sed 's/ //g' | xxd -r -p > vrom_table.aml
xxd -i vrom_table.aml | sed 's/vrom_table_aml/vrom_table/g' > vrom_table.h
# 返回 edk2 的目录下打补丁
cd ../..
wget https://gist.github.com/jscinoz/c43a81882929ceaf7ec90afd820cd470/raw/139799c87fc806a966250e5686e15a28676fc84e/nvidia-hack.diff
dos2unix nvidia-hack.diff
dos2unix OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c
patch -p1 < nvidia-hack.diff
# 开始编译 OVMF
make -C BaseTools
source edksetup.sh
# 修改 Conf/target.txt 中如下变量的值:
# - ACTIVE_PLATFORM       = OvmfPkg/OvmfPkgX64.dsc
# - TARGET_ARCH           = X64
# - TOOL_CHAIN_TAG        = GCC5
build
# 等待编译完成,确认 Build/OvmfX64/DEBUG_GCC5/FV 文件夹下有这两个文件:
# - OVMF_CODE.fd
# - OVMF_VARS.fd
# 然后替换你的虚拟机的 UEFI 参数,注意修改虚拟机名
cp Build/OvmfX64/DEBUG_GCC5/FV/OVMF_VARS.fd /var/lib/libvirt/qemu/nvram/虚拟机名_VARS.fd

六、增加独显进虚拟机

visrh edit 虚拟机名称,做如下配置

<!-- 把 os 一段改成这样,注意对应你的 OVMF_CODE.fd 路径 -->
<os>
  <type arch='x86_64' machine='pc-q35-4.2'>hvm</type>
  <loader readonly='yes' type='pflash'>/opt/edk2/Build/OvmfX64/DEBUG_GCC5/FV/OVMF_CODE.fd</loader>
  <nvram>最后复制的那个路径</nvram>
</os>
<!-- 把 features 一段改成这样,就是让 QEMU 隐藏虚拟机的特征 -->
<features>
  <acpi/>
  <apic/>
  <hyperv>
    <relaxed state='on'/>
    <vapic state='on'/>
    <spinlocks state='on' retries='8191'/>
    <vendor_id state='on' value='GenuineIntel'/>
  </hyperv>
  <kvm>
    <hidden state='on'/>
  </kvm>
  <vmport state='off'/>
</features>
<!-- 添加显卡直通的 PCIe 设备,必须放在核显 hostdev 的后面 -->
<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
  </source>
  <rom bar='off'/>
  <!-- 注意这里的 PCIe 总线地址必须是 01:00.0,一点都不能差 -->
  <!-- 如果保存时提示 PCIe 总线地址冲突,就把其它设备的 <address> 全部删掉 -->
  <!-- 这样 Libvirt 会重新分配一遍 PCIe 地址 -->
  <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0' multifunction='on'/>
</hostdev>
<!-- 在 </qemu:commandline> 之前添加这些参数 -->
<qemu:arg value='-set'/>
<!-- 下面的两个id为 lspci -nn中的那两个id -->
<qemu:arg value='device.hostdev1.x-pci-vendor-id=0x10de'/>
<qemu:arg value='-set'/>
<qemu:arg value='device.hostdev1.x-pci-device-id=0x1c8d'/>
<qemu:arg value='-set'/>
<!-- 下面的两个id为 lspci -nnk中,subsystem显示的id那两个 -->
<qemu:arg value='device.hostdev1.x-pci-sub-vendor-id=0x17aa'/>
<qemu:arg value='-set'/>
<qemu:arg value='device.hostdev1.x-pci-sub-device-id=0x39d1'/>
<qemu:arg value='-acpitable'/>
<qemu:arg value='file=/ssdt1.dat'/>

最后一行的ssdt1.dat从这里下载,并将路径对应修改。

启动虚拟机,等Win10自动安装驱动。

如果不出意外的话,直通就完成了。

视频点此

VNC,Virtual Network Console的缩写。说白了,VNC是从类Unix系统出来的,横跨全平台的图形远程桌面,有别于纯文本的ssh,功能强大。所以,来看看再Linux下要如何部署VNC服务。

只是使用的话,不必研究它的原理,只需要知道Linux下面是通过软件包tigervnc来实现vnc服务的即可。

这里以Arch为例。

  • 安装tigervnc:pacman -S tigervnc
  • 启动vnc服务:vncserver

    • 要求一个密码,输入后回车
    • 确认刚刚输入的密码,输入后回车
    • 是否需要一个仅查看的密码,需要则输入y回车,否则输入n回车完成设置
    • 若输入y,则继续输入新的密码两遍,完成配置
  • 编辑~/.vnc/xstartup,只保留最前面unset开头的两行,之后的全部删除,并增加一行exec dbus-launch startplasma-x11(这是kde桌面增加的行,其他的请去往wiki查看),保存
  • 注销再登录,重新启动vnc服务,设置完成

到此,就可以从其他电脑上通过vnc相关软件连接了。其中,vnc使用的端口在输入vncserver之后输出的内容中有所体现。规律为5900+冒号后的数字。如输出为:1,则端口号为5901

更多资料

更详细更高级的vnc使用方法,参考TigerVNC (简体中文) - ArchWikiVNC - openSUSE Wiki

视频点此

我曾经说过如何在Windows下屏蔽笔记本键盘的教程。现在,来看看Linux下面如何实现屏蔽笔记本键盘。

Linux屏蔽需要安装一个工具xinput。arch系的包名为xorg-xinput,debian系的包名为xinput

之后,通过命令xinput找到自带键盘设备的ID号。这个设备的名字为AT Translated Set 2 Keyboard。找到以这个名字开头的一行,记录后面id=字段的数字。我这里是11.

最后,通过命令xinput set-prop ID 'Device Enabled' 0来完成设备的仅用。其中,ID区域替换为前面找到的数字。

如果想恢复使用,将结尾的0更改为1即可。

视频点此

这个对应的是一个看板问题。说实话啊,这种软件各种各样,自己尝试尝试应该就可以了。至于都有哪些方法,可以看一看知乎的回答。其中vlc的方法可能很多人都想不到,可以尝试一下。

不过我个人使用obs来进行屏幕录制任务,主要是它可以很方便的满足我个人的几点要求:

  • 录屏、直播
  • 录制的文件可以正常导入到达芬奇中
  • 初步的音源修正

那么接下来,简单记录下我的obs设置,权当分享,也是给自己保存一个配置存档。

录制

除了下面提到的设置项,其他的可直接保持默认或随意调整。

设置 - 输出输出模式调整为高级,为设置达芬奇格式做准备。

切换到录像标签按图设置。

这其中:

  • 文件路径或URL视频比特率音频比特率根据自己的情况进行设置
  • 视频编码器可以选择libx264尝试一下(我这里是有问题的,所以没有使用)。而如果你使用达芬奇免费版,此项最好选择prores的一系列编码器,但是录制的文件会非常大,要注意
  • 音频编码器默认应该是aac。如果你不使用达芬奇的话,保持默认即可,否则按图设定

点击左边栏的视频栏目,按需进行调整。这几项简单介绍一下

  • 基础(画布)分辨率:电脑屏幕分辨率
  • 输出(缩放)分辨率:录制出来的视频文件分辨率
  • 缩小方法:上边两项不同时使用的优化方法
  • 帧率:视频帧率

点击左边栏的高级项目,颜色格式可以调整为RGB,保持默认也可。

直播

类似上面的,只是这里着重注意串流标签下的设定。如图

其中,比特率可以根据自己的网络条件调整,CPU使用预设根据自己的电脑配置调节。

推流地址在推流一页进行设置。

要注意:对于推流,高级页的颜色格式最好保持默认的NV12

其他技巧

obs拥有很多滤镜,可以通过右键点击每个捕获源,弹出的菜单选择滤镜来进行设置,自行探索吧。