mirror of
https://github.com/BBaoVanC/bbaovanc.com.git
synced 2025-07-13 15:17:28 -05:00
Compare commits
25 Commits
update-set
...
86c4b1ea18
Author | SHA1 | Date | |
---|---|---|---|
86c4b1ea18
|
|||
3be325b34d
|
|||
ea27c632b5
|
|||
9e4e72c711
|
|||
80ecf66cbe
|
|||
3d69f686d5
|
|||
7315daf89c
|
|||
e942d3ca4f
|
|||
a899d617be
|
|||
5d8afcca7e
|
|||
5f44c05e57
|
|||
0e67adf41c
|
|||
b4c695aeb4
|
|||
cdfcf3c372
|
|||
6d7dfa6c5d
|
|||
ef8dda9657
|
|||
f6b27235f3
|
|||
1ce61b8260
|
|||
f719cadd1e
|
|||
43d4f47e29
|
|||
510e3e9bf9
|
|||
685a9ed8f4
|
|||
66fac8058f
|
|||
e93871c923
|
|||
07f586e5b0
|
24
.github/workflows/audit.yml
vendored
24
.github/workflows/audit.yml
vendored
@ -2,8 +2,6 @@ name: Audit
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
@ -18,7 +16,7 @@ jobs:
|
||||
|
||||
- name: Checkout (pull_request)
|
||||
if: github.event.pull_request
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 0
|
||||
@ -26,7 +24,7 @@ jobs:
|
||||
|
||||
- name: Checkout (push)
|
||||
if: github.event_name == 'push'
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 0
|
||||
@ -34,10 +32,10 @@ jobs:
|
||||
|
||||
- name: Build previous commit
|
||||
run: |
|
||||
hugo --printI18nWarnings --printPathWarnings --baseURL https://localhost -d old/
|
||||
hugo --buildDrafts --printI18nWarnings --printPathWarnings --baseURL https://localhost -d old/
|
||||
|
||||
- name: Checkout current commit
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 0
|
||||
@ -45,7 +43,7 @@ jobs:
|
||||
|
||||
- name: Build current commit
|
||||
run: |
|
||||
hugo --printI18nWarnings --printPathWarnings --baseURL https://localhost
|
||||
hugo --buildDrafts --printI18nWarnings --printPathWarnings --baseURL https://localhost
|
||||
cp -r public/ new/
|
||||
# copy, so that public/ stays, it will be needed for Caddy to serve
|
||||
|
||||
@ -65,10 +63,10 @@ jobs:
|
||||
DOMAIN: localhost
|
||||
run: |
|
||||
urls="$(./changed-urls.sh)"
|
||||
urls="${urls//'%'/'%25'}"
|
||||
urls="${urls//$'\n'/'%0A'}"
|
||||
urls="${urls//$'\r'/'%0D'}"
|
||||
echo "::set-output name=urls::$urls"
|
||||
echo "urls<<EOM" >> $GITHUB_OUTPUT
|
||||
echo "$urls" >> $GITHUB_OUTPUT
|
||||
echo "EOM" >> $GITHUB_OUTPUT
|
||||
echo -e "CHANGED:\n$urls"
|
||||
|
||||
- name: Install Caddy
|
||||
if: "${{ steps.changed_urls.outputs.urls != '' }}"
|
||||
@ -101,7 +99,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 0
|
||||
@ -116,7 +114,7 @@ jobs:
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
HUGO_MINIFY_TDEWOLFF_HTML_KEEPCOMMENTS=true HUGO_ENABLEMISSINGTRANSLATIONPLACEHOLDERS=true hugo --printI18nWarnings --printPathWarnings
|
||||
HUGO_MINIFY_TDEWOLFF_HTML_KEEPCOMMENTS=true HUGO_ENABLEMISSINGTRANSLATIONPLACEHOLDERS=true hugo --buildDrafts --printI18nWarnings --printPathWarnings
|
||||
|
||||
# For the following steps, see
|
||||
# https://discourse.gohugo.io/t/audit-your-published-site-for-problems/35184
|
||||
|
2
.github/workflows/deploy.yml
vendored
2
.github/workflows/deploy.yml
vendored
@ -14,7 +14,7 @@ jobs:
|
||||
url: https://bbaovanc.com
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 0
|
||||
|
4
.github/workflows/pull_request.yml
vendored
4
.github/workflows/pull_request.yml
vendored
@ -12,7 +12,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 0
|
||||
@ -36,7 +36,7 @@ jobs:
|
||||
extended: true
|
||||
|
||||
- name: Build
|
||||
run: hugo --printI18nWarnings --printPathWarnings --baseURL "https://demo.bbaovanc.com/pull_request/${{ github.event.number }}"
|
||||
run: hugo --printI18nWarnings --printPathWarnings --baseURL "https://demo.bbaovanc.com/pull_request/${{ github.event.number }}" --buildDrafts
|
||||
|
||||
- name: Compress
|
||||
run: |
|
||||
|
@ -46,7 +46,8 @@ a.isso-author:hover,
|
||||
border: none;
|
||||
padding: 2px 4px;
|
||||
border-radius: 5px;
|
||||
font-size: 100%;
|
||||
/* thanks isso.css for setting this to 85% for whatever reason */
|
||||
font-size: 0.75em;
|
||||
}
|
||||
|
||||
.isso-input-wrapper input,
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
title: Using GitHub Actions to audit my website with Google Chrome Lighthouse
|
||||
date: 2022-05-07T00:54:11-05:00
|
||||
lastmod: 2022-05-07T00:54:11-05:00
|
||||
lastmod: 2022-05-08T16:16:02-05:00
|
||||
toc: true
|
||||
comments: true
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
title: Newsletter for my blog posts
|
||||
date: 2022-04-30T01:00:14-05:00
|
||||
lastmod: 2022-04-30T01:00:14-05:00
|
||||
lastmod: 2022-05-23T02:17:47-05:00
|
||||
toc: true
|
||||
comments: true
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
title: Caddy is literally the best webserver
|
||||
date: 2021-11-13T00:43:35-06:00
|
||||
lastmod: 2022-05-02T00:54:43-05:00
|
||||
lastmod: 2023-01-16T20:57:00-06:00
|
||||
toc: true
|
||||
comments: true
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
title: How the "Discord sex" (`s/e/x`) hack works
|
||||
date: 2022-05-11T21:11:17-05:00
|
||||
lastmod: 2022-05-11T21:11:17-05:00
|
||||
lastmod: 2022-09-24T14:56:05-05:00
|
||||
toc: true
|
||||
comments: true
|
||||
|
||||
@ -17,6 +17,10 @@ tags:
|
||||
- discord-tricks
|
||||
- sed
|
||||
|
||||
_build:
|
||||
# won't appear on main Home page, but will in Blog
|
||||
list: local
|
||||
|
||||
# this will be shown for the article in list pages and in the page metadata
|
||||
# it can be either an image or video (this might change in the future, however)
|
||||
resources:
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
title: How to put `(edited)` in the middle of a message in Discord
|
||||
date: 2021-03-25T18:48:34-05:00
|
||||
lastmod: 2022-04-08T23:29:41-05:00
|
||||
lastmod: 2022-12-06T19:59:22-06:00
|
||||
toc: true
|
||||
comments: true
|
||||
|
||||
|
270
content/blog/swapfile-guide/index.md
Normal file
270
content/blog/swapfile-guide/index.md
Normal file
@ -0,0 +1,270 @@
|
||||
---
|
||||
|
||||
title: How to create (or remove) a swapfile on Linux
|
||||
date: 2023-01-23T20:26:18-06:00
|
||||
lastmod: 2023-01-23T20:26:18-06:00
|
||||
toc: true
|
||||
comments: true
|
||||
draft: true
|
||||
|
||||
authors:
|
||||
- bbaovanc
|
||||
|
||||
categories:
|
||||
- guides
|
||||
- linux
|
||||
- tips-and-tricks
|
||||
|
||||
tags:
|
||||
- linux-swap
|
||||
- swapfile
|
||||
|
||||
series:
|
||||
- swapfile-guide
|
||||
|
||||
# this will be shown for the article in list pages and in the page metadata
|
||||
# it can be either an image or video (this might change in the future, however)
|
||||
resources:
|
||||
- name: feature
|
||||
src: something.webp
|
||||
title: Some image (image format can be anything; webp is just an example)
|
||||
|
||||
---
|
||||
|
||||
This is a step-by-step tutorial on how to create or remove a swapfile on a Linux
|
||||
machine, and whether you should create swap space in the first place.
|
||||
|
||||
Also included is the most correct `fstab` entry: most articles get this "wrong"
|
||||
(but it doesn't actually matter).
|
||||
|
||||
<!--more-->
|
||||
|
||||
## Should you use swap?
|
||||
|
||||
A common misconception is that adding swap to your system can reduce
|
||||
performance. However, even if you aren't running out of RAM, it can still be
|
||||
beneficial to add swap.
|
||||
|
||||
See these points according to [an article by Hayden James][always-add-swap]:
|
||||
|
||||
> - Even if there is still available RAM, the Linux Kernel will **move memory
|
||||
> pages that are hardly ever used** into swap space.
|
||||
>
|
||||
> - It’s better to swap out memory pages that have been inactive for a while,
|
||||
> **keeping often-used data in cache**, and this should happen when the server
|
||||
> is most idle, which is the aim of the Kernel.
|
||||
>
|
||||
> - Avoid setting your swap space too large if it will result in prolonging
|
||||
> performance issues, outages, or your response time (without proper
|
||||
> monitoring/alerts).
|
||||
|
||||
[always-add-swap]: https://haydenjames.io/linux-performance-almost-always-add-swap-space/
|
||||
|
||||
### Should you use a swap file or partition?
|
||||
|
||||
Swap partitions should be preferred because swapfiles tend to be slower and
|
||||
slightly more complex to set up, especially if hibernating. A swapfile might be
|
||||
preferred due to its flexibility (ease to resize), but if you use
|
||||
[LVM][lvm-archwiki] then you can easily resize the swap partition anyways.
|
||||
|
||||
[lvm-archwiki]: https://wiki.archlinux.org/title/LVM
|
||||
|
||||
## Tutorial
|
||||
|
||||
{{< include path="include/bashsession.md" markdown=true >}}
|
||||
|
||||
### Step 1: Create the file
|
||||
|
||||
The first step is to allocate the file.
|
||||
|
||||
```bashsession
|
||||
# dd if=/dev/zero of=/swapfile bs=1M count=[size in MiB] status=progress
|
||||
```
|
||||
|
||||
Replace `[size in MiB]` with the size of your swapfile in Mebibytes (MiB). You
|
||||
can use [this online converter](https://www.convertunits.com/from/GiB/to/MiB) to
|
||||
convert from Gibibytes (GiB, often confused with Gigabytes, but that's a
|
||||
misconception for another time) to MiB, which you can put in the command.
|
||||
|
||||
Or you can look at this table for common sizes:
|
||||
|
||||
{{< table >}}
|
||||
| GiB | MiB |
|
||||
|-----|-------------|
|
||||
| 1 | count=1024 |
|
||||
| 2 | count=2048 |
|
||||
| 3 | count=3072 |
|
||||
| 4 | count=4096 |
|
||||
| 8 | count=8192 |
|
||||
| 16 | count=16384 |
|
||||
{{< /table >}}
|
||||
|
||||
If you aren't sure how big your swapfile should be, take a look at [Table 15.1
|
||||
on this Red Hat documentation page][redhat-swap-table]. Remember that if your
|
||||
first swapfile isn't large enough, you can create another one.
|
||||
|
||||
[redhat-swap-table]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-swapspace#tb-recommended-system-swap-space
|
||||
|
||||
On my computer I have 32 GiB of RAM and a 16 GiB swap partition, rather than
|
||||
swapfile, because I can flexibly expand the swap partition using
|
||||
[LVM][lvm-archwiki].
|
||||
|
||||
{{< aside example >}}
|
||||
|
||||
To create a swapfile 4 GiB in size, you would run:
|
||||
|
||||
```bashsession
|
||||
# dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress
|
||||
4096+0 records in
|
||||
4096+0 records out
|
||||
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 0.960183 s, 4.5 GB/s
|
||||
```
|
||||
|
||||
{{< /aside >}}
|
||||
|
||||
### Step 2: Change swapfile permissions
|
||||
|
||||
The swapfile should only be readable by the system (`root` user). Run this
|
||||
command to change it:
|
||||
|
||||
```bashsession
|
||||
# chmod 600 /swapfile
|
||||
```
|
||||
|
||||
### Step 3: Format the swapfile
|
||||
|
||||
Use the `mkswap` command to format the file to be used as swap (basically just
|
||||
add a header to identify it):
|
||||
|
||||
```bashsession
|
||||
# mkswap /swapfile
|
||||
Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
|
||||
no label, UUID=a0b87eca-b951-4344-be2d-020d77cdef48
|
||||
```
|
||||
|
||||
### Step 4: Create an entry in `/etc/fstab`
|
||||
|
||||
An entry needs to be added to `/etc/fstab` for the swapfile to be enabled during
|
||||
bootup. Open `/etc/fstab` in a text editor, and add this line to the end (add
|
||||
spaces to line up with other entries if you want, whitespace is ignored):
|
||||
|
||||
```text
|
||||
/swapfile none swap sw 0 0
|
||||
```
|
||||
|
||||
{{< aside note >}}
|
||||
|
||||
Above, I have filled the "options" field with `sw`. This is actually a result of
|
||||
[cargo culting](https://en.wiktionary.org/wiki/cargo_culting). On Linux, the
|
||||
`sw` option (and the [options specified by the commonly used
|
||||
`defaults`][fstab-defaults-man]) [isn't valid for `swapon` and is
|
||||
ignored][swapon-options-source]. However, the field does need to be filled out
|
||||
with something, so feel free to put something funny (do let me know in the
|
||||
comments if this somehow breaks something though).
|
||||
|
||||
[fstab-defaults-man]: https://man.archlinux.org/man/fstab.5#The_fourth_field_(%3Ci%3Efs_mntops%3C/i%3E).
|
||||
[swapon-options-source]: https://github.com/util-linux/util-linux/blob/2ea397239683270a0fc8cd3b72ed5457f52dbda8/sys-utils/swapon.c#L699
|
||||
|
||||
If you're curious, this is my `fstab` entry (`UUID` is because I use a swap
|
||||
partition, rather than swapfile):
|
||||
|
||||
```text
|
||||
# /dev/mapper/bobavg0-swap
|
||||
UUID=4f7c3ae8-839b-4474-b8a5-96bd78db06f8 none swap bobaswap 0 0
|
||||
```
|
||||
|
||||
{{< /aside >}}
|
||||
|
||||
### Step 5: Enable the swapfile
|
||||
|
||||
Adding the `fstab` entry won't enable the swapfile until a reboot. To enable it
|
||||
now, use the `swapon` command.
|
||||
|
||||
```bashsession
|
||||
# swapon /swapfile
|
||||
```
|
||||
|
||||
### Finally: check the swap status
|
||||
|
||||
Use `swapon` and `free` to verify that your new swapfile has been added:
|
||||
|
||||
```bashsession
|
||||
$ swapon --show
|
||||
NAME TYPE SIZE USED PRIO
|
||||
/swapfile file 4G 0B -2
|
||||
|
||||
$ free -h
|
||||
total used free shared buff/cache available
|
||||
Mem: 31Gi 3.6Gi 20Gi 233Mi 6.9Gi 26Gi
|
||||
Swap: 4.0Gi 0B 4.0Gi
|
||||
```
|
||||
|
||||
{{< aside note >}}
|
||||
|
||||
If you get an error saying that the `swapon` command was not found, try running
|
||||
it as `root` (using `sudo`). On Debian-based distributions the `swapon` command
|
||||
is not available to regular users.
|
||||
|
||||
```bashsession
|
||||
$ swapon --show
|
||||
bash: swapon: command not found
|
||||
|
||||
# swapon --show
|
||||
NAME TYPE SIZE USED PRIO
|
||||
/swapfile file 4G 0B -2
|
||||
```
|
||||
|
||||
{{< /aside >}}
|
||||
|
||||
## Removing a swapfile
|
||||
|
||||
{{< aside warning >}}
|
||||
|
||||
Be careful that the swapfile isn't being highly used because once you run
|
||||
`swapoff`, it will dump the entire contents back into RAM and may cause you to
|
||||
run out of memory.
|
||||
|
||||
{{< /aside >}}
|
||||
|
||||
### Step 1: Disable/unload the swapfile
|
||||
|
||||
```bashsession
|
||||
$ swapon --show
|
||||
NAME TYPE SIZE USED PRIO
|
||||
/swapfile file 4G 0B -2
|
||||
|
||||
$ # the path to the swapfile I want to remove is `/swapfile`
|
||||
|
||||
# swapoff /swapfile
|
||||
```
|
||||
|
||||
### Step 2: Remove the entry from `fstab`
|
||||
|
||||
Open `/etc/fstab` in a text editor and find the line matching the swapfile you
|
||||
want to remove, and delete it. For example:
|
||||
|
||||
```text
|
||||
/swapfile none swap sw 0 0
|
||||
```
|
||||
|
||||
### Step 3: Delete the actual file
|
||||
|
||||
```bashsession
|
||||
# rm /swapfile
|
||||
```
|
||||
|
||||
## References
|
||||
|
||||
### Use `dd` instead of `fallocate`
|
||||
|
||||
See ["Files with holes" under the man page][swapon-holes-man].
|
||||
|
||||
[swapon-holes-man]: https://man.archlinux.org/man/core/util-linux/swapon.8.en#Files_with_holes
|
||||
|
||||
### The options field in fstab
|
||||
|
||||
On Linux, `sw` doesn't mean anything for `swapon`, so it gets ignored. See:
|
||||
|
||||
- [StackExchange answer 1](https://unix.stackexchange.com/a/365961/525130)
|
||||
- [StackExchange answer 2](https://unix.stackexchange.com/a/365954/525130)
|
||||
- [`parse_options` in the `swapon` source code](https://github.com/util-linux/util-linux/blob/2ea397239683270a0fc8cd3b72ed5457f52dbda8/sys-utils/swapon.c#L699)
|
@ -2,6 +2,7 @@
|
||||
|
||||
title: Text substitution in Discord using `sed`
|
||||
date: 2021-03-25T18:48:15-05:00
|
||||
lastmod: 2021-10-19T14:02:08-05:00
|
||||
toc: false
|
||||
comments: true
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
title: Youtube URL structures you should know
|
||||
date: 2021-10-30T21:20:38-05:00
|
||||
lastmod: 2022-05-02T00:59:25-05:00
|
||||
lastmod: 2023-01-16T21:04:09-06:00
|
||||
toc: true
|
||||
comments: true
|
||||
|
||||
|
10
content/series/swapfile-guide/_index.md
Normal file
10
content/series/swapfile-guide/_index.md
Normal file
@ -0,0 +1,10 @@
|
||||
---
|
||||
|
||||
title: Swapfile Guide
|
||||
|
||||
---
|
||||
|
||||
A tutorial on how to set up a swapfile on Linux, but with some more depth than
|
||||
just a step-by-step.
|
||||
|
||||
<!--more-->
|
13
content/tags/linux-swap/_index.md
Normal file
13
content/tags/linux-swap/_index.md
Normal file
@ -0,0 +1,13 @@
|
||||
---
|
||||
|
||||
title: Swap (Linux)
|
||||
|
||||
---
|
||||
|
||||
Swap space is storage on your drive that can be used as virtual memory when the
|
||||
system is running low on physical memory (RAM). It is also used when hibernating
|
||||
(suspend to disk).
|
||||
|
||||
More information: https://haydenjames.io/linux-performance-almost-always-add-swap-space/
|
||||
|
||||
<!--more-->
|
11
content/tags/swapfile/_index.md
Normal file
11
content/tags/swapfile/_index.md
Normal file
@ -0,0 +1,11 @@
|
||||
---
|
||||
|
||||
title: swapfile
|
||||
|
||||
---
|
||||
|
||||
A swapfile is a file that gives your system more [swap]({{< relref
|
||||
"../linux-swap" >}}) space, which is used when the system is running low on RAM,
|
||||
or when hibernating.
|
||||
|
||||
<!--more-->
|
32
include/bashsession.md
Normal file
32
include/bashsession.md
Normal file
@ -0,0 +1,32 @@
|
||||
{{< aside info >}}
|
||||
|
||||
Commands in this article are prefixed them with a prompt symbol (either `$` or
|
||||
`#`) which is not part of the command. Lines with no prompt symbol are output
|
||||
from the command.
|
||||
|
||||
The `#` means to run it as `root` (usually using `sudo`):
|
||||
|
||||
```bashsession
|
||||
$ ls /var/lib/docker
|
||||
ls: cannot open directory '/var/lib/docker': Permission denied
|
||||
|
||||
$ # this is a comment
|
||||
$ # regular users aren't allowed to view /var/lib/docker, we need root
|
||||
|
||||
# ls /var/lib/docker
|
||||
builder containerd image overlay2 runtimes tmp volumes
|
||||
buildkit containers network plugins swarm trust
|
||||
|
||||
$ # we can do the same thing using sudo
|
||||
|
||||
$ sudo ls /var/lib/docker
|
||||
[sudo] password for bbaovanc:
|
||||
builder containerd image overlay2 runtimes tmp volumes
|
||||
buildkit containers network plugins swarm trust
|
||||
```
|
||||
|
||||
If you want to copy just the commands (for example: pasting them into your own
|
||||
terminal to run them all), press the [Copy](javascript:void(0)) button in the top right of the code
|
||||
block.
|
||||
|
||||
{{< /aside >}}
|
@ -2,3 +2,5 @@
|
||||
<script defer data-domain="bbaovanc.com" src="https://plausible.bbaovanc.com/js/bobalytics.outbound-links.js"></script>
|
||||
<script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
|
||||
{{ end }}
|
||||
|
||||
<link rel="me" href="https://procursus.social/@bbaovanc" />
|
||||
|
Submodule themes/bobatheme updated: 60ed1c0264...7bc8a4cb57
Reference in New Issue
Block a user