Initial commit
This commit is contained in:
commit
06eb6898c7
|
@ -0,0 +1,3 @@
|
|||
[submodule "themes/ananke"]
|
||||
path = themes/ananke
|
||||
url = https://github.com/theNewDynamic/gohugo-theme-ananke
|
|
@ -0,0 +1,18 @@
|
|||
title: 'Digital Studium'
|
||||
theme: 'ds'
|
||||
|
||||
defaultContentLanguageInSubdir: true
|
||||
|
||||
languages:
|
||||
en:
|
||||
contentDir: content/en
|
||||
languageName: English
|
||||
params:
|
||||
author: Konstantin Shutkin
|
||||
description: Blog about Linux, DevOps, programming and cloud technologies
|
||||
ru:
|
||||
contentDir: content/ru
|
||||
languageName: Русский
|
||||
params:
|
||||
author: Константин Шуткин
|
||||
description: Блог о Linux, DevOps, программировании и облачных технологиях
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "About author"
|
||||
date: "2023-02-18"
|
||||
---
|
||||
|
||||
{{< figure src="/images/kostya.jpg" width="100px" class="floatleft alignleft" >}}
|
||||
My name is Konstantin Shutkin, I am from Moscow, Russia and I am a DevOps engineer. Since 2016, I have worked in this position in companies such as Severstal, Sberbank, Nvidia. My main subject of research and work is Linux, Docker, Kubernetes, Python programming and more. I share my knowledge on this blog.
|
||||
|
||||
My Github: https://github.com/digitalstudium
|
||||
|
||||
My email: konstantin@shootkin.ru
|
|
@ -0,0 +1,107 @@
|
|||
---
|
||||
title: "Linux: How to create LVM logical volume"
|
||||
date: "2022-05-15"
|
||||
---
|
||||
### First step: creating a physical volume
|
||||
After you have attached the disk to a physical server or virtual machine, you need to type
|
||||
this command:
|
||||
```bash
|
||||
sudo fdisk -l
|
||||
```
|
||||
<!--more-->
|
||||
to make sure the drive is recognized by the operating system, and to identify the drive name. Output
|
||||
of command will be something like this:
|
||||
```plaintext
|
||||
Disk /dev/vdb: 10 GiB, 10737418240 bytes, 20971520 sectors
|
||||
Units: sectors of 1 * 512 = 512 bytes
|
||||
Sector size (logical/physical): 512 bytes/512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes/512 bytes
|
||||
```
|
||||
Once you have identified the drive name (in our case it is `/dev/vdb`), you can create
|
||||
physical volume using the command:
|
||||
```bash
|
||||
sudo pvcreate /dev/vdb
|
||||
```
|
||||
You will see output like this:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo pvcreate /dev/vdb
|
||||
Physical volume "/dev/vdb" successfully created.
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
### Step two: create the volume group
|
||||
Now we need to create a volume group. This is done by the following command:
|
||||
```bash
|
||||
sudo vgcreate {vgname} {pvname}
|
||||
```
|
||||
In our case, the command will look like this:
|
||||
```bash
|
||||
sudo vgcreate vg-example /dev/vdb
|
||||
```
|
||||
The command output will look like this:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo vgcreate vg-example/dev/vdb
|
||||
Volume group "vg-example" successfully created
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
### Step three: creating the logical volume
|
||||
Creating a logical volume can be done with the following command:
|
||||
```bash
|
||||
sudo lvcreate --size {size} --name {lv-name} {vg-name}
|
||||
```
|
||||
In our case, it will be:
|
||||
```bash
|
||||
sudo lvcreate --size 5G --name lv-example vg-example
|
||||
```
|
||||
You will see output like this:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo lvcreate --size 5G --name lv-example vg-example
|
||||
Logical volume "lv-example" created.
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
If you want the logical volume to use all the free space in the volume group, then run the command:
|
||||
```bash
|
||||
sudo lvcreate --extents 100%FREE --name lv-example vg-example
|
||||
```
|
||||
### Fourth step: creating the filesystem
|
||||
To create an xfs filesystem, type the command:
|
||||
```bash
|
||||
sudo mkfs.xfs /dev/vg-example/lv-example
|
||||
```
|
||||
The command output will look like this:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo mkfs.xfs/dev/vg-example/lv-example
|
||||
meta-data =/dev/vg-example/lv-example isize = 512 agcount = 4, agsize = 327680 blks
|
||||
= sectsz = 512 attr = 2, projid32bit = 1
|
||||
= crc = 1 finobt = 1, sparse = 1, rmapbt = 0
|
||||
= reflink = 1 bigtime = 0
|
||||
data = bsize = 4096 blocks = 1310720, imaxpct = 25
|
||||
= sunit = 0 swidth = 0 blks
|
||||
naming = version 2 bsize = 4096 ascii-ci = 0, ftype = 1
|
||||
log = internal log bsize = 4096 blocks = 2560, version = 2
|
||||
= sectsz = 512 sunit = 0 blks, lazy-count = 1
|
||||
realtime = none extsz = 4096 blocks = 0, rtextents = 0
|
||||
Discarding blocks ... Done.
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
To create an ext4 filesystem, replace the `mkfs.xfs` command with `mkfs.ext4`
|
||||
### Step Five: Mount the Logical Volume
|
||||
For example, suppose you want to mount the newly created logical volume to the `/opt` folder. In this
|
||||
case, add this line to file `/etc/fstab`:
|
||||
```bash
|
||||
/dev/vg-example/lv-example /opt xfs defaults 0 1
|
||||
```
|
||||
After that, type the command:
|
||||
```bash
|
||||
sudo mount -a
|
||||
```
|
||||
You can verify that the logical volume has been mounted successfully using the command:
|
||||
```bash
|
||||
df -h /opt
|
||||
```
|
||||
The output should be like this:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ df -h /opt/
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
/dev/mapper/vg--random-lv--random 5.0G 68M 5.0G 2% /opt
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
|
@ -0,0 +1,84 @@
|
|||
---
|
||||
title: "Linux: How to extend LVM volume"
|
||||
date: "2022-05-15"
|
||||
---
|
||||
### Situation 1: new disk
|
||||
#### First step: creating a physical volume
|
||||
After you have attached the disk to a physical server or virtual machine, you need to type command:
|
||||
```bash
|
||||
sudo fdisk -l
|
||||
```
|
||||
<!--more-->
|
||||
This is to make sure the drive is recognized by the operating system, and to identify the drive name. Output of the command will be something like this:
|
||||
```plaintext
|
||||
Disk /dev/vdc: 5 GiB, 5368709120 bytes, 10485760 sectors
|
||||
Units: sectors of 1 * 512 = 512 bytes
|
||||
Sector size (logical/physical): 512 bytes/512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes/512 bytes
|
||||
```
|
||||
Once you have identified the drive name (in our case it is `/dev/vdc`), you can create physical volume using the command:
|
||||
```bash
|
||||
sudo pvcreate /dev/vdc
|
||||
```
|
||||
You will see output like this:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo pvcreate /dev/vdc
|
||||
Physical volume "/dev/vdc" successfully created.
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
#### Step two: extend the volume group
|
||||
You can now extend the volume group. This is done by the following command:
|
||||
```bash
|
||||
sudo vgextend {vg-name} {pv-name}
|
||||
```
|
||||
In our case, it will be:
|
||||
```bash
|
||||
sudo vgextend vg-example /dev/vdc
|
||||
```
|
||||
You will see output like this:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo vgextend vg-example /dev/vdc
|
||||
Physical volume "/dev/vdc" successfully created.
|
||||
Volume group "vg-example" successfully extended
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
#### Step three: extending the logical volume
|
||||
Extending a logical volume can be done with the following command:
|
||||
```bash
|
||||
sudo lvextend --size + {size} {vg-name/lv-name}
|
||||
```
|
||||
In our case, it will be:
|
||||
```bash
|
||||
sudo lvextend --size +2G vg-example/lv-example
|
||||
```
|
||||
You will see output like this:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo lvextend --size +2G vg-example/lv-example
|
||||
Size of logical volume vg-example/lv-example changed from 5.00 GiB (1280 extents) to 7.00 GiB (1792 extents).
|
||||
Logical volume vg-example/lv-example successfully resized.
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
If you want the logical volume to use all the free space in the volume group, then type
|
||||
command:
|
||||
```bash
|
||||
sudo lvextend --extents +100%FREE vg-example/lv-example
|
||||
```
|
||||
#### Fourth step: extending the file system
|
||||
If you have xfs file system, then the extending can be done with the following command:
|
||||
```bash
|
||||
sudo xfs_growfs /dev/{vg-name}/{lv-name}
|
||||
```
|
||||
In our case, it will be:
|
||||
```bash
|
||||
sudo xfs_growfs /dev/vg-example/lv-example
|
||||
```
|
||||
For ext4 filesystem, replace `xfs_growfs` with `resize2fs`
|
||||
### Situation 2: if the size of the existing disk has changed
|
||||
Sometimes the size of an existing disk can change, for example, in case of a virtual machine. In this case, the first step will be different, the second step will not be performed, and the rest of the steps will be pretty the same as in the situation with a new disc described above. The first step is not to create a physical volume, but to resize the existing one. It can be done with the command:
|
||||
```bash
|
||||
sudo pvresize /dev/DISKNAME
|
||||
```
|
||||
For example,
|
||||
```bash
|
||||
sudo pvresize /dev/vdc
|
||||
```
|
|
@ -0,0 +1,60 @@
|
|||
---
|
||||
title: "Linux: how to limit /var/log folder size"
|
||||
date: "2022-06-16"
|
||||
---
|
||||
|
||||
Sometimes the `/var/log` folder grows so large that it causes a shortage of disk space. How to limit the size of this folder? By following the two steps in this article, you can control the size of the `/var/log` folder.<!--more-->
|
||||
### Step 1. Limiting the size of journald logs
|
||||
The logs of all systemd services are added to the `/var/log/journal/` folder by the `journald` service. To set the size limit for this folder, run the following commands:
|
||||
```bash
|
||||
sudo bash -c 'echo "SystemMaxUse=100M" >> /etc/systemd/journald.conf'
|
||||
sudo systemctl restart systemd-journald
|
||||
```
|
||||
Instead of the `100M` size, you can specify any other size, in `K, M, G, T` units. After the above commands, you can verify that the size of the folder `/var/log` has become the specified size using the command:
|
||||
```bash
|
||||
du -sh /var/log/journal/
|
||||
```
|
||||
### Step 2. Limiting the number of log files stored by logrotate
|
||||
Logrotate rotates almost all log files in the `/var/log` folder every day. For example, if I type the command `ls /var/log/kern*`, then I will see that in addition to the file `/var/log/kern.log` I have 4 more files stored that logrotate saved:
|
||||
```bash
|
||||
ls /var/log/kern*
|
||||
```
|
||||
```plaintext
|
||||
/var/log/kern.log /var/log/kern.log.2.gz /var/log/kern.log.4.gz
|
||||
/var/log/kern.log.1 /var/log/kern.log.3.gz
|
||||
```
|
||||
|
||||
To limit the number of log files, edit the file `/etc/logrotate.d/rsyslog`. Looking at the contents of the `/etc/logrotate.d/rsyslog` file, we can see that the default value of the `rotate` parameter is `4`:
|
||||
```bash
|
||||
cat /etc/logrotate.d/rsyslog
|
||||
```
|
||||
```plaintext
|
||||
/var/log/syslog
|
||||
/var/log/mail.info
|
||||
/var/log/mail.warn
|
||||
/var/log/mail.err
|
||||
/var/log/mail.log
|
||||
/var/log/daemon.log
|
||||
/var/log/kern.log
|
||||
/var/log/auth.log
|
||||
/var/log/user.log
|
||||
/var/log/lpr.log
|
||||
/var/log/cron.log
|
||||
/var/log/debug
|
||||
/var/log/messages
|
||||
{
|
||||
rotate 4
|
||||
weekly
|
||||
missingok
|
||||
notifempty
|
||||
compress
|
||||
delaycompress
|
||||
sharedscripts
|
||||
postrotate
|
||||
/usr/lib/rsyslog/rsyslog-rotate
|
||||
endscript
|
||||
}
|
||||
```
|
||||
You can change `4` to some other value, such as `1`, so that only one file is stored. In the `/etc/logrotate.d/` folder you will also find many other configuration files related to other log files, where you can also change the `rotate` setting.
|
||||
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
---
|
||||
title: "Linux: How to set up monitoring with alerts to Telegram"
|
||||
date: "2023-03-04"
|
||||
---
|
||||
This article describes how to set up monitoring with alerts to Telegram using Grafana, Prometheus, Alertmanager, Node-exporter and Cadvisor.
|
||||
### First step: Cloning the repository
|
||||
Log in to the server or go to local terminal and run the following commands:
|
||||
```bash
|
||||
git clone https://github.com/digitalstudium/grafana-docker-stack.git
|
||||
cd grafana-docker-stack
|
||||
git checkout alertmanager
|
||||
```
|
||||
<!--more-->
|
||||
### Second step: setting the external address of the server
|
||||
Open the `docker-compose.yml` file and on lines 22 and 38 change the address `127.0.0.1` to the address of the server where you want to install Prometheus.
|
||||
### Third step: creating a bot in Telegram
|
||||
In the Telegram search, type `Botfather` and follow the first link:
|
||||
|
||||
![Botfather search](/images/botfather1.png "Botfather search")
|
||||
|
||||
Then press `Start`:
|
||||
|
||||
![Botfather start](/images/botfather2.png "Botfather start")
|
||||
|
||||
After that, create a bot using the `Botfather` instructions.
|
||||
As a result, you should receive a message with an API token:
|
||||
|
||||
![Botfather API token](/images/botfather3.png "Botfather API token")
|
||||
|
||||
Copy this token and paste it on line 14 of the `configs/alertmanager.yml` file as the value of the `bot_token` parameter.
|
||||
|
||||
Then create a telegram group and add the created bot to this group. This group will receive notifications (alerts).
|
||||
|
||||
### Fourth step: Get the group id
|
||||
In the group you added the bot to, write some command, for example: `/my_id foobar`
|
||||
|
||||
Then in the browser follow the link
|
||||
`https://api.telegram.org/botINSERT_BOT_TOKEN_HERE/getUpdates` replacing `INSERT_BOT_TOKEN_HERE` with the token created in step 3.
|
||||
You should get something like this page:
|
||||
|
||||
![Telegram getting chat id](/images/chat_id.png "Telegram getting chat id")
|
||||
If there is nothing on your page, try sending the command `/my_id foobar` to the group again.
|
||||
|
||||
You need to copy the chat id value from this page and paste it on line 15 of the `configs/alertmanager.yml` file as the value of the `chat_id` parameter. Note that the value of the `chat_id` parameter must be without quotes and with a hyphen at the beginning.
|
||||
|
||||
### Fifth step: Deploying the docker stack
|
||||
While in the `grafana-docker-stack` folder, run the following commands:
|
||||
```bash
|
||||
docker swarm init
|
||||
docker stack deploy -c docker-compose.yml monitoring
|
||||
```
|
||||
Wait 5-10 minutes then run the command
|
||||
```bash
|
||||
docker ps
|
||||
```
|
||||
|
||||
The command output should contain 5 containers: prometheus, grafana, alertmanager, node-exporter, grafana.
|
||||
```plaintext
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
46fba26e7234 gcr.io/cadvisor/cadvisor:v0.47.0 "/usr/bin/cadvisor -…" 5 days ago Up 5 days (healthy) 8080/tcp monitoring_cadvisor.1.q02qcn798dh0rydo1dzslylse
|
||||
f212e3c66786 prom/alertmanager:v0.25.0 "/bin/alertmanager -…" 6 days ago Up 6 days 9093/tcp monitoring_alertmanager.1.oysziztrqnur7xr0hr82avunz
|
||||
c16fb14929e2 prom/prometheus:v2.42.0 "/bin/prometheus --c…" 6 days ago Up 6 days 9090/tcp monitoring_prometheus.1.yslspi4fgjp7ic4f5e18gm99a
|
||||
9bf01ce6b7a1 grafana/grafana:9.3.6-ubuntu "/run.sh" 6 days ago Up 6 days 3000/tcp monitoring_grafana.1.mypn85x12xw37ucprr33knuwk
|
||||
58efdb46f5c3 kindest/node:v1.25.3 "/usr/local/bin/entr…" 6 days ago Up 6 days 127.0.0.1:46579->6443/tcp kind-control-plane
|
||||
ae15e453e517 prom/node-exporter:v1.5.0 "/bin/node_exporter …" 7 days ago Up 7 days 9100/tcp monitoring_node-exporter.1.uecim10ow12h1qlpox5lg0c5r
|
||||
```
|
||||
If you see this output, then everything turned out successfully. If not, try repeating all previous steps.
|
||||
|
||||
### Sixth step: Check if it works
|
||||
|
||||
Go to [server ip-address or domain name]:3000
|
||||
You should get Grafana opened. Enter login `admin` and password `admin`. Grafana will ask you to change your password, change it to any other.
|
||||
Under Dashboard -> Browse -> General you will see 2 dashboards: Cadvisor exporter and Node Exporter Full. Open them and make sure everything works.
|
||||
|
||||
## Summary
|
||||
Now you can evaluate server performance through Grafana graphs.
|
||||
You will also receive alerts about problems with the server in the Telegram group. Alert rules can be configured in `configs/prometheus/alert_rules.yml`
|
|
@ -0,0 +1,69 @@
|
|||
---
|
||||
title: "Python: How to load multiple web pages in parallel"
|
||||
date: "2022-05-15"
|
||||
---
|
||||
First you need to install an aiohttp package. To install aiohttp run the command:
|
||||
```bash
|
||||
pip install aiohttp[speedups]
|
||||
```<!--more-->
|
||||
The `[speedups]` suffix is needed to install aiohttp accelerating packages - aiodns and cchardet. Then create a main.py file with this code:
|
||||
```python
|
||||
import aiohttp
|
||||
import asyncio
|
||||
import socket
|
||||
|
||||
|
||||
async def fetch_urls(urls):
|
||||
resolver = aiohttp.AsyncResolver()
|
||||
connector = aiohttp.TCPConnector(resolver=resolver, family=socket.AF_INET, use_dns_cache=False)
|
||||
session = aiohttp.ClientSession(connector=connector)
|
||||
|
||||
async def fetch_url(url, session):
|
||||
async with session.get(url) as resp:
|
||||
print(resp.status)
|
||||
print(await resp.text())
|
||||
|
||||
tasks = [fetch_url(url, session) for url in urls]
|
||||
await asyncio.gather(*tasks)
|
||||
await session.close()
|
||||
|
||||
|
||||
loop = asyncio.get_event_loop()
|
||||
|
||||
urls = ['http://httpbin.org/get?key=value1', 'http://httpbin.org/get?key=value2', 'http://httpbin.org/get?key=value3']
|
||||
|
||||
loop.run_until_complete(fetch_urls(urls))
|
||||
|
||||
```
|
||||
Now you can run main.py file with the command:
|
||||
```bash
|
||||
python3 main.py
|
||||
```
|
||||
You will see this output:
|
||||
```plaintext
|
||||
200
|
||||
{
|
||||
"args": {
|
||||
"key": "value2"
|
||||
},
|
||||
"headers": {
|
||||
"Accept": "*/*",
|
||||
"Accept-Encoding": "gzip, deflate",
|
||||
...
|
||||
|
||||
```
|
||||
All three queries will be executed in parallel. You can add any urls to the `urls` list, for example:
|
||||
```python
|
||||
urls = ['https://yandex.com', 'https://google.com', 'https://yahoo.com']
|
||||
```
|
||||
|
||||
In order to make HEAD, POST, PUT, DELETE requests, just replace `session.get(url)` in your code with the appropriate method:
|
||||
```python
|
||||
session.post('http://httpbin.org/post', data=b'data')
|
||||
session.put('http://httpbin.org/put', data=b'data')
|
||||
session.delete('http://httpbin.org/delete')
|
||||
session.head('http://httpbin.org/get')
|
||||
session.options('http://httpbin.org/get')
|
||||
session.patch('http://httpbin.org/patch', data=b'data')
|
||||
|
||||
```
|
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
title: "Ubuntu: How to upgrade kernel"
|
||||
date: "2022-05-14"
|
||||
---
|
||||
### First method
|
||||
The first method is very simple. We need to enter only one command in the terminal:
|
||||
```bash
|
||||
sudo apt update && sudo apt -y upgrade
|
||||
```<!--more-->
|
||||
The `sudo apt update` command will update the repository cache, and the `sudo apt -y upgrade` command will install new versions of all installed programs, including the linux kernel. The advantage of this method is that the latest version of the linux kernel, <i>officially supported</i> by Ubuntu OS, will be installed. The disadvantage of this method is that the <i>officially supported</i> kernel is usually not the newest. Sometimes it happens that it is necessary to install the latest version of the linux kernel. Real world example: your new laptop may have a CPU which is only supported in linux kernel version 5.12, while the officially supported version is older. And here the second method comes to the rescue.
|
||||
### Second method
|
||||
The first step is to go to https://kernel.ubuntu.com/~kernel-ppa/mainline/. On this site, you need to select the folder with the latest version of the linux kernel (at the very bottom of the page). Note that it is recommended to select the version without the "rc" suffix. The "rc" suffix means "release candidate", which in turn means that the given kernel version is not stable. On the page that opens, select the folder with the architecture of your processor. The architecture can be found using the `uname -p` command. If the output of this command is "x86_64", then select the amd64 folder. On the opened page there will be links to .deb files. We need to download 4 of them:
|
||||
```plaintext
|
||||
linux-headers-{version}-generic_{version}.{date}_amd64.deb
|
||||
linux-headers-{version}_{version}.{date}_all.deb
|
||||
linux-image-unsigned-{version}-generic_{version}.{date}_amd64.deb
|
||||
linux-modules-{version}-generic_{version}.{date}_amd64.deb
|
||||
```
|
||||
After you have downloaded the files, you need to install them using the command:
|
||||
```bash
|
||||
sudo apt install -y ~/Downloads/linux-*.deb
|
||||
```
|
||||
Installation will take 1-5 minutes. After restarting the computer, the installed kernel version will be loaded.
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: "Об авторе"
|
||||
date: "2023-02-18"
|
||||
---
|
||||
{{< figure src="/images/kostya.jpg" width="100px" class="floatleft alignleft" >}}
|
||||
Меня зовут Константин Шуткин, я живу в городе Москва и я DevOps-инженер. С 2016 года я работал на этой должности в таких компаниях, как Северсталь, Сбербанк, Nvidia. Мой основной предмет исследований и работы это Linux, Docker, Kubernetes, программирование на Python и т. д., и я делюсь своими знаниями в этих областях на этом сайте и на ютуб канале.
|
||||
|
||||
Мой youtube канал: https://youtube.com/DigitalStudium
|
||||
|
||||
Мой Github: https://github.com/digitalstudium
|
||||
|
||||
Мой email: konstantin@shootkin.ru
|
|
@ -0,0 +1,107 @@
|
|||
---
|
||||
title: "Linux: Как создать логический том LVM"
|
||||
date: "2022-05-15"
|
||||
---
|
||||
### Первый шаг: создание физического тома
|
||||
После того, как вы присоединили диск к физическому серверу или к виртуальной машине, вам нужно набрать
|
||||
команду:
|
||||
```bash
|
||||
sudo fdisk -l
|
||||
```
|
||||
<!--more-->
|
||||
чтобы убедиться, что диск распознан операционной системой, а также чтобы идентифицировать имя диска. Вывод
|
||||
команды будет примерно такой:
|
||||
```plaintext
|
||||
Disk /dev/vdb: 10 GiB, 10737418240 bytes, 20971520 sectors
|
||||
Units: sectors of 1 * 512 = 512 bytes
|
||||
Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes / 512 bytes
|
||||
```
|
||||
После того, как вы идентифицировали имя диска (в нашем случае это `/dev/vdb`), вы можете создать
|
||||
физический том с помощью команды:
|
||||
```bash
|
||||
sudo pvcreate /dev/vdb
|
||||
```
|
||||
Вы увидите такой вывод:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo pvcreate /dev/vdb
|
||||
Physical volume "/dev/vdb" successfully created.
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
### Второй шаг: создание группы томов
|
||||
Теперь нужно создать группу томов. Делается это такой командой:
|
||||
```bash
|
||||
sudo vgcreate {vgname} {pvname}
|
||||
```
|
||||
в нашем случае команда будет выглядеть так:
|
||||
```bash
|
||||
sudo vgcreate vg-example /dev/vdb
|
||||
```
|
||||
Вывод команды будет такой:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo vgcreate vg-example /dev/vdb
|
||||
Volume group "vg-example" successfully created
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
### Третий шаг: создание логического тома
|
||||
Создание логического тома делается такой командой:
|
||||
```bash
|
||||
sudo lvcreate --size {size} --name {lv-name} {vg-name}
|
||||
```
|
||||
В нашем случае это будет:
|
||||
```bash
|
||||
sudo lvcreate --size 5G --name lv-example vg-example
|
||||
```
|
||||
Вы увидите такой вывод:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo lvcreate --size 5G --name lv-example vg-example
|
||||
Logical volume "lv-example" created.
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
Если же вы хотите, чтобы логичекий том использовал всё свободное место в группе томов, то наберите команду:
|
||||
```bash
|
||||
sudo lvcreate --extents 100%FREE --name lv-example vg-example
|
||||
```
|
||||
### Четвёртый шаг: создание файловой системы
|
||||
Чтобы создать файловую систему xfs, наберите команду:
|
||||
```bash
|
||||
sudo mkfs.xfs /dev/vg-example/lv-example
|
||||
```
|
||||
Вывод команды будет такой:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo mkfs.xfs /dev/vg-example/lv-example
|
||||
meta-data=/dev/vg-example/lv-example isize=512 agcount=4, agsize=327680 blks
|
||||
= sectsz=512 attr=2, projid32bit=1
|
||||
= crc=1 finobt=1, sparse=1, rmapbt=0
|
||||
= reflink=1 bigtime=0
|
||||
data = bsize=4096 blocks=1310720, imaxpct=25
|
||||
= sunit=0 swidth=0 blks
|
||||
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
|
||||
log =internal log bsize=4096 blocks=2560, version=2
|
||||
= sectsz=512 sunit=0 blks, lazy-count=1
|
||||
realtime =none extsz=4096 blocks=0, rtextents=0
|
||||
Discarding blocks...Done.
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
Для создания файловой системы ext4 замените команду mkfs.xfs на mkfs.ext4
|
||||
### Пятый шаг: монтирование логического тома
|
||||
Например, вы хотите смонтировать созданный логический том в папку `/opt`. В таком случае, добавьте такую
|
||||
строку в файл `/etc/fstab`:
|
||||
```bash
|
||||
/dev/vg-example/lv-example /opt xfs defaults 0 1
|
||||
```
|
||||
После этого наберите команду:
|
||||
```bash
|
||||
sudo mount -a
|
||||
```
|
||||
Убедиться в том, что логический том успешно смонтирован, вы можете с помощью команды
|
||||
```bash
|
||||
df -h /opt
|
||||
```
|
||||
Вывод должен быть такой:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ df -h /opt/
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
/dev/mapper/vg--random-lv--random 5.0G 68M 5.0G 2% /opt
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
|
@ -0,0 +1,84 @@
|
|||
---
|
||||
title: "Linux: Как расширить логический том LVM"
|
||||
date: "2022-05-15"
|
||||
---
|
||||
### Ситуация 1: новый диск
|
||||
#### Первый шаг: создание физического тома
|
||||
После того, как вы присоединили диск к физическому серверу или к виртуальной машине, вам нужно набрать команду:
|
||||
```bash
|
||||
sudo fdisk -l
|
||||
```
|
||||
<!--more-->
|
||||
Это нужно, чтобы убедиться, что диск распознан операционной системой, а также чтобы идентифицировать имя диска. Вывод команды будет примерно такой:
|
||||
```plaintext
|
||||
Disk /dev/vdc: 5 GiB, 5368709120 bytes, 10485760 sectors
|
||||
Units: sectors of 1 * 512 = 512 bytes
|
||||
Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes / 512 bytes
|
||||
```
|
||||
После того, как вы идентифицировали имя диска (в нашем случае это `/dev/vdc`), вы можете создать физический том с помощью команды:
|
||||
```bash
|
||||
sudo pvcreate /dev/vdc
|
||||
```
|
||||
Вы увидите такой вывод:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo pvcreate /dev/vdc
|
||||
Physical volume "/dev/vdc" successfully created.
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
#### Второй шаг: расширение группы томов
|
||||
Теперь можно расширить группу томов. Делается это такой командой:
|
||||
```bash
|
||||
sudo vgextend {vg-name} {pv-name}
|
||||
```
|
||||
В нашем случае это будет:
|
||||
```bash
|
||||
sudo vgextend vg-example /dev/vdc
|
||||
```
|
||||
Вы увидите такой вывод:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo vgextend vg-example /dev/vdc
|
||||
Physical volume "/dev/vdc" successfully created.
|
||||
Volume group "vg-example" successfully extended
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
#### Третий шаг: расширение логического тома
|
||||
Расширение логического тома делается такой командой:
|
||||
```bash
|
||||
sudo lvextend --size +{size} {vg-name/lv-name}
|
||||
```
|
||||
В нашем случае это будет:
|
||||
```bash
|
||||
sudo lvextend --size +2G vg-example/lv-example
|
||||
```
|
||||
Вы увидите такой вывод:
|
||||
```plaintext
|
||||
kostya@ubuntu-21-04:~$ sudo lvextend --size +2G vg-example/lv-example
|
||||
Size of logical volume vg-example/lv-example changed from 5.00 GiB (1280 extents) to 7.00 GiB (1792 extents).
|
||||
Logical volume vg-example/lv-example successfully resized.
|
||||
kostya@ubuntu-21-04:~$
|
||||
```
|
||||
Если же вы хотите, чтобы логичекий том использовал всё свободное место в группе томов, то наберите
|
||||
команду:
|
||||
```bash
|
||||
sudo lvextend --extents +100%FREE vg-example/lv-example
|
||||
```
|
||||
#### Четвёртый шаг: расширение файловой системы
|
||||
Если у вас файловая система `xfs`, то расширение делается такой командой:
|
||||
```bash
|
||||
sudo xfs_growfs /dev/{vg-name}/{lv-name}
|
||||
```
|
||||
В нашем случае это будет:
|
||||
```bash
|
||||
sudo xfs_growfs /dev/vg-example/lv-example
|
||||
```
|
||||
В случае с файловой системой ext4 замените команду `xfs_growfs` на `resize2fs`
|
||||
### Ситуация 2: если изменился размер существующего диска
|
||||
Иногда может измениться размер существующего диска, например, в случае с виртуальной машиной. В таком случае, первый шаг будет отличаться, второй шаг выполняться не будет, а остальные шаги будут такими же, как в ситуации с новым диском, описанной выше. На первом шаге нужно будет не создать физический том, а расширить существующий. Делается это такой командой:
|
||||
```bash
|
||||
sudo pvresize /dev/DISKNAME
|
||||
```
|
||||
Например,
|
||||
```bash
|
||||
sudo pvresize /dev/vdc
|
||||
```
|
|
@ -0,0 +1,54 @@
|
|||
---
|
||||
title: "Linux: как ограничить размер папки /var/log"
|
||||
date: "2022-06-06"
|
||||
---
|
||||
|
||||
Иногда папка `/var/log` увеличивается в размере настолько, что становится причиной нехватки места на диске. Как ограничить рост размера этой папки? Выполнив два шага из этой статьи, вы можете поставить размер папки `/var/log` под контроль.<!--more-->
|
||||
### Шаг 1. Ограничение размера логов journald
|
||||
Логи всех сервисов systemd складываются в папку `/var/log/journal/` сервисом `journald`. Чтобы установить предельный размер этой папки, выполните следующие команды:
|
||||
```bash
|
||||
sudo bash -c 'echo "SystemMaxUse=100M" >> /etc/systemd/journald.conf'
|
||||
sudo systemctl restart systemd-journald
|
||||
```
|
||||
Вместо размера `100M` вы можете указать любой другой размер, в единицах измерения `K, M, G, T`. После вышеуказанных команд вы можете убедиться, что размер папки `/var/log` стал иметь заданный размер с помощью команды: `du -sh /var/log/journal/`
|
||||
### Шаг 2. Ограничение количества файлов логов, ротируемых logrotate
|
||||
Logrotate каждый день совершает ротацию почти всех лог-файлов, находящихся в папке `/var/log`. Например, если я наберу команду `ls /var/log/kern*`, то я увижу, что помимо файла `/var/log/kern.log` у меня хранится ещё 4 файла, которые сохранил logrotate:
|
||||
```bash
|
||||
ls /var/log/kern*
|
||||
```
|
||||
```plaintext
|
||||
/var/log/kern.log /var/log/kern.log.2.gz /var/log/kern.log.4.gz
|
||||
/var/log/kern.log.1 /var/log/kern.log.3.gz
|
||||
```
|
||||
Чтобы ограничить количество лог-файлов, нужно отредактировать файл `/etc/logrotate.d/rsyslog`. Посмотрев содержимое файла `/etc/logrotate.d/rsyslog`, мы увидим, что дефолтное значение параметра `rotate` равно `4`:
|
||||
```bash
|
||||
cat /etc/logrotate.d/rsyslog
|
||||
```
|
||||
```plaintext
|
||||
/var/log/syslog
|
||||
/var/log/mail.info
|
||||
/var/log/mail.warn
|
||||
/var/log/mail.err
|
||||
/var/log/mail.log
|
||||
/var/log/daemon.log
|
||||
/var/log/kern.log
|
||||
/var/log/auth.log
|
||||
/var/log/user.log
|
||||
/var/log/lpr.log
|
||||
/var/log/cron.log
|
||||
/var/log/debug
|
||||
/var/log/messages
|
||||
{
|
||||
rotate 4
|
||||
weekly
|
||||
missingok
|
||||
notifempty
|
||||
compress
|
||||
delaycompress
|
||||
sharedscripts
|
||||
postrotate
|
||||
/usr/lib/rsyslog/rsyslog-rotate
|
||||
endscript
|
||||
}
|
||||
```
|
||||
Можно изменить `4` на какое-то другое значение, например, на `1`, чтобы хранился только один файл. В папке `/etc/logrotate.d/` вы найдёте также множество других конфигурационных файлов, относящихся к другим лог-файлам, там вы тоже можете изменить параметр `rotate`.
|
|
@ -0,0 +1,77 @@
|
|||
---
|
||||
title: "Linux: Как настроить мониторинг с уведомлениями в Telegram"
|
||||
date: "2023-03-04"
|
||||
---
|
||||
В статье описывается, как настроить мониторинг с уведомлениями в Telergram с помощью Grafana, Prometheus, Alertmanager, Node-exporter и Cadvisor.
|
||||
### Первый шаг: Клонирование репозитория
|
||||
Зайдите на сервер или в локальный терминал и выполните следующие команды:
|
||||
```bash
|
||||
git clone https://github.com/digitalstudium/grafana-docker-stack.git
|
||||
cd grafana-docker-stack
|
||||
git checkout alertmanager
|
||||
```
|
||||
<!--more-->
|
||||
### Второй шаг: установка внешнего адреса сервера
|
||||
Откройте файл `docker-compose.yml` и в строках 22 и 38 измените адрес `127.0.0.1` на адрес того сервера, на котором вы хотите установить Prometheus.
|
||||
### Третий шаг: создание бота в Telegram
|
||||
В поиске Telegram наберите `Botfather` и перейдите по первой ссылке:
|
||||
|
||||
![Botfather поиск](/images/botfather1.png "Botfather поиск")
|
||||
|
||||
Затем нажмите `Start`:
|
||||
|
||||
![Botfather старт бота](/images/botfather2.png "Botfather старт бота")
|
||||
|
||||
После этого создайте бота, пользуясь инструкциями `Botfather`.
|
||||
В итоге вы должны получить сообщение с токеном API:
|
||||
|
||||
![Botfather API токен](/images/botfather3.png "Botfather API токен")
|
||||
|
||||
Скопируйте данный токен и вставьте его в строку 14 файла `configs/alertmanager.yml` в качестве значения параметра `bot_token`.
|
||||
|
||||
Затем создайте группу в телеграм и добавьте созданного бота в эту группу. В эту группу будут приходить уведомления (алёрты).
|
||||
|
||||
### Четвертый шаг: Получение id группы
|
||||
В группе, к которой вы добавили бота, напишите какую-ниюудь команду, например: `/my_id foobar`
|
||||
|
||||
Затем в браузере перейдите по ссылке
|
||||
`https://api.telegram.org/botINSERT_BOT_TOKEN_HERE/getUpdates`, заменив `INSERT_BOT_TOKEN_HERE` на токен, созданный на шаге 3.
|
||||
Вы должны получить примерно такую страницу:
|
||||
|
||||
![Telegram получение id чата](/images/chat_id.png "Telegram получение id чата")
|
||||
Если на вашей странице ничего нет, попробуйте отправьте команду `/my_id foobar` в группу ещё раз.
|
||||
|
||||
Вам нужно скопировать значение chat id с этой страницы и вставить его в строку 15 файла `configs/alertmanager.yml` в качестве значения параметра `chat_id`. Обратите внимание, что значение параметра `chat_id` должно быть без кавычек и со знаком дефиса вначале.
|
||||
|
||||
### Пятый шаг: развёртывание docker стэка
|
||||
Находясь в папке `grafana-docker-stack`, выполните следующие команды:
|
||||
```bash
|
||||
docker swarm init
|
||||
docker stack deploy -c docker-compose.yml monitoring
|
||||
```
|
||||
Подождите 5-10 минут, затем выполните команду
|
||||
```bash
|
||||
docker ps
|
||||
```
|
||||
|
||||
Вывод команды должен содержать 5 контейнеров: prometheus, grafana, alertmanager, node-exporter, grafana.
|
||||
```plaintext
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
46fba26e7234 gcr.io/cadvisor/cadvisor:v0.47.0 "/usr/bin/cadvisor -…" 5 days ago Up 5 days (healthy) 8080/tcp monitoring_cadvisor.1.q02qcn798dh0rydo1dzslylse
|
||||
f212e3c66786 prom/alertmanager:v0.25.0 "/bin/alertmanager -…" 6 days ago Up 6 days 9093/tcp monitoring_alertmanager.1.oysziztrqnur7xr0hr82avunz
|
||||
c16fb14929e2 prom/prometheus:v2.42.0 "/bin/prometheus --c…" 6 days ago Up 6 days 9090/tcp monitoring_prometheus.1.yslspi4fgjp7ic4f5e18gm99a
|
||||
9bf01ce6b7a1 grafana/grafana:9.3.6-ubuntu "/run.sh" 6 days ago Up 6 days 3000/tcp monitoring_grafana.1.mypn85x12xw37ucprr33knuwk
|
||||
58efdb46f5c3 kindest/node:v1.25.3 "/usr/local/bin/entr…" 6 days ago Up 6 days 127.0.0.1:46579->6443/tcp kind-control-plane
|
||||
ae15e453e517 prom/node-exporter:v1.5.0 "/bin/node_exporter …" 7 days ago Up 7 days 9100/tcp monitoring_node-exporter.1.uecim10ow12h1qlpox5lg0c5r
|
||||
```
|
||||
Если вы видите такой вывод, значит всё развернулось успешно. Если нет, попробуйте повторить все предыдущие шаги.
|
||||
|
||||
### Шестой шаг: проверить работоспособность
|
||||
|
||||
Зайдите по адресу [ip-адрес или доменное имя сервера]:3000
|
||||
У вас должна открыться Grafana. Введите логин `admin` и пароль `admin`. Grafana попросит сменить пароль, смените его на любой другой.
|
||||
В разделе Dashboard -> Browse -> General вы увидите 2 дашборда: Cadvisor exporter и Node Exporter Full. Откройте их и убедитесь, что всё работает.
|
||||
|
||||
## Итог
|
||||
Теперь вы можете оценивать производительность сервера через графики Grafana.
|
||||
Также вам будут приходить уведомления о проблемах с сервером в группу Telegram. Правила уведомлений можно настроить в файле `configs/prometheus/alert_rules.yml`
|
|
@ -0,0 +1,70 @@
|
|||
---
|
||||
title: "Python: Как параллельно загрузить несколько веб-страниц"
|
||||
date: "2022-05-15"
|
||||
---
|
||||
|
||||
Сначала нужно установить пакет `aiohttp`. Для установки aiohttp выполните команду:
|
||||
```bash
|
||||
pip install aiohttp[speedups]
|
||||
```
|
||||
Суффикс `[speedups]` нужен для установки ускоряющих aiohttp пакетов - `aiodns`, `cchardet`. Затем создайте файл<!--more-->
|
||||
main.py с таким кодом:
|
||||
```python
|
||||
import aiohttp
|
||||
import asyncio
|
||||
import socket
|
||||
|
||||
|
||||
async def fetch_urls(urls):
|
||||
resolver = aiohttp.AsyncResolver()
|
||||
connector = aiohttp.TCPConnector(resolver=resolver, family=socket.AF_INET, use_dns_cache=False)
|
||||
session = aiohttp.ClientSession(connector=connector)
|
||||
|
||||
async def fetch_url(url, session):
|
||||
async with session.get(url) as resp:
|
||||
print(resp.status)
|
||||
print(await resp.text())
|
||||
|
||||
tasks = [fetch_url(url, session) for url in urls]
|
||||
await asyncio.gather(*tasks)
|
||||
await session.close()
|
||||
|
||||
|
||||
loop = asyncio.get_event_loop()
|
||||
|
||||
urls = ['http://httpbin.org/get?key=value1', 'http://httpbin.org/get?key=value2', 'http://httpbin.org/get?key=value3']
|
||||
|
||||
loop.run_until_complete(fetch_urls(urls))
|
||||
```
|
||||
Теперь можно запустить созданный файл с помощью команды:
|
||||
```bash
|
||||
python3 main.py
|
||||
```
|
||||
Вы увидите примерно такой вывод:
|
||||
```plaintext
|
||||
200
|
||||
{
|
||||
"args": {
|
||||
"key": "value2"
|
||||
},
|
||||
"headers": {
|
||||
"Accept": "*/*",
|
||||
"Accept-Encoding": "gzip, deflate",
|
||||
...
|
||||
```
|
||||
Все три запроса при этом выполнятся параллельно. Вы можете добавить любые url-ы в список <var>urls</var>, например:
|
||||
```python
|
||||
urls = ['https://yandex.com', 'https://google.com', 'https://yahoo.com']
|
||||
```
|
||||
|
||||
Чтобы выполнить HEAD, POST, PUT, DELETE запросы, просто замените в коде `session.get(url)` на соответствующий
|
||||
метод:
|
||||
|
||||
```python
|
||||
session.post('http://httpbin.org/post', data=b'data')
|
||||
session.put('http://httpbin.org/put', data=b'data')
|
||||
session.delete('http://httpbin.org/delete')
|
||||
session.head('http://httpbin.org/get')
|
||||
session.options('http://httpbin.org/get')
|
||||
session.patch('http://httpbin.org/patch', data=b'data')
|
||||
```
|
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
title: "Ubuntu: Как обновить ядро"
|
||||
date: "2022-05-14"
|
||||
---
|
||||
### Первый способ
|
||||
Первый способ очень прост. Нам нужно ввести в терминале всего одну команду:
|
||||
```bash
|
||||
sudo apt update && sudo apt -y upgrade
|
||||
```<!--more-->
|
||||
Команда `sudo apt update` обновит кэш репозиториев, а команда `sudo apt -y upgrade` установит новые версии всех установленных программ, включая ядро linux. Плюс данного способа в том, что будет установлена последняя версия linux ядра, <i>официально поддерживаемого</i> ОС Ubuntu. Минус этого способа в том, что <i>официально поддерживаемое</i> ядро обычно не самое новое. Иногда бывает так, что необходимо установить именно самую новую версию ядра linux. Реальный пример: на вашем новом ноутбуке может быть установлен процессор, поддержка которого обеспечивается только в версии ядра linux 5.12, тогда как официально поддерживаемая версия более старая. И тут на помощь приходит второй способ.
|
||||
### Второй способ
|
||||
Первым делом нужно зайти на сайт https://kernel.ubuntu.com/~kernel-ppa/mainline/. На этом сайте нужно выбрать папку с последней версией ядра linux (в самом низу страницы). Обратите внимание, что рекомендуется выбирать версию без суффикса "rc". Суффикс "rc" означает "release candidate", что в свою очередь значит, что данная версия ядра не является стабильной. На открывшейся странице выбираем папку с архитектурой вашего процессора. Архитектуру можно узнать с помощью команды `uname -p`. Если вывод этой команды "x86_64", то выбираем папку amd64. На открывшейся странице будут ссылки на .deb файлы. Нам нужно скачать 4 из них:
|
||||
```plaintext
|
||||
linux-headers-{version}-generic_{version}.{date}_amd64.deb
|
||||
linux-headers-{version}_{version}.{date}_all.deb
|
||||
linux-image-unsigned-{version}-generic_{version}.{date}_amd64.deb
|
||||
linux-modules-{version}-generic_{version}.{date}_amd64.deb
|
||||
```
|
||||
После того, как вы скачали файлы, их нужно установить с помощью команды:
|
||||
```bash
|
||||
sudo apt install -y ~/Downloads/linux-*.deb
|
||||
```
|
||||
Установка будет длиться 1-5 минут. После перезагрузки компьютера будет загружена установленная версия ядра.
|
Binary file not shown.
After Width: | Height: | Size: 473 KiB |
Binary file not shown.
After Width: | Height: | Size: 768 KiB |
Binary file not shown.
After Width: | Height: | Size: 647 KiB |
Binary file not shown.
After Width: | Height: | Size: 60 KiB |
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1 @@
|
|||
Subproject commit a1a99cf12681ad95b006e648a28139e6b9b75f09
|
Loading…
Reference in New Issue