Rilascio del kernel Linux 6.19. Il prossimo kernel avrà assegnato il numero 7.0

Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 6.19. Tra le modifiche più significative ci sono: il sottosistema Live Update Orchestrator, il supporto per la crittografia PCIe Link, la chiamata di sistema listns, la modalità Zero-Copy Receive in io_uring, il supporto per l'estensione ARM MPAM, klp-build per la generazione di live patch, il supporto per l'architettura LoongArch32, QoS per s2idle, ottimizzazione del sottosistema di auditing, Intel LASS per la protezione da Spectre, supporto per gli hash SHA-3 e BLAKE2b, il meccanismo Confidential VMBus, e ottimizzazioni TX nel sottosistema di rete, oltre al protocollo CAN XL e a un'API per l'accelerazione hardware dei output HDR.

Nell'annuncio della nuova versione, Linus ha comunicato che al prossimo rilascio del kernel sarà assegnato il numero 7.0, poiché nella serie 6.x si sono accumulati abbastanza rilasci per cambiare la prima cifra del numero di versione (in passato, il rilascio 6.0 è stato creato dopo il 5.19). Il cambiamento di numerazione avviene per ragioni estetiche ed è un passo formale che elimina il disagio causato dall'accumulo di un gran numero di versioni nella serie. Linus ha scherzato dicendo che i numeri grandi lo confondono, poiché non ha abbastanza dita su mani e piedi. Inoltre, formalmente c'è motivo per un cambiamento significativo del numero di versione, poiché a partire dal prossimo rilascio, il supporto per Rust sarà spostato da funzionalità sperimentali a funzioni principali del kernel.

Nella nuova versione sono state apportate 15657 correzioni da 2237 sviluppatori, la dimensione della patch è di 52 MB (sono stati coinvolti 13682 file, 794649 righe di codice sono state aggiunte e 335498 righe sono state rimosse). Nell'ultima versione ci sono state 15035 correzioni da 2217 sviluppatori, la dimensione della patch era di 45 MB. Circa il 40% di tutte le modifiche presentate nella 6.19 riguarda i driver dei dispositivi, circa il 13% delle modifiche riguarda l'aggiornamento del codice specifico per le architetture hardware, il 12% è relativo allo stack di rete, il 5% ai file system e il 3% alle sottosistemi interni del kernel.

Le principali novità nel kernel 6.19 (1, 2, 3):

  • Sottosistema disco, I/O e file system
    • In Btrfs, file system checking processes (scrub) and device replacement no longer block the transition of the system into sleep mode (the state of the scrub check is saved before going to sleep; after waking up, the scrub check continues, and the device replacement operation restarts). Support for blocks larger than the page size has been added to the RAID56 implementation. Preparations for fscrypt support have been made. Performance has been improved for locking operations related to space reservation. Support for the ioctl operation "shutdown" has been added, allowing the file system to enter a state where attempts are made to complete already running operations, but all new operations are blocked.
    • Nel file system Ext4 è stata implementata la supporto per blocchi di dimensioni superiori a quelle della pagina di memoria (>4KB nei sistemi x86). L'uso di blocchi più grandi consente di migliorare le prestazioni delle operazioni di scrittura buffered in media del 50%, ma riduce le prestazioni delle operazioni di input/output diretto a causa dell'aumento del tempo di calcolo dei checksum. Nella nuova versione sono state aggiunte anche ottimizzazioni che aumentano la capacità durante l'esecuzione della deframmentazione online.
    • Nella sottosistema FUSE è migliorato il supporto per la lettura buffered con grandi folii di pagina di memoria (large folios). Attraverso iomap è stata implementata la possibilità di monitorare i folii parzialmente attivi per caricare solo i dati mancanti nel buffer.
    • Nel VFS è stato aggiunto il supporto per la delega di gestione delle directory richiamabile (recallable directory delegation), permettendo di implementare in NFS il passaggio di controllo della directory da server al cliente, affinché il client NFS possa monitorare autonomamente lo stato della directory basandosi sulla cache locale, senza contattare il server NFS. Se un altro client NFS apporta modifiche a questa directory, la delega di gestione verrà revocata dal primo cliente.
    • Per NFS è stata aggiunta la supporto per la lettura in modalità direct I/O. Sono state implementate le impostazioni /sys/kernel/debug/nfsd/io_cache_read e /sys/kernel/debug/nfsd/io_cache_write per gestire l'attivazione della cache e delle operazioni di direct I/O; la manipolazione di queste impostazioni consente di ridurre il sovraccarico lato client NFS durante l'esecuzione di grandi operazioni di input/output.
    • In NTFS è stata implementata la supporto per l'operazione ioctl di spegnimento, le opzioni di montaggio «acl» e «prealloc» sono state incluse per impostazione predefinita, ed è stata aggiunta la supporto per un orario anteriore al 1 gennaio 1970.
    • Per i dispositivi di blocco e il filesystem, è stato attivato per impostazione predefinita un caching degli oggetti «bio» (Block I/O) separato per ciascun CPU, che definisce le operazioni di input/output attive.
  • Memoria e servizi di sistema
    • Il kernel include il sottosistema Live Update Orchestrator (LUO), che consente di riavviare e aggiornare completamente il kernel senza interrompere le operazioni e senza perdere lo stato del sistema, dei dispositivi e dei processi. Il sottosistema LUO si basa sul meccanismo KHO (Kexec HandOver) precedentemente integrato nel kernel e, oltre alla possibilità di avviare un nuovo kernel da quello vecchio senza perdere lo stato del sistema, affronta anche compiti come il salvataggio dello stato dei dispositivi e della memoria operativa, garantendo la continuità delle operazioni associate al DMA e alla gestione delle interruzioni. Lo stato viene conservato fino al passaggio al nuovo kernel e ripristinato dopo l'attivazione del nuovo kernel senza compromettere le operazioni continue con i dispositivi effettuate dal sistema e dalle applicazioni nello spazio utente.
    • È stata aggiunta la syscall listns() per visualizzare un elenco degli spazi dei nomi esistenti nel sistema senza dover esaminare /proc/<pid>/ns/ per tutti i processi.
    • Nel sistema di input/output asincrono io_uring è stata aggiunta la supporto per la collocazione di elementi di differente dimensione nella coda di invio (SQE, Submission Queue Entry), analogamente a quanto è stato permesso nella precedente versione con la mescolanza delle dimensioni degli eventi nella coda di completamento (CQE, Completion Queue Event). Prima di ciò, tutti gli elementi nella coda dovevano avere la stessa dimensione, il che portava a un eccessivo consumo di memoria a causa della necessità di utilizzare la dimensione massima per tutti gli elementi nella coda.

      In io_uring è stata anche aggiunta la supporto per il meccanismo zcrx (Zero-Copy Receive) per ricevere dati senza copiare tra il kernel e lo spazio utente. È stata implementata la supporto per le richieste di layout di memoria per le code SQ (Submission Queue) e CQ (Completion Queue), consentendo di ottenere informazioni sulla dimensione del buffer circolare necessarie per l'allocazione della memoria da parte dell'utente utilizzando i flag IORING_SETUP_NO_MMAP e IORING_MEM_REGION_TYPE_USER.

    • Per una rapida tracciatura dello stack utilizzando strumenti come perf, è stato aggiunto il supporto per il formato SFrame con informazioni sul unwind dello stack delle chiamate. SFrame è già supportato in GCC e binutils, non comporta una diminuzione delle prestazioni e, a differenza del formato DWARF, contiene solo il minimo necessario per la tracciatura dello stack.
    • Nell'utilità perf è stato aggiunto il supporto per la descrizione unificata di metriche ed eventi nel formato JSON, così come l'unwind ritardato dello stack delle chiamate nello spazio utente.
    • Per i processori AMD è stato implementato un meccanismo di sostituzione dei dati nella cache, che consente ai dispositivi di input/output di inserire direttamente i dati nella cache L3 della CPU senza doverli prima memorizzare nella RAM.
    • È stata aggiunta la supporto MPAM (Memory System Resource Partitioning and Monitoring), un'estensione dell'architettura del set di istruzioni ARMv8-A per contrassegnare ogni accesso alla memoria con un identificatore di sezione (PARTID, Partition ID) e un identificatore di gruppo di monitoraggio (PMG, Monitoring Group ID). In associazione al PARTID, è possibile limitare il consumo delle risorse, come la larghezza di banda della memoria o la dimensione della cache, per evitare che un gruppo di compiti occupi tutte le risorse. Nel contesto del monitoraggio, la combinazione di PMG e PARTID può essere utilizzata per tracciare il consumo delle risorse di memoria in base a determinate tipologie di carico.
    • In caso di terminazione imprevista di un processo dopo aver ricevuto un segnale, un altro processo con pidfd del processo terminato può ora determinare il numero del segnale che ha provocato la chiusura del processo.
    • È stata riprogettata l'implementazione delle sequenze riavviabili (restartable sequences), che consentono alle applicazioni di organizzare un'esecuzione pseudo-atomica ininterrotta di un gruppo di istruzioni (nel caso di interruzione da un altro thread, si tenta nuovamente di eseguire la sequenza). La nuova implementazione si distingue per una maggiore alta performance.
    • Per i programmi BPF sono state implementate le istruzioni BPF_JMP, BPF_X e BPF_JA per effettuare salti indiretti a una posizione specifica nella tabella dei salti. È stata introdotta la concetto di puntatori dinamici (dynptr), che consentono di leggere dati da file strutturati. È stata aggiunta la possibilità di allegare a pacchetti di rete diversi byte con metadati.
    • I moduli in Python, utilizzati per la gestione della documentazione del kernel, sono stati spostati in una directory separata tools/lib/python.
    • È stata aggiunta la funzione mempool_alloc_bulk() per una sicura allocazione di elementi da un pool di memoria per più oggetti contemporaneamente.
    • Prosegue il trasferimento delle modifiche dalla branch Rust-for-Linux, relative all'uso del linguaggio Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel (il supporto per Rust non è attivo di default e non comporta l'inclusione di Rust tra le dipendenze di compilazione obbligatorie del kernel). Nella nuova versione, è stata integrata nel kernel la libreria "syn" con un parser di codice Rust, che semplifica la scrittura di macro complesse. Sono state ampliate le funzionalità delle librerie kernel, pin-init e rbtree. Aggiunta la libreria 'num' con il tratto Integer per la manipolazione di numeri interi. Il macro "module!" ha ora supporto per parametri interi. È stata implementata la possibilità di specificare parametri durante il caricamento di moduli del kernel scritti in Rust. Sono state realizzate astrazioni per i sottosistemi I2C e PWM (Pulse Width Modulation).
    • Aggiunto il macro "at_least" (ad esempio, "param[at_least 7]"), che informa sulla dimensione minima consentita per l'array passato alla funzione. Se un array con un numero inferiore di elementi viene passato alla funzione, il compilatore emetterà un avviso.
    • È stato incluso uno script klp-build per generare moduli del kernel che apportano modifiche al kernel in esecuzione (livepatch) basandosi su un file patch. Sono state apportate modifiche allo strumento objtool necessarie per la creazione di live-patch.
    • In User-mode Linux (esecuzione del kernel come processo utente) è stata aggiunta un supporto limitato per la multiprocessualità, ma i thread all'interno di un singolo processo non possono ancora essere eseguiti simultaneamente. È iniziato il porting di User-mode Linux su una libreria nolibc.
    • È stato aggiunto il supporto per l'architettura LoongArch32 (LA32R, LA32S) oltre a LoongArch64.
    • È stata aggiunta la possibilità di impostare limiti QoS sull'intensità di risveglio del processore in modalità risparmio energetico s2idle (Suspend-To-Idle), che congela l'esecuzione dei processi nello spazio utente, mantenendo attivi alcuni gestori nel kernel.
    • È stato aggiunto il supporto per la gestione delle tabelle delle pagine di memoria per i controller IOMMU (Input-Output Memory Management Unit), che eseguono la traduzione degli indirizzi virtuali visibili all'hardware in indirizzi fisici, con la possibilità di filtrare le operazioni DMA per indirizzi virtuali e di limitare e isolare le operazioni di input-output.
    • Nelle tracce degli eventi delle chiamate di sistema è stata implementata la possibilità di leggere i buffer dallo spazio utente e di includerne il contenuto (ad esempio, i nomi dei file) nel risultato della traccia.
    • Le pagine di guardia della memoria (guard page), il cui accesso genera un'eccezione e la terminazione del processo (SIGSEGV), sono ora contrassegnate con un'etichetta speciale nel file /proc/PID/smaps.
    • Aggiunta la possibilità di gestire le pagine di memoria grandi (transparent huge page) nella memoria privata dei dispositivi zonati.
    • Nel dispositivo zram, utilizzato per la memorizzazione compressa della partizione di swap in memoria, è stata implementata la supporto per l'espulsione di più strutture 'bio' (Block I/O) in modalità batch (writeback batching).
    • Inclusa la font 'Terminus 10×18', che migliora la leggibilità delle informazioni dalla console sui display dei laptop con risoluzione media (1440×900).
    • Significativa ottimizzazione del funzionamento del sottosistema di audit — si segnala una riduzione delle spese generali del 50%.
  • Virtualizzazione e sicurezza
    • È stata aggiunta la supporto della funzionalità fornita dai processori Intel per la separazione dello spazio degli indirizzi lineari (LASS, linear address-space separation), che consente di separare hardware i range di indirizzi dello spazio utente e del kernel per migliorare la sicurezza. Lo spazio degli indirizzi è separato dal bit più significativo dell'indirizzo: metà dello spazio degli indirizzi con il bit più significativo impostato è utilizzato per il kernel, mentre la parte inferiore è per lo spazio utente. Nelle prime fasi dell'esecuzione delle istruzioni (prima dell'esecuzione speculativa) viene effettuato un controllo della validità degli accessi dallo spazio utente agli indirizzi con il bit più significativo impostato e viceversa. Tale separazione consente di bloccare le perdite di memoria del kernel nello spazio utente tramite canali laterali anche durante l'esecuzione speculativa delle istruzioni, permettendo di applicare LASS per proteggere contro gli attacchi di tipo Meltdown e Spectre, senza comportare elevati sovraccarichi.
    • È stata aggiunta la possibilità di attivare le estensioni di sicurezza dell'autobus PCI Express — PCIe Link Encryption e PCIe Device Authentication, che consentono di verificare l'autenticità e cifrare il canale di comunicazione tra il dispositivo PCIe e la macchina virtuale, protetta mediante i meccanismi Intel TDX (Trusted Domain Extensions) e AMD SEV-SNP (Secure Nested Paging). Le tecnologie implementate impediscono l'intercettazione, l'analisi e l'inserimento di dati nel traffico DMA in presenza di accesso al sistema host o ad altri dispositivi.
    • La libreria crittografica integrata ha aggiunto il supporto per gli algoritmi SHA-3 (SHA3-224, SHA3-256, SHA3-384, SHA3-512) SHAKE128, SHAKE256 e BLAKE2b.
    • Per i moduli LSM (Linux Security Modules) e, in particolare per SELinux, è stata realizzata la possibilità di monitorare la creazione di descrittori memfd per applicare politiche di sicurezza agli oggetti correlati.
    • Nel modulo LSM IPE (Integrity Policy Enforcement), che definisce la politica generale di protezione dell'integrità per l'intero sistema, è stato aggiunto il supporto per il flag AT_EXECVE_CHECK nella funzione execveat(), che include la verifica dell'integrità dello script prima della sua esecuzione da parte dell'interprete.
    • Sono stati aggiunti i primitivi scoped_user_read_access(), scoped_user_write_access e scoped_user_rw_access() per un accesso limitato ai dati nello spazio dell'utente con protezione contro attacchi speculativi.
    • È stato aggiunto il supporto per il meccanismo Confidential VMBus, utilizzato nell'iperboreale HyperV per l'interazione protetta dall'iperboreale tra il sistema guest eseguito in modalità confidenziale (con crittografia della memoria e isolamento dei registri basato sulle tecnologie AMD SNP e Intel TDX) e il paravisor che gestisce l'accesso ai dispositivi che elaborano dati riservati.
    • È stata aggiunta la possibilità di trasmettere informazioni su un processo terminato in modo anomalo (per generare coredump) tramite il meccanismo pidfd. L'identificatore PIDFD è legato a un processo specifico e non cambia, mentre il PID può essere associato a un altro processo dopo la terminazione dell'attuale processo associato a quel PID. L'uso di pidfd consente di bloccare gli attacchi di sostituzione di un processo suid terminato in modo anomalo con un altro processo, creando una condizione di competizione nel momento successivo all'inizio della gestione da parte del kernel del terminato anomalo, ma prima della verifica da parte del gestore nello spazio utente dei parametri del processo.
  • Sottosistema di rete
    • Sono state apportate ottimizzazioni al sottosistema di rete per migliorare l'efficienza della trasmissione dei dati (TX). Rimuovendo la spin-lock dalla funzione __dev_queue_xmit() e utilizzando una struttura llist senza lock, è stato possibile aumentare la performance di 4 volte sotto carico pesante e raddoppiare l'intensità dell'invio di pacchetti riducendo a metà il carico sulla CPU.
    • È stata fornita la possibilità di disattivare i limiti di memoria di rete per singoli socket, nel qual caso verranno utilizzati i limiti di memoria comuni definiti per i singoli contenitori. Per gestire la disattivazione dei limiti, è stato proposto sysctl net.core.bypass_prot_mem e il flag SK_BPF_BYPASS_PROT_MEM nella funzione bpf_setsockopt.
    • Aggiunto il supporto per l'estensione RFC 5837, che inserisce nei messaggi ICMP 'Time Exceeded' restituiti alla scadenza del tempo di vita (TTL) del pacchetto, dati sulle interfacce di rete in ingresso per ottenere informazioni più dettagliate durante la tracciatura dei percorsi con lo strumento traceroute.
    • Introdotto il supporto per il polling attivo continuo (busy polling) in un thread kernel separato con l'obiettivo di estrarre i descrittori dalle code RX/TX per applicazioni che richiedono latenze minime.
    • Aggiunto il supporto per il protocollo CAN XL (Controller Area Network eXtended Length), nel quale la dimensione del campo dati è aumentata a 2048 byte per garantire l'integrazione con le reti TCP/IP, implementata la possibilità di tunneling dei frame Ethernet e aggiunto il supporto per la modulazione di larghezza di impulso, consentendo la trasmissione di dati a velocità di 20 Mbit/s e oltre.
    • Aggiunta la supporto per la struttura sockaddr_unsized, una variante della struttura sockaddr che utilizza un array con elementi flessibili anziché un array di dimensioni fisse (sa_data[] invece di sa_data[14], utilizzato principalmente per riferimenti ad altre strutture di dimensioni maggiori).
    • Aggiunta la possibilità di utilizzare le funzionalità di getsockname e getpeername attraverso la sottosistema io_uring.
    • Aggiunti sysctl net.ipv4.tcp_rcvbuf_low_rtt e net.ipv4.tcp_comp_sack_rtt_percent per ottimizzare il TCP.
    • Aggiunta la supporto per collegamenti con una larghezza di banda di 1600 Gbps (1.6T).
  • Attrezzature
    • Nel sottosistema DRM (Direct Rendering Manager) è stata aggiunta un'API per sfruttare le capacità hardware di conversione dei colori, permettendo di evitare trasformazioni simili tramite shader o esecuzione di codice sulla CPU. Per l'output dei contenuti su monitor HDR, ora le complesse conversioni di colore possono essere effettuate dal controllore di visualizzazione durante le fasi di pre-mixing e post-mixing dei layer, invece di comporre il contenuto programmaticamente nel buffer finale di visualizzazione. Oltre a ridurre i costi e il consumo energetico per l'organizzazione dell'output in HDR, la funzionalità proposta può essere utilizzata per una corretta resa dei colori in editor video o di immagini.
    • È stato aggiunto il driver «ethosu» per NPU Arm Ethos U65 e U85, progettato per accelerare hardware nell'esecuzione di modelli AI.
    • Nel driver i915 per GPU Lunar Lake e versioni più recenti è stata aggiunta la supporto per l'aumento della nitidezza dell'immagine (Sharpening).
    • Prosegue il lavoro sul driver drm (Direct Rendering Manager) Xe per GPU basati sull'architettura Intel Xe, comunemente usata nelle schede grafiche Intel della serie Arc e nella grafica integrata, a partire dai processori Tiger Lake. È stato aggiunto il supporto iniziale per l'architettura Xe3P, utilizzata nelle GPU di Crescent Island e nella serie di processori con grafica integrata Nova Lake.
    • Il driver AMDGPU offre un supporto completo per le schede grafiche AMD delle famiglie GCN 1.0 "Southern Island" e 1.1 "Sea Islands", precedentemente supportate dal driver Radeon. Il driver AMDGPU è stato aggiornato per eguagliare le capacità del driver Radeon ed è attivato per le GPU indicate di default. Le schede GCN 1.x sono state prodotte dal 2012 al 2019 e includono modelli come Radeon HD 77xx/78xx/79xx/87xx/88xx/89xx, Radeon R9 280, FirePro W4000-W9000, Radeon Sky 700/900, Radeon R9 265/270/370, Radeon R9 290/390, HD 7790 / 8870 e altre schede grafiche delle famiglie Radeon Rx 200 / Rx 300. Oltre a un aumento delle prestazioni medio del 24%, il passaggio a AMDGPU ha permesso di implementare il supporto per il grafico API Vulkan 1.3 per queste GPU. Inoltre, in AMDGPU è stato aggiunto il supporto per connettori analogici e Video Coding Engine 1.0, ed è stato attivato di default lo stack DC (Display Core) per le GPU basate sull'architettura Bonaire (Radeon HD 7700).
    • Il driver Nouveau supporta l'acceleratore hardware NVJPG, presente nel SoC Tegra210.
    • Nel driver Panthor è stato aggiunto il supporto per GPU Mali-G1 e supporto iniziale per il chip MediaTek MT8196.
    • È stato aggiunto il supporto per il subsistema audio dei chip Intel Nova Lake S, laptop HP con HDA CS35L41, e per le interfacce audio CIX IPBLOQ HD e Onkyo SE-300PCIE.
    • È proseguita l'integrazione dei componenti del driver Nova per le GPU NVIDIA dotate di firmware GSP, utilizzati a partire dalla serie NVIDIA GeForce RTX 2000 basata sull'architettura Turing. Il driver è scritto in Rust. Nella nuova versione è iniziato il lavoro su RPC e sono stati completati i caricamenti del coprocessore GSP (GPU System Processor).
    • È stato aggiunto il supporto per piattaforme ARM, SoC e dispositivi: Bananapi r4 pro, LinkEase EasePi R1, Qualcomm MSM8937 (Snapdragon 430), Renesas R-Car X5H, FriendlyElec NanoPi R76S, TI AM62L, Black Sesame Technologies C1200, Aspeed AST2600, Genio 1200 EVK, grinn geniosbc-510/700, Tanix TX9 Pro, Radxa Dragon Q6A, Tinker Board 3/3S, Aquila AM69, phyBOARD-Segin-i.MX91, i.MX 95 Verdin Evaluation Kit, Toradex SMARC iMX95, VIDIA Jetson Nano 2GB, Renesas rz/g3s, Indiedroid Nova, 24 varianti di schede Enclustra Mercury.
    • Aggiunto supporto per smartphone e tablet basati su SoC Mediatek MT6582 (Alcatel yarisxl), Nvidia Tegra124 (Xiaomi Mi Pad) e Qualcomm MSM8939 (ASUS ZenFone 2). Aggiunto supporto per notebook basati su SoC Qualcomm sdm850, come Huawei MateBook E 2019.
    • È stato aggiunto il supporto per SoC e schede basate sull'architettura RISC-V: OrangePi R2S, OrangePi RV, Anlogic dr1v90, Tenstorrent Blackhole.

Allo stesso tempo, il Fondo per il Software Libero dell'America Latina ha creato una variante completamente libera del kernel 6.19 — Linux-libre 6.19-gnu, depurato da elementi di firmware e driver che contengono componenti o porzioni di codice non liberi, il cui utilizzo è limitato dal produttore. Nella versione 6.19 è stato rimosso il codice per il caricamento di firmware binari dal sottosistema audio SDCA. Il codice per la pulizia dei blob nei driver Intel XE, Nova-Core, Qualcomm Iris, Venus e Q6V5, TI PRUeth, Intel iwlwifi, Marvell mwifiex, FourSemi fs210x, Realtek rt1320 e codec audio TI tas2783 è stato aggiornato. È stata completata la pulizia dei nomi dei blob nei file dts (devicetree) per i chip ARM. È stata interrotta la pulizia del driver STM C8SECTPFE DVB, rimosso dal kernel.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster