MacBook Pro 2018 T2ని ArchLinux (dualboot)తో పని చేయడం

కొత్త T2 చిప్ కొత్త 2018 మ్యాక్‌బుక్స్‌లో టచ్‌బార్‌తో Linuxని ఇన్‌స్టాల్ చేయడం అసాధ్యం అనే వాస్తవం గురించి కొంచెం ప్రచారం జరిగింది. సమయం గడిచిపోయింది మరియు 2019 చివరిలో, థర్డ్-పార్టీ డెవలపర్‌లు T2 చిప్‌తో పరస్పర చర్య కోసం అనేక డ్రైవర్‌లు మరియు కెర్నల్ ప్యాచ్‌లను అమలు చేశారు. MacBook మోడల్స్ 2018 మరియు కొత్త ఇంప్లిమెంట్స్ VHCI ఆపరేషన్ (టచ్/కీబోర్డ్/మొదలైన ఆపరేషన్), అలాగే సౌండ్ ఆపరేషన్ కోసం ప్రధాన డ్రైవర్.

ప్రాజెక్ట్ mbp2018-bridge-drv 3 ప్రధాన భాగాలుగా విభజించబడింది:

  • BCE (బఫర్ కాపీ ఇంజిన్) - T2తో ప్రధాన కమ్యూనికేషన్ ఛానెల్‌ని ఏర్పాటు చేస్తుంది. VHCI మరియు ఆడియోకి ఈ భాగం అవసరం.
  • VHCI అనేది USB వర్చువల్ హోస్ట్ కంట్రోలర్; కీబోర్డ్, మౌస్ మరియు ఇతర సిస్టమ్ భాగాలు ఈ భాగం ద్వారా అందించబడతాయి (ఇతర డ్రైవర్లు మరింత కార్యాచరణను అందించడానికి ఈ హోస్ట్ కంట్రోలర్‌ను ఉపయోగిస్తారు.
  • ఆడియో - T2 ఆడియో ఇంటర్‌ఫేస్ కోసం డ్రైవర్, ప్రస్తుతం MacBook యొక్క అంతర్నిర్మిత స్పీకర్ల ద్వారా ఆడియో అవుట్‌పుట్‌కు మాత్రమే మద్దతు ఇస్తుంది


రెండవ ప్రాజెక్ట్ అంటారు macbook12-spi-డ్రైవర్, మరియు ఇది MacBook Pro లేట్ 2016 మరియు తదుపరి కోసం కీబోర్డ్, SPI ట్రాక్‌ప్యాడ్ మరియు టచ్‌బార్ కోసం ఇన్‌పుట్ డ్రైవర్‌ను ఆపరేట్ చేయగల సామర్థ్యాన్ని అమలు చేస్తుంది. కొన్ని కీబోర్డ్/ట్రాక్‌ప్యాడ్ డ్రైవర్‌లు ఇప్పుడు వెర్షన్ 5.3తో ప్రారంభమయ్యే కెర్నల్‌లో చేర్చబడ్డాయి.

Wi-Fi, టచ్‌ప్యాడ్ మొదలైన పరికరాలకు మద్దతు కూడా కెర్నల్ ప్యాచ్‌లను ఉపయోగించి అమలు చేయబడింది. ప్రస్తుత కెర్నల్ వెర్షన్ 5.3.5-1

ప్రస్తుతం ఏమి పని చేస్తోంది

  1. NVMe
  2. కీబోర్డ్
  3. USB-C (థండర్ బోల్ట్ పరీక్షించబడలేదు; మాడ్యూల్ స్వయంచాలకంగా లోడ్ అయినప్పుడు, అది సిస్టమ్‌ను స్తంభింపజేస్తుంది)
  4. టచ్‌బార్ (Fn కీలు, బ్యాక్‌లైట్, ESC మొదలైనవాటిని ఆన్ చేయగల సామర్థ్యంతో)
  5. ధ్వని (అంతర్నిర్మిత స్పీకర్లు మాత్రమే)
  6. Wi-Fi మాడ్యూల్ (brcmfmac ద్వారా మరియు iw ద్వారా మాత్రమే)
  7. USB-C ద్వారా డిస్ప్లేపోర్ట్
  8. సెన్సార్లు
  9. సస్పెండ్/రెస్యూమ్ (పాక్షికంగా)
  10. etc ..

ఈ ట్యుటోరియల్ macbookpro15,1 మరియు macbookpro15,2 కోసం వర్తిస్తుంది. వ్యాసం ఆంగ్లంలో గితుబ్ నుండి తీసుకోబడింది. ఇక్కడ నుండి. ఈ వ్యాసంలోని ప్రతిదీ పని చేయలేదు, కాబట్టి నేను స్వయంగా ఒక పరిష్కారాన్ని కనుగొనవలసి వచ్చింది.

మీరు ఏమి ఇన్స్టాల్ చేయాలి

  • USBకి USB-C డాకింగ్ అడాప్టర్ (టెథరింగ్ మోడ్‌లో మౌస్, కీబోర్డ్, USB మోడెమ్ లేదా ఫోన్‌ని కనెక్ట్ చేయడానికి కనీసం మూడు USB ఇన్‌పుట్‌లు). ఇది సంస్థాపన యొక్క మొదటి దశలలో మాత్రమే అవసరం
  • USB కీబోర్డ్
  • USB/USB-C ఫ్లాష్ డ్రైవ్ కనీసం 4GB

1. బాహ్య మీడియా నుండి బూట్ చేయడంపై నిషేధాన్ని నిలిపివేయండి

https://support.apple.com/en-us/HT208330
https://www.ninjastik.com/support/2018-macbook-pro-boot-from-usb/

2. డిస్క్ యుటిలిటీని ఉపయోగించి ఖాళీ స్థలాన్ని కేటాయించండి

సౌలభ్యం కోసం, నేను వెంటనే డిస్క్‌కి 30GBని కేటాయించాను, దానిని డిస్క్ యుటిలిటీలోనే ఎక్స్‌ఫాట్‌లో ఫార్మాట్ చేసాను. ఫిజికల్ డిస్క్ డిస్క్ యుటిలిటీని విభజించడం.

3. ISO చిత్రాన్ని సృష్టించండి

ఎంపికలు:

  1. మీరు సరళమైన మార్గంలో వెళ్లి కెర్నల్ 5.3.5-1 మరియు ప్యాచ్‌లతో రెడీమేడ్ ఇమేజ్‌ని డౌన్‌లోడ్ చేసుకోవచ్చు ఔనాలి1 పూర్తయిన చిత్రానికి లింక్ చేయండి
  2. ఆర్చ్‌లైవ్ ద్వారా చిత్రాన్ని మీరే సృష్టించండి (ఆర్చా పంపిణీతో కూడిన సిస్టమ్ అవసరం)

    ఇన్‌స్టాల్ చేయండి అర్చిసో

    pacman -S archiso

    
    cp -r /usr/share/archiso/configs/releng/ archlive
    cd archlive
    

    pacman.confకు రిపోజిటరీని జోడించండి:

    
    [mbp]
    Server = https://packages.aunali1.com/archlinux/$repo/$arch
    

    మేము pacman.conf లో అసలు కెర్నల్‌ను విస్మరిస్తాము:

    IgnorePkg   = linux linux-headers
    

    అవసరమైన ప్యాకేజీలను జోడించండి, చివరలో linux-mbp కెర్నల్ మరియు linux-mbp-హెడర్‌లను జోడించండి

    ...
    wvdial
    xl2tpd
    linux-mbp
    linux-mbp-headers
    

    మేము ఇంటరాక్టివ్ మోడ్‌లో పని చేయడానికి స్క్రిప్ట్‌ను మారుస్తాము (pacstrap -Cని ప్యాక్‌స్ట్రాప్ -i -Cతో భర్తీ చేయండి):

    sudo nano /usr/bin/mkarchiso

    # Install desired packages to airootfs
    _pacman ()
    {
        _msg_info "Installing packages to '${work_dir}/airootfs/'..."
    
        if [[ "${quiet}" = "y" ]]; then
            pacstrap -i -C "${pacman_conf}" -c -G -M "${work_dir}/airootfs" $* &> /dev/null
        else
            pacstrap -i -C "${pacman_conf}" -c -G -M "${work_dir}/airootfs" $*
        fi
    
        _msg_info "Packages installed successfully!"
    }

    చిత్రాన్ని రూపొందించడం:

    sudo ./build.sh -v

    విస్మరించబడిన ప్యాకేజీలను దాటవేయడానికి Y నొక్కండి, ఆపై usb ఫ్లాష్ డ్రైవ్‌కు iso చిత్రాన్ని వ్రాయండి:

    sudo dd if=out/archlinux*.iso of=/dev/sdb bs=1M

4. మొదటి బూట్

ఫ్లాష్ డ్రైవ్ మరియు కీబోర్డ్ చొప్పించడంతో రీబూట్ చేయండి. ఆపిల్ కనిపించినప్పుడు ఎంపికలను నొక్కండి, EFI BOOT ఎంచుకోండి.

తరువాత, మీరు "e" కీని నొక్కాలి మరియు కమాండ్ లైన్ చివరిలో నమోదు చేయాలి module_blacklist=thunderbolt. ఇది చేయకపోతే, సిస్టమ్ బూట్ కాకపోవచ్చు మరియు థండర్ బోల్ట్ ICM లోపం కనిపిస్తుంది.

fdisk/cfdisk ఉపయోగించి మన విభజనను కనుగొంటాము (నాకు ఇది nvme0n1p4), దానిని ఫార్మాట్ చేసి, ఆర్కైవ్‌ను ఇన్‌స్టాల్ చేయండి. మీరు ఉపయోగించవచ్చు అధికారిక సూచనలు లేదా పక్కకి.

మేము బూట్ విభజనను సృష్టించడం లేదు; మేము బూట్‌లోడర్‌ను వ్రాస్తాము /dev/nvme0n1p1
/mntలో పర్యావరణం పూర్తిగా ఏర్పడిన తర్వాత మరియు arch-chrootకి వెళ్లే ముందు, వ్రాయండి:

mount /dev/nvme0n1p1 /mnt/boot
arch-chroot /mnt /bin/bash

/etc/pacman.confకు జోడించు:


[mbp]
Server = https://packages.aunali1.com/archlinux/$repo/$arch

కెర్నల్‌ను ఇన్‌స్టాల్ చేయండి:


sudo pacman -S linux-mbp linux-mbp-headers
sudo mkinitcpio -p linux-mbp

మేము /etc/modprobe.d/blacklist.confలో పిడుగు మరియు applesmcని నమోదు చేస్తాము

blacklist thunderbolt
blacklist applesmc

కీబోర్డ్, టచ్ బార్ మొదలైనవి

అవును ఇన్‌స్టాల్ చేయండి:


sudo pacman -S git gcc make fakeroot binutils
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si

టచ్‌బార్ పని చేయడానికి మాడ్యూళ్లను ఇన్‌స్టాల్ చేస్తోంది:


git clone --branch mbp15 https://github.com/roadrunner2/macbook12-spi-driver.git
cd macbook12-spi-driver
make install

ప్రారంభానికి మాడ్యూళ్లను జోడించండి: /etc/modules-load.d/apple.conf

industrialio_triggered_buffer
apple-ibridge
apple-ib-tb
apple-ib-als

కీబోర్డ్ కోసం కెర్నల్ మాడ్యూల్‌లను ఇన్‌స్టాల్ చేస్తోంది. రిపోజిటరీలో వార్షిక 1 రెడీమేడ్ ప్యాకేజీ ఉంది, దీనిని పిలుస్తారు apple-bce-dkms-git. దీన్ని ఇన్‌స్టాల్ చేయడానికి, కన్సోల్‌లో వ్రాయండి:

pacman -S apple-bce-dkms-git

ఈ సందర్భంలో, కెర్నల్ మాడ్యూల్ కాల్ చేయబడుతుంది ఆపిల్-bce. స్వీయ-అసెంబ్లీ విషయంలో, దీనిని పిలుస్తారు bce. దీని ప్రకారం, మీరు mkinicpio.conf ఫైల్‌లోని MODULES విభాగంలో మాడ్యూల్‌ను నమోదు చేయాలనుకుంటే, మీరు ఏ మాడ్యూల్‌ని ఇన్‌స్టాల్ చేసారో మర్చిపోకండి.

మాన్యువల్ అసెంబ్లీ:


git clone https://github.com/MCMrARM/mbp2018-bridge-drv.git
cd mbp2018-bridge-drv
make
cp bce.ko /usr/lib/modules/extramodules-mbp/bce.ko

ప్రారంభానికి bce లేదా apple-bce మాడ్యూల్‌ని జోడించండి: /etc/modules-load.d/bce.conf

bce

మీరు డిఫాల్ట్‌గా Fn బటన్‌లను ఉపయోగించాలనుకుంటే, /etc/modprobe.d/apple-tb.conf ఫైల్‌లో వ్రాయండి:

options apple-ib-tb fnmode=2

కెర్నల్ మరియు initramf లను నవీకరిస్తోంది.


mkinitcpio -p linux-mbp

iwdని ఇన్‌స్టాల్ చేయండి:

sudo pacman -S networkmanager iwd

5. లోడర్

chroot లోపల అన్ని ప్రధాన ప్యాకేజీలు ఇన్‌స్టాల్ చేయబడిన తర్వాత, మీరు బూట్‌లోడర్‌ను ఇన్‌స్టాల్ చేయడం ప్రారంభించవచ్చు.

నేను పని చేయడానికి గ్రబ్‌ని పొందలేకపోయాను. బాహ్య USB డ్రైవ్ నుండి బూట్‌లను గ్రబ్ చేయండి, కానీ మీరు దీన్ని nvmeలో నమోదు చేయడానికి ప్రయత్నించినప్పుడు

grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub

సిస్టమ్ కెర్నల్ భయాందోళనకు గురైంది మరియు ఎంపికల ద్వారా కొత్త ఐటెమ్‌ను రీబూట్ చేసిన తర్వాత కనిపించలేదు. నేను ఈ సమస్యకు స్పష్టమైన పరిష్కారం కనుగొనలేదు మరియు కనుక systemd-boot ఉపయోగించి బూటింగ్‌ని అమలు చేయడానికి ప్రయత్నించాలని నిర్ణయించుకున్నాను.

  1. ప్రారంభించండి
    bootctl --path=/boot install

    మరియు మేము కెర్నల్ పానిక్ లోకి వెళ్తాము. మ్యాక్‌బుక్‌ను ఆఫ్ చేయండి, దాన్ని మళ్లీ ఆన్ చేయండి, ఎంపికలను క్లిక్ చేయండి (కీబోర్డ్‌తో USB-C హబ్‌ను ఆఫ్ చేయవద్దు)

  2. బాహ్య పరికరానికి అదనంగా కొత్త EFI BOOT ఎంట్రీ కనిపించిందని మేము తనిఖీ చేస్తాము
  3. మేము మొదటి ఇన్‌స్టాలేషన్ సమయంలో (module_blacklist=thunderboltని పేర్కొనడం మర్చిపోవద్దు) వంటి బాహ్య USB డ్రైవ్ నుండి బూట్ చేయడాన్ని ఎంచుకుంటాము.
  4. మేము మా డిస్క్‌ను మౌంట్ చేసి, ఆర్చ్-క్రోట్ ద్వారా పర్యావరణంలోకి వెళ్తాము


mount /dev/nvme0n1p4 /mnt
mount /dev/nvme0n1p1 /mnt/boot
arch-chroot /mnt

సిస్టమ్ పూర్తిగా లోడ్ అయ్యే వరకు కీబోర్డ్ పనిచేయడం అవసరమైతే (luks/dm-crypt ఎన్‌క్రిప్షన్‌ని ఉపయోగిస్తున్నప్పుడు ఇది అవసరం), ఆపై దానిని MODULES విభాగంలోని /etc/mkinicpio.conf ఫైల్‌లో వ్రాయండి:

MODULES=(ext4 applespi intel_lpss_pci spi_pxa2xx_platform bce)

కెర్నల్ మరియు initramf లను నవీకరిస్తోంది.


mkinicpio -p linux-mbp

systemd-bootని సెటప్ చేస్తోంది

మేము /boot/loader/loader.conf ఫైల్‌ని సవరించాము, లోపల ఉన్న ప్రతిదాన్ని తొలగించి, క్రింది వాటిని జోడించండి:

default arch
timeout 5
editor 1

/boot/loader/entries ఫోల్డర్‌కి వెళ్లి, arch.conf ఫైల్‌ని సృష్టించి, వ్రాయండి:

title arch
linux /vmlinuz-linux-mbp
initrd /initramfs-linux-mbp.img
options root=/dev/<b>nvme0n1p4</b> rw pcie_ports=compat

మీరు luks మరియు lvm ఉపయోగించినట్లయితే, అప్పుడు

options cryptdevice=/dev/<b>nvme0n1p4</b>:luks root=/dev/mapper/vz0-root rw pcie_ports=compat

MacOS లోకి రీబూట్ చేయండి.

6. Wi-Fi సెటప్

చివరికి తేలినట్లుగా, MacOS ఫోల్డర్‌లో wi-fi అడాప్టర్ కోసం ఫర్మ్‌వేర్ ఫైల్‌లను నిల్వ చేస్తుంది /usr/share/firmware/wifi , మరియు మీరు వాటిని అక్కడ నుండి బొబ్బల రూపంలో తీసుకోవచ్చు మరియు వాటిని brcmfmac కెర్నల్ మాడ్యూల్‌కు అందించవచ్చు. మీ అడాప్టర్ ఏ ఫైల్‌లను ఉపయోగిస్తుందో తెలుసుకోవడానికి, MacOSలో టెర్మినల్‌ని తెరిచి, వ్రాయండి:

ioreg -l | grep C-4364

మేము సుదీర్ఘ జాబితాను పొందుతాము. మాకు విభాగం నుండి ఫైల్‌లు మాత్రమే అవసరం అభ్యర్థించిన ఫైల్‌లు:

"RequestedFiles" = ({"Firmware"="<b>C-4364__s-B2/maui.trx</b>","TxCap"="C-4364__s-B2/maui-X3.txcb","Regulatory"="C-4364__s-B2/<b>maui-X3.clmb</b>","NVRAM"="C-4364__s-B2/<b>P-maui-X3_M-HRPN_V-m__m-7.7.txt</b>"})

మీ విషయంలో, ఫైల్ పేర్లు భిన్నంగా ఉండవచ్చు. వాటిని /usr/share/firmware/wifi ఫోల్డర్ నుండి ఫ్లాష్ డ్రైవ్‌కి కాపీ చేసి, వాటిని ఈ క్రింది విధంగా పేరు మార్చండి:

    maui.trx -> brcmfmac4364-pcie.bin
    maui-X3.clmb -> brcmfmac4364-pcie.clm_blob
    P-maui-X3_M-HRPN_V-m__m-7.7.txt -> brcmfmac4364-pcie.Apple Inc.-<b>MacBookPro15,2.txt</b>

ఈ సందర్భంలో, చివరి టెక్స్ట్ ఫైల్ మోడల్ పేర్లను కలిగి ఉంటుంది; మీ మోడల్ macbookpro15,2 కాకపోతే, మీరు మీ మ్యాక్‌బుక్ మోడల్‌కు అనుగుణంగా ఈ ఫైల్‌కు పేరు మార్చాలి.

ఆర్చ్‌లోకి రీబూట్ చేయండి.

ఫైల్‌లను ఫ్లాష్ డ్రైవ్ నుండి /lib/firmware/brcm/ ఫోల్డర్‌కు కాపీ చేయండి


sudo cp brcmfmac4364-pcie.bin /lib/firmware/brcm/
sudo cp brcmfmac4364-pcie.clm_blob /lib/firmware/brcm/
sudo cp 'brcmfmac4364-pcie.Apple Inc.-<b>MacBookPro15,2.txt' /lib/firmware/brcm/

మాడ్యూల్ యొక్క కార్యాచరణను తనిఖీ చేస్తోంది:


rmmod brcmfmac
modprobe brcmfmac

మేము ifconfig/ip ద్వారా నెట్‌వర్క్ ఇంటర్‌ఫేస్ కనిపించేలా చూసుకుంటాము.
ద్వారా wifiని సెటప్ చేస్తోంది iwctl

శ్రద్ధ. netctl, nmcli మొదలైన వాటి ద్వారా. ఇంటర్‌ఫేస్ పనిచేయదు, iwd ద్వారా మాత్రమే.

మేము నెట్‌వర్క్ మేనేజర్‌ని iwdని ఉపయోగించమని బలవంతం చేస్తాము. దీన్ని చేయడానికి, ఫైల్ /etc/NetworkManager/NetworkManager.conf ను సృష్టించి, వ్రాయండి:

[device]
wifi.backend=iwd

NetworkManager సేవను ప్రారంభించండి


sudo systemctl start NetworkManager.service
sudo systemctl enable NetworkManager.service

7. ధ్వని

ధ్వని పని చేయడానికి, మీరు pulseaudioని ఇన్‌స్టాల్ చేయాలి:


sudo pacman -S pulseaudio

మూడు ఫైల్‌లను డౌన్‌లోడ్ చేయండి:

వాటిని తరలిద్దాం:

    /usr/share/alsa/cards/AppleT2.conf
    /usr/share/pulseaudio/alsa-mixer/profile-sets/apple-t2.conf
    /usr/lib/udev/rules.d/91-pulseaudio-custom.rules

8. సస్పెండ్/రెస్యూమ్

ఈ క్షణం లో 16.10.2019 మీరు ధ్వని లేదా సస్పెండ్/రెస్యూమ్‌ని ఎంచుకోవాలి. మేము bce మాడ్యూల్ యొక్క రచయిత కార్యాచరణను పూర్తి చేయడానికి వేచి ఉన్నాము.

సస్పెడ్/రెస్యూమ్ సపోర్ట్‌తో మాడ్యూల్‌ను రూపొందించడానికి, మీరు ఈ క్రింది వాటిని చేయాలి:


git clone https://github.com/MCMrARM/mbp2018-bridge-drv.git
cd mbp2018-bridge-drv
git checkout suspend
make
cp bce.ko /usr/lib/modules/extramodules-mbp/bce.ko
modprobe bce

మీరు anual1 రిపోజిటరీ నుండి రెడీమేడ్ apple-bce మాడ్యూల్‌ని ఇన్‌స్టాల్ చేసి ఉంటే, మీరు ముందుగా దాన్ని తీసివేయాలి మరియు సస్పెండ్ మోడ్ సపోర్ట్‌తో bce మాడ్యూల్‌ను సమీకరించి, ఇన్‌స్టాల్ చేయాలి.

అలాగే, మీరు applesmc మాడ్యూల్‌ను బ్లాక్‌లిస్ట్‌కు జోడించాలి (మీరు ఇంతకు ముందు దీన్ని చేయకుంటే) మరియు చివరిలో ఎంపికల లైన్‌లోని /boot/loader/entries/arch.confలో పరామితి జోడించబడిందని నిర్ధారించుకోండి. pcie_ports=compat.

ప్రస్తుతం, సస్పెండ్ మోడ్‌లోకి ప్రవేశించేటప్పుడు టచ్‌బార్ డ్రైవర్ క్రాష్ అవుతుంది మరియు థండర్ బోల్ట్ డ్రైవర్ కొన్నిసార్లు సిస్టమ్‌ను 30 సెకన్ల కంటే ఎక్కువ స్తంభింపజేస్తుంది మరియు పునఃప్రారంభించేటప్పుడు చాలా నిమిషాల పాటు స్తంభింపజేస్తుంది. సమస్యాత్మక మాడ్యూళ్లను స్వయంచాలకంగా అన్‌లోడ్ చేయడం ద్వారా ఇది పరిష్కరించబడుతుంది.

స్క్రిప్ట్‌ను సృష్టించండి /lib/systemd/system-sleep/rmmod.sh:

#!/bin/sh
if [ "" == "pre" ]; then
        rmmod thunderbolt
        rmmod apple_ib_tb
elif [ "" == "post" ]; then
        modprobe apple_ib_tb
        modprobe thunderbolt
fi

దీన్ని ఎక్జిక్యూటబుల్ చేయండి:

sudo chmod +x /lib/systemd/system-sleep/rmmod.sh

ఇప్పటికి ఇంతే. ఫలితంగా సస్పెండ్/రెస్యూమ్‌తో కొన్ని సూక్ష్మ నైపుణ్యాలను మినహాయించి, పూర్తిగా పని చేయగల వ్యవస్థ. అనేక రోజుల అప్‌టైమ్‌లో క్రాష్‌లు లేదా కెర్నల్ భయాందోళనలు గమనించబడలేదు. సమీప భవిష్యత్తులో bce మాడ్యూల్ రచయిత దీన్ని పూర్తి చేస్తారని మరియు సస్పెండ్/రెస్యూమ్ మరియు సౌండ్‌కి మేము పూర్తి మద్దతుని పొందుతామని నేను ఆశిస్తున్నాను.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి