เช† เชฐเซ‚เชชเชฐเซ‡เช–เชพ เช•เซเชฏเชพเช‚เชฅเซ€ เช†เชตเซ‡ เช›เซ‡? [เชกเซ‡เชฌเชฟเชฏเชจ/เช‰เชฌเซเชจเซเชŸเซ]

เช† เชชเซ‹เชธเซเชŸเชจเซ‹ เชนเซ‡เชคเซ เชธเชฟเชธเซเชŸเชฎ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเชฎเชพเช‚ "เชธเซเชฐเซ‹เชค เชถเซ‹เชงเชตเชพ" เชธเช‚เชฌเช‚เชงเชฟเชค เชกเซ‡เชฌเชฟเชฏเชจ/เช‰เชฌเซเชจเซเชŸเซเชฎเชพเช‚ เชกเชฟเชฌเช—เซ€เช‚เช— เชคเช•เชจเซ€เช• เชฌเชคเชพเชตเชตเชพเชจเซ‹ เช›เซ‡.

เชชเชฐเซ€เช•เซเชทเชฃ เช‰เชฆเชพเชนเชฐเชฃ: เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒ OS เชจเซ€ tar.gz เชจเช•เชฒเชจเซ€ เช–เซ‚เชฌ เชฎเชœเชพเช• เช•เชฐเซเชฏเชพ เชชเช›เซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซเชฏเชพ เชชเช›เซ€ เช…เชจเซ‡ เช…เชชเชกเซ‡เชŸเซเชธ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช…เชฎเชจเซ‡ เชธเช‚เชฆเซ‡เชถ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡:

update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic
W: initramfs-tools configuration sets RESUME=/dev/mapper/U1563304817I0-swap
W: but no matching swap device is available.
I: The initramfs will attempt to resume from /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Set the RESUME variable to override this.

เชงเซเชฏเซ‡เชฏ: เชธเชฎเชœเซ‹ เช•เซ‡ เช† เชฎเซ‚เชฒเซเชฏ (U1563304817I0) เช•เซเชฏเชพเช‚เชฅเซ€ เช†เชตเซเชฏเซเช‚ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชฆเชฒเชตเซเช‚. เช† เชชเชนเซ‡เชฒเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡ เชœเซ‡ เชธเชพเชฎเซ‡ เช†เชตเซเชฏเซเช‚ เช›เซ‡, เชœเซ‡ เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชฐเชธเชชเซเชฐเชฆ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ Linux เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซ€ เชตเซเชฏเชตเชนเชพเชฐเซ เชชเชฆเซเชงเชคเชฟเช“ เชฌเชคเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช…เชจเซเช•เซ‚เชณ เช›เซ‡..

เชชเช—เชฒเซเช‚ เชจเช‚เชฌเชฐ 1: RESUME เช•เซเชฏเชพเช‚เชฅเซ€ เช†เชตเซเชฏเซเช‚?

# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap

เช…เชฎเซ‡ เชตเชพเชฐเช‚เชตเชพเชฐ (-r) /etc เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เช† เชšเชฒเชจเชพ เช‰เชฒเซเชฒเซ‡เช– เชฎเชพเชŸเซ‡ เชœเซเช“ (เชœเซเชฏเชพเช‚ เชฎเซ‹เชŸเชพเชญเชพเช—เชจเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช“ เช›เซ‡). เช…เชฎเซ‡ conf.d เชธเซเชจเชฟเชชเซ‡เชŸ เชถเซ‹เชงเซ€เช เช›เซ€เช, เชœเซ‡ เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ initramfs-tools เชชเซ‡เช•เซ‡เชœ เชฆเซเชตเชพเชฐเชพ เชตเชชเชฐเชพเชฏ เช›เซ‡.

เช† เชธเซเชจเชฟเชชเซ‡เชŸ เช•เซเชฏเชพเช‚เชฅเซ€ เช›เซ‡?

เชคเซเชฏเชพเช‚ เชคเซเชฐเชฃ เชตเชฟเช•เชฒเซเชชเซ‹ เช›เซ‡:

  1. เชœเชพเชฆเซเชˆ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ (เช•เซ‹เชˆเช เชฎเซ‚เช•เซเชฏเซเช‚ เช…เชจเซ‡ เชญเซ‚เชฒเซ€ เช—เชฏเซเช‚)
  2. เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚เชฅเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ
  3. เชธเชฟเชธเซเชŸเชฎ เชชเซ‡เช•เซ‡เชœเซ‹เชฎเชพเช‚เชฅเซ€ เช•เซ‡เชŸเชฒเซ€เช• เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฆเซเชตเชพเชฐเชพ เชฌเชจเชพเชตเซ‡เชฒ เชฐเซ‚เชชเชฐเซ‡เช–เชพ

เชšเชพเชฒเซ‹ เชจเช‚เชฌเชฐ 2 เชคเชชเชพเชธเซ€เช (เชธเซŒเชฅเซ€ เชธเชฐเชณ เชคเชฐเซ€เช•เซ‡):

 dpkg -S initramfs-tools/conf.d/resume
dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume*

dpkg -S เช…เชฎเชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒเซ€ เชซเชพเช‡เชฒเซ‹เชจเชพ เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเซ‡ เชถเซ‹เชงเชตเชพ เช…เชจเซ‡ เชซเชพเช‡เชฒ เช•เชฏเชพ เชชเซ‡เช•เซ‡เชœเชจเซ€ เช›เซ‡ เชคเซ‡ เชถเซ‹เชงเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เช…เชนเซ€เช‚ เชธเชซเชณ เชถเซ‹เชงเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡:

dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.conf

เชšเชพเชฒเซ‹ เช†เชชเชฃเชพ เช•เชพเชฐเซเชฏ เชชเชฐ เชชเชพเช›เชพ เช†เชตเซ€เช: เชซเชพเช‡เชฒ initramfs-tools/conf.d/resume เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚เชฅเซ€ เชธเชฟเชธเซเชŸเชฎ เชชเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒ เชจเชฅเซ€. เช•เชฆเชพเชš เชคเซ‡ เชชเซ‡เช•เซ‡เชœเชจเซ€ postinst/preinst เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚ เชœเชจเชฐเซ‡เชŸ เชฅเชฏเซเช‚ เชนเชถเซ‡? เชšเชพเชฒเซ‹ เชธเช‚เชธเซเช•เชฐเชฃ เชจเช‚เชฌเชฐ 3 เชคเชชเชพเชธเซ€เช.

# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm:    rm -f /etc/initramfs-tools/conf.d/resume

เช•เซ‡เชŸเชฒเซ‹เช—เชฎเชพเช‚ /var/lib/dpkg/info/ เชชเซ‡เช•เซ‡เชœเซ‹เชจเซ€ เชฌเชงเซ€ โ€œเชฎเซ‡เชŸเชพเชซเชพเชˆเชฒเซเชธโ€ (เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ/เชฐเชฟเชฎเซ‚เชตเชฒ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซเชธ, เชชเซ‡เช•เซ‡เชœ เชตเชฐเซเชฃเชจเซ‹, เชตเช—เซ‡เชฐเซ‡) เชจเชพ เช…เชจเชชเซ‡เช•เซเชก เชตเชฐเซเชเชจ เช›เซ‡. เช†เชถเซเชšเชฐเซเชฏเชœเชจเช• เชฐเซ€เชคเซ‡, เช† เชซเชพเช‡เชฒ initramfs-tools-core เชชเซ‡เช•เซ‡เชœเชจเชพ postrm (เช…เชจเช‡เชจเซเชธเซเชŸเซ‹เชฒ เชชเชฐ) เชฎเชพเช‚ เชฆเซ‚เชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชšเชพเชฒเซ‹ เชคเซ‡เชจเชพ postinst เชจเชพ เชธเชฎเชพเชตเชฟเชทเซเชŸเซ‹ เชœเซ‹เชˆเช... conf.d เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชธเชพเชฅเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เช•เช‚เชˆ เชจเชฅเซ€.

เชšเชพเชฒเซ‹ เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚ เชธเชฎเชพเชตเชฟเชทเซเชŸ เชซเชพเช‡เชฒเซ‹ เชœเซ‹เชˆเช initramfs-tools-core.

# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...

เชŸเซ€เชฎ dpkg -L เชคเชฎเชจเซ‡ เชธเซเชชเชทเซเชŸ เช•เชฐเซ‡เชฒ เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚เชฅเซ€ เชธเชฟเชธเซเชŸเชฎ เชชเชฐเชจเซ€ เชฌเชงเซ€ เชซเชพเชˆเชฒเซ‹ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡. เชฎเซ‡เช‚ เชเช• เชซเชพเช‡เชฒ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€ เช›เซ‡ เชœเซ‡ เช…เชญเซเชฏเชพเชธ เชฎเชพเชŸเซ‡ เชฐเชธเชชเซเชฐเชฆ เช›เซ‡. เชซเชพเช‡เชฒเชจเซ€ เชคเชชเชพเชธ เช•เชฐเชตเชพเชฅเซ€ เช† เชšเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฅเชพเชฏ เช›เซ‡ เชคเซ‡ เชฌเชคเชพเชตเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เช•เซเชฏเชพเช‚เชฅเซ€ เช†เชตเซ‡ เช›เซ‡ เชคเซ‡ เชœเชฃเชพเชตเชคเซเช‚ เชจเชฅเซ€.

เชกเซ‡เชฌเช•เซ‹เชจเชซ

เชคเซ‡ เชคเชพเชฐเชฃ เช†เชชเซ‡ เช›เซ‡ เช•เซ‡ เช† เช•เซ‹เชˆเชจเซ€ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เช›เซ‡. เช•เซ‹เชจเซ€? เช‡เชจเซเชธเซเชŸเซ‹เชฒเชฐเชฎเชพเช‚ เชกเชพเช‡เชตเชฟเช‚เช— เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ, เชšเชพเชฒเซ‹ เช…เชจเซเชฏ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชกเซ‡เชฌเชฟเชฏเชจ เช‡เชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชชเชฐ เชเช• เชจเชœเชฐ เช•เชฐเซ€เช - เชชเซเชฐเชถเซเชจเซ‹เชจเชพ เชœเชตเชพเชฌเซ‹. เชฆเชฐ เชตเช–เชคเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชชเซ‡เช•เซ‡เชœ เชชเซเชฐเชถเซเชจ เชชเซ‚เช›เซ‡ เช›เซ‡, เช…เชจเซ‡ เช˜เชฃเชพ เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚ เชœเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชชเซเชฐเชถเซเชจ เชชเซ‚เช›เชคเซ‹ เชจเชฅเซ€ เชชเชฐเช‚เชคเซ เชกเชฟเชซเซ‹เชฒเซเชŸ เชตเชฟเช•เชฒเซเชชเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชชเซเชฐเชถเซเชจ เช…เชจเซ‡ เชœเชตเชพเชฌ เชฌเช‚เชจเซ‡ เชกเซ‡เชฌเชฟเชฏเชจเชฎเชพเช‚ เชกเซ‡เชฌเช•เซ‹เชจเซเชซ เชจเชพเชฎเชจเชพ เชตเชฟเชถเชฟเชทเซเชŸ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช…เชฎเซ‡ เชœเชตเชพเชฌเซ‹เชจเชพ เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเซ‡ เชœเซ‹เชˆ เชถเช•เซ€เช เช›เซ€เช (เช…เชจเซ‡ เชชเซ‡เช•เซ‡เชœเชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ เชคเซ‡เชจเซ‡ เชธเซ‡เชŸ เชชเชฃ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช - debconf-set-selections), เช† เชฎเชพเชŸเซ‡ เช†เชชเชฃเชจเซ‡ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ debconf-get-selections เชฐเชšเชจเชพเชฎเชพเช‚เชฅเซ€ debconf-utils. เช•เชฎเชจเชธเซ€เชฌเซ‡, เช•เช‚เชˆ เชฐเชธเชชเซเชฐเชฆ เชฎเชณเซเชฏเซเช‚ เชจเชฅเซ€ :(debconf-get-selections |grep -i resume เช–เชพเชฒเซ€ เชชเชฐเชค เชซเชฐเซเชฏเชพ).

เชกเซ‡เชฌเชฟเชฏเชจ-เช‡เชจเซเชธเซเชŸเซ‹เชฒเชฐ

เช‡เชจเซเชธเซเชŸเซ‹เชฒเชฐ เชชเชพเชธเซ‡ เชชเซเชฐเชถเซเชจเซ‹เชจเชพ เชœเชตเชพเชฌเซ‹เชจเซ‹ เชชเซ‹เชคเชพเชจเซ‹ เชกเซ‡เชŸเชพเชฌเซ‡เช เช›เซ‡: /var/log/installer/cdebconf/questions.dat. เช•เชฎเชจเชธเซ€เชฌเซ‡, เช…เชฎเชพเชฐเชพ เชฐเซ‡เชเซเชฏเซ‚เชฎเซ‡ เชตเชฟเชถเซ‡ เชเช• เชถเชฌเซเชฆ เชชเชฃ เชจเชฅเซ€.
เชชเชฐเช‚เชคเซ เชจเชœเซ€เช•เชฎเชพเช‚ เชฒเซ‰เช—เซเชธ เช›เซ‡, เชธเชนเชฟเชค. syslog, เชœเซเชฏเชพเช‚ เชธเชฎเช—เซเชฐ เชธเซเชฅเชพเชชเชจ เชฒเซ‹เช— เชฒเช–เชพเชฏเซ‡เชฒ เช›เซ‡. เชฌเซ‡เช-เช‡เชจเซเชธเซเชŸเซ‹เชฒเชฐ เชชเซ‡เช•เซ‡เชœเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เชคเซเชฏเชพเช‚ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเชฐ เช›เซ‡ เชชเซƒเชทเซเช  เช…เชฎเซ‡ เช•เชพเชšเชพ เชจเซ€ เชฒเชฟเช‚เช• เชœเซ‹เชˆ เชถเช•เซ€เช เช›เซ€เช.

เชคเซ‡เชฎเชจเซ€ เช…เช‚เชฆเชฐ เช†เชชเชฃเซ‡ เช†เชชเชฃเชพ เชชเซเชฐเชถเซเชจเชจเซ‹ เชœเชตเชพเชฌ เชธเชฐเชณเชคเชพเชฅเซ€ เชถเซ‹เชงเซ€ เชถเช•เซ€เช เช›เซ€เช:

  resume="$(mapdevfs "$resume_devfs")"; then
...
    if [ "$do_initrd" = yes ]; then
     ...
            resumeconf=$IT_CONFDIR/resume
....
                echo "RESUME=$resume" >> $resumeconf

mapdevfs เช เชธเซเชชเชทเซเชŸ เชนเซ‡เชคเซ เชธเชพเชฅเซ‡ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เช›เซ‡, เช…เชจเซ‡ เช…เชฎเชจเซ‡ เชœเซ‡ เช•เชพเชฐเซเชฏเชฎเชพเช‚ เชฐเชธ เช›เซ‡ เชคเซ‡ เช›เซ‡ get_resume_partition, เชœเซ‡ /proc/swaps เชตเชพเช‚เชšเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซเชฏเชพเช‚ เชธเซŒเชฅเซ€ เชฎเซ‹เชŸเซเช‚ เชชเชธเช‚เชฆ เช•เชฐเซ‡ เช›เซ‡. เชธเซเชตเซ‡เชช เชชเชพเชฐเซเชŸเชฎเซ‡เชจเชฅเซ€ เช†เชตเซ‡ เช›เซ‡.

เช…เชฎเชพเชฐเชพ เชŸเซ‡เชธเซเชŸ เชŸเชพเชธเซเช•เชจเซ‹ เชœเชตเชพเชฌ: เชซเชพเชˆเชฒ เช‡เชจเซเชธเซเชŸเซ‹เชฒเชฐ เชฆเซเชตเชพเชฐเชพ /target เชฎเชพเช‚ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เชธเชฎเชฏเซ‡ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡. เช…เชฎเซ‡ เชœเชพเชฃเซ€เชคเซ€, เชชเชฐเช‚เชคเซ เชเช• เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช. เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชนเชพเชฒเชจเชพ เชชเซ‡เช•เซ‡เชœเซ‹เชฎเชพเช‚ เช•เซ‹เชˆ เชเช• เช…เชฅเชตเชพ เช•เช‚เชˆเชชเชฃ เชจเชฅเซ€ เช•เซ‡ เชœเซ‡ เช† เชซเชพเช‡เชฒเชจเซ‡ เชฌเชฆเชฒเซ€ เชถเช•เซ‡.

เช…เชช เชธเชฎเชœเซ€

  1. dpkg เช…เชจเซ‡ debconf เช เชซเชพเช‡เชฒ เชชเซเชฐเชฆเชพเชคเชพเช“ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชฎเซเช–เซเชฏ เชชเชฆเซเชงเชคเชฟเช“ เช›เซ‡.
  2. /var/lib/dpkg/info เชฎเชพเช‚ เชถเซ‹เชงเชตเซเช‚ เชคเชฎเชจเซ‡ เชธเซเชฅเชพเชชเชจ เชคเชฌเช•เซเช•เชพ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชซเชพเช‡เชฒเซ‹ เชชเชฐเชจเซ€ เช•เชพเชฎเช—เซ€เชฐเซ€ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡.
  3. เช‡เชจเซเชธเซเชŸเซ‹เชฒเชฐ เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เชซเชพเช‡เชฒเซ‹ เชฌเชจเชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡ เชœเซ‡ เชชเช›เซ€ เช•เซ‹เชˆ เชชเชฃ เชตเซเชฏเช•เซเชคเชฟ เชฆเซเชตเชพเชฐเชพ เช•เซเชฏเชพเชฐเซ‡เชฏ เชฌเชฆเชฒเชพเชคเซ€ เชจเชฅเซ€ (เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชธเชฟเชตเชพเชฏ), เช…เชจเซ‡ เช† เช‡เชจเซเชธเซเชŸเซ‹เชฒเชฐ เช•เซ‹เชกเชฎเชพเช‚ เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹