<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>使用linuxonDocs</title><link>https://hiraethecho.github.io/docs/topics/%E4%BD%BF%E7%94%A8linux/</link><description>Recent contentin使用linuxonDocs</description><generator>Hugo --0.152.2</generator><language>en</language><managingEditor>wyz2016zxc@outlook.com(Hiraeth)</managingEditor><webMaster>wyz2016zxc@outlook.com(Hiraeth)</webMaster><lastBuildDate>Mon, 16 Mar 2026 15:39:39 +0800</lastBuildDate><atom:link href="https://hiraethecho.github.io/docs/topics/%E4%BD%BF%E7%94%A8linux/index.xml" rel="self" type="application/rss+xml"/><item><title>niri</title><link>https://hiraethecho.github.io/docs/linux/niri/</link><pubDate>Tue, 02 Dec 2025 00:00:00 +0000</pubDate><author>wyz2016zxc@outlook.com(Hiraeth)</author><guid>https://hiraethecho.github.io/docs/linux/niri/</guid><description>wayland下paper scroll 的 wm</description><content:encoded><![CDATA[<h1 id="滚动式窗口管理器niri">
  <a class="anchor inpage" href="#%e6%bb%9a%e5%8a%a8%e5%bc%8f%e7%aa%97%e5%8f%a3%e7%ae%a1%e7%90%86%e5%99%a8niri">#</a>滚动式窗口管理器niri</h1>
<p>长期使用dwm作为X11下的窗口管理器，一直想找一个舒服wayland下窗口管理器试试。hyprland太重了，dwl没力气再写了，river太像了，sway不习惯。<br>
最后发现了niri，水平滚动式WM，非常有趣好用。</p>
<h2 id="特点">
  <a class="anchor inpage" href="#%e7%89%b9%e7%82%b9">##</a>特点</h2>
<p>某种意义上niri是<em>反</em>窗口管理器：不管理窗口，就一排铺开。</p>
<ul>
<li>最大的优点应该是窗口不会变化大小和位置。</li>
<li>我用dwm时主要用monocle布局，并且尽量放在不同tag下（dwm的tag类似于工作区），通过切换tag来切换窗口。少数需要同时查看多个窗口时才会用grid或tile布局。<br>
在niri下用named workspace可以实现相同效果，并且更符合直觉，就像在一个大桌子上摊开文件一样。</li>
<li>另一个优势是niri的逻辑很适合触控板，在外出无鼠标使用笔记本的场景非常舒服。</li>
</ul>
<h2 id="set-up">
  <a class="anchor inpage" href="#set-up">##</a>set-up</h2>
<p>各种配置文档和实例已经很多了，所以只列出我选择的搭配的组合：</p>
<ul>
<li>niri</li>
<li>dms/noctalia</li>
<li>rofi</li>
<li>foot</li>
</ul>
<p>然后是我倾向的设定：</p>
<ul>
<li>虽然niri推荐动态工作区，但我还是习惯named space，所以用dms和noctalia这种quick-shell系的组件作为bar（waybar用不习惯）</li>
<li>我习惯少一点快捷键，不介意稍微多按几下，所以只使用
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">    Super&#43;H {
        consume-or-expel-window-left
    }
    Super&#43;L {
        consume-or-expel-window-right
    }
    Super&#43;J {
        move-window-down-or-to-workspace-down
    }
    Super&#43;K {
        move-window-up-or-to-workspace-up
    }</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script>而且基本不用移动workspace或column的操作</li>
<li>使用rofi是因为X11下也可以用，保持一点一致性。</li>
</ul>
<h2 id="dot">
  <a class="anchor inpage" href="#dot">##</a>dot</h2>
<p>我的具体配置可以参考我的
，使用stow管理。<br>
niri相关的文件在<code>wm/.config/niri</code>，rofi相关的配置（没有整理）在<code>tools/.config/rofi</code>和<code>bin/.local/bin/</code></p>
]]></content:encoded></item><item><title>linux手册</title><link>https://hiraethecho.github.io/docs/linux/linux-handbook/</link><pubDate>Sat, 25 Oct 2025 00:00:00 +0000</pubDate><author>wyz2016zxc@outlook.com(Hiraeth)</author><guid>https://hiraethecho.github.io/docs/linux/linux-handbook/</guid><description>&lt;h1 id="linux-handbook"&gt;
&lt;a class="anchor inpage" href="#linux-handbook"&gt;#&lt;/a&gt;Linux Handbook&lt;/h1&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;details open&gt;
&lt;summary&gt;TEXT&lt;/summary&gt;&lt;pre
class="codeblock"
&gt;&lt;code class="language-" data-lang=""&gt;bash &amp;lt;(curl -sSL https://linuxmirrors.cn/main.sh)&lt;/code&gt;&lt;button onclick="copyCode(this)" class="copybtn"&gt;copy&lt;/button&gt;&lt;/pre&gt;&lt;/details&gt;
&lt;script&gt;
function copyCode(btn) {
const code = btn.previousElementSibling.textContent.trim();
navigator.clipboard.writeText(code).then(() =&gt; {
btn.innerText = "copied";
setTimeout(() =&gt; (btn.innerText = "copy"), 2000);
});
}
&lt;/script&gt;&lt;details open&gt;
&lt;summary&gt;TEXT&lt;/summary&gt;&lt;pre
class="codeblock"
&gt;&lt;code class="language-" data-lang=""&gt;bash &amp;lt;(curl -sSL https://linuxmirrors.cn/docker.sh)&lt;/code&gt;&lt;button onclick="copyCode(this)" class="copybtn"&gt;copy&lt;/button&gt;&lt;/pre&gt;&lt;/details&gt;
&lt;script&gt;
function copyCode(btn) {
const code = btn.previousElementSibling.textContent.trim();
navigator.clipboard.writeText(code).then(() =&gt; {
btn.innerText = "copied";
setTimeout(() =&gt; (btn.innerText = "copy"), 2000);
});
}
&lt;/script&gt;&lt;details open&gt;
&lt;summary&gt;TEXT&lt;/summary&gt;&lt;pre
class="codeblock"
&gt;&lt;code class="language-" data-lang=""&gt;bash &amp;lt;(curl -sSL https://linuxmirrors.cn/docker.sh) --only-registry&lt;/code&gt;&lt;button onclick="copyCode(this)" class="copybtn"&gt;copy&lt;/button&gt;&lt;/pre&gt;&lt;/details&gt;
&lt;script&gt;
function copyCode(btn) {
const code = btn.previousElementSibling.textContent.trim();
navigator.clipboard.writeText(code).then(() =&gt; {
btn.innerText = "copied";
setTimeout(() =&gt; (btn.innerText = "copy"), 2000);
});
}
&lt;/script&gt;&lt;h2 id="file"&gt;
&lt;a class="anchor inpage" href="#file"&gt;##&lt;/a&gt;file&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;filedialog&lt;/code&gt; 是其他应用需要选择文件时的弹窗&lt;/p&gt;</description><content:encoded><![CDATA[<h1 id="linux-handbook">
  <a class="anchor inpage" href="#linux-handbook">#</a>Linux Handbook</h1>
<p>
</p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">bash &lt;(curl -sSL https://linuxmirrors.cn/main.sh)</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">bash &lt;(curl -sSL https://linuxmirrors.cn/docker.sh)</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">bash &lt;(curl -sSL https://linuxmirrors.cn/docker.sh) --only-registry</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h2 id="file">
  <a class="anchor inpage" href="#file">##</a>file</h2>
<p><code>filedialog</code> 是其他应用需要选择文件时的弹窗</p>
<h2 id="boot">
  <a class="anchor inpage" href="#boot">##</a>boot</h2>
<h2 id="display-manager">
  <a class="anchor inpage" href="#display-manager">##</a>display manager</h2>
<p>lightdm 有一堆莫名其妙的问题</p>
<p>gtk display还不知道怎么搞</p>
<h2 id="keyring">
  <a class="anchor inpage" href="#keyring">##</a>keyring</h2>
<p>
</p>
<p>use <code>gnome-keyring</code> and <code>thunar</code> to auto connect a webdav.

</p>
<h2 id="reference">
  <a class="anchor inpage" href="#reference">##</a>Reference</h2>
<p>
</p>
<h2 id="commands">
  <a class="anchor inpage" href="#commands">##</a>commands</h2>
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>type something</span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>example</p>
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>type cd
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>cd is a shell builtin</span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h2 id="技巧">
  <a class="anchor inpage" href="#%e6%8a%80%e5%b7%a7">##</a>技巧</h2>
<details open>
    <summary>tldr</summary><pre
        class="codeblock"
      ><code class="language-tldr" data-lang="tldr">  Change attributes of files or directories.
  More information: &lt;https://manned.org/chattr&gt;.

  Make a file or directory [i]mmutable to changes and deletion, even by superuser:

      chattr &#43;i path/to/file_or_directory

  Make a file or directory mutable:

      chattr -i path/to/file_or_directory

  [R]ecursively make an entire directory and contents immutable:

      chattr -R &#43;i path/to/directory

  Mark a directory and its files to be interpreted in a case-insensitive manner (case-[F]olding):

      chattr &#43;F path/to/directory

  Set a file to only allow [a]ppending:

      chattr &#43;a path/to/file</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script>]]></content:encoded></item><item><title>Display Manager</title><link>https://hiraethecho.github.io/docs/linux/sddm/</link><pubDate>Thu, 05 Jun 2025 00:00:00 +0000</pubDate><author>wyz2016zxc@outlook.com(Hiraeth)</author><guid>https://hiraethecho.github.io/docs/linux/sddm/</guid><description>在Linux系统中配置显示管理器（Display Manager）的指南，包括无显示管理器和sddm的自动登录设置。</description><content:encoded><![CDATA[<h1 id="display-manager">
  <a class="anchor inpage" href="#display-manager">#</a>Display Manager</h1>
<h2 id="no-dm">
  <a class="anchor inpage" href="#no-dm">##</a>No DM</h2>
<p>skip username: <code>/etc/systemd/system/getty@tty1.service.d/skip-username.conf</code></p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">[Service]
ExecStart=
ExecStart=-/sbin/agetty -o &#39;-p -- hiraeth&#39; --noclear --skip-login - $TERM</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h2 id="sddm">
  <a class="anchor inpage" href="#sddm">##</a>sddm</h2>
<h3 id="autologin">
  <a class="anchor inpage" href="#autologin">###</a>autologin</h3>
<p>默认session <code>/etc/sddm.conf</code></p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">[Theme]
Current=chili

[Autologin]
User=hiraeth
Session=dwm.desktop</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>免密码
You must then also be part of the nopasswdlogin group to be able to login interactively without entering your password:</p>
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>groupadd -r nopasswdlogin
</span></span><span style="display:flex;"><span>gpasswd -a username nopasswdlogin</span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>SDDM goes through PAM so you must configure the SDDM configuration of PAM: <code>/etc/pam.d/sddm</code></p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">#%PAM-1.0
auth        sufficient  pam_succeed_if.so user ingroup nopasswdlogin
auth        include     system-login
-auth       optional    pam_gnome_keyring.so
-auth       optional    pam_kwallet5.so

account     include     system-login

password    include     system-login
-password   optional    pam_gnome_keyring.so    use_authtok

session     optional    pam_keyinit.so          force revoke
session     include     system-login
-session    optional    pam_gnome_keyring.so    auto_start
-session    optional    pam_kwallet5.so         auto_start</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p><code>/etc/pam.d/sddm-autologin</code></p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">#%PAM-1.0
auth        required    pam_env.so
auth        required    pam_faillock.so preauth
auth        required    pam_shells.so
auth        required    pam_nologin.so
auth        required    pam_permit.so
-auth       optional    pam_gnome_keyring.so
-auth       optional    pam_kwallet5.so
account     include     system-local-login
password    include     system-local-login
session     include     system-local-login
-session    optional    pam_gnome_keyring.so auto_start
-session    optional    pam_kwallet5.so auto_start</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h2 id="files">
  <a class="anchor inpage" href="#files">##</a>files</h2>
<details open>
    <summary>/etc/zsh/zshenv</summary><pre
        class="codeblock"
      ><code class="language-/etc/zsh/zshenv" data-lang="/etc/zsh/zshenv">export ERRFILE=&#34;$XDG_CACHE_HOME/X11/xsession-errors&#34;</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script>]]></content:encoded></item><item><title>qemu虚拟机</title><link>https://hiraethecho.github.io/docs/linux/virtual-machine/</link><pubDate>Mon, 21 Apr 2025 00:00:00 +0000</pubDate><author>wyz2016zxc@outlook.com(Hiraeth)</author><guid>https://hiraethecho.github.io/docs/linux/virtual-machine/</guid><description>在linux上配置使用qemu虚拟机</description><content:encoded><![CDATA[<h1 id="qemu虚拟机">
  <a class="anchor inpage" href="#qemu%e8%99%9a%e6%8b%9f%e6%9c%ba">#</a>qemu虚拟机</h1>
<h2 id="install">
  <a class="anchor inpage" href="#install">##</a>Install</h2>
<p>Install pakages</p>
<details open>
    <summary>arch</summary><pre
        class="codeblock"
      ><code class="language-arch" data-lang="arch">paru -S qemu-base # basic
paru -S libvirt # 虚拟机一些api的封装
virtual-manager # GUI
paru -S dnsmasq bridge-utils # net</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>Add user into groups, and start services<br>
编辑文件<code>/etc/libvirt/libvirtd.conf</code></p>
<details open>
    <summary>conf</summary><pre
        class="codeblock"
      ><code class="language-conf" data-lang="conf">unix_sock_group = &#34;libvirt&#34;
unix_sock_rw_perms = &#34;0770&#34;</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">sudo usermod -a -G libvirt $(whoami)</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>sudo systemctl enable libvirtd.service</span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h2 id="net">
  <a class="anchor inpage" href="#net">##</a>net</h2>
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>sudo virsh net-list --all
</span></span><span style="display:flex;"><span>sudo virsh net-start --all
</span></span><span style="display:flex;"><span>sudo virsh net-autostart default</span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h2 id="windows">
  <a class="anchor inpage" href="#windows">##</a>Windows</h2>
<p>
 一个更迷你的win镜像</p>
]]></content:encoded></item></channel></rss>