<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SoftWare on ousfifty's blog</title><link>https://blog.ous50.moe/en/categories/software/</link><description>Recent content in SoftWare on ousfifty's blog</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><copyright>ousfifty 2020-</copyright><lastBuildDate>Sat, 20 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.ous50.moe/en/categories/software/index.xml" rel="self" type="application/rss+xml"/><item><title>eUICC management explained</title><link>https://blog.ous50.moe/en/p/euicc-management-explained/</link><pubDate>Mon, 06 Apr 2026 22:39:01 +0800</pubDate><guid>https://blog.ous50.moe/en/p/euicc-management-explained/</guid><description>&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;As established in my &lt;a class="link" href="../eUICC-Explained" &gt;previous post on UICC history&lt;/a&gt;, an &lt;strong&gt;eUICC&lt;/strong&gt; is a programmable platform. Android™ provides multiple ways for users to manage their eUICC (referred to as &amp;rsquo;eSIM&amp;rsquo; below), including but not limited to using &lt;a class="link" href="https://source.android.com/docs/core/connect/esim-overview#make-lpa-app" target="_blank" rel="noopener"
 &gt;LPAs (Local Profile Assistants)&lt;/a&gt; via &lt;a class="link" href="https://euicc-manual.osmocom.org/docs/android/open-mobile-api/" target="_blank" rel="noopener"
 &gt;OMAPI&lt;/a&gt; (Open Mobile API, requires Android 9 / API level 28 or later) or the &lt;a class="link" href="https://developer.android.com/reference/android/telephony/euicc/EuiccManager" target="_blank" rel="noopener"
 &gt;Android Telephony API&lt;/a&gt; (requires root permission and Android 11 or later; you can replace the default eSIM management portal on your phone using Magisk).&lt;/p&gt;
&lt;p&gt;This article mainly demonstrates the difference between OMAPI and Android Telephony API using OpenEUICC and EasyEUICC apps. These apps are developed by &lt;a class="link" href="https://gitea.angry.im/PeterCxy" target="_blank" rel="noopener"
 &gt;Peter Cai&lt;/a&gt; and shared &lt;a class="link" href="https://gitea.angry.im/PeterCxy/OpenEUICC" target="_blank" rel="noopener"
 &gt;the same codebase&lt;/a&gt;. The only difference is the management API used (EasyEUICC for unprivileged users and OpenEUICC for privileged users). Their differences are shown below:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;&lt;/th&gt;
					&lt;th style="text-align: center"&gt;OpenEUICC&lt;/th&gt;
					&lt;th style="text-align: center"&gt;EasyEUICC&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;Privileged&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Must be installed as system app&lt;/td&gt;
					&lt;td style="text-align: center"&gt;No&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;Internal eSIM&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Supported&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Unsupported&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;External eSIM &lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Supported&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Supported&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;USB Readers&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Supported&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Supported&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;Requires allowlisting by eSIM&lt;/td&gt;
					&lt;td style="text-align: center"&gt;No&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Yes &amp;ndash; except USB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;System Integration&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Partial &lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
					&lt;td style="text-align: center"&gt;No&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;Minimum Android Version&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Android 11 or higher&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Android 9 or higher&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="if-you-are-interested-in-purchasing-compatible-removable-esim-cards"&gt;&lt;a href="#if-you-are-interested-in-purchasing-compatible-removable-esim-cards" class="header-anchor"&gt;&lt;/a&gt;If you are interested in purchasing compatible Removable eSIM cards
&lt;/h3&gt;&lt;p&gt;We have collaborated with multiple excellent manufacturers and have some discounts for your choices. Check the following to purchase cheaper and support me if you like this article.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://store.estk.me/products?code=ous50" target="_blank" rel="noopener"
 &gt;eSTK.me&lt;/a&gt; - The no-fuss choice. Use any LPA apps and even be able to manage profiles on Any Android or iPhone. Use &lt;code&gt;OUS50&lt;/code&gt; as coupon code at checkout to get &lt;strong&gt;10% OFF&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.9esim.com/shop/" target="_blank" rel="noopener"
 &gt;9eSIM&lt;/a&gt; - affordable choices. use &lt;code&gt;OUS50&lt;/code&gt; at checkout to get &lt;strong&gt;10% OFF&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="easyeuicc---omapi"&gt;&lt;a href="#easyeuicc---omapi" class="header-anchor"&gt;&lt;/a&gt;EasyEUICC - OMAPI
&lt;/h2&gt;

&lt;style&gt;
 .light-quote { font-weight: 300; }
 .bold-quote { font-weight: 700; }
 .extrabold-quote { font-weight: 900}
&lt;/style&gt;


 &lt;blockquote class="gh-blockquote gh-note"&gt;
 &lt;span class="extrabold-quote"&gt;Note&lt;/span&gt;
 &lt;br&gt;

 Unless you compile the EasyEUICC by yourself, &lt;strong&gt;you have to make sure your external eSIM device is compatible with &lt;code&gt;EasyEUICC&lt;/code&gt;&lt;/strong&gt;, which means the device MUST comply with the GSMA SGP.22 specification and &lt;strong&gt;MUST support&lt;/strong&gt; this specific ARA-M SHA-1 value: &lt;code&gt;2A2FA878BC7C3354C2CF82935A5945A3EDAE4AFA&lt;/code&gt; before proceeding.
 &lt;/blockquote&gt;


&lt;h3 id="download"&gt;&lt;a href="#download" class="header-anchor"&gt;&lt;/a&gt;Download
&lt;/h3&gt;&lt;p&gt;You may download the app directly from &lt;a class="link" href="https://easyeuicc.org/en/" target="_blank" rel="noopener"
 &gt;EasyEUICC official page&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="first-usage"&gt;&lt;a href="#first-usage" class="header-anchor"&gt;&lt;/a&gt;First usage
&lt;/h3&gt;&lt;p&gt;At first launch, the EasyEUICC app will check your Android phone&amp;rsquo;s OMAPI compatibility and show the SIM slot(s) you can use to manage your &lt;a class="link" href="#if-you-are-interested-in-purchasing-compatible-removable-esim-cards" &gt;compatible external eSIM devices&lt;/a&gt;&lt;/p&gt;
&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/allow-notification.png" class="content-gallery-image"&gt;
 

 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/first-start-check.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;
&lt;p&gt;Click the &lt;code&gt;Continue&lt;/code&gt; button to proceed, and you will be taken to the main interface:&lt;/p&gt;
&lt;p&gt;&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/main-page.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;


&lt;style&gt;
 .light-quote { font-weight: 300; }
 .bold-quote { font-weight: 700; }
 .extrabold-quote { font-weight: 900}
&lt;/style&gt;


 &lt;blockquote class="gh-blockquote gh-note"&gt;
 &lt;span class="extrabold-quote"&gt;Note&lt;/span&gt;
 &lt;br&gt;

 If you just want to add/manage your eSIM profiles, just go &lt;a class="link" href="#add-esim-profiles" &gt;here&lt;/a&gt;
 &lt;/blockquote&gt;

&lt;/p&gt;
&lt;h3 id="settings-page"&gt;&lt;a href="#settings-page" class="header-anchor"&gt;&lt;/a&gt;Settings page
&lt;/h3&gt;&lt;p&gt;Click the &lt;code&gt;⋮&lt;/code&gt; button in the upper right corner to check the settings:&lt;/p&gt;
&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/settings.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;
&lt;h3 id="add-esim-profiles"&gt;&lt;a href="#add-esim-profiles" class="header-anchor"&gt;&lt;/a&gt;Add eSIM profiles
&lt;/h3&gt;&lt;p&gt;Click the &lt;code&gt;+&lt;/code&gt; button in the lower right corner, and &lt;strong&gt;select the eSIM device&lt;/strong&gt; you want to download the profile to:&lt;/p&gt;


&lt;style&gt;
 .light-quote { font-weight: 300; }
 .bold-quote { font-weight: 700; }
 .extrabold-quote { font-weight: 900}
&lt;/style&gt;


 &lt;blockquote class="gh-blockquote gh-note"&gt;
 &lt;span class="extrabold-quote"&gt;Note&lt;/span&gt;
 &lt;br&gt;

 You should check your eSIM via &lt;code&gt;eID&lt;/code&gt;, not &lt;code&gt;ICCID&lt;/code&gt;. &lt;code&gt;eID&lt;/code&gt; is your &lt;strong&gt;eSIM device(the card inserted into your phone)&lt;/strong&gt; identification number and &lt;code&gt;ICCID&lt;/code&gt; is your eSIM profile identification number.
 &lt;/blockquote&gt;


&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/download-profile-select-eSIM.png" class="content-gallery-image"&gt;
 

 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/download-profile-install-method.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;
&lt;p&gt;Choose the method you want to use (usually scanning a QR code with the camera or loading it from the gallery). The profile download will start after checking with the target server:&lt;/p&gt;


&lt;style&gt;
 .light-quote { font-weight: 300; }
 .bold-quote { font-weight: 700; }
 .extrabold-quote { font-weight: 900}
&lt;/style&gt;


 &lt;blockquote class="gh-blockquote gh-warning"&gt;
 &lt;span class="extrabold-quote"&gt;Warning&lt;/span&gt;
 &lt;br&gt;

 Make sure you &lt;strong&gt;have a stable and reachable connection&lt;/strong&gt; when you are downloading profiles. Otherwise &lt;strong&gt;you may lose your profile permanently&lt;/strong&gt; since the profile issuing server has marked your profile as downloaded.
 &lt;/blockquote&gt;


&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.common/download-profile-progress.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;
&lt;h4 id="if-you-need-to-download-profile-with-raw-data-provided-or-qr-code-is-not-working"&gt;&lt;a href="#if-you-need-to-download-profile-with-raw-data-provided-or-qr-code-is-not-working" class="header-anchor"&gt;&lt;/a&gt;If you need to download profile with raw data provided, or QR code is not working
&lt;/h4&gt;&lt;p&gt;Then select the last option &lt;code&gt;Enter manually&lt;/code&gt;. Type in the strings your provider gave you:&lt;/p&gt;
&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/download-profile-manual.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;
&lt;h3 id="after-profile-downloaded"&gt;&lt;a href="#after-profile-downloaded" class="header-anchor"&gt;&lt;/a&gt;After Profile downloaded
&lt;/h3&gt;&lt;p&gt;When the profile is downloaded, you can view, toggle, and rename the profile on the main page:&lt;/p&gt;
&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.common/main-page-toggle-profile.png" class="content-gallery-image"&gt;
 

 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.common/main-page-config-profile-name.png" class="content-gallery-image"&gt;
 

 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.common/main-page-after-profile-name-changed.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;


&lt;style&gt;
 .light-quote { font-weight: 300; }
 .bold-quote { font-weight: 700; }
 .extrabold-quote { font-weight: 900}
&lt;/style&gt;


 &lt;blockquote class="gh-blockquote gh-note"&gt;
 &lt;span class="extrabold-quote"&gt;Note&lt;/span&gt;
 &lt;br&gt;

 I have been using &lt;code&gt;esim.gg&lt;/code&gt; every day for several years, and it has been exceptionally reliable and stable while I travel globally. Currently there is no discount for data-only eSIMs, but you can get 0.3 EUR off if you purchase a new Estonian number using &lt;code&gt;ous50&lt;/code&gt; at checkout.
 &lt;/blockquote&gt;


&lt;h2 id="troubleshooting"&gt;&lt;a href="#troubleshooting" class="header-anchor"&gt;&lt;/a&gt;Troubleshooting
&lt;/h2&gt;&lt;h3 id="omapi-detection-failed"&gt;&lt;a href="#omapi-detection-failed" class="header-anchor"&gt;&lt;/a&gt;OMAPI detection failed
&lt;/h3&gt;&lt;p&gt;In this case, your phone or system does not support EasyEUICC via OMAPI. Consider using OpenEUICC after gaining root access, or switch to a more modern device.&lt;/p&gt;
&lt;h3 id="profile-download-failed"&gt;&lt;a href="#profile-download-failed" class="header-anchor"&gt;&lt;/a&gt;Profile download failed
&lt;/h3&gt;&lt;p&gt;Check the error code, try scanning the QR code again or &lt;a class="link" href="#if-you-need-to-download-profile-with-raw-data-provided-or-qr-code-is-not-working" &gt;downloading the profile manually&lt;/a&gt;.&lt;/p&gt;


&lt;style&gt;
 .light-quote { font-weight: 300; }
 .bold-quote { font-weight: 700; }
 .extrabold-quote { font-weight: 900}
&lt;/style&gt;


 &lt;blockquote class="gh-blockquote gh-warning"&gt;
 &lt;span class="extrabold-quote"&gt;Warning&lt;/span&gt;
 &lt;br&gt;

 Make sure you &lt;strong&gt;have a stable and reachable connection&lt;/strong&gt; when you are downloading profiles. Otherwise &lt;strong&gt;you may lose your profile permanently&lt;/strong&gt; since the profile issuing server has marked your profile as downloaded.
 &lt;/blockquote&gt;


&lt;p&gt;If you have run out of download attempts, contact your eSIM profile provider for further assistance.&lt;/p&gt;
&lt;h3 id="no-esim-carddevice-found"&gt;&lt;a href="#no-esim-carddevice-found" class="header-anchor"&gt;&lt;/a&gt;no eSIM card/device found
&lt;/h3&gt;&lt;p&gt;Your eSIM card/device might not be compatible with EasyEUICC. &lt;a class="link" href="#easyeuicc---omapi" &gt;Check here&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h2 id="faq"&gt;&lt;a href="#faq" class="header-anchor"&gt;&lt;/a&gt;FAQ
&lt;/h2&gt;&lt;h3 id="will-i-get-banned-by-my-provider-for-using-this-app"&gt;&lt;a href="#will-i-get-banned-by-my-provider-for-using-this-app" class="header-anchor"&gt;&lt;/a&gt;Will I get banned by my provider for using this app?
&lt;/h3&gt;&lt;p&gt;Generally no. But providers have their own blacklist. Some eSIM card manufacturer/models might be blacklisted.
Purchase a good eSIM card &lt;a class="link" href="#if-you-are-interested-in-purchasing-compatible-removable-esim-cards" &gt;listed above&lt;/a&gt; and follow the instructions from your provider.&lt;/p&gt;
&lt;h3 id="can-i-use-these-cards-on-other-phones"&gt;&lt;a href="#can-i-use-these-cards-on-other-phones" class="header-anchor"&gt;&lt;/a&gt;Can I use these cards on other phones?
&lt;/h3&gt;&lt;p&gt;Yes, &lt;strong&gt;you can use these cards like normal physical SIM cards&lt;/strong&gt; after you have properly set up the eSIM card/device and have toggled and configured your desired profile.&lt;/p&gt;
&lt;p&gt;You can use the EasyEUICC app on any OMAPI-compatible Android phone to manage profiles on &lt;a class="link" href="#if-you-are-interested-in-purchasing-compatible-removable-esim-cards" &gt;compatible cards&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For eSTK cards, you can even manage your profiles on iPhones using the STK application.&lt;/p&gt;
&lt;h2 id="footnotes"&gt;&lt;a href="#footnotes" class="header-anchor"&gt;&lt;/a&gt;Footnotes
&lt;/h2&gt;&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Also known as &amp;ldquo;Removable eSIM&amp;rdquo;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Carrier Partner API not implemented yet&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>How I Create Seamless Network Using OSPF on Routeros and Shellcrash on PVE</title><link>https://blog.ous50.moe/en/p/how-i-create-seamless-network-using-ospf-on-routeros-and-shellcrash-on-pve/</link><pubDate>Thu, 29 Jan 2026 00:58:18 +0800</pubDate><guid>https://blog.ous50.moe/en/p/how-i-create-seamless-network-using-ospf-on-routeros-and-shellcrash-on-pve/</guid><description>

&lt;style&gt;
 .light-quote { font-weight: 300; }
 .bold-quote { font-weight: 700; }
 .extrabold-quote { font-weight: 900}
&lt;/style&gt;


 &lt;blockquote class="gh-blockquote gh-note"&gt;
 &lt;span class="extrabold-quote"&gt;Note&lt;/span&gt;
 &lt;br&gt;

 Please be advised that this article is written for RouterOS &lt;code&gt;7.20.1&lt;/code&gt; and ShellCrash &lt;code&gt;1.9.4beta6&lt;/code&gt; on &lt;code&gt;2026-01-29&lt;/code&gt;, both operated as KVM instance in PVE. Contents might vary for different version of RouterOS and ShellCrash.
 &lt;/blockquote&gt;


&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Previously I used DHCP gateway nomination to let devices in my network use proxy. Although it successfully enables me to use proxy seamlessly, I can&amp;rsquo;t expand this experience to all devices, since sometimes ShellCrash may really &amp;ldquo;crashed&amp;rdquo; and would affect normal network traffic. I have heard OSPF feature for a long time, so recently I set up OSPF using RouterOS according to &lt;a class="link" href="https://deeprouter.org/article/routeros-ospf-intelligent-traffic-split" target="_blank" rel="noopener"
 &gt;DeepRouter&amp;rsquo;s article&lt;/a&gt;. This article is to record my experience and share my way to enhance the robustness.&lt;/p&gt;
&lt;!-- &lt;script&gt;
 // Your dynamic JavaScript code here (e.g., fetching data from an API)
 document.addEventListener('DOMContentLoaded', (event) =&gt; {
 document.getElementById('dynamic-data').innerText = 'Data loaded at runtime!';
 });
&lt;/script&gt;
&lt;div id="dynamic-data"&gt;Loading...&lt;/div&gt; --&gt;
&lt;h2 id="shellcrash-and-bird-configuration"&gt;&lt;a href="#shellcrash-and-bird-configuration" class="header-anchor"&gt;&lt;/a&gt;ShellCrash and Bird Configuration
&lt;/h2&gt;&lt;p&gt;Although it is fine to deploy ShellCrash and BIRD in separate instance, it is highly recommended to deploy in the same one.&lt;/p&gt;
&lt;p&gt;ShellCrash installation process is ignored, just make sure you are using MIX in DNS configuration(press 2(feature setting) - 2(DNS Setting)).&lt;/p&gt;
&lt;h3 id="check-ipv4-and-ipv6-forward-configuration"&gt;&lt;a href="#check-ipv4-and-ipv6-forward-configuration" class="header-anchor"&gt;&lt;/a&gt;Check IPv4 and IPv6 forward configuration
&lt;/h3&gt;&lt;p&gt;run &lt;code&gt;sudo sysctl -p&lt;/code&gt; and check if the following are properly configured:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.ipv4.ip_forward=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.ipv6.conf.all.forwarding=1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If not, edit &lt;code&gt;/etc/sysctl.conf&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="bird"&gt;&lt;a href="#bird" class="header-anchor"&gt;&lt;/a&gt;BIRD
&lt;/h3&gt;&lt;p&gt;We will use &lt;a class="link" href="https://github.com/ous50/nchnroutes" target="_blank" rel="noopener"
 &gt;!chnroutes&lt;/a&gt; to distinguish chn ips.&lt;/p&gt;
&lt;p&gt;Make sure you doesn&amp;rsquo;t enable/start bird service after installation. There are several things to do.&lt;/p&gt;
&lt;p&gt;For Debian:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install bird2 make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="birdconf"&gt;&lt;a href="#birdconf" class="header-anchor"&gt;&lt;/a&gt;bird.conf
&lt;/h4&gt;&lt;p&gt;Edit &lt;code&gt;/etc/bird/bird.conf&lt;/code&gt; and change as below.&lt;/p&gt;
&lt;p&gt;make sure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;router id&lt;/code&gt; is your ShellCrash/BIRD instance IP&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;interface&lt;/code&gt; in both ospf v2 and v3 is set to the interface this instance used to connect to the gateway(the LAN port).
You may check using &lt;code&gt;ip a&lt;/code&gt; or &lt;code&gt;ip link&lt;/code&gt;, and find the one OTHER THAN &lt;code&gt;lo&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;log&lt;/span&gt; &lt;span class="n"&gt;syslog&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;114.51&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;#This line change to instance IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;scan&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv4&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv6&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/etc/bird/routes4.conf&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/etc/bird/routes6.conf&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;ospf&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv4&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;interface&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ens18&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# Change this to your networking interface&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;pointopoint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;ospf&lt;/span&gt; &lt;span class="n"&gt;v3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv6&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;interface&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ens18&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# Change this to your networking interface&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;pointopoint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="generating-routes"&gt;&lt;a href="#generating-routes" class="header-anchor"&gt;&lt;/a&gt;Generating routes
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/ous50/nchnroutes.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; nchnroutes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you have trouble connecting to github.com, use a mirror instead:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://hk.gh-proxy.org/https://github.com/ous50/nchnroutes.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; nchnroutes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You are pleased to continue if the following output is shown:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 produce.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv routes4.conf /etc/bird/routes4.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv routes6.conf /etc/bird/routes6.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo birdc configure
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BIRD 2.0.12 ready.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Reading configuration from /etc/bird/bird.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Reconfigured
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="routeros-configuration"&gt;&lt;a href="#routeros-configuration" class="header-anchor"&gt;&lt;/a&gt;RouterOS Configuration
&lt;/h2&gt;&lt;p&gt;You need to set up bypassing routing table first to prevent looping instantly after OSPF neighbor is found.&lt;/p&gt;
&lt;h3 id="bypass-shellcrash-looping-and-setting-up-exceptions"&gt;&lt;a href="#bypass-shellcrash-looping-and-setting-up-exceptions" class="header-anchor"&gt;&lt;/a&gt;Bypass ShellCrash looping and setting up exceptions
&lt;/h3&gt;&lt;p&gt;We are going to make another routing table to bypass the traffic from ShellCrash to prevent loop.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing table
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no fib name=bypass-shellcrash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing rule
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add action=lookup-only-in-table comment=&amp;#34;Bypass Shellcrash Gateway using Routing Mark&amp;#34; disabled=no routing-mark=bypass-shellcrash table=bypass-shellcrash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Migrate your routes from &lt;code&gt;main&lt;/code&gt; to &lt;code&gt;bypass-shellcrash&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Your&lt;/span&gt; &lt;span class="n"&gt;LAN&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;CIDR&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lan&lt;/span&gt; &lt;span class="n"&gt;routing&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bypass&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;shellcrash&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="n"&gt;suppress&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hw&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;offload&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Your&lt;/span&gt; &lt;span class="n"&gt;Internet&lt;/span&gt; &lt;span class="n"&gt;Gateway&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;routing&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bypass&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;shellcrash&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="n"&gt;suppress&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hw&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;offload&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="firewall-tagging"&gt;&lt;a href="#firewall-tagging" class="header-anchor"&gt;&lt;/a&gt;Firewall tagging
&lt;/h4&gt;&lt;p&gt;Make sure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change the dst-address to your LAN, preserving the &lt;code&gt;!&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Change the src-mac-address to the ShellCrash networking interface port MAC address(check using &lt;code&gt;ip link&lt;/code&gt; in shellcrash instance or directly from PVE)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/ip firewall mangle
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add action=mark-routing chain=prerouting comment=bypass-shellcrash-gateway dst-address=!192.168.0.0/23 new-routing-mark=bypass-shellcrash src-mac-address=11:45:14:19:19:81
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ospf-config"&gt;&lt;a href="#ospf-config" class="header-anchor"&gt;&lt;/a&gt;OSPF config
&lt;/h3&gt;&lt;p&gt;By default you do not need to change anything in this script.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing ospf instance
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no name=shellcrash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no name=shellcrash-v6 version=3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing ospf area
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no instance=shellcrash name=ospf-area-v4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no instance=shellcrash-v6 name=ospf-area-v6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing ospf interface-template
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add area=ospf-area-v4 cost=10 disabled=no priority=32 type=ptp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add area=ospf-area-v6 cost=10 disabled=no priority=32 type=ptp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="tricks"&gt;&lt;a href="#tricks" class="header-anchor"&gt;&lt;/a&gt;Tricks
&lt;/h2&gt;&lt;h3 id="robust-dns-setting"&gt;&lt;a href="#robust-dns-setting" class="header-anchor"&gt;&lt;/a&gt;Robust DNS setting
&lt;/h3&gt;&lt;p&gt;Due to the &lt;code&gt;fake-ip&lt;/code&gt; used by ShellCrash, you should set ShellCrash&amp;rsquo;s DNS as an upstream.&lt;/p&gt;
&lt;p&gt;In this case we assume nominating RouterOS&amp;rsquo;s DNS to clients and use the following RouterOS script to update upstream DNS source to enhance the robustness, in case of ShellCrash failed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;global&lt;/span&gt; &lt;span class="n"&gt;ospfInstance&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;shellsrash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;global&lt;/span&gt; &lt;span class="n"&gt;ospfDNS&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1.1.4.5&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# Your ShellCrash instance IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;global&lt;/span&gt; &lt;span class="n"&gt;publicDNS&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;223.5.5.5&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# Change this DNS for your direct internet access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# (true / false), turn debug off after testing or your logs have abundant annoying debug messages.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="n"&gt;DEBUG&lt;/span&gt; &lt;span class="bp"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# marking the final status default value is false (down)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="n"&gt;isOspfActive&lt;/span&gt; &lt;span class="bp"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Trying to find the neighbor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="n"&gt;neighborIds&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;routing&lt;/span&gt; &lt;span class="n"&gt;ospf&lt;/span&gt; &lt;span class="n"&gt;neighbor&lt;/span&gt; &lt;span class="n"&gt;find&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;=$&lt;/span&gt;&lt;span class="n"&gt;ospfInstance&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# check if neighbor is found&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;([:&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;neighborIds&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Note: In this case we will only use one instance.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# If you have multiple instance, you might need to traversal and find the instance.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="n"&gt;neighborState&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;routing&lt;/span&gt; &lt;span class="n"&gt;ospf&lt;/span&gt; &lt;span class="n"&gt;neighbor&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;neighborIds&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{:&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[DEBUG] Neighbor found! State: $neighborState&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Only consider ospf active when state is &amp;#34;Full&amp;#34;. Remember, not &amp;#34;full&amp;#34;. This state might vary on different RouterOS version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;neighborState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Full&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;isOspfActive&lt;/span&gt; &lt;span class="bp"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# if length is 0, this neighbor is not found. check bird configuration/status.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{:&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[DEBUG] No OSPF neighbor found. Logic assumes DOWN.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;isOspfActive&lt;/span&gt; &lt;span class="bp"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# change DNS according to the variable isOspfActive &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="n"&gt;currentDNS&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="n"&gt;dns&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;isOspfActive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# OSPF Up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{:&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[DEBUG] Decision: OSPF is UP.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;currentDNS&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;ospfDNS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OSPF Shellcrash Up: Switching to OSPF DNS ($ospfDNS).&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="n"&gt;dns&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="o"&gt;=$&lt;/span&gt;&lt;span class="n"&gt;ospfDNS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="n"&gt;dns&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{:&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[DEBUG] DNS is already correct (OSPF).&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# OSPF Down (or missing neighbor)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{:&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[DEBUG] Decision: OSPF is DOWN/MISSING.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;currentDNS&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;publicDNS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OSPF Shellcrash Down: Switching to Public DNS ($publicDNS).&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="n"&gt;dns&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="o"&gt;=$&lt;/span&gt;&lt;span class="n"&gt;publicDNS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="n"&gt;dns&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{:&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[DEBUG] DNS is already correct (Public).&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="switch-off-bird-when-shellcrash-is-crashed"&gt;&lt;a href="#switch-off-bird-when-shellcrash-is-crashed" class="header-anchor"&gt;&lt;/a&gt;Switch off bird when shellcrash is crashed
&lt;/h3&gt;&lt;p&gt;We will use a bash script to actively check if shellcrash is alive. If the API is unreachable, it will stop the Bird service to withdraw OSPF routes.&lt;/p&gt;
&lt;p&gt;Copy and paste the following block into your PVE Shell (logged in as the &lt;code&gt;clash&lt;/code&gt; user, or a user with sudo privileges):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. Create the watchdog script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Note: We use &amp;#39;EOF&amp;#39; (quoted) to prevent variable expansion during creation.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tee /home/clash/check_clash.sh &amp;gt; /dev/null &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# Configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;API_URL=&amp;#34;http://127.0.0.1:9999/&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;LOG_FILE=&amp;#34;/home/clash/clash_watchdog.log&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;DEBUG=false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;INTERVAL=3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# Init state (0=unknown, 1=normal, 2=crashed)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;LAST_STATE=0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;while true; do
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # Check ShellCrash API
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; HTTP_CODE=$(curl -s -m 1 -o /dev/null -w &amp;#34;%{http_code}&amp;#34; &amp;#34;$API_URL&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$DEBUG&amp;#34; = &amp;#34;true&amp;#34; ]; then 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;[DEBUG] Dashboard code: $HTTP_CODE&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$HTTP_CODE&amp;#34; == &amp;#34;200&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # ShellCrash is ALIVE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$LAST_STATE&amp;#34; != &amp;#34;1&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; DATE=$(date &amp;#34;+%Y-%m-%d %H:%M:%S&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # Check if Bird is running using systemctl&amp;#39;s return code (more reliable)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; sudo systemctl is-active --quiet bird
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; BIRD_EXIT_CODE=$?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ $BIRD_EXIT_CODE -ne 0 ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$DEBUG&amp;#34; = &amp;#34;true&amp;#34; ]; then 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;ShellCrash detected. Starting Bird...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;[$DATE] ShellCrash recovered/detected. Starting Bird...&amp;#34; &amp;gt;&amp;gt; $LOG_FILE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; sudo systemctl start bird
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; LAST_STATE=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # ShellCrash is DEAD
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$LAST_STATE&amp;#34; != &amp;#34;2&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; DATE=$(date &amp;#34;+%Y-%m-%d %H:%M:%S&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$DEBUG&amp;#34; = &amp;#34;true&amp;#34; ]; then 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;[$DATE] Alert! ShellCrash died (Code: $HTTP_CODE). Stopping Bird!&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;[$DATE] Alert! ShellCrash died (Code: $HTTP_CODE). Stopping Bird!&amp;#34; &amp;gt;&amp;gt; $LOG_FILE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; sudo systemctl stop bird
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; LAST_STATE=2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; sleep $INTERVAL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;done
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. Make it executable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod +x /home/clash/check_clash.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. Create Systemd Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tee /etc/systemd/system/clash-watchdog.service &amp;gt; /dev/null &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Description=ShellCrash Watchdog for Bird OSPF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;After=network.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;User=clash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Group=clash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ExecStart=/home/clash/check_clash.sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Restart=always
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;RestartSec=3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. Enable and Start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now clash-watchdog.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status clash-watchdog.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Install Easytier on Pve</title><link>https://blog.ous50.moe/en/p/install-easytier-on-pve/</link><pubDate>Tue, 26 Aug 2025 10:30:16 +0800</pubDate><guid>https://blog.ous50.moe/en/p/install-easytier-on-pve/</guid><description>&lt;p&gt;If your internet provider interferes with the GitHub, you can use the following commands to install EasyTier:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update -y sudo unzip openssl 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O /tmp/easytier.sh &lt;span class="s2"&gt;&amp;#34;https://ghfast.top/https://raw.githubusercontent.com/EasyTier/EasyTier/main/script/install.sh&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo bash /tmp/easytier.sh install --gh-proxy https://ghfast.top/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl disable --now easytier@default.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check the latest proxy &lt;a class="link" href="https://ghproxy.link" target="_blank" rel="noopener"
 &gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Otherwise just simply use the default GitHub URL.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update -y sudo unzip openssl 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O /tmp/easytier.sh &lt;span class="s2"&gt;&amp;#34;https://raw.githubusercontent.com/EasyTier/EasyTier/main/script/install.sh&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo bash /tmp/easytier.sh install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl disable --now easytier@default.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Should you wish to use easytier dashboard to manage, you can enable the service with the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your_username&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Description=EasyTier Service
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;After=network.target syslog.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Wants=network.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Type=simple
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;ExecStart=/usr/sbin/easytier-core -w &lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/systemd/system/easytier.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now easytier.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then you are able to access the EasyTier dashboard at &lt;a class="link" href="https://easytier.cn/web" target="_blank" rel="noopener"
 &gt;https://easytier.cn/web&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Compiling Lineage OS on WSL2</title><link>https://blog.ous50.moe/en/p/compiling-lineage-os-on-wsl2/</link><pubDate>Thu, 25 Jan 2024 03:46:22 +0000</pubDate><guid>https://blog.ous50.moe/en/p/compiling-lineage-os-on-wsl2/</guid><description>&lt;h1 id="install-wsl-linux-and-compiling-dependency"&gt;&lt;a href="#install-wsl-linux-and-compiling-dependency" class="header-anchor"&gt;&lt;/a&gt;Install WSL Linux and Compiling Dependency
&lt;/h1&gt;&lt;p&gt;By default Ubuntu is installed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Make downloads faster by not displaying progress bar:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$ProgressPreference&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;SilentlyContinue&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Using the URL you found above, download the appx package:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Invoke-WebRequest&lt;/span&gt; &lt;span class="n"&gt;-Uri&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;aka&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wslubuntu&lt;/span&gt; &lt;span class="n"&gt;-OutFile&lt;/span&gt; &lt;span class="n"&gt;Linux&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;appx&lt;/span&gt; &lt;span class="n"&gt;-UseBasicParsing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Make a backup and unpack:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Copy-Item&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;Linux&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;appx&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;Linux&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;zip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Expand-Archive&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;Linux&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;zip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Search for the installer:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-Childitem&lt;/span&gt; &lt;span class="n"&gt;-Filter&lt;/span&gt; &lt;span class="p"&gt;*.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install compiling dependency for Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="for-debian-bookworm"&gt;&lt;a href="#for-debian-bookworm" class="header-anchor"&gt;&lt;/a&gt;For Debian Bookworm:
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev libncurses5 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="install-build-packages"&gt;&lt;a href="#install-build-packages" class="header-anchor"&gt;&lt;/a&gt;Install build packages:
&lt;/h1&gt;&lt;h2 id="repo"&gt;&lt;a href="#repo" class="header-anchor"&gt;&lt;/a&gt;Repo
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl https://storage.googleapis.com/git-repo-downloads/repo &lt;span class="p"&gt;|&lt;/span&gt;sudo tee /usr/bin/repo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod a+x /usr/bin/repo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="platform-tools"&gt;&lt;a href="#platform-tools" class="header-anchor"&gt;&lt;/a&gt;Platform tools
&lt;/h2&gt;&lt;p&gt;If you haven’t previously installed &lt;code&gt;adb&lt;/code&gt; and &lt;code&gt;fastboot&lt;/code&gt;, you can &lt;a class="link" href="https://dl.google.com/android/repository/platform-tools-latest-linux.zip" target="_blank" rel="noopener"
 &gt;download the original version from Google&lt;/a&gt; and extract it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://dl.google.cn/android/repository/platform-tools-latest-linux.zip &lt;span class="c1"&gt;# For readers located in China&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unzip platform-tools-latest-linux.zip -d ~/.local/bin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you have to add &lt;code&gt;adb&lt;/code&gt; and &lt;code&gt;fastboot&lt;/code&gt; to your PATH. Open &lt;code&gt;~/.profile&lt;/code&gt; and add the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# add Android SDK platform tools to path
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if [ -d &amp;#34;$HOME/.local/bin/platform-tools&amp;#34; ] ; then
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; PATH=&amp;#34;$HOME/.local/bin/platform-tools:$PATH&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run &lt;code&gt;source ~/.profile&lt;/code&gt; to update your environment, or simply restart the shell.&lt;/p&gt;
&lt;h2 id="python"&gt;&lt;a href="#python" class="header-anchor"&gt;&lt;/a&gt;Python
&lt;/h2&gt;&lt;p&gt;For Lineage OS 18+, &lt;code&gt;python3&lt;/code&gt; is required to build a package.&lt;/p&gt;
&lt;h1 id="configure-git"&gt;&lt;a href="#configure-git" class="header-anchor"&gt;&lt;/a&gt;Configure Git
&lt;/h1&gt;&lt;p&gt;You would have to set your name to sync android source code.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.email &lt;span class="s2"&gt;&amp;#34;you@example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.name &lt;span class="s2"&gt;&amp;#34;Your Name&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Some large files may be required to download when syncing source code, hence install &lt;code&gt;git-lfs&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git lfs intall
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="make-new-directory-to-pull-source-code"&gt;&lt;a href="#make-new-directory-to-pull-source-code" class="header-anchor"&gt;&lt;/a&gt;Make new directory to pull source code
&lt;/h1&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir lineage-21.0 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; lineage-21.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="initialize-repo"&gt;&lt;a href="#initialize-repo" class="header-anchor"&gt;&lt;/a&gt;Initialize repo
&lt;/h1&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;repo init -u https://github.com/LineageOS/android.git -b lineage-21.0 &lt;span class="c1"&gt;# Sync the whole repo with all commit log, takes a lot of spaces.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;repo init -u https://github.com/LineageOS/android.git -b lineage-21.0 --depth&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# Only pull the latest commit without commit logs, takes not much spaces&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="start-syncing-repo"&gt;&lt;a href="#start-syncing-repo" class="header-anchor"&gt;&lt;/a&gt;Start syncing repo
&lt;/h1&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;repo sync -c -j&lt;span class="k"&gt;$(&lt;/span&gt;nproc --all&lt;span class="k"&gt;)&lt;/span&gt; --force-sync --no-clone-bundle --no-tags
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then follow &lt;a class="link" href="https://wiki.lineageos.org/devices/rtwo/build/variant2/#download-the-source-code" target="_blank" rel="noopener"
 &gt;Lineage OS building guide&lt;/a&gt;&amp;hellip;&lt;/p&gt;</description></item><item><title>Installing ArchLinux With Btrfs in Vmware</title><link>https://blog.ous50.moe/en/p/installing-archlinux-with-btrfs-in-vmware/</link><pubDate>Fri, 13 Jan 2023 23:07:11 +0800</pubDate><guid>https://blog.ous50.moe/en/p/installing-archlinux-with-btrfs-in-vmware/</guid><description>&lt;h2 id="before-installation"&gt;&lt;a href="#before-installation" class="header-anchor"&gt;&lt;/a&gt;Before installation
&lt;/h2&gt;&lt;p&gt;Create a virtual machine and adjust depend config on your need(Except for the UEFI firmware part):&lt;/p&gt;
&lt;p&gt;&lt;img alt="overview" class="gallery-image" data-flex-basis="237px" data-flex-grow="98" height="901" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ous50.moe/p/%E5%9C%A8-vmware-%E4%B8%AD%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-btrfs-%E7%9A%84-arch-linux/overview.png" srcset="https://blog.ous50.moe/p/%E5%9C%A8-vmware-%E4%B8%AD%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-btrfs-%E7%9A%84-arch-linux/overview_hu_943cda27a63beee4.png 800w, https://blog.ous50.moe/p/%E5%9C%A8-vmware-%E4%B8%AD%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-btrfs-%E7%9A%84-arch-linux/overview.png 891w" width="891"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="firmwareConfig" class="gallery-image" data-flex-basis="238px" data-flex-grow="99" height="896" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ous50.moe/p/%E5%9C%A8-vmware-%E4%B8%AD%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-btrfs-%E7%9A%84-arch-linux/firmwareConfig.png" srcset="https://blog.ous50.moe/p/%E5%9C%A8-vmware-%E4%B8%AD%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-btrfs-%E7%9A%84-arch-linux/firmwareConfig_hu_667105f6b17aceff.png 800w, https://blog.ous50.moe/p/%E5%9C%A8-vmware-%E4%B8%AD%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-btrfs-%E7%9A%84-arch-linux/firmwareConfig.png 889w" width="889"&gt;&lt;/p&gt;
&lt;p&gt;To prevent the creation of vmem files for acceleration, &lt;a class="link" href="https://gist.github.com/extremecoders-re/cf8d829c108d58bfbb2e3c1f4121d7e1" title="Disabling vmem files creation."
 target="_blank" rel="noopener"
 &gt;add the following lines to your .vmx file&lt;/a&gt;(:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;prefvmx.minVmMemPct = &amp;#34;100&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MemTrimRate = &amp;#34;0&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mainMem.useNamedFile = &amp;#34;FALSE&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sched.mem.pshare.enable = &amp;#34;FALSE&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;prefvmx.useRecommendedLockedMemSize = &amp;#34;TRUE&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Boot up the vm, and check if the firmware is UEFI or not:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /sys/firmware/efi/efivars
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;if it&amp;rsquo;s legacy BIOS, it will returns &lt;code&gt;No such file or directory.&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="partitioning"&gt;&lt;a href="#partitioning" class="header-anchor"&gt;&lt;/a&gt;Partitioning
&lt;/h2&gt;&lt;p&gt;Create a &lt;a class="link" href="https://wiki.archlinux.org/title/Installation_guide#Example_layouts" title="Partition layout "
 target="_blank" rel="noopener"
 &gt;new GPT partition table and partitioned with an EFI Partition no less than 300MiB&lt;/a&gt; and an Linux partition with &lt;code&gt;cgdisk&lt;/code&gt; or any other partition tools you want to use:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cgdisk /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="format-partitions"&gt;&lt;a href="#format-partitions" class="header-anchor"&gt;&lt;/a&gt;Format partitions
&lt;/h3&gt;&lt;h4 id="efi"&gt;&lt;a href="#efi" class="header-anchor"&gt;&lt;/a&gt;EFI
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkfs.fat -F32 /dev/sda1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="root-system"&gt;&lt;a href="#root-system" class="header-anchor"&gt;&lt;/a&gt;Root system
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkfs.btrfs -f -L Arch /dev/sda2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="building-btrfs-subvolume"&gt;&lt;a href="#building-btrfs-subvolume" class="header-anchor"&gt;&lt;/a&gt;Building BTRFS subvolume
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@&lt;/code&gt;：corresponding to &lt;code&gt;/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@home&lt;/code&gt;：corresponding to&lt;code&gt;/home&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cache&lt;/code&gt;：corresponding to &lt;code&gt;/var/cache&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@docker&lt;/code&gt;：corresponding to &lt;code&gt;/var/lib/docker&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@log&lt;/code&gt;：corresponding to &lt;code&gt;/var/log&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enabling COW in &lt;code&gt;@cache, @log&lt;/code&gt; is not needed.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mount root partition to &lt;code&gt;/mnt&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -t btrfs -o &lt;span class="nv"&gt;compress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lzo /dev/sda2 /mnt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;Generally we lzo is good enough. Reports shows that btrfs is way slower even under Zstd:1, while lzo has nearly no difference compared with non-compressed.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Create subvolumes:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@home
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@cache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@swap
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Use chattr to disable COW &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chattr +C /mnt/@cache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chattr +C /mnt/@log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chattr +C /mnt/@swap
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Umount the partition&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;umount /mnt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="mount-partitions-and-subvolumes"&gt;&lt;a href="#mount-partitions-and-subvolumes" class="header-anchor"&gt;&lt;/a&gt;Mount partitions and subvolumes
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@ /dev/sda2 /mnt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /mnt/&lt;span class="o"&gt;{&lt;/span&gt;boot/efi,home,var/&lt;span class="o"&gt;{&lt;/span&gt;log,lib/docker,cache&lt;span class="o"&gt;}&lt;/span&gt;,tmp,swap&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@home /dev/sda2 /mnt/home
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@log /dev/sda2 /mnt/var/log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@docker /dev/sda2 /mnt/var/lib/docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@cache /dev/sda2 /mnt/var/cache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@tmp /dev/sda2 /mnt/tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@swap /dev/sda2 /mnt/swap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="mount-efi-partition"&gt;&lt;a href="#mount-efi-partition" class="header-anchor"&gt;&lt;/a&gt;Mount EFI partition:
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount /dev/sda1 /mnt/boot/EFI
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="install-the-system"&gt;&lt;a href="#install-the-system" class="header-anchor"&gt;&lt;/a&gt;Install the system
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pacstrap /mnt base base-devel linux linux-firmware btrfs-progs networkmanager dhcpcd iwd vim sudo zsh zsh-completions &lt;span class="o"&gt;{&lt;/span&gt;intel,amd&lt;span class="o"&gt;}&lt;/span&gt;-ucode net-tools linux-headers curl git wget 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="generate-fstab"&gt;&lt;a href="#generate-fstab" class="header-anchor"&gt;&lt;/a&gt;Generate fstab
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genfstab -U /mnt &amp;gt; /mnt/etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check again carefully after generation. Then proceed to post installation.&lt;/p&gt;
&lt;h2 id="post-installation"&gt;&lt;a href="#post-installation" class="header-anchor"&gt;&lt;/a&gt;Post Installation
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arch-chroot /mnt	
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="set-mirror-for-pacman"&gt;&lt;a href="#set-mirror-for-pacman" class="header-anchor"&gt;&lt;/a&gt;Set mirror for pacman
&lt;/h3&gt;&lt;p&gt;Use reflector or just update &lt;code&gt;/etc/pacman.d/mirrorlist&lt;/code&gt;, then apply changes via &lt;code&gt;pacman -Syy&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="install-bootloader"&gt;&lt;a href="#install-bootloader" class="header-anchor"&gt;&lt;/a&gt;Install bootloader
&lt;/h3&gt;&lt;p&gt;In this article we use grub as the bootloader, since it is one of a few bootloaders has a good support to btrfs.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pacman -S grub efibootmgr os-prober
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grub-install --target&lt;span class="o"&gt;=&lt;/span&gt;x86_64-efi --efi-directory&lt;span class="o"&gt;=&lt;/span&gt;/boot/efi --bootloader-id&lt;span class="o"&gt;=&lt;/span&gt;Arch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;successful results is shown below.&lt;/p&gt;
&lt;p&gt;&lt;img alt="grub install success result" class="gallery-image" data-flex-basis="5461px" data-flex-grow="2275" height="45" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ous50.moe/p/%E5%9C%A8-vmware-%E4%B8%AD%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-btrfs-%E7%9A%84-arch-linux/grubInstallSuccessfulResult.png" srcset="https://blog.ous50.moe/p/%E5%9C%A8-vmware-%E4%B8%AD%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-btrfs-%E7%9A%84-arch-linux/grubInstallSuccessfulResult_hu_f778010c4f0821d.png 800w, https://blog.ous50.moe/p/%E5%9C%A8-vmware-%E4%B8%AD%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8-btrfs-%E7%9A%84-arch-linux/grubInstallSuccessfulResult.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;Then do some optimization. Increase the log level and add &lt;code&gt;nowatchdog&lt;/code&gt; param to accelerate the speed of booting and powering off:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano /etc/default/grub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and edit as below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- GRUB_CMDLINE_LINUX_DEFAULT= &amp;#34;loglevel=5&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ GRUB_CMDLINE_LINUX_DEFAULT= &amp;#34;loglevel=5 nowatchdog&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Save it and then generate new grub config file to apply changes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@archiso /&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# grub—mkconfig —o /boot/grub/grub.cfg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Generating grub configuration file ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Found linux image: /boot/vmlinuz-linux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Found initrd image: /boot/intel—ucode.img /bootzamd—ucode.img /boot/initramfs—linux.img
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Found fal Iback initrd image&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; in /boot :
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;intel—ucode.img amd—ucode.img initramfs—linux—fallback.img
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Warning: os—prober will not be executed to detect other bootable partitions.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Systems on them will not be added to the GRUB boot configuration.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Check documentation entry.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Adding boot menu entry &lt;span class="k"&gt;for&lt;/span&gt; UEFI Firmware Settings ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="set-hostname-and-hosts"&gt;&lt;a href="#set-hostname-and-hosts" class="header-anchor"&gt;&lt;/a&gt;Set hostname and hosts
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;newHostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Your-new-hostname&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$newHostname&lt;/span&gt; &amp;gt; /etc/hostname
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;127.0.0.1 localhost\n&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;::1 localhost\n&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;127.0.1.1 &lt;/span&gt;&lt;span class="nv"&gt;$newHostname&lt;/span&gt;&lt;span class="s2"&gt;.localdomain &lt;/span&gt;&lt;span class="nv"&gt;$newHostname&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/hosts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="set-timezone"&gt;&lt;a href="#set-timezone" class="header-anchor"&gt;&lt;/a&gt;Set Timezone
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -sf /usr/share/zoneinfo/Asia/Hong_Kong /etc/localtime
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=""&gt;&lt;a href="#" class="header-anchor"&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;h3 id="set-locale"&gt;&lt;a href="#set-locale" class="header-anchor"&gt;&lt;/a&gt;Set locale
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano /etc/locale.gen
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and uncomment &lt;code&gt;en-US.UTF-8 UTF-8&lt;/code&gt; and any locale you wanna to use, then generate locale and set en_US locale:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;locale-gen &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;LANG=en_US.UTF-8&amp;#39;&lt;/span&gt; &amp;gt; /etc/locale.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="setting-up-user-accounts"&gt;&lt;a href="#setting-up-user-accounts" class="header-anchor"&gt;&lt;/a&gt;Setting up user accounts
&lt;/h3&gt;&lt;p&gt;First set the root account password:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;passwd root	
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;yourName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;useradd -m &lt;span class="nv"&gt;$yourName&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Set a new password for the user &lt;/span&gt;&lt;span class="nv"&gt;$yourName&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; passwd &lt;span class="nv"&gt;$yourName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="desktop-environment"&gt;&lt;a href="#desktop-environment" class="header-anchor"&gt;&lt;/a&gt;Desktop Environment
&lt;/h3&gt;&lt;p&gt;In this article we install &lt;a class="link" href="https://wiki.archlinux.org/title/KDE" target="_blank" rel="noopener"
 &gt;KDE&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pacman -S plasma plasma-wayland-session egl-wayland kde-{accessibility,graphics,multimedia,network,pim,sdk,system,utilities}-meta
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="vmware-tools"&gt;&lt;a href="#vmware-tools" class="header-anchor"&gt;&lt;/a&gt;VMware Tools
&lt;/h3&gt;&lt;p&gt;Arch Linux is not supported in the official VMware Tools. OpenVMTools is commonly used.&lt;/p&gt;
&lt;p&gt;Using Open VM Tools one cannot resize the screeen properly. Here&amp;rsquo;s a solution following to a &lt;a class="link" href="https://www.reddit.com/r/archlinux/comments/b0ona0/vmtools_on_arch_linux_full_screen_or_resizing/" title="vmware tools how-to"
 target="_blank" rel="noopener"
 &gt;reddit post&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -Syu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -S open-vm-tools
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -Su xf86-input-vmmouse xf86-video-vmware mesa gtk2 gtkmm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;needs_root_rights&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/X11/Xwrapper.config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now vmtoolsd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And you are good to go.&lt;/p&gt;
&lt;p&gt;Reference:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.zrlab.org/posts/arch-btrfs" target="_blank" rel="noopener"
 &gt;https://blog.zrlab.org/posts/arch-btrfs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://wiki.archwiki.org" target="_blank" rel="noopener"
 &gt;https://wiki.archwiki.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://ericclose.github.io/Installing-Arch-as-a-guest-with-UEFI-and-GPT.html" target="_blank" rel="noopener"
 &gt;https://ericclose.github.io/Installing-Arch-as-a-guest-with-UEFI-and-GPT.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://arch.icekylin.online/rookie/basic-install.html" target="_blank" rel="noopener"
 &gt;https://arch.icekylin.online/rookie/basic-install.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.reddit.com/r/archlinux/comments/b0ona0/vmtools_on_arch_linux_full_screen_or_resizing/" target="_blank" rel="noopener"
 &gt;https://www.reddit.com/r/archlinux/comments/b0ona0/vmtools_on_arch_linux_full_screen_or_resizing/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>How to make a combined brother printer driver AUR package</title><link>https://blog.ous50.moe/en/p/how-to-make-a-combined-brother-printer-driver-aur-package/</link><pubDate>Tue, 25 Jan 2022 03:46:22 +0000</pubDate><guid>https://blog.ous50.moe/en/p/how-to-make-a-combined-brother-printer-driver-aur-package/</guid><description>&lt;h1 id="how-to-make-a-combined-brother-printer-driver-aur-package"&gt;&lt;a href="#how-to-make-a-combined-brother-printer-driver-aur-package" class="header-anchor"&gt;&lt;/a&gt;How to make a combined brother printer driver AUR package
&lt;/h1&gt;&lt;h2 id="todo"&gt;&lt;a href="#todo" class="header-anchor"&gt;&lt;/a&gt;TODO
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Analyze differences of file trees between the two types&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Analyze differences of the installation processes between the two types&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="intro"&gt;&lt;a href="#intro" class="header-anchor"&gt;&lt;/a&gt;Intro
&lt;/h2&gt;&lt;p&gt;Traditionally, Brother printers&amp;rsquo; drivers are divided with cupswrapper and lpr. The Arch-Wiki &lt;a class="link" href="https://wiki.archlinux.org/title/Packaging_Brother_printer_drivers" target="_blank" rel="noopener"
 &gt;gives the solution on how to package them&lt;/a&gt;. But there&amp;rsquo;s some printers, e.g. DCP-B7500D and HL-L2350DW, have a combined driver with different file tree. This article is to record how I package.&lt;/p&gt;
&lt;h2 id="preparation"&gt;&lt;a href="#preparation" class="header-anchor"&gt;&lt;/a&gt;Preparation
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Arch-Linux PC (of cause)&lt;/li&gt;
&lt;li&gt;.deb or .rpm download link&lt;/li&gt;
&lt;li&gt;Have learn how to make AUR package &lt;a class="link" href="https://wiki.archlinux.org/title/Arch_package_guidelines" target="_blank" rel="noopener"
 &gt;https://wiki.archlinux.org/title/Arch_package_guidelines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="write-pkgbuild"&gt;&lt;a href="#write-pkgbuild" class="header-anchor"&gt;&lt;/a&gt;Write PKGBUILD
&lt;/h2&gt;&lt;p&gt;Usually they have a common version 4.0.0&lt;/p&gt;
&lt;p&gt;Just make your own adaptation to my &lt;a class="link" href="https://aur.archlinux.org/packages/brother-dcpb7500d/" target="_blank" rel="noopener"
 &gt;PKGBUILD&lt;/a&gt; (adapted from &lt;a class="link" href="https://aur.archlinux.org/account/romasch" target="_blank" rel="noopener"
 &gt;Roman Schmocker&lt;/a&gt;&amp;rsquo;s &lt;a class="link" href="https://aur.archlinux.org/packages/brother-hll2350dw/" target="_blank" rel="noopener"
 &gt;brother-hll2350dw package&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Maintainer: ous50&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pkgname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;brother&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dcpb7500d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;printerModel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DCPB7500D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pkgver&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pkgrel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pkgdesc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Printing driver for Brother DCP-B7500 printer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;arch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;i686&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;x86_64&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;armv7l&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/opt/brother/Printers/$printerModel/lpd&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://support.brother.com/g/b/producttop.aspx?c=in&amp;amp;lang=en&amp;amp;prod=dcpb7500d_as_cn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;license&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;EULA&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;base-devel&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;depends&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cups&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ghostscript&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;depends_x86_64&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lib32-glibc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$pkgname.install&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://download.brother.com/welcome/dlf103663/dcpb7500dpdrv-$pkgver-1.i386.deb&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;cupswrapper-license.txt&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="s1"&gt;&amp;#39;lpr-license.txt&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;md5sums&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;c5d5c7febae0eab6254cb7332f4038c0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;97ad0cffd216059e9d1d3121899d8646&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;5e87a3dc0f3e3438c088eda0f3565f0d&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tar&lt;/span&gt; &lt;span class="n"&gt;xf&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;If&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deb&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;must&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;fully&lt;/span&gt; &lt;span class="n"&gt;decompress&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;tested&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rpm&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cp&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$srcdir/opt&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$pkgdir/opt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ln&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/opt/brother/Printers/DCPB7500D/lpd/$CARCH/rawtobr3&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$pkgdir/opt/brother/Printers/DCPB7500D/lpd/rawtobr3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ln&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/opt/brother/Printers/DCPB7500D/lpd/$CARCH/brprintconflsr3&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$pkgdir/opt/brother/Printers/DCPB7500D/lpd/brprintconflsr3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$pkgdir/usr/lib/cups/filter/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ln&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/opt/brother/Printers/DCPB7500D/cupswrapper/lpdwrapper&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$pkgdir/usr/lib/cups/filter/brother_lpdwrapper_DCPB7500D&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$pkgdir/usr/share/cups/model/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ln&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/opt/brother/Printers/DCPB7500D/cupswrapper/brother-DCPB7500D-cups-en.ppd&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$pkgdir/usr/share/cups/model&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Dm644&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$srcdir/opt/brother/Printers/DCPB7500D/LICENSE_ENG.txt&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$pkgdir/usr/share/licenses/$pkgname/LICENSE_ENG.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Dm644&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$srcdir/opt/brother/Printers/DCPB7500D/LICENSE_JPN.txt&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$pkgdir/usr/share/licenses/$pkgname/LICENSE_JPN.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Remember to get &amp;lsquo;cupswrapper-license.txt&amp;rsquo; and &amp;rsquo;lpr-license.txt&amp;rsquo; or just delete them from source&lt;/p&gt;
&lt;p&gt;For better notice of user installation, you could write a xxx.install file to help(in my case the filename is brother-dcpb7500d.install):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;post_install&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;post_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;post_upgrade&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Restart CUPS service to load the new files&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;You can now register your new printer using the web interface at:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; http://localhost:631/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="test-installation-and-upload"&gt;&lt;a href="#test-installation-and-upload" class="header-anchor"&gt;&lt;/a&gt;Test installation and upload
&lt;/h2&gt;&lt;p&gt;After you have saved the PKGBUILD, do a test installation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;makepkg -rcsi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;restart cups.service after installation and go to check if your model has shown in the list:&lt;/p&gt;
&lt;p&gt;&lt;img alt="model-has-shown-in-the-list.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://p.itxe.net/images/2022/01/25/model-has-shown-in-the-list.png"&gt;&lt;/p&gt;
&lt;p&gt;If it&amp;rsquo;s shown, then you could &lt;a class="link" href="https://wiki.archlinux.org/title/AUR_submission_guidelines" target="_blank" rel="noopener"
 &gt;upload it to AUR&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="tips"&gt;&lt;a href="#tips" class="header-anchor"&gt;&lt;/a&gt;Tips:
&lt;/h3&gt;&lt;p&gt;In settings you might see an error like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Failed to search for a recommended driver: &amp;#39;The name org.fedoraproject.Config.Printing was not provided by any .service files&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this case you need to install system-config-printer package:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -S system-config-printer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="thanks"&gt;&lt;a href="#thanks" class="header-anchor"&gt;&lt;/a&gt;Thanks
&lt;/h2&gt;&lt;p&gt;Many thanks to &lt;a class="link" href="https://aur.archlinux.org/account/romasch" target="_blank" rel="noopener"
 &gt;Roman Schmocker&lt;/a&gt;. Without you it would be much harder to finish my AUR package and of course, this blog.&lt;/p&gt;
&lt;p&gt;Thanks Arch-Wiki contributors for good documentations.&lt;/p&gt;</description></item></channel></rss>